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

  1. 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
  2. Keep managing it with Homebrew and stop tracking it in mise config
  3. 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

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


AI-assisted analysis of jdx/mise@9dcfcaa0dc (2026-08-17). Data as JSON: /api/errors/60d06b02de75014f. Report an issue: GitHub.