{"record":{"id":"9263ca99f36521b7","repo":"jdx/mise","slug":"invalid-bootstrap-service-name-name-use-at-mo","errorCode":null,"errorMessage":"invalid bootstrap service name '{name}': use at most 255 ASCII letters, digits, '.', '_', '@', ':', or '-'","messagePattern":"invalid bootstrap service name '(.+?)': use at most 255 ASCII letters, digits, '\\.', '_', '@', ':', or '-'","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/services.rs","lineNumber":618,"sourceCode":"    [\n        \"/usr/bin/systemctl\",\n        \"/bin/systemctl\",\n        \"/run/current-system/sw/bin/systemctl\",\n    ]\n    .into_iter()\n    .map(PathBuf::from)\n    .find(|path| path.is_file())\n}\n\nfn normalize_unit_name(name: &str) -> Result<String> {\n    if name.is_empty()\n        || name.len() > 255\n        || name.starts_with('-')\n        || !name\n            .chars()\n            .all(|character| character.is_ascii_alphanumeric() || \"_.@:-\".contains(character))\n    {\n        bail!(\n            \"invalid bootstrap service name '{name}': use at most 255 ASCII letters, digits, '.', '_', '@', ':', or '-'\"\n        );\n    }\n    if name.contains('.') {\n        Ok(name.to_string())\n    } else {\n        Ok(format!(\"{name}.service\"))\n    }\n}\n\nfn describe_current(active_state: &str, unit_file_state: &str, need_daemon_reload: bool) -> String {\n    format!(\n        \"{active_state}; {unit_file_state}{}\",\n        if need_daemon_reload {\n            \"; daemon reload needed\"\n        } else {\n            \"\"\n        }","sourceCodeStart":600,"sourceCodeEnd":636,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/system/services.rs#L600-L636","documentation":"Bootstrap service names are validated against systemd unit-name rules: at most 255 ASCII alphanumerics plus `.`, `_`, `@`, `:`, `-`, and no leading `-`. `normalize_unit_name`, invoked when parsing service TOML, rejects any name violating this before mise derives the unit name.","triggerScenarios":"Declaring a bootstrap service in mise.toml with a name containing spaces, slashes, non-ASCII characters, a leading dash, or exceeding 255 characters — parsed via `from_toml_with_origin` → `normalize_unit_name`.","commonSituations":"Using a descriptive name like `my app` or `dev/server` instead of the systemd unit name; pasting a path as the service name; generating names from untrusted input.","solutions":["Rename the service to only ASCII letters, digits, `.`, `_`, `@`, `:`, `-` (max 255 chars, no leading `-`)","Use a valid systemd unit name including the suffix (e.g. `myapp.service`)","Sanitize any dynamically generated service names before writing config"],"exampleFix":"// before (mise.toml)\n[services.\"dev/server\"]\nscope = \"system\"\n// after\n[services.\"dev-server.service\"]\nscope = \"system\"","handlingStrategy":"validation","validationCode":"fn valid_service_name(name: &str) -> bool { !name.is_empty() && name.len() <= 255 && !name.starts_with('-') && name.chars().all(|c| c.is_ascii_alphanumeric() || \"_.@:-\".contains(c)) }","typeGuard":"fn is_valid_unit_name(s: &str) -> Option<&str> { let ok = !s.is_empty() && s.len() <= 255 && !s.starts_with('-') && s.chars().all(|c| c.is_ascii_alphanumeric() || \"_.@:-\".contains(c)); ok.then_some(s) }","tryCatchPattern":null,"preventionTips":["Use lowercase ASCII names with dashes or dots only","Never derive service names from paths or free-form strings without sanitizing","Keep names under 255 characters"],"tags":["validation","systemd","naming"],"backgroundTag":"invalid-identifier-format","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}