{"record":{"id":"f03c77b0f9ee5236","repo":"jdx/mise","slug":"no-lockfile-url-found-for-on-platform-loc-f03c77","errorCode":null,"errorMessage":"No lockfile URL found for {} on platform {} (--locked mode)\nhint: Run `mise lock` to generate lockfile URLs, or disable locked mode","messagePattern":"No lockfile URL found for (.+?) on platform (.+?) \\(--locked mode\\)\nhint: Run `mise lock` to generate lockfile URLs, or disable locked mode","errorType":"validation","errorClass":"eyre::Report","httpStatus":null,"severity":"error","filePath":"src/backend/mod.rs","lineNumber":3229,"sourceCode":"        // 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                );\n            }\n        }\n\n        // A rolling release (e.g. a `nightly` tag) keeps the same version string,\n        // so its install dir already existing does NOT mean it's up-to-date.\n        let rolling_reinstall = !ctx.force\n            && self.is_version_installed(&ctx.config, &tv, true)\n            && self.is_rolling_version_outdated(&ctx.config, &tv).await;\n\n        // Handle dry-run mode early to avoid plugin installation\n        if ctx.dry_run {\n            use crate::ui::progress_report::ProgressIcon;\n            let satisfied = !ctx.force","sourceCodeStart":3211,"sourceCodeEnd":3247,"githubUrl":"https://github.com/jdx/mise/blob/6f52dcdf99e282ef7a7db68c81301fa4618d0f79/src/backend/mod.rs#L3211-L3247","documentation":"In locked mode, for every non-stub tool whose backend supports URL locking, mise requires the lockfile to already contain a download URL for the current platform key. If tv.lock_platforms has no url for get_platform_key(), the install would have to hit the network and resolve dynamically — exactly what --locked forbids — so it bails with a hint to run `mise lock`.","triggerScenarios":"`mise install --locked` (or settings.locked) for a tool where mise.lock lacks a platform entry: a new tool added to mise.toml without re-locking; mise.lock generated on linux but installing on macos (different platform key); lockfile deleted or pruned.","commonSituations":"CI with --locked after a teammate adds a tool but forgets to commit an updated mise.lock; cross-platform repos where the lockfile must be regenerated per-OS; fresh clones before anyone ran `mise lock` on the new platform.","solutions":["Run `mise lock` (on the failing platform) to generate the missing URL entries, commit mise.lock, and retry","If the lockfile exists but lacks the platform: run `mise lock` on that OS/arch (platform keys differ) and commit both","Disable locked mode for this install (drop --locked / settings.locked) when dynamic resolution is acceptable"],"exampleFix":"# before\nmise install --locked   # No lockfile URL found for node 22 on linux-x64\n# after\nmise lock && mise install --locked","handlingStrategy":"validation","validationCode":"# CI ordering: always lock before a locked install\nmise lock && mise install --locked","typeGuard":null,"tryCatchPattern":"mise install --locked || mise lock && mise install --locked","preventionTips":["Treat any mise.toml tool change as requiring a `mise lock` commit in the same PR","Run `mise lock` on every OS in the build matrix and commit the merged mise.lock","CI: never allow `--locked` on a fresh clone without the lock step first"],"tags":["lockfile","locked-mode","install","platform-key"],"backgroundTag":"lockfile-entry-missing","analyzedSha":"6f52dcdf99e282ef7a7db68c81301fa4618d0f79","analyzedAt":"2026-08-22T10:14:23.840Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}