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()
|| receiptView on GitHub (pinned to 6f52dcdf99)
Solutions
- Remove the metadata-only apps manually (drag to Trash) and uninstall the cask through a non-prune path.
- Delete the pre-existing app copies, reinstall the cask so mise stages and fingerprints them (making the receipt fully owned), then prune.
- 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
- Don't pre-create app bundles in /Applications that a cask will install.
- After removing stray duplicate apps, reinstall the cask so the receipt records only owned targets.
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
- Homebrew now owns this cask
- ownership receipt has changed
- receipt is not marked safe for direct-artifact pruning
- receipt target inventory is incomplete or duplicated
- receipt target inventory contains an unclassified path
AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22).
Data as JSON: /api/errors/acf5713861004bfd.
Report an issue: GitHub.