jdx/mise · warning · eyre::Report

metadata-only app ownership cannot be proven safely during p

Error message

metadata-only app ownership cannot be proven safely during pruning

What it means

The receipt lists metadata_only_apps — app artifacts recorded as metadata-only because they were present on disk at install time but never staged or owned by the installer. Their bytes were never fingerprinted from a staged copy, so ownership cannot be proven at prune time. mise refuses the whole direct-artifact prune rather than risk deleting an app bundle it did not install.

Source

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

            );
        }
    }
    Ok(())
}

fn validate_cask_prune_candidate(candidate: &CaskPruneCandidate) -> Result<()> {
    if homebrew_metadata_present(&candidate.token) {
        bail!("Homebrew now owns this cask");
    }
    let receipt = &candidate.receipt;
    if read_receipt(&candidate.version_dir)?.as_ref() != Some(receipt) {
        bail!("ownership receipt has changed");
    }
    if receipt.schema_version != 3 || !receipt.prune_safe || !receipt.pkg_ids.is_empty() {
        bail!("receipt is not marked safe for direct-artifact pruning");
    }
    if !receipt.metadata_only_apps.is_empty() {
        bail!("metadata-only app ownership cannot be proven safely during pruning");
    }
    let records = receipt
        .targets
        .iter()
        .map(|record| (record.path.clone(), record))
        .collect::<BTreeMap<_, _>>();
    let expected = receipt
        .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

View on GitHub (pinned to 6f52dcdf99)

Solutions

  1. Remove the metadata-only apps manually (drag to Trash) and uninstall the cask through a non-prune path.
  2. Delete the pre-existing app copies, reinstall the cask so mise stages and fingerprints them (making the receipt fully owned), then prune.
  3. Accept the skip: the cask stays installed and is reported in the skipped list; remove it via `brew uninstall --cask` if Homebrew manages it.
Defensive patterns

Strategy: validation

Validate before calling

// Refuse to plan a direct prune when metadata-only apps are recorded
if !receipt.metadata_only_apps.is_empty() {
    // direct artifact pruning cannot prove ownership; skip or use manual uninstall
}

Try / catch

Convert the Err into a skip entry (token + reason) in the prune plan; surface it to the user as 'retained, remove manually'.

Prevention

When it happens

Trigger: Pruning a cask whose install-time receipt has a non-empty metadata_only_apps list — e.g. the target .app path already existed in /Applications when mise poured the cask, so it was recorded as metadata-only instead of an owned staged artifact.

Common situations: Reinstalling a cask over an app the user placed in /Applications manually; casks whose declared apps ship with macOS or another package; leftover apps from a previous uninstall that were never removed.

Related errors


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