{"record":{"id":"66bbbae4cecd4027","repo":"jdx/mise","slug":"additional-artifacts-must-be-an-array-in-lockfile","errorCode":null,"errorMessage":"additional_artifacts must be an array in lockfile","messagePattern":"additional_artifacts must be an array in lockfile","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/lockfile.rs","lineNumber":662,"sourceCode":"                    }\n                    _ => None,\n                };\n                let provenance_verified = provenance.is_some()\n                    && matches!(\n                        t.remove(\"provenance_verified\"),\n                        Some(toml::Value::Boolean(true))\n                    );\n                let github_attestations = if provenance.is_some() {\n                    None\n                } else {\n                    github_attestations\n                };\n                let additional_artifacts = match t.remove(\"additional_artifacts\") {\n                    Some(toml::Value::Array(values)) => values\n                        .into_iter()\n                        .map(|value| value.try_into().map_err(Report::from))\n                        .collect::<Result<Vec<ArtifactInfo>>>()?,\n                    Some(_) => bail!(\"additional_artifacts must be an array in lockfile\"),\n                    None => Vec::new(),\n                };\n                Ok(PlatformInfo {\n                    install,\n                    checksum,\n                    size,\n                    url,\n                    url_api,\n                    conda_deps,\n                    pkgx_deps,\n                    pkgx_provides,\n                    pkgx_runtime_env,\n                    provenance,\n                    provenance_verified,\n                    github_attestations,\n                    additional_artifacts,\n                })\n            }","sourceCodeStart":644,"sourceCodeEnd":680,"githubUrl":"https://github.com/jdx/mise/blob/6f52dcdf99e282ef7a7db68c81301fa4618d0f79/src/lockfile.rs#L644-L680","documentation":"In a mise.lock platform table, additional_artifacts must be a TOML array of artifact tables; any other type (string, integer, inline table) bails (src/lockfile.rs:661-665). Each array element is then recursively parsed as ArtifactInfo.","triggerScenarios":"additional_artifacts = \"docs.zip\" or a single inline table instead of an array — hand-edited lockfiles, or structural drift between mise versions.","commonSituations":"Hand-editing mise.lock trying to add an artifact; merging lockfiles by hand; format changes after version upgrades.","solutions":["Regenerate the lockfile: rm mise.lock && mise lock.","Align mise versions across writers and readers (upgrade mise).","Express extra artifacts in backend config and re-lock instead of editing mise.lock."],"exampleFix":"# before (mise.lock, hand-edited — wrong type)\nadditional_artifacts = \"docs.zip\"\n\n# after — regenerate instead of editing\n$ rm mise.lock && mise lock","handlingStrategy":"validation","validationCode":"# CI guard: additional_artifacts must be an array wherever it appears\npython3 -c \"\nimport tomllib\n\ndef walk(v):\n    if isinstance(v, dict):\n        if 'additional_artifacts' in v and not isinstance(v['additional_artifacts'], list):\n            raise SystemExit('additional_artifacts must be an array')\n        for x in v.values(): walk(x)\n    elif isinstance(v, list):\n        for x in v: walk(x)\n\nwalk(tomllib.load(open('mise.lock', 'rb')))\n\"","typeGuard":null,"tryCatchPattern":"On \"additional_artifacts must be an array\", do not repair the field by hand — delete mise.lock and regenerate with mise lock using a mise version aligned with the writer, then fail the job if regeneration is not allowed (e.g. protected lockfiles).","preventionTips":["Express desired artifacts in backend config and re-lock; never edit mise.lock.","Validate mise.lock structure in CI before the real job runs.","Resolve lockfile merge conflicts by regenerating, not by hand-merging."],"tags":["lockfile","parse","toml","type-error"],"backgroundTag":"invalid-lockfile-format","analyzedSha":"6f52dcdf99e282ef7a7db68c81301fa4618d0f79","analyzedAt":"2026-08-22T10:14:23.840Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}