{"record":{"id":"2a165e3194480eb8","repo":"jdx/mise","slug":"daemon-requests-tool-version-conflicting-with-another-daemon","errorCode":null,"errorMessage":"daemon {} requests {tool}@{version}, conflicting with another daemon; use one version per tool","messagePattern":"daemon (.+?) requests (.+?)@(.+?), conflicting with another daemon; use one version per tool","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/daemons/mod.rs","lineNumber":159,"sourceCode":"                .map(str::to_string)\n                .ok_or_else(|| eyre::eyre!(\"daemon {key} must be a string\"))\n        })\n        .transpose()\n}\n\nimpl DaemonSet {\n    pub(crate) fn add_tool_requests(&self, trs: &mut ToolRequestSet) -> Result<()> {\n        for daemon in self.daemons.values() {\n            let Some((tool, version)) = &daemon.tool else {\n                continue;\n            };\n            let ba = crate::cli::args::BackendArg::from(tool.as_str());\n            if let Some(existing) = trs.tools.get(&ba) {\n                // Explicit declarations are validated against backend resolution before starting.\n                if existing.iter().all(|tr| tr.source().is_mise_toml_daemon())\n                    && existing.iter().any(|tr| tr.version() != *version)\n                {\n                    bail!(\n                        \"daemon {} requests {tool}@{version}, conflicting with another daemon; use one version per tool\",\n                        daemon.name\n                    );\n                }\n                continue;\n            }\n            let source = ToolSource::MiseTomlDaemon(daemon.source.clone());\n            let request = ToolRequest::new(ba.into(), version, source.clone())?;\n            trs.add_version(request, &source);\n        }\n        Ok(())\n    }\n\n    pub(crate) fn env_entries(&self) -> Vec<(EnvDirective, PathBuf)> {\n        self.daemons\n            .values()\n            .flat_map(|daemon| {\n                daemon.exports.iter().map(|(k, v)| {","sourceCodeStart":141,"sourceCodeEnd":177,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/daemons/mod.rs#L141-L177","documentation":"mise daemons each declare tool requests; when two daemons in the same tool-request set request different versions of the same tool and both requests come from mise.toml daemon sources, mise refuses to start because one version per tool is supported. This check runs in add_tool_requests while merging each daemon's requested tools into the shared set.","triggerScenarios":"Starting (or rendering) daemons where two daemon definitions request the same tool at different versions, e.g. daemon A requests postgres@16 and daemon B requests postgres@17, and both requests originate from mise.toml daemon source.","commonSituations":"Copying an existing daemon block in mise.toml and changing its version without removing the old one; a project and an environment-specific mise.toml each declaring the same tool for daemons at different versions.","solutions":["Pick one version and make every daemon request that same tool version","Remove the duplicate/conflicting tool request from one of the daemons","If different versions are genuinely needed, split them across separate configs that are not used together"],"exampleFix":"// before\n[daemons.db]\npreset = \"postgres\"\ntools = { postgres = \"16\" }\n[daemons.db-old]\npreset = \"postgres\"\ntools = { postgres = \"17\" }\n// after\n[daemons.db]\npreset = \"postgres\"\ntools = { postgres = \"16\" }","handlingStrategy":"validation","validationCode":"# shell: ensure all daemons request the same version per tool\ngrep -A3 'daemons' mise.toml | grep -E 'postgres|redis' # eyeball versions match","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Define each daemon tool version once in a shared config section","Avoid duplicating daemon blocks when copying configs","One version per tool across all daemons in a project"],"tags":["daemon","config","conflict","tools"],"backgroundTag":"conflicting-config-options","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"}