{"record":{"id":"50115d15b868dfbc","repo":"jdx/mise","slug":"invalid-lockfile-checksum-for-precompiled-erlang-o","errorCode":null,"errorMessage":"Invalid lockfile checksum for precompiled Erlang/OTP {version}; regenerate mise.lock with `mise lock`","messagePattern":"Invalid lockfile checksum for precompiled Erlang/OTP (.+?); regenerate mise\\.lock with `mise lock`","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/plugins/core/erlang.rs","lineNumber":841,"sourceCode":"    let checksum = matching[0]\n        .get(3)\n        .ok_or_else(|| eyre::eyre!(\"Hex OTP build record for {release_tag} has no checksum\"))?;\n    if !regex!(r\"^[0-9a-f]{64}$\").is_match(checksum) {\n        bail!(\"invalid Hex OTP checksum for {release_tag}: {checksum}\");\n    }\n\n    Ok(format!(\"sha256:{checksum}\"))\n}\n\n#[cfg(any(linux, test))]\nfn require_locked_precompiled_checksum(version: &str, checksum: Option<&str>) -> Result<String> {\n    let checksum = checksum.ok_or_else(|| {\n        eyre::eyre!(\n            \"No lockfile checksum found for precompiled Erlang/OTP {version}; regenerate mise.lock with `mise lock`\"\n        )\n    })?;\n    if !regex!(r\"^sha256:[0-9a-f]{64}$\").is_match(checksum) {\n        bail!(\n            \"Invalid lockfile checksum for precompiled Erlang/OTP {version}; regenerate mise.lock with `mise lock`\"\n        );\n    }\n\n    Ok(checksum.to_string())\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_parse_hex_build_checksum_requires_exact_publisher_record() {\n        let builds = \"OTP-28.5.0.4 abc 2026-07-27T13:55:40Z 34498e6287e1fbc31250d36dd88bcdb1d286cedbdd9b1a66bbc4284738d2d2eb\\n\\\n                      OTP-28.5.0.5 def 2026-08-04T10:35:03Z e3476633cae6fef8e1bb53576832b15823f715e70e3d4d1e66a6be908804f967\\n\";\n\n        assert_eq!(\n            parse_hex_build_checksum(builds, \"OTP-28.5.0.5\").unwrap(),","sourceCodeStart":823,"sourceCodeEnd":859,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/plugins/core/erlang.rs#L823-L859","documentation":"require_locked_precompiled_checksum validates the checksum stored in mise.lock for a precompiled Erlang install. The checksum must match `sha256:` followed by 64 hex chars; anything else means the lockfile entry is stale or malformed.","triggerScenarios":"Installing precompiled Erlang in locked mode where the mise.lock checksum entry exists but does not match the expected `sha256:<64 hex>` format (old mise version wrote a different format, hand-edited lockfile, merge conflict residue).","commonSituations":"mise.lock generated by an older mise before checksum format changes, manual edits, or git merge conflicts left in mise.lock.","solutions":["Regenerate the lockfile by running `mise lock` as the message instructs","Remove merge-conflict markers or hand edits from mise.lock and re-lock","Upgrade mise so lockfile reading matches the format written by your version"],"exampleFix":"# before (mise.lock)\n[erlang.26.2.5]\nchecksum = \"abc123\"\n\n# after: run `mise lock`\n# checksum = \"sha256:64hexchars...\"","handlingStrategy":"validation","validationCode":"grep -E 'checksum\\s*=\\s*\"sha256:[0-9a-f]{64}\"' mise.lock || mise lock","typeGuard":null,"tryCatchPattern":"mise install erlang@X || { mise lock && mise install erlang@X; }","preventionTips":["Run `mise lock` after upgrading mise versions that change lockfile formats","Never hand-edit mise.lock; resolve merge conflicts by re-locking","Commit lockfiles generated by the same mise version CI uses"],"tags":["erlang","lockfile","checksum","sha256"],"backgroundTag":"checksum-mismatch","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"}