{"record":{"id":"81db4781618bb0ea","repo":"jdx/mise","slug":"unknown-preset-name-option-key","errorCode":null,"errorMessage":"unknown {preset_name} option {key:?}","messagePattern":"unknown (.+?) option (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/daemons/presets.rs","lineNumber":71,"sourceCode":"    let port = overrides\n        .remove(\"port\")\n        .map(|v| {\n            v.as_integer()\n                .and_then(|n| u16::try_from(n).ok())\n                .filter(|n| *n > 0)\n                .ok_or_else(|| {\n                    eyre::eyre!(\"[daemons.{name}].port must be an integer from 1 to 65535\")\n                })\n        })\n        .transpose()?\n        .unwrap_or(preset.port);\n    if let Some(options) = overrides.remove(\"options\") {\n        let options = options\n            .as_table()\n            .ok_or_else(|| eyre::eyre!(\"daemon options must be a table\"))?;\n        for (key, value) in options {\n            if !preset.options.contains_key(key) {\n                bail!(\"unknown {preset_name} option {key:?}\");\n            }\n            preset.options.insert(key.clone(), value.clone());\n        }\n    }\n    let database = preset\n        .options\n        .get(\"database\")\n        .map(|value| {\n            value\n                .as_str()\n                .ok_or_else(|| eyre::eyre!(\"options.database must be a string\"))\n        })\n        .transpose()?\n        .unwrap_or(\"postgres\");\n    // This name is also used as a URI component and SQL identifier.\n    if database.is_empty()\n        || !database\n            .chars()","sourceCodeStart":53,"sourceCodeEnd":89,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/daemons/presets.rs#L53-L89","documentation":"When expanding a daemon preset, an [options] table from user overrides is applied to the preset; every key must match an option the preset defines. Unknown keys are rejected so typos and stale options fail loudly instead of being silently ignored.","triggerScenarios":"Calling expand (via presets_render_local_persistent_daemons or named_instances_override_ports_and_keep_templates) with a daemon config whose options table contains a key not present in preset.options.","commonSituations":"Typo in an option name (e.g. 'prot' instead of 'port'); using an option that exists in one preset but not another; renaming preset options in a newer mise while old config remains.","solutions":["Correct the option key to one defined by the preset","Remove the unknown option from the daemon's options table","Run `mise daemon --help` or check the preset docs for valid option names"],"exampleFix":"# before\n[daemons.db.options]\nprot = 5432\n# after\n[daemons.db.options]\nport = 5432","handlingStrategy":"validation","validationCode":"# shell: check option names against the preset before running\nmise daemon preset show postgres | grep -E 'options|port|database'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Copy option names from the preset docs, don't type from memory","Re-check options after upgrading mise in case preset options changed","Keep options tables minimal"],"tags":["daemon","preset","config","validation"],"backgroundTag":"invalid-config-value","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"}