Split 2026-07-19 out of GET-050 (landed 64525364) and the STATUS-008 loop.js loss. GET-050 band-restamps carried files AFTER the get so dirt stays visible — but the DECISION input is untouched: get's pending detection consumes classify, whose STATUS-011 has(mtime) fast path answers "bytes unchanged since row X", never "clean vs the CURRENT base".
9928a0be, unverified): file put-staged (restamp in the stamp set), bytes unchanged since the put (stamp VALID), upstream moves the file's base entry; bare get → fast path says clean → the clean-overwrite leaf checks out the new base blob over the wt bytes. Discard happens BEFORE GET-050's carrySweep could see dirt ("iff still dirty vs the new base" is false once overwritten) — silent, unrecoverable unless the staged blob rode the put row.//STATUS-008-f21 loop.js casualty itself ran that tree's OWN f21-era (pre-GET-048) get code via the jsrc climb — it motivates but does not prove the tip hole; hence repro-first on the tip.RED-first on the pristine tip: the shape above must show the discard (or prove the tip safe — a NO-REPRO with evidence closes this DONT).
//STATUS-008-f21 (evidence tree).NO-REPRO on tip 9928a0be (opus worker //GET-052, 2026-07-19) — the hypothesis is structurally impossible in current get:
dirty = onDisk != baseBytes(oldSha) off full reads (get.js:1032-1038) — the STATUS-011 stamp set never gates it. Merkle prune (get.js:926) keys on tree-sha equality, so a base-moved file always reaches the content check....v weave-preserved; staged valid-stamp conflicting ...! with markers, non-conflicting ...v — nothing discarded. Suites test/get/{carry-stamp,divergent-dirty-weave,dirty,divergent-committed-add,restore-deleted} PASS.//STATUS-008-f21 loop.js loss was that tree's OWN pre-GET-048 get code — not tip evidence. The generic write-seam backstop stays GET-051 (any misclassification, incl. old-code trees and post).