Measured while working #13489 (PR #13797). Filed unassigned.
What happened
A PR touching three scripts/** files ran its full derived gate family locally — every family green — and CI reddened on pnpm check:ratchet-remedy-authority, a gate that was not in the derived family. Both readings were true, and of the same tree: nothing landed between the push and the failing run.
The measurement
node scripts/pm/dispatch-gates.mjs --residue scripts/check-self-test-wired.mjs scripts/check-self-test-workflow-commands.mjs scripts/measure-self-test-floor.mjs places it in:
Undetermined (source names no path at all — NOT known irrelevant): 39 famil(ies).
...
- pnpm check:ratchet-remedy-authority [lint.yml]
Not matched, not silent — undetermined, one of 39.
The cause is mechanical and visible in the gate's own source. It sweeps scripts/*.{mjs,mts} — a real, wide path population, 176 files on the day it was measured — but it builds that population at runtime from readdirSync(SCRIPTS_DIR). The string scripts/*.{mjs,mts} exists in the file only inside its output messages and one comment, never as a declared literal. So the derivation reads no path population, declares nothing, and makes no claim.
Compare the eight families that did match those same three paths: every one of them matched at gate source 'scripts/**', because their populations are spelled where the derivation can read them.
Why this is worth a card rather than a footnote
The derivation is honest about it in its own residue text — "NOT known irrelevant", and it even says the bucket is largely unexamined: "2 of those 39 undetermined famil(ies) DECLARE that they have no path population... Those have been examined; the rest of the bucket has not, and the two used to read alike." On the next line of the same output, check:release-body carries an explicit declared no path population marker with its reason; check:ratchet-remedy-authority carries nothing.
The gap is between that residue text and what a dispatch brief actually carries. The brief prints the matched list. A dev who runs exactly that list has run a set that does not contain this gate, and the honest caveat that would have warned them is in a section nobody pastes.
⭐ Note the class: a derivation that passes while not covering what its reader takes it to cover. That is the same shape as the card this was found on — a check believed to cover something on evidence other than its own assertion.
The remedy shape
Declare the subtree the gate really walks, beside the literal, using the ROOT_DIR_WATCH_HINTS idiom scripts/check-watch-hint-literal.mjs already gates. The gate then moves from undetermined to matched for every scripts/** card, and the derivation stops being silent about a sweep that reads every file in the directory.
⛔ Deliberately not done in PR #13797: that PR's scope was its own two files' new text, and this is a change to a third gate's declared population with its own gate to satisfy.
Worth checking at the same time
The other 37 undetermined families have not been examined. Any one of them that computes a wide population the same way is invisible in exactly the same manner, and the count says nothing about which.
Generated by Claude Code
Measured while working #13489 (PR #13797). Filed unassigned.
What happened
A PR touching three
scripts/**files ran its full derived gate family locally — every family green — and CI reddened onpnpm check:ratchet-remedy-authority, a gate that was not in the derived family. Both readings were true, and of the same tree: nothing landed between the push and the failing run.The measurement
node scripts/pm/dispatch-gates.mjs --residue scripts/check-self-test-wired.mjs scripts/check-self-test-workflow-commands.mjs scripts/measure-self-test-floor.mjsplaces it in:Not
matched, notsilent— undetermined, one of 39.The cause is mechanical and visible in the gate's own source. It sweeps
scripts/*.{mjs,mts}— a real, wide path population, 176 files on the day it was measured — but it builds that population at runtime fromreaddirSync(SCRIPTS_DIR). The stringscripts/*.{mjs,mts}exists in the file only inside its output messages and one comment, never as a declared literal. So the derivation reads no path population, declares nothing, and makes no claim.Compare the eight families that did match those same three paths: every one of them matched at
gate source 'scripts/**', because their populations are spelled where the derivation can read them.Why this is worth a card rather than a footnote
The derivation is honest about it in its own residue text — "NOT known irrelevant", and it even says the bucket is largely unexamined: "2 of those 39 undetermined famil(ies) DECLARE that they have no path population... Those have been examined; the rest of the bucket has not, and the two used to read alike." On the next line of the same output,
check:release-bodycarries an explicitdeclared no path populationmarker with its reason;check:ratchet-remedy-authoritycarries nothing.The gap is between that residue text and what a dispatch brief actually carries. The brief prints the matched list. A dev who runs exactly that list has run a set that does not contain this gate, and the honest caveat that would have warned them is in a section nobody pastes.
⭐ Note the class: a derivation that passes while not covering what its reader takes it to cover. That is the same shape as the card this was found on — a check believed to cover something on evidence other than its own assertion.
The remedy shape
Declare the subtree the gate really walks, beside the literal, using the
ROOT_DIR_WATCH_HINTSidiomscripts/check-watch-hint-literal.mjsalready gates. The gate then moves fromundeterminedtomatchedfor everyscripts/**card, and the derivation stops being silent about a sweep that reads every file in the directory.⛔ Deliberately not done in PR #13797: that PR's scope was its own two files' new text, and this is a change to a third gate's declared population with its own gate to satisfy.
Worth checking at the same time
The other 37 undetermined families have not been examined. Any one of them that computes a wide population the same way is invisible in exactly the same manner, and the count says nothing about which.
Generated by Claude Code