jdx/mise · warning · eyre::Report

receipt target inventory contains an unclassified path

Error message

receipt target inventory contains an unclassified path

What it means

Every path in receipt.targets must be classifiable — it must appear in at least one of the receipt's apps/binaries/fonts/completions lists, because the validator applies per-kind rules (directory/symlink/file, allowed roots, staged-copy match). A target record whose path is in none of those lists is 'unclassified', and the prune is refused since the validator cannot decide which rule set applies.

Solutions

  1. Upgrade mise to at least the version that installed the cask (so new artifact kinds are classified) and retry the prune.
  2. Reinstall the cask with the current mise so targets and classified lists are rewritten together.
  3. Manually inspect `.mise-cask.toml` and repair/remove the stray target entry only if you understand the artifact.
Defensive patterns

Strategy: validation

Validate before calling

// Ensure every recorded target is classifiable before pruning
let classified: BTreeSet<_> = receipt.apps.iter().chain(&receipt.binaries).chain(&receipt.fonts).chain(&receipt.completions).collect();
if receipt.targets.iter().any(|t| !classified.contains(&t.path)) {
    // unknown artifact kind; skip prune, reinstall or upgrade mise
}

Try / catch

Catch the Err and add a CaskPruneSkip carrying the reason; recommend reinstalling the cask with the current mise version.

Prevention

When it happens

Trigger: A receipt.targets entry whose path is absent from all classified lists — a corrupted receipt, a receipt mixing data from different mise versions, or a new artifact kind written by a newer mise that this validator does not know.

Common situations: Pruning casks installed by a newer mise version after downgrading; partially corrupted receipts after disk trouble or interrupted writes.

Related errors


AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22). Data as JSON: /api/errors/138aef5dec35f4c2. Report an issue: GitHub.

Appendix: source

Thrown at src/system/packages/brew/cask.rs:7286

        .apps
        .iter()
        .chain(&receipt.binaries)
        .chain(&receipt.fonts)
        .chain(&receipt.completions)
        .cloned()
        .collect::<BTreeSet<_>>();
    if expected.is_empty()
        || records.len() != receipt.targets.len()
        || records.len() != expected.len()
        || receipt
            .metadata_only_apps
            .iter()
            .any(|path| !receipt.apps.contains(path))
    {
        bail!("receipt target inventory is incomplete or duplicated");
    }
    if records.keys().any(|path| !expected.contains(path)) {
        bail!("receipt target inventory contains an unclassified path");
    }

    for path in &receipt.apps {
        let record = records
            .get(path)
            .ok_or_else(|| eyre!("missing app target record"))?;
        if record.fingerprint.kind != CaskTargetKind::Directory
            || !allowed_appdir_roots()?
                .iter()
                .any(|root| path_is_below(path, root))
            || !path.file_name().is_some_and(|name| {
                staged_app_matches_target(record, &candidate.version_dir.join(name))
            })
        {
            bail!(
                "app target is outside an allowed Applications directory: {}",
                path.display()
            );

View on GitHub (pinned to 6f52dcdf99)