{"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/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/system/services.rs#L600-L636","documentation":"Thrown by `normalize_unit_name` when a bootstrap service name is empty, longer than 255 bytes, starts with '-', or contains characters outside ASCII letters, digits, '.', '_', '@', ':', '-'. These mirror systemd's own unit-name constraints; names without a dot get a default suffix appended (e.g. .service).","triggerScenarios":"A `[bootstrap.services.<key>]` whose key violates the charset/length rules: leading dash, spaces or slashes in the name, Unicode characters, or names over 255 bytes.","commonSituations":"Using a descriptive sentence or path as the service key; Windows-derived names with backslashes; very long generated names; typos like '-myunit'.","solutions":["Rename the service key to only ASCII letters, digits, '.', '_', '@', ':' or '-', without a leading '-'","Shorten the name to 255 bytes or fewer","Include a dot (or let mise append the default suffix) so systemd gets a proper unit name, e.g. `myapp.service` or just `myapp`"],"exampleFix":"# before\n[bootstrap.services.\"-my app/worker\"]\nstate = \"running\"\n# after\n[bootstrap.services.myapp-worker]\nstate = \"running\"","handlingStrategy":"validation","validationCode":"fn valid_unit_name(name: &str) -> bool {\n    !name.is_empty() && name.len() <= 255 && !name.starts_with('-')\n        && name.chars().all(|c| c.is_ascii_alphanumeric() || \"_.@:-\".contains(c))\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep service keys short and ASCII: letters, digits, dots, underscores","Never use leading dashes, spaces, slashes or backslashes in unit names","Let mise append the default suffix by using dot-free simple names","Generate names programmatically? enforce the charset/length rule at generation time"],"tags":["validation","systemd","naming","config"],"backgroundTag":"invalid-identifier-format","analyzedSha":"afd2eddd3a50c16190efc1c7e94404b48f72af57","analyzedAt":"2026-09-09T01:38:25.179Z","contentChangedAt":"2026-09-09T01:38:25.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}