You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
ci(gates): declare this gate's bare roots so the dispatch derivation can see it
`INSTRUCTION_ROOTS` and `EXECUTED_ROOTS` spelled two of their four roots as bare
single-segment words. `extractWatchHints` builds no hint from a literal without
a separator, so a card touching `scripts/**` or `skills/**` derived this gate
NOWHERE — including the cards most likely to add the spelling it exists to
judge. `scripts/pm/bare-root-worklist.mjs --self-test` caught it on the commit
that introduced it.
Declared rather than refused, and the choice is measured from this gate's own
walker rather than taken from the shape: numerator is what `scannedFiles()`
admits, denominator the tracked files under the subtree the declaration names —
`skills/**` 50 of 50 (100%), `scripts/**` 239 of 242 (98.8%, the 3 misses are
`.txt`). This is the `subtree` case, not the `filtered` one: the walk descends
the whole of each root and the only losses are non-code files the extension
filter drops. Both precedents are already in this tree at the same or lower
coverage — `check-pnpm-filter-targets.mjs` declares `scripts/**` at 97.0%, and
`check-role-word.mjs` declares `skills/**`.
`AGENTS.md/**` and `CLAUDE.md/**` take the escapable repo-root-FILE case the
derivation's own residue names: a bare filename is refused as too generic and
reaches its file through the subtree spelling. Measured — `AGENTS.md/**` covers
`AGENTS.md` and does NOT cover `examples/AGENTS.md`, so it claims the one file
this gate reads at that root and does not overclaim the nested ones.
The workspace-manifest read stays UNDECLARED: the only spellable claim is
`packages/**` + `apps/**` + `examples/**`, which would name this gate for ~5200
files to reach ~80 manifests. Refused, and pinned in `--self-test`.
⚠️ The declaration is pinned STRUCTURALLY, derived from the scan roots, not by
importing `hintCovers`. An earlier draft did import it, and `discoverFamilies`
then treated dispatch-gates.mjs as this gate's own source and hoisted ITS path
literals — `packages/spec/src/**`, `packages/plugins`, `packages/drivers`,
`packages/services` — into this gate's hints. That is the fabricated lead the
declaration exists to avoid, arriving through the assertion meant to prevent it.
Measured before and after: 19 hints with the import, 11 without, 0 fabricated.
`scripts/pm/bare-root-worklist.mjs` itself is untouched.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015ahemw8RcTgqtxrj15PEZx
0 commit comments