Skip to content

[finding] 38 watch hints name real files the gates read but miss the corpus by their file EXTENSION — every card touching those files is under-named #12781

Description

@claude

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions