Skip to content

finding: five more gates genuinely read a repo-root instruction file and still score silent for it — the root-file class that #9964 closed for only one gate #9979

Description

@os-warren

Sibling of #9964, found while measuring it. That card fixed check:pm-skill-ratchet alone; the measurement showed the same hole open in five other gate families, and the fix for each is now a one-line declaration with a landed precedent.

The measurement

Measuring the option-2 extractor widening (114 families x 6326 tracked files) enumerated every (family, root file) pair that a bare top-level *.md literal would create. Nine of the seventeen are genuine — the gate really reads that repo-root file from a module-body literal — and all nine except the ratchet's are still invisible to dispatch-gates:

gateroot file it really readswhere the literal lives
check:pm-skill-id-lintAGENTS.mdEXTRA_FILES = ['.claude/agents/os-dev.md', 'AGENTS.md']
check:pm-governed-mergesAGENTS.md, CLAUDE.mdGOVERNED_SURFACES rows agents-md / claude-md (exact:)
check:pm-governed-proseAGENTS.mdregister entry path: 'AGENTS.md'
check:docs-audit-scopeAGENTS.mdconst AGENTS_REL = 'AGENTS.md'
check:required-contextsAGENTS.mdINSTRUCTION_SURFACES entry file: 'AGENTS.md'
check:doc-anchorsREADME.md, ARCHITECTURE.mdconst EXTRA_SOURCES = ['README.md', 'ARCHITECTURE.md']

So an AGENTS.md-only card today derives one gate where six genuinely read the file, and a README.md or ARCHITECTURE.md card still derives zero while check:doc-anchors is REQUIRED in lint.yml and is the repo's only fragment coverage.

check-doc-anchors.mjs already says so about itself, in its own docblock: "README.md or ARCHITECTURE.md still has to reach this gate by judgment". That line was written before the declaration form existed.

Why this is now cheap

The extractor is deliberately closed to bare top-level filenames and should stay closed — re-measured under #9964, widening it costs 17 new pairs of which 8 are fabricated (gates spell README.md / CHANGELOG.md as basenames they join with a package directory), so a README.md card would gain six leads of which five are false. That refusal is correct and should not be revisited.

What changed is that #9964 established the per-gate escape hatch: declare the root-file population as the subtree spelling (AGENTS.md/**), which extractWatchHints already accepts and collapseHint reduces back to the single file. Measured cost of the ratchet's declaration: +1 watch-hint pair, one family, one file, zero fabricated. Each gate above is the same one-line change plus a self-test pin.

Scope note

Deliberately not folded into #9964's PR: those are five other gates, so it is a different file surface and a different set of gate self-tests — outside that card's claimed files. Filing it rather than fixing it in passing.

Each row is independently landable, so this may be worth splitting per gate at triage; check:doc-anchors is the highest-value one (REQUIRED, unique coverage, and its own docblock already flags the gap).


Generated by Claude Code

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions