{"record":{"id":"60d06b02de75014f","repo":"jdx/mise","slug":"homebrew-now-owns-this-cask","errorCode":null,"errorMessage":"Homebrew now owns this cask","messagePattern":"Homebrew now owns this cask","errorType":"exception","errorClass":"eyre::Report","httpStatus":null,"severity":"error","filePath":"src/system/packages/brew/cask.rs","lineNumber":7006,"sourceCode":"        }\n    }\n    for target in &candidate.receipt.targets {\n        if claims\n            .get(&target.path)\n            .is_some_and(|tokens| tokens.iter().any(|token| token != &candidate.token))\n        {\n            bail!(\n                \"artifact target is now claimed by another cask: {}\",\n                target.path.display()\n            );\n        }\n    }\n    Ok(())\n}\n\nfn validate_cask_prune_candidate(candidate: &CaskPruneCandidate) -> Result<()> {\n    if homebrew_metadata_present(&candidate.token) {\n        bail!(\"Homebrew now owns this cask\");\n    }\n    let receipt = &candidate.receipt;\n    if read_receipt(&candidate.version_dir)?.as_ref() != Some(receipt) {\n        bail!(\"ownership receipt has changed\");\n    }\n    if receipt.schema_version != 3 || !receipt.prune_safe || !receipt.pkg_ids.is_empty() {\n        bail!(\"receipt is not marked safe for direct-artifact pruning\");\n    }\n    let records = receipt\n        .targets\n        .iter()\n        .map(|record| (record.path.clone(), record))\n        .collect::<BTreeMap<_, _>>();\n    let expected = receipt\n        .apps\n        .iter()\n        .chain(&receipt.binaries)\n        .chain(&receipt.fonts)","sourceCodeStart":6988,"sourceCodeEnd":7024,"githubUrl":"https://github.com/jdx/mise/blob/9dcfcaa0dc8747a2577d3270b69bb9d8313b2807/src/system/packages/brew/cask.rs#L6988-L7024","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"# before: cask now owned by Homebrew, mise prune refuses\nbrew uninstall --cask <token> && mise rm brew:cask/<token>\n# after: Homebrew removed it cleanly; mise tracking dropped","handlingStrategy":"validation","validationCode":"fn homebrew_owns(token: &str) -> bool {\n    caskroom_token_dir(token)\n        .join(\".metadata\")\n        .symlink_metadata()\n        .is_ok()\n}\n// before prune:\nif homebrew_owns(token) {\n    eprintln!(\"Homebrew owns this cask; use brew uninstall --cask {token}\");\n}","typeGuard":null,"tryCatchPattern":"match validate_cask_prune_candidate(&candidate) {\n    Ok(()) => prune(),\n    Err(e) if e.to_string().contains(\"Homebrew now owns this cask\") => {\n        warn!(\"deferring to brew uninstall --cask {}\");\n        Ok(())\n    }\n    Err(e) => Err(e),\n}","preventionTips":["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"],"tags":["brew-cask","prune","ownership","homebrew"],"backgroundTag":"ownership-conflict","analyzedSha":"9dcfcaa0dc8747a2577d3270b69bb9d8313b2807","analyzedAt":"2026-08-17T14:28:50.624Z","schemaVersion":2},"datasetVersion":"2026-08-22T04:17:13.399Z"}