{"record":{"id":"486ac6ba8e68a05e","repo":"jdx/mise","slug":"agent-name-queue-directories-must-not-contai","errorCode":null,"errorMessage":"agent '{name}' `queue_directories` must not contain empty entries","messagePattern":"agent '(.+?)' `queue_directories` must not contain empty entries","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/system/launchd.rs","lineNumber":117,"sourceCode":"}\n\nimpl LaunchdRequest {\n    pub fn from_toml(name: String, config: LaunchdTomlConfig) -> Result<Self> {\n        if !valid_name(&name) {\n            bail!(\"agent name '{name}' must contain only letters, numbers, '.', '_', or '-'\");\n        }\n        let Some(program) = config.program.map(|s| s.trim().to_string()) else {\n            bail!(\"agent '{name}' must set `program`\");\n        };\n        if program.is_empty() {\n            bail!(\"agent '{name}' must set a non-empty `program`\");\n        }\n        if let Some(interval) = &config.start_calendar_interval {\n            interval.validate(&name)?;\n        }\n        for dir in &config.queue_directories {\n            if dir.trim().is_empty() {\n                bail!(\"agent '{name}' `queue_directories` must not contain empty entries\");\n            }\n            // checked against the raw string rather than `Path::is_absolute` on the\n            // expanded value: the plist is consumed by macOS launchd, so POSIX rules\n            // apply regardless of the platform parsing the config, and on Windows\n            // `Path::new(\"/var/spool\").is_absolute()` is false (root, but no prefix)\n            if !is_absolute_launchd_path(dir) {\n                bail!(\n                    \"agent '{name}' `queue_directories` entry '{dir}' must be an absolute path \\\n                     (launchd requires absolute paths; `~` and `~/` are expanded)\"\n                );\n            }\n        }\n        Ok(Self {\n            label: format!(\"dev.mise.{name}\"),\n            name,\n            program,\n            args: config.args,\n            run_at_load: config.run_at_load,","sourceCodeStart":99,"sourceCodeEnd":135,"githubUrl":"https://github.com/jdx/mise/blob/9dcfcaa0dc8747a2577d3270b69bb9d8313b2807/src/system/launchd.rs#L99-L135","documentation":"Each entry in an agent's queue_directories list is trimmed and checked; an entry that is empty or only whitespace causes LaunchdRequest::from_toml to reject the agent (it is skipped with a warning). launchd requires every QueueDirectories entry to name a real directory, so blank entries cannot be passed through.","triggerScenarios":"Writing queue_directories = [\"\", \"/var/spool/mail\"] or queue_directories = [\"   \"] in a [bootstrap.macos.launchd.agents.<name>] table.","commonSituations":"Trailing commas or list templating that yields empty slots; placeholders pending real paths; copy-paste leaving an empty line inside the TOML array.","solutions":["Remove the empty entry from queue_directories","If the directory is not yet decided, remove queue_directories entirely until it is known","Re-run mise bootstrap and verify the agent passes validation"],"exampleFix":"# before\n[bootstrap.macos.launchd.agents.mailwatch]\nprogram = \"/usr/local/bin/watch\"\nqueue_directories = [\"\", \"/var/spool/mail\"]\n\n# after\n[bootstrap.macos.launchd.agents.mailwatch]\nprogram = \"/usr/local/bin/watch\"\nqueue_directories = [\"/var/spool/mail\"]","handlingStrategy":"validation","validationCode":"python3 - <<'EOF'\nimport tomllib,sys\nc=tomllib.load(open('mise.toml','rb'))\nfor name,agent in (c.get('bootstrap',{}).get('macos',{}).get('launchd',{}).get('agents',{}) or {}).items():\n    for d in agent.get('queue_directories',[]) or []:\n        if not d.strip(): sys.exit(f'agent {name} has empty queue_directories entry')\nEOF","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep queue_directories lists tight; drop empty slots from templating","Omit queue_directories until the real paths are known","Treat empty entries as bugs — launchd needs concrete directories"],"tags":["mise","macos","launchd","bootstrap","empty-value"],"backgroundTag":"config-validation-failed","analyzedSha":"9dcfcaa0dc8747a2577d3270b69bb9d8313b2807","analyzedAt":"2026-08-17T14:28:50.624Z","schemaVersion":2},"datasetVersion":"2026-08-21T18:17:14.833Z"}