{"record":{"id":"bd2bbca29eb10c5c","repo":"jdx/mise","slug":"no-lockfile-url-found-for-on-platform-loc","errorCode":null,"errorMessage":"No lockfile URL found for {} on platform {} (--locked mode requires pre-resolved URLs)","messagePattern":"No lockfile URL found for (.+?) on platform (.+?) \\(--locked mode requires pre-resolved URLs\\)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/backend/aqua.rs","lineNumber":531,"sourceCode":"                if url.contains(&prefixed_version) || filename.contains(&prefixed_version) {\n                    prefixed_version\n                } else if url.contains(&format!(\"v{}\", tv.version))\n                    || filename.contains(&format!(\"v{}\", tv.version))\n                {\n                    format!(\"v{}\", tv.version)\n                } else {\n                    tv.version.clone()\n                }\n            } else if url.contains(&format!(\"v{}\", tv.version))\n                || filename.contains(&format!(\"v{}\", tv.version))\n            {\n                format!(\"v{}\", tv.version)\n            } else {\n                tv.version.clone()\n            };\n            (url, existing_url_api.clone(), v, filename, None)\n        } else if ctx.locked {\n            bail!(\n                \"No lockfile URL found for {} on platform {} (--locked mode requires pre-resolved URLs)\",\n                self.id,\n                platform_key\n            );\n        } else {\n            let (url, url_api, v, digest) = if pkg.package_type() == AquaPackageType::Http {\n                let (url, resolved_version) =\n                    resolve_aqua_http_url(&pkg, &v, v_prefixed.as_deref(), os(), arch()).await?;\n                (url, None, resolved_version, None)\n            } else if let Some(v_prefixed) = v_prefixed {\n                // Try v-prefixed version first because most aqua packages use v-prefixed versions\n                match self.get_url(&pkg, v_prefixed.as_ref()).await {\n                    // If the url is already checked, use it\n                    Ok((url, url_api, true, digest)) => (url, url_api, v_prefixed, digest),\n                    Ok((url_prefixed, url_api_prefixed, false, digest_prefixed)) => {\n                        let (url, url_api, _, digest) = self.get_url(&pkg, &v).await?;\n                        // If the v-prefixed URL is the same as the non-prefixed URL, use it\n                        if url == url_prefixed {","sourceCodeStart":513,"sourceCodeEnd":549,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/backend/aqua.rs#L513-L549","documentation":"In --locked mode the aqua backend installs only from URLs pre-resolved in the lockfile and refuses to hit the network/API to resolve fresh ones. If no lockfile entry provides a URL for the requested package version on the target platform, it throws instead of resolving online, keeping locked installs reproducible and offline.","triggerScenarios":"Running install with --locked (or in an environment like CI where locked mode is enforced) for an aqua package version that is absent from aqua.lock / mise.lock, or whose lock entry lacks a URL for the current OS/arch (platform_key).","commonSituations":"Adding a new tool to mise.toml but not running `mise install` (or the lock-regeneration command) locally before CI; upgrading a package version without refreshing the lockfile; installing on a platform the lockfile entry never resolved for.","solutions":["Regenerate the lockfile so the URL gets resolved: run `mise install` (or the aqua lock update command) locally without --locked, commit the updated lockfile","Verify the lockfile contains an entry for this package version AND platform (os/arch) you are installing on","If you genuinely need resolution to happen, drop --locked for this step"],"exampleFix":"# before (CI, fails)\nmise install --locked\n# after: refresh lock locally first, then commit it\n# $ mise install          # updates mise.lock with resolved URLs\n# $ git add mise.lock && git commit -m \"chore: update mise.lock\"\nmise install --locked","handlingStrategy":"fallback","validationCode":"let lock_entry = lockfile.get_aqua_url(pkg_id, version, platform_key);\nif ctx.locked && lock_entry.is_none() {\n    return Err(anyhow!(\"{pkg_id}@{version} not locked for {platform_key}; run `mise install` to refresh the lockfile\"));\n}","typeGuard":null,"tryCatchPattern":"match install_locked(pkg) {\n    Err(e) if e.to_string().contains(\"No lockfile URL found\") => {\n        return Err(anyhow!(\"lockfile out of date; run `mise install` locally and commit mise.lock\"));\n    }\n    r => r,\n}","preventionTips":["Regenerate the lockfile after any mise.toml tool version change and commit it","Run `mise install` (unlocked) locally before pushing CI that uses --locked","Check the lockfile covers all target platforms your CI runs on","Keep mise updated so lockfile formats stay compatible"],"tags":["aqua","lockfile","ci"],"backgroundTag":"record-not-found","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"}