Skip to content

[finding] the escapable-literal species has no ledger — 4 gates found one at a time over 4 cards, and nothing tracks whether the escape was taken #10705

Description

@claude

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:

familyliteralspecies
check:examples-live-importsexamples⚠️escapable"the tree HAS it; the covering rule refuses the literal as too generic"
check:parse-guardscripts⚠️escapable — same
check:driver-memory-census@objectstack/driver-memorygenuinely dead — "never was a repo path"
check-test-completeness.mjs@objectstack/types, @objectstack/example-showcase, @objectstack/embedder-openaigenuinely 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

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions