jdx/mise · error

unrecognized attested_by

Error message

unrecognized attested_by {s:?} in lockfile

What it means

A tool entry's `attested_by` field in mise.lock may only be the literal string "repackager" — the only attesting party the parser knows. Any other string (from a newer mise or manual edit) causes a hard parse failure so unknown attestation claims are never silently accepted.

Solutions

  1. Upgrade mise to the latest version so the new attested_by value is recognized.
  2. Change the value to "repackager" or remove the attested_by key from the tool entry in mise.lock.
  3. Regenerate the lockfile with `mise lock` to produce valid attestation metadata.

Example fix

// before (mise.lock)
attested_by = "custom-signer"

// after
attested_by = "repackager"
Defensive patterns

Strategy: validation

Validate before calling

const vals = doc.get('tools')?.flatMap(t => t.get('attested_by')).filter(Boolean);
const bad = vals.filter(s => s !== 'repackager');
if (bad.length) throw new Error('unsupported attested_by: ' + bad);

Type guard

function isAttestedBy(v) { return v === 'repackager'; }

Prevention

When it happens

Trigger: Parsing a mise.lock tool entry with `attested_by = "<value other than repackager>"` — written by a newer mise introducing a new attester, or set by hand.

Common situations: Downgrading mise after using a newer version that records a new attester; hand-editing lockfile provenance; sharing lockfiles across mise versions.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


AI-assisted analysis of jdx/mise@533346cc37 (2026-09-17). Data as JSON: /api/errors/17dced8d664ff784. Report an issue: GitHub.

Appendix: source

Thrown at src/lockfile.rs:861

                    }
                    _ => None,
                };
                let provenance_verified = t
                    .remove("provenance_verified")
                    .and_then(|value| value.as_bool());
                let github_attestations = if provenance.is_some() {
                    None
                } else {
                    github_attestations
                };
                let signer = match t.remove("signer") {
                    Some(toml::Value::String(s)) => Some(s),
                    _ => None,
                };
                let attested_by = match t.remove("attested_by") {
                    Some(toml::Value::String(s)) if s == "repackager" => Some(s),
                    Some(toml::Value::String(s)) => {
                        bail!("unrecognized attested_by {s:?} in lockfile")
                    }
                    _ => None,
                };
                let additional_artifacts = match t.remove("additional_artifacts") {
                    Some(toml::Value::Array(values)) => values
                        .into_iter()
                        .map(|value| value.try_into().map_err(Report::from))
                        .collect::<Result<Vec<ArtifactInfo>>>()?,
                    Some(_) => bail!("additional_artifacts must be an array in lockfile"),
                    None => Vec::new(),
                };
                Ok(PlatformInfo {
                    install,
                    checksum,
                    size,
                    url,
                    url_api,
                    conda_deps,

View on GitHub (pinned to 533346cc37)