Found while implementing #13163 (declaring check:where-matcher's test-file population where the derivation can read it). ⛔ Not repaired in PR #13231: that card's brief fences scripts/pm/dispatch-gates.mjs off explicitly, so this is recorded rather than folded in. Filed unassigned.
The stale claim
scripts/pm/dispatch-gates.mjs, in the CONVENTION_GATES docblock (~line 4534 on a81aa9dd5e), justifies the named convention table by measuring the three test-file ratchets' hint sets:
* ... Measured on this tree, their entire hint sets are:
*
* check:query-options-erasure scripts/query-options-erasure-baseline.json, origin/main
* check:where-matcher scripts/where-matcher-conformance.baseline.json, origin/main
* check:engine-double-contract scripts/engine-double-contract.baseline.json,
* @objectstack/{core,objectql,metadata-core}
*
* Not one of those can cover a card's path, so all three score `silent` ...
PR #13231 declares packages/**/*.test.ts beside that gate's SCAN_ROOT. Measured on that branch, extractWatchHints over scripts/check-where-matcher-conformance.mjs now returns two hints, not one, and the second one does cover a card's path:
["scripts/where-matcher-conformance.baseline.json", "packages/**/*.test.ts"]
Driving the real derivation on the specimen test file, that gate moves out of the silent bucket and into MATCHED (20 -> 21 matched, 127 -> 126 silent, 26 -> 25 roster-only). So two things in the quoted block go false at once: the row for check:where-matcher, and the sentence "Not one of those can cover a card's path, so all three score silent", which is the load-bearing half — it is the argument for why the named table has to exist for these three.
Why it matters rather than being a typo
That docblock is the authority a future author reads before touching the convention table. It now says the gate is unnameable by any path derivation, one section above a table that is correct and a derivation that no longer agrees with the prose. This is the class of #8604 (a header stating hint extraction "does not skip comments" after maskComments retired that) and #10012 (residue prose still naming README.md as the live unreachable-root-file specimen after it was declared) — both filed and both closed as real.
⚠️ The convention-table ENTRY itself is not affected and should stay: it fires on the change KIND, reaches a card dispatched before its code exists, and is pinned by this tool's own self-test. Only the measurement quoted above and the sentence drawn from it are stale.
Reproduce
On the claude/issue-13163-where-matcher-hint branch (or after PR #13231 lands):
node -e "import('./scripts/pm/dispatch-gates.mjs').then(async(m)=>{
const {readFileSync}=await import('node:fs');
const t=m.watchHintTree(m.trackedFiles());
const p='scripts/check-where-matcher-conformance.mjs';
console.log(m.extractWatchHints(readFileSync(p,'utf8'),p,{tree:t})); })"
Not asserted
Whether the right repair is to re-measure the three rows in place, to drop the per-gate hint listing in favour of a pointer at --residue (which derives it and cannot go stale), or to restate the paragraph in terms of the two ratchets it is still true of. That is a judgement about this docblock's job, not a measurement. #13126 also touches this file and queues nearby, so the two may want ordering.
Generated by Claude Code
Found while implementing #13163 (declaring
check:where-matcher's test-file population where the derivation can read it). ⛔ Not repaired in PR #13231: that card's brief fencesscripts/pm/dispatch-gates.mjsoff explicitly, so this is recorded rather than folded in. Filed unassigned.The stale claim
scripts/pm/dispatch-gates.mjs, in theCONVENTION_GATESdocblock (~line 4534 ona81aa9dd5e), justifies the named convention table by measuring the three test-file ratchets' hint sets:PR #13231 declares
packages/**/*.test.tsbeside that gate'sSCAN_ROOT. Measured on that branch,extractWatchHintsoverscripts/check-where-matcher-conformance.mjsnow returns two hints, not one, and the second one does cover a card's path:Driving the real derivation on the specimen test file, that gate moves out of the
silentbucket and into MATCHED (20 -> 21matched,127 -> 126silent,26 -> 25roster-only). So two things in the quoted block go false at once: the row forcheck:where-matcher, and the sentence "Not one of those can cover a card's path, so all three scoresilent", which is the load-bearing half — it is the argument for why the named table has to exist for these three.Why it matters rather than being a typo
That docblock is the authority a future author reads before touching the convention table. It now says the gate is unnameable by any path derivation, one section above a table that is correct and a derivation that no longer agrees with the prose. This is the class of #8604 (a header stating hint extraction "does not skip comments" after
maskCommentsretired that) and #10012 (residue prose still namingREADME.mdas the live unreachable-root-file specimen after it was declared) — both filed and both closed as real.Reproduce
On the
claude/issue-13163-where-matcher-hintbranch (or after PR #13231 lands):Not asserted
Whether the right repair is to re-measure the three rows in place, to drop the per-gate hint listing in favour of a pointer at
--residue(which derives it and cannot go stale), or to restate the paragraph in terms of the two ratchets it is still true of. That is a judgement about this docblock's job, not a measurement. #13126 also touches this file and queues nearby, so the two may want ordering.Generated by Claude Code