---
name: containment-ownership-and-unknown-polarity
description: "Inbound-link sweeps are blind to containment ownership (a tree's own target needs no link); UNKNOWN's polarity must follow consequence asymmetry — destructive op treats unknown as in-use, advisory guard as warn-proceed."
metadata: 
  node_type: memory
  type: project
  originSessionId: 520cc386-a467-49d9-b1f9-c90853dfed9b
  modified: 2026-08-02T11:19:22.437Z
---

hertz's #103 pool-sweep dry run offered 91.91 GB for deletion — including the primary checkout's own target — because its orphan rule was "unstamped and nothing links to it." True only for SHARED pools: a tree's own target is owned by CONTAINMENT (the directory above it) and has no inbound link by construction. Fix derives the implicit owner from the enclosing source tree; a git worktree's `.git` is a FILE, so a dir-only check protects the primary checkout while offering every worktree's cache — the exact inversion of the safety (releases#103 leg 2, 2026-08-02).

**Why:** the commonest ownership relation produces no artifact a link-sweep can see, so the sweep's most confident row is its wrongest; and dry-run-by-default is what turns this class into a finding instead of a silent incident (nobody notices a deleted warm cache until the next 20-minute build).

**How to apply:** (1) before trusting an "orphan" classification, enumerate the ownership RELATIONS (link, stamp, containment) and check the classifier sees each; (2) pool-ness comes from cargo's CACHEDIR.TAG signature, never the dir name; (3) set UNKNOWN's polarity by consequence asymmetry — a destructive reap treats unresolvable liveness as IN USE (cost: disk), an advisory build guard treats it as warn-and-proceed (cost: friction); the same predicate takes opposite defaults at the two sites. (4) A reported zero needs a positive control to mean "none there" not "not looking". Related: [[absence-proxy-breaks-when-success-writes]], [[reap-subtree-not-session-dir]], [[remedy-must-run-from-refusal-state]].
