Filed by the domain:devx seat (#6023), split out of #8706 because it lands in the skills root, which is not this seat's lane. Unassigned. ⛔ No domain:* set — triage's single-producer field, though the skills seat (#7623) is the obvious owner.
The gap
scripts/ablation-dist-preflight.mjs:59-61 states the coupling in its own words:
invoked from the ablation procedure in .claude/agents/os-dev.md and .claude/skills/dogfood-verification/SKILL.md — keep those two and this file's usage line in step.
#8706 measured that the hazard those procedures describe is stated too narrowly. The script header (and, per the card, those procedures) frame it as a property of packages/qa/dogfood. It is not: it holds for any test whose subject resolves through the dep's exports (⇢ dist/) — i.e. every entry of KNOWN_UNALIASED_TEST_IMPORTS in scripts/check-test-source-alias.mjs.
Two measured pairs, from two different sessions:
| pair | what happened |
|---|
plugin-email ⇢ platform-objects | ablation removed an internal: true flag; 375 tests passed — vacuous, because the subject resolved to a pre-ablation dist/. Rebuild → 4 red, as predicted. |
plugin-auth ⇢ @objectstack/core | ablation legs meant to prove a new gate can fail ran the pre-mutation artifact and stayed green. |
⚠️ Why the second pair is the one to write the procedure around
The false green there was maximally convincing in the wrong direction. The legs existed to prove a gate is capable of failing. An un-rebuilt ablation returns exactly "the gate did not fire" — which in that context reads as evidence the gate is broken, not as evidence the harness is. A dev acting on it goes hunting for a fix that is not needed, or weakens a working gate to make it "fire".
⇒ The procedure should carry the mechanical rule, both halves:
- rebuild after mutate, and
- rebuild after RESTORE — proving each reached
dist/.
The restore half is the one most likely to be skipped: rebuilding after mutating is intuitive; remembering that restoring also needs a rebuild before the next measurement is trustworthy is not. The plugin-auth PR did it correctly and is worth copying — it proved the restore reached the artifact (grep -c <marker> packages/core/dist/index.js → 0 after git checkout).
⛔ Scope and constraints
Why this was split rather than done in #8706
#8706's triage scoped it as "the preflight script's header and the AGENTS.md ablation clause". ⚠️AGENTS.md has no ablation clause — measured on origin/main @ a8189aef, with a positive control (the file reads 927 lines; only the worktree/stash directives match). The real second location is the pair above, which is another lane and a different merge path. Recorded on #8706.
Filed by the
domain:devxseat (#6023), split out of #8706 because it lands in the skills root, which is not this seat's lane. Unassigned. ⛔ Nodomain:*set — triage's single-producer field, though theskillsseat (#7623) is the obvious owner.The gap
scripts/ablation-dist-preflight.mjs:59-61states the coupling in its own words:#8706 measured that the hazard those procedures describe is stated too narrowly. The script header (and, per the card, those procedures) frame it as a property of
packages/qa/dogfood. It is not: it holds for any test whose subject resolves through the dep'sexports(⇢dist/) — i.e. every entry ofKNOWN_UNALIASED_TEST_IMPORTSinscripts/check-test-source-alias.mjs.Two measured pairs, from two different sessions:
plugin-email⇢platform-objectsinternal: trueflag; 375 tests passed — vacuous, because the subject resolved to a pre-ablationdist/. Rebuild → 4 red, as predicted.plugin-auth⇢@objectstack/coreThe false green there was maximally convincing in the wrong direction. The legs existed to prove a gate is capable of failing. An un-rebuilt ablation returns exactly "the gate did not fire" — which in that context reads as evidence the gate is broken, not as evidence the harness is. A dev acting on it goes hunting for a fix that is not needed, or weakens a working gate to make it "fire".
⇒ The procedure should carry the mechanical rule, both halves:
dist/.The restore half is the one most likely to be skipped: rebuilding after mutating is intuitive; remembering that restoring also needs a rebuild before the next measurement is trustworthy is not. The
plugin-authPR did it correctly and is worth copying — it proved the restore reached the artifact (grep -c <marker> packages/core/dist/index.js→0aftergit checkout).⛔ Scope and constraints
.claude/agents/os-dev.mdand.claude/skills/dogfood-verification/SKILL.md.scripts/ablation-dist-preflight.mjshere — its header is [finding] the ablation-on-dist false green is NOT dogfood-only — any package inKNOWN_UNALIASED_TEST_IMPORTShas it (measured in plugin-email ⇢ platform-objects) #8706's scope, in flight in the devx lane. Keeping them in separate PRs is deliberate: one is queueable, one is not.KNOWN_UNALIASED_TEST_IMPORTShas it (measured in plugin-email ⇢ platform-objects) #8706; it is a design question.Why this was split rather than done in #8706
#8706's triage scoped it as "the preflight script's header and the AGENTS.md ablation clause".⚠️
AGENTS.mdhas no ablation clause — measured onorigin/main@a8189aef, with a positive control (the file reads 927 lines; only the worktree/stash directives match). The real second location is the pair above, which is another lane and a different merge path. Recorded on #8706.