Filed unassigned, recording only. Measured 2026-08-27 on origin/main @ 1246b4cf2 while implementing #12299 (the residue-side repair, ruling B of #12371).
The gap
hintCovers compares WHOLE SEGMENTS. An ESM/TypeScript relative import spells its target without the extension. So after #12371's producer fix resolves a module-relative literal against its writing script, the hint is correct and still reaches nothing:
hint packages/spec/scripts/lib/dist-freshness <- what the gate imports
tree packages/spec/scripts/lib/dist-freshness.ts <- what the gate reads
Measured over the live fleet (176 families, 829 distinct hints, 385 inert, 7125 tracked files): 38 distinct inert hints name a real tracked file once a file extension is appended. All 38 resolve through .ts.
The cost is in the MATCHED column, and it is a MISSING lead, not a fabricated one: a card editing packages/spec/scripts/lib/dist-freshness.ts is never told that check:api-surface, check:dual-source-exports, check:exported-any and check:entry-nameability all read it. Nine families are unreachable entirely for this reason — their whole declared population is extensionless specifiers.
Sample of the 38 (full list reproducible with the census in #12299's PR):
packages/spec/scripts/lib/dist-freshness packages/spec/src/kernel/protocol-version
packages/spec/scripts/lib/sharded-artifacts packages/spec/src/migrations/registry
packages/spec/scripts/lib/strictness-ledger packages/spec/src/conversions/registry
packages/spec/scripts/lib/export-origins-layout packages/spec/src/ui/react-blocks
Why #12299 did not take it
#12299's declared surface is the residue printer. It teaches unreachableReason to name the real file and stops unreachableClass filing these as "the layout moved", so the rows stop lying — but it moves no verdict, and hintCovers is untouched. Teaching the covering rule to follow a dropped extension is a fleet-wide MATCHED-column widening, which under firstPartyImportTargets' docblock owes its own pair-count measurement before it lands. That is this card.
What a card here would owe
Dedup
Searched the open domain:devx board (99 issues, listed and grepped locally; the /search/issues endpoint is not reachable from this seat). The neighbours are #12470 (a SINGLE-SEGMENT module-relative literal contributes no hint at all — a different predicate: there no hint is produced, here the hint is produced and misses by the extension) and #12514 (which describes these same nine families as a LAYOUT MOVE; see the correction posted there). Nothing open covers this class.
Refs: #12371 (producer fix A) · #12299 (residue repair B) · #12470 (the adjacent single-segment class)
Generated by Claude Code
Filed unassigned, recording only. Measured 2026-08-27 on
origin/main@1246b4cf2while implementing #12299 (the residue-side repair, ruling B of #12371).The gap
hintCoverscompares WHOLE SEGMENTS. An ESM/TypeScript relative import spells its target without the extension. So after #12371's producer fix resolves a module-relative literal against its writing script, the hint is correct and still reaches nothing:Measured over the live fleet (176 families, 829 distinct hints, 385 inert, 7125 tracked files): 38 distinct inert hints name a real tracked file once a file extension is appended. All 38 resolve through
.ts.The cost is in the MATCHED column, and it is a MISSING lead, not a fabricated one: a card editing
packages/spec/scripts/lib/dist-freshness.tsis never told thatcheck:api-surface,check:dual-source-exports,check:exported-anyandcheck:entry-nameabilityall read it. Nine families are unreachable entirely for this reason — their whole declared population is extensionless specifiers.Sample of the 38 (full list reproducible with the census in #12299's PR):
Why #12299 did not take it
#12299's declared surface is the residue printer. It teaches
unreachableReasonto name the real file and stopsunreachableClassfiling these as "the layout moved", so the rows stop lying — but it moves no verdict, andhintCoversis untouched. Teaching the covering rule to follow a dropped extension is a fleet-wide MATCHED-column widening, which underfirstPartyImportTargets' docblock owes its own pair-count measurement before it lands. That is this card.What a card here would owe
hintCoversand nothing else.hintCoverstries the extensions). These are not equivalent — the first changes the printed hint, the second does not.extractWatchHintsstrips a module-relative literal's own depth, sounreachableReasonprints false "never was a repo path" rows for files the gates really read — residue-side repair, shape pending the #12371 ruling #12299: over the same corpus a rule accepting ANY suffix in the same directory selects the same 38 hints but names a.test.tssibling for 4 of them (protocol-version,metadata-type-schemas,react-blocks,manifest-collection-spelling). Whichever site follows the extension inherits that trap.Dedup
Searched the open
domain:devxboard (99 issues, listed and grepped locally; the/search/issuesendpoint is not reachable from this seat). The neighbours are #12470 (a SINGLE-SEGMENT module-relative literal contributes no hint at all — a different predicate: there no hint is produced, here the hint is produced and misses by the extension) and #12514 (which describes these same nine families as a LAYOUT MOVE; see the correction posted there). Nothing open covers this class.Refs: #12371 (producer fix A) · #12299 (residue repair B) · #12470 (the adjacent single-segment class)
Generated by Claude Code