Follow-up to #13265 / PR #13288, filed at the dispatching PM's ruling rather than by that card's dev (it named the residue and correctly declined to fold a governed-surface prose change into a code PR).
The residue
PR #13288 closes this mechanically for anyone who runs scripts/ablation-dist-preflight.mjs: the script now reads git status --porcelain over the whole worktree and refuses on a restore leg whose tree still differs from HEAD.
It cannot reach an agent that never runs the preflight and reasons about the restore leg from per-path proofs alone. That agent is not hypothetical — it is the exact shape of the incident #13265 was filed about.
Why per-path proofs are not enough, measured
From #13265's reproduction. After mutating a packages/spec source, building, then restoring only the source:
| proof |
result on a tree that is NOT restored |
git diff HEAD -- THE_SOURCE_PATH |
empty (0 lines) |
git hash-object THE_SOURCE_PATH |
equal to the HEAD blob |
grep -c MARKER THE_SOURCE_PATH |
0 |
git status --porcelain (whole tree) |
1 dirty path — packages/spec/authorable-surface/data.json |
⇒ All three per-path proofs pass on a tree that is still dirty. The leak is in a generated, committed artifact the build rewrote as a side effect, which no per-path check on the mutated file can see. The next build then refuses with 1 authorable key(s) disappeared from the contract — a false red attributable to the ablation, not the tree.
Proposed remedy
One sentence in the ablation discipline saying the restore leg is proved by a whole-tree git status --porcelain, never by a per-path diff.
⚠️ Governed surface ⇒ human merge. The text lives in .claude/agents/os-dev.md, with a twin in .claude/skills/dogfood-verification/SKILL.md. ⛔ Nothing here should be dispatched to a dev seat to edit.
What this card does NOT claim
Verification
node scripts/ablation-dist-preflight.mjs --self-test
and #13265 / PR #13288 for the full reproduction, including the differential against the pre-fix script.
Follow-up to #13265 / PR #13288, filed at the dispatching PM's ruling rather than by that card's dev (it named the residue and correctly declined to fold a governed-surface prose change into a code PR).
The residue
PR #13288 closes this mechanically for anyone who runs
scripts/ablation-dist-preflight.mjs: the script now readsgit status --porcelainover the whole worktree and refuses on a restore leg whose tree still differs from HEAD.It cannot reach an agent that never runs the preflight and reasons about the restore leg from per-path proofs alone. That agent is not hypothetical — it is the exact shape of the incident #13265 was filed about.
Why per-path proofs are not enough, measured
From #13265's reproduction. After mutating a
packages/specsource, building, then restoring only the source:git diff HEAD -- THE_SOURCE_PATHgit hash-object THE_SOURCE_PATHgrep -c MARKER THE_SOURCE_PATHgit status --porcelain(whole tree)packages/spec/authorable-surface/data.json⇒ All three per-path proofs pass on a tree that is still dirty. The leak is in a generated, committed artifact the build rewrote as a side effect, which no per-path check on the mutated file can see. The next build then refuses with
1 authorable key(s) disappeared from the contract— a false red attributable to the ablation, not the tree.Proposed remedy
One sentence in the ablation discipline saying the restore leg is proved by a whole-tree
git status --porcelain, never by a per-path diff..claude/agents/os-dev.md, with a twin in.claude/skills/dogfood-verification/SKILL.md. ⛔ Nothing here should be dispatched to a dev seat to edit.What this card does NOT claim
domain:*, priority or type label — triage's field. Noting only that the remedy is a skills-surface prose change, not adevxtooling change, so the routing is probably not this lane's.packages/specleaks the mutation into the COMMITTED authorable-surface baseline — restoring only the mutated source leaves a tree whose next build refuses, as a false red #13265 already records.Verification
and #13265 / PR #13288 for the full reproduction, including the differential against the pre-fix script.