Observation-class, measured while reviewing the fourth instance tonight. No gate is red, and
hintCovers' refusal is correct and correctly priced — this is not a request to change it.
Filed unassigned, no pm:queue.
The root cause, and why it should stay
scripts/pm/dispatch-gates.mjs:920:
if(!hint.includes('/')&&!plain.startsWith('.'))returnfalse;A bare single-segment literal is refused unless dot-prefixed. hintCovers' own docblock carries
the measurement: accepting bare top-level directory words was priced at +139084 fabricated
pairs, because packages, apps and examples are path components in dozens of gates that
never read those roots. The refusal buys more than it costs and should stay.
The sanctioned escape exists and the tool names it in its own residue text:
"That second one is escapable, and gates have escaped it: a gate whose population really is a
root file reaches it by declaring the subtree spelling (AGENTS.md/**), after which it is no
longer silent for that file."
PR #10114 took that escape for check-role-word.mjs (ROOT_DIR_WATCH_HINTS = ['skills/**']),
and #10662 / #10687 took it for check:doc-authoring and check:doc-formula-expressions.
What is missing: nothing tracks who still needs to take it
Measured on origin/main = 47cd3ec1f8 (2026-08-21T09:09:54Z), node scripts/pm/dispatch-gates.mjs <path>:
4 unreachable BY CONSTRUCTION, and they are two different species:
| family | literal | species |
|---|
check:examples-live-imports | examples | ⚠️escapable — "the tree HAS it; the covering rule refuses the literal as too generic" |
check:parse-guard | scripts | ⚠️escapable — same |
check:driver-memory-census | @objectstack/driver-memory | genuinely dead — "never was a repo path" |
check-test-completeness.mjs | @objectstack/types, @objectstack/example-showcase, @objectstack/embedder-openai | genuinely dead — same |
The residue block also states that the same escapable shape lives inside the silent bucket
(79 of 125 families), for a gate whose population is a repo-root file spelled as a bare
filename. So the population of this class is not bounded by the 4 named above, and no one
knows its size.
Why this is worth a card rather than four more cards
Each instance has been found by a different person, on a different card, by happening to read the
residue block on the way past:
That fourth one is the tell. The card was about parse-guard's blind spot, and the dispatch
derivation for it could not name parse-guard. The per-gate remedy is right, but discovering who
needs it depends on a human reading a diagnostic block that is printed on every run and skimmed
on most.
Direction (not a decision)
Make the escapable species a declared, ⛔ shrink-only ledger, exactly the shape #10665 landed
for KNOWN_IMPORT_UNSAFE: a gate whose population literal is separator-less and whose first
segment the tree does have must either declare its subtree spelling or appear on the ledger.
Nothing new can join; entries leave as gates take the escape.
That turns "N gates are silently unnameable, discovered one at a time" into a bounded list with a
verdict, and — unlike widening hintCovers — it costs nothing in fabricated pairs. It also
answers the population question the residue block currently leaves open, since building the
ledger requires enumerating the silent-bucket instances too.
⛔ Explicitly not proposed: changing the :920 refusal. The +139084 measurement stands.
Refs
#10114 (the first escape, and the precedent) · #10662 / #10687 (two more) · #10314 (the third,
still open — a valid individual fix, not superseded by this) · #10665 (the shrink-only ledger
shape) · #10653 (where the fourth was found) · dispatch-gates.mjs:920 and hintCovers' docblock
Generated by Claude Code
Observation-class, measured while reviewing the fourth instance tonight. No gate is red, and
hintCovers' refusal is correct and correctly priced — this is not a request to change it.Filed unassigned, no
pm:queue.The root cause, and why it should stay
scripts/pm/dispatch-gates.mjs:920:A bare single-segment literal is refused unless dot-prefixed.
hintCovers' own docblock carriesthe measurement: accepting bare top-level directory words was priced at +139084 fabricated
pairs, because
packages,appsandexamplesare path components in dozens of gates thatnever read those roots. The refusal buys more than it costs and should stay.
The sanctioned escape exists and the tool names it in its own residue text:
PR #10114 took that escape for
check-role-word.mjs(ROOT_DIR_WATCH_HINTS = ['skills/**']),and #10662 / #10687 took it for
check:doc-authoringandcheck:doc-formula-expressions.What is missing: nothing tracks who still needs to take it
Measured on
origin/main=47cd3ec1f8(2026-08-21T09:09:54Z),node scripts/pm/dispatch-gates.mjs <path>:4 unreachable BY CONSTRUCTION, and they are two different species:
check:examples-live-importsexamplescheck:parse-guardscriptscheck:driver-memory-census@objectstack/driver-memorycheck-test-completeness.mjs@objectstack/types,@objectstack/example-showcase,@objectstack/embedder-openaiThe residue block also states that the same escapable shape lives inside the
silentbucket(79 of 125 families), for a gate whose population is a repo-root file spelled as a bare
filename. So the population of this class is not bounded by the 4 named above, and no one
knows its size.
Why this is worth a card rather than four more cards
Each instance has been found by a different person, on a different card, by happening to read the
residue block on the way past:
check:doc-authoring(baredocs/skills/content), landed fix(pm): declare check:doc-authoring's real population to dispatch-gates #10662check:doc-formula-expressions(same), landed fix(lint): declare check:doc-formula-expressions' real corpus to dispatch-gates #10687examples, the same class #10114 fixed for check-role-word #10314 —check:examples-live-imports(bareexamples), still opencheck:parse-guard(barescripts) — found tonight by the dev on packages/lint's three validators score an unparseable source CLEAN — the defect is the unread parseDiagnostics, not the try/catch #10653, who noticed thatthe gate family their card was about could not be named by the derivation, and ran it by hand
That fourth one is the tell. The card was about parse-guard's blind spot, and the dispatch
derivation for it could not name parse-guard. The per-gate remedy is right, but discovering who
needs it depends on a human reading a diagnostic block that is printed on every run and skimmed
on most.
Direction (not a decision)
Make the escapable species a declared, ⛔ shrink-only ledger, exactly the shape #10665 landed
for
KNOWN_IMPORT_UNSAFE: a gate whose population literal is separator-less and whose firstsegment the tree does have must either declare its subtree spelling or appear on the ledger.
Nothing new can join; entries leave as gates take the escape.
That turns "N gates are silently unnameable, discovered one at a time" into a bounded list with a
verdict, and — unlike widening
hintCovers— it costs nothing in fabricated pairs. It alsoanswers the population question the residue block currently leaves open, since building the
ledger requires enumerating the
silent-bucket instances too.⛔ Explicitly not proposed: changing the
:920refusal. The +139084 measurement stands.Refs
#10114 (the first escape, and the precedent) · #10662 / #10687 (two more) · #10314 (the third,
still open — a valid individual fix, not superseded by this) · #10665 (the shrink-only ledger
shape) · #10653 (where the fourth was found) ·
dispatch-gates.mjs:920andhintCovers' docblockGenerated by Claude Code