Skip to content

[finding] dispatch-gates' CONVENTION_GATES docblock states a measured hint set for check:where-matcher that PR #13231 makes false — and the sentence built on it ("all three score silent") #13232

Description

@os-elon

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

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions