Skip to content

finding: dispatch-gates cannot name check:examples-live-imports — its root literal is the bare word examples, the same class #10114 fixed for check-role-word #10314

Description

@os-zhuang

Observation only — no gate is red. Found while implementing #9932 (scripts/check-role-word.mjs), whose own dispatch derivation printed this on the way past. Filed unassigned.

What the tool says about itself

node scripts/pm/dispatch-gates.mjs, run for an unrelated card, prints:

3 unreachable BY CONSTRUCTION — the literal is not a path this derivation can reach…
- pnpm check:examples-live-imports [lint.yml] dead: 'examples' — the tree HAS it;
the covering rule refuses the literal as too generic (no path separator)

examples/ plainly exists and the gate plainly reads it — scripts/check-examples-live-imports.mjs:253 is const root = join(REPO_ROOT, 'examples');. The extractor reads code string literals, and the only one describing this gate's population is the bare single-segment word examples, which hintCovers refuses by design (the measured reason: 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 examples/** spellings elsewhere in that file are in comments and in author-facing message text, which the extractor does not read.

Net effect: the gate scores the same quiet unreachable for every card in the tree, so no dispatch brief ever names it — including a brief for the one edit that is most likely to break it.

Why this is the escapable species, not the dead one

The residue block groups this with two genuinely dead literals (@objectstack/driver-memory, @objectstack/types — package names that were never repo paths). This one is different, and the tool's own text says so:

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.

That is precisely what PR #10114 did for the sibling case: check-role-word.mjs walks content/docs (separator, extractable) and skills (no separator, refused), and it now carries

constROOT_DIR_WATCH_HINTS=['skills/**'];

as provenance only — nothing in the gate reads it. check-examples-live-imports.mjs is the same shape one root over.

Why it is worth someone's time

The gate exists because an edit inside an example app can break a packages/** test that imports it live, and the affected-subset CI model structurally cannot see that coupling (#8754 records the measurement and the merge-queue failure that produced it). The card most likely to break this gate is therefore an examples/** edit — exactly the card for which the derivation currently names nothing. That is the same cost shape the skills half paid before #10114: PR #10038 derived a green local union and met check-role-word as red CI, costing one repair round.

CI enforces either way (lint.yml carries no path filter for this job), so nothing is unprotected. What is missing is discoverability.

Not asserted

No claim that examples/** is the whole right declaration. The gate's population arguably has two halves — the example apps it reads, and the packages/** tests whose imports it inventories — and whether both, one, or neither should be declared is a judgement this issue does not make. Whoever takes it should also check the self-test discipline #10114 landed alongside its declaration: the coupling is asserted in both directions, so a declaration cannot drift from what the gate actually walks.

Related: #9932 (the sibling half of this file's own root handling), #9964 (the declaration pattern), #10038 and PR #10114 (the measured cost and the fix for the skills root), #8754 (why this gate exists), #9955 (a different, non-escapable species of the same blind spot).

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