{"record":{"id":"a513c8b6337dc9e9","repo":"jdx/mise","slug":"locked-mode-requires-lockfile-to-be-enabled-hint","errorCode":null,"errorMessage":"locked mode requires lockfile to be enabled\nhint: Remove `lockfile = false` or set `lockfile = true`, or disable locked mode","messagePattern":"locked mode requires lockfile to be enabled\nhint: Remove `lockfile = false` or set `lockfile = true`, or disable locked mode","errorType":"validation","errorClass":"eyre::Report","httpStatus":null,"severity":"error","filePath":"src/backend/mod.rs","lineNumber":3216,"sourceCode":"        None\n    }\n\n    async fn install_version(\n        &self,\n        ctx: InstallContext,\n        mut tv: ToolVersion,\n    ) -> eyre::Result<ToolVersion> {\n        // Toolset installs preflight these options before doing any work, but\n        // direct callers such as `install-into` must be protected here too.\n        tv.request.ensure_safe_install_options()?;\n\n        // Check for --locked mode: if enabled and no lockfile URL exists, fail early\n        // Exempt tool stubs from lockfile requirements since they are ephemeral\n        // Also exempt backends that don't support URL locking (e.g., Rust uses rustup)\n        // This must run before the dry-run check so that --locked --dry-run still validates\n        let settings = Settings::get();\n        if (ctx.locked || settings.locked) && settings.lockfile == Some(false) {\n            bail!(\n                \"locked mode requires lockfile to be enabled\\n\\\n                hint: Remove `lockfile = false` or set `lockfile = true`, or disable locked mode\"\n            );\n        }\n        if ctx.locked && !tv.request.source().is_tool_stub() && self.supports_lockfile_url() {\n            let platform_key = self.get_platform_key();\n            let has_lockfile_url = tv\n                .lock_platforms\n                .get(&platform_key)\n                .and_then(|p| p.url.as_ref())\n                .is_some();\n            if !has_lockfile_url {\n                bail!(\n                    \"No lockfile URL found for {} on platform {} (--locked mode)\\n\\\n                    hint: Run `mise lock` to generate lockfile URLs, or disable locked mode\",\n                    tv.style(),\n                    platform_key\n                );","sourceCodeStart":3198,"sourceCodeEnd":3234,"githubUrl":"https://github.com/jdx/mise/blob/6f52dcdf99e282ef7a7db68c81301fa4618d0f79/src/backend/mod.rs#L3198-L3234","documentation":"Locked mode (`mise install --locked` or settings.locked = true) works by validating every install against mise.lock, so it fundamentally requires the lockfile feature. If settings explicitly set `lockfile = false`, the two options contradict each other and Backend::install fails fast before any work — including dry-runs, which the guard deliberately precedes.","triggerScenarios":"settings.toml (or env) contains `lockfile = false` while the user runs `mise install --locked` or has `locked = true` in settings; commonly a leftover `lockfile = false` from an old experiment when adopting locked mode.","commonSituations":"Teams adopting `--locked` in CI while a developer's global settings still disable lockfile; copy-pasted settings snippets that combine both; env-var MISE_LOCKFILE=false in pipelines that also pass --locked.","solutions":["Remove `lockfile = false` (or set `lockfile = true`) in settings/env","Drop locked mode if the lockfile is intentionally disabled","Audit with `mise settings ls` for both keys to find where each is set (global vs project)"],"exampleFix":"# before (~/.config/mise/settings.toml)\nlockfile = false\nlocked = true\n# after\nlocked = true","handlingStrategy":"validation","validationCode":"# fail fast in CI if settings combine contradictory flags\n[ \"$(mise settings get lockfile)\" = \"false\" ] && [ \"$MISE_LOCKED\" = \"1\" ] && { echo 'lockfile=false + locked is invalid'; exit 1; }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep lockfile and locked settings owned by one layer (project settings), not mixed global/project","Use `mise settings ls` to audit both keys before adopting --locked","Codemod old `lockfile = false` experiments away when enabling locked mode"],"tags":["lockfile","locked-mode","settings","config-conflict"],"backgroundTag":"config-conflict","analyzedSha":"6f52dcdf99e282ef7a7db68c81301fa4618d0f79","analyzedAt":"2026-08-22T10:14:23.840Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}