{"record":{"id":"e62f08551e1b916d","repo":"jdx/mise","slug":"unrecognized-install-s-in-lockfile","errorCode":null,"errorMessage":"unrecognized install {s:?} in lockfile","messagePattern":"unrecognized install (.+?) in lockfile","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/lockfile.rs","lineNumber":550,"sourceCode":"                merge_additional_artifacts(&self.additional_artifacts, &other.additional_artifacts)\n            },\n        }\n    }\n}\n\nimpl TryFrom<toml::Value> for PlatformInfo {\n    type Error = Report;\n    fn try_from(value: toml::Value) -> Result<Self> {\n        match value {\n            toml::Value::String(checksum) => Ok(PlatformInfo {\n                checksum: Some(checksum),\n                ..Default::default()\n            }),\n            toml::Value::Table(mut t) => {\n                let install = match t.remove(\"install\") {\n                    Some(toml::Value::String(s)) if s == \"source\" => Some(s),\n                    Some(toml::Value::String(s)) => {\n                        bail!(\"unrecognized install {s:?} in lockfile\")\n                    }\n                    _ => None,\n                };\n                let checksum = match t.remove(\"checksum\") {\n                    Some(toml::Value::String(s)) => Some(s),\n                    _ => None,\n                };\n                let size = t\n                    .remove(\"size\")\n                    .and_then(|v| v.as_integer())\n                    .map(|i| i.try_into())\n                    .transpose()?;\n                let url = match t.remove(\"url\") {\n                    Some(toml::Value::String(s)) => Some(s),\n                    _ => None,\n                };\n                let url_api = match t.remove(\"url_api\") {\n                    Some(toml::Value::String(s)) => Some(s),","sourceCodeStart":532,"sourceCodeEnd":568,"githubUrl":"https://github.com/jdx/mise/blob/6f52dcdf99e282ef7a7db68c81301fa4618d0f79/src/lockfile.rs#L532-L568","documentation":"When parsing mise.lock, a platform entry's optional install field only accepts the string \"source\" (marking a from-source build); any other string aborts parsing of the whole lockfile (src/lockfile.rs:549-553). This is a forward-compatibility guard: the value was written by a newer format than this build understands.","triggerScenarios":"Reading a mise.lock whose [tools.<name>...] platform table has install = \"<anything but source>\" — typically a lockfile written by a newer mise release that added a new install kind, opened by a machine or CI image running an older mise.","commonSituations":"Teammates or CI lanes on different mise versions after someone upgrades and commits a refreshed mise.lock; pinned older mise in Docker images consuming newer lockfiles; hand-edited lockfiles.","solutions":["Upgrade mise on the failing machine (mise upgrade) to at least the version that wrote the lockfile.","Or regenerate the lockfile with the installed version: rm mise.lock && mise lock.","Pin one mise version for the whole team ([tools] mise = \"x.y.z\" in mise.toml) so lockfile writer and readers never diverge.","Revert any hand edits — mise.lock is generated output."],"exampleFix":"# before: older mise reading a newer lockfile\n$ mise install\nERROR unrecognized install \"binary\" in lockfile\n\n# after\n$ mise upgrade && mise install   # the reader now understands the format","handlingStrategy":"validation","validationCode":"# CI guard: refuse install kinds this mise cannot parse before it fails mid-job\ngrep -P 'install\\s*=\\s*\"(?!source\")' mise.lock && { echo 'mise.lock has an install kind this mise rejects — upgrade mise or re-lock'; exit 1; } || true","typeGuard":null,"tryCatchPattern":"Catch lockfile parse errors during mise install/mise lock and fail fast with an actionable message: upgrade mise to the lockfile writer's version, or delete mise.lock and re-lock. Do not auto-regenerate silently — that drops the pinned-version guarantees the lockfile exists for.","preventionTips":["Pin the mise version for the repo and CI ([tools] mise = \"…\") so writer and readers match.","Regenerate mise.lock whenever the pinned mise version is bumped.","Treat mise.lock as generated output: review diffs, never author fields by hand."],"tags":["lockfile","parse","version-mismatch","config"],"backgroundTag":"lockfile-schema-mismatch","analyzedSha":"6f52dcdf99e282ef7a7db68c81301fa4618d0f79","analyzedAt":"2026-08-22T10:14:23.840Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}