jdx/mise · error · eyre::Report
Homebrew now owns this cask
Error message
Homebrew now owns this cask
What it means
validate_cask_prune_candidate refuses to prune a cask when Homebrew's .metadata directory exists under the caskroom token dir (homebrew_metadata_present). That directory only appears when Homebrew itself has (re)installed or taken over the cask, so mise's stored receipt no longer describes the on-disk owner and pruning from mise would fight Homebrew.
Source
Thrown at src/system/packages/brew/cask.rs:7006
}
}
for target in &candidate.receipt.targets {
if claims
.get(&target.path)
.is_some_and(|tokens| tokens.iter().any(|token| token != &candidate.token))
{
bail!(
"artifact target is now claimed by another cask: {}",
target.path.display()
);
}
}
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");
}
let records = receipt
.targets
.iter()
.map(|record| (record.path.clone(), record))
.collect::<BTreeMap<_, _>>();
let expected = receipt
.apps
.iter()
.chain(&receipt.binaries)
.chain(&receipt.fonts)View on GitHub (pinned to 9dcfcaa0dc)
Solutions
- Let Homebrew own it: `brew uninstall --cask <token>`, then remove mise's tracking (`mise rm brew:cask/<token>` or the equivalent uninstall) if you no longer want it
- Keep managing it with Homebrew and stop tracking it in mise config
- If you truly want mise to own it again, `brew uninstall --cask <token>` first, then reinstall via mise
Example fix
# before: cask now owned by Homebrew, mise prune refuses brew uninstall --cask <token> && mise rm brew:cask/<token> # after: Homebrew removed it cleanly; mise tracking dropped
Defensive patterns
Strategy: validation
Validate before calling
fn homebrew_owns(token: &str) -> bool {
caskroom_token_dir(token)
.join(".metadata")
.symlink_metadata()
.is_ok()
}
// before prune:
if homebrew_owns(token) {
eprintln!("Homebrew owns this cask; use brew uninstall --cask {token}");
} Try / catch
match validate_cask_prune_candidate(&candidate) {
Ok(()) => prune(),
Err(e) if e.to_string().contains("Homebrew now owns this cask") => {
warn!("deferring to brew uninstall --cask {}");
Ok(())
}
Err(e) => Err(e),
} Prevention
- Pick one manager per cask — do not alternate brew and mise installs of the same token
- After brew reinstalls a cask, drop mise's tracking (mise rm brew:cask/<token>) before pruning
- Check for caskroom/<token>/.metadata when diagnosing prune refusals
When it happens
Trigger: Running a mise prune/uninstall of a cask after `brew install --cask` (or `brew upgrade`) has installed it — the caskroom/<token>/.metadata marker is present, so mise declines to act.
Common situations: Machines where a cask was first installed via mise and later managed by Homebrew (or vice versa); brew upgrades recreating .metadata on a mise-installed cask; mixed brew/mise workflows on shared state.
Related errors
- brew-cask is not available: {}
- artifact target is now claimed by another cask: {}
- brew is not available: {}
- brew-cask prune is not supported on windows
- brew-cask:{}: Homebrew owns this cask; remove it with Homebr
AI-assisted analysis of jdx/mise@9dcfcaa0dc (2026-08-17).
Data as JSON: /api/errors/60d06b02de75014f.
Report an issue: GitHub.