{"record":{"id":"a1b6839ae55b62c7","repo":"jdx/mise","slug":"invalid-bootstrap-kind-name-name-use-at-mos","errorCode":null,"errorMessage":"invalid bootstrap {kind} name '{name}': use at most 32 ASCII letters, digits, '_' or '-', with an optional trailing '$'","messagePattern":"invalid bootstrap (.+?) name '(.+?)': use at most 32 ASCII letters, digits, '_' or '-', with an optional trailing '\\$'","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/accounts.rs","lineNumber":718,"sourceCode":"    )\n}\n\nfn validate_name(kind: &str, name: &str) -> Result<()> {\n    let base = name.strip_suffix('$').unwrap_or(name);\n    let mut characters = base.chars();\n    let valid = !name.is_empty()\n        && name.len() <= 32\n        && characters\n            .next()\n            .is_some_and(|character| character == '_' || character.is_ascii_alphabetic())\n        && characters.all(|character| {\n            character == '_'\n                || character == '-'\n                || character.is_ascii_digit()\n                || character.is_ascii_alphabetic()\n        });\n    if !valid {\n        bail!(\n            \"invalid bootstrap {kind} name '{name}': use at most 32 ASCII letters, digits, '_' or '-', with an optional trailing '$'\"\n        );\n    }\n    Ok(())\n}\n\nfn validate_account_path(name: &str, field: &str, path: &std::path::Path) -> Result<()> {\n    if !path.is_absolute() {\n        bail!(\"bootstrap user '{name}' {field} must be an absolute path\");\n    }\n    if path\n        .to_string_lossy()\n        .chars()\n        .any(|character| character == ':' || character == '\\n' || character == '\\r')\n    {\n        bail!(\"bootstrap user '{name}' {field} must not contain ':', CR, or LF\");\n    }\n    Ok(())","sourceCodeStart":700,"sourceCodeEnd":736,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/system/accounts.rs#L700-L736","documentation":"Bootstrap account (user or group) names are validated against passwd/group-safe rules: at most 32 characters of ASCII letters, digits, '_' or '-', with an optional trailing '$'. Names that break these rules would produce invalid /etc/passwd or /etc/group entries, so mise rejects them up front.","triggerScenarios":"Declaring a bootstrap user or group whose name exceeds 32 characters, contains spaces, dots, uppercase-non-ASCII, or other special characters, or ends with characters other than the allowed set ('$' allowed only trailing).","commonSituations":"Using an email address as a username ('ci.bot@example.com'); names with dots from Windows conventions; names generated from branch or project names containing slashes.","solutions":["Shorten the name to 32 characters or fewer","Replace invalid characters with '-' or '_'","Drop any trailing or embedded special characters; keep an optional single trailing '$'"],"exampleFix":"// before\n[users.\"ci.bot@example.com\"]\n// after\n[users.\"ci-bot\"]","handlingStrategy":"validation","validationCode":"function validAccountName(name) {\n  return /^[A-Za-z0-9_-]{1,31}\\$?$/.test(name) && name.length <= 32;\n}","typeGuard":null,"tryCatchPattern":"try {\n  await run('mise bootstrap apply');\n} catch (e) {\n  if (/invalid bootstrap .* name/.test(e.message)) {\n    throw new Error('Fix the account name in config: letters/digits/_/- up to 32 chars, optional trailing $');\n  }\n  throw e;\n}","preventionTips":["Validate names with /^[A-Za-z0-9_-]{1,31}\\$?$/ before writing config","Never derive account names from emails, URLs, or branch names without sanitizing","Cap generated names at 32 characters"],"tags":["validation","bootstrap","naming","linux"],"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"}