Uh oh!
There was an error while loading. Please reload this page.
fix(pm): declare check-role-word's skills root for dispatch-gates derivation - #10114
Conversation
…ivation check-role-word walks ROOTS = ['content/docs', 'skills'], but dispatch-gates builds its watch hints from path literals carrying a separator, so the bare word `skills` produced no hint at all: a skills-only card derived the content half and scored this gate `silent`. PR #10038 paid one repair round for it — a green local union, then `role-word count grew 2 to 3` in CI. Adds the provenance-only subtree declaration (`skills/**`) in the gate's own source, the same pattern root-file populations use, with the coupling to ROOTS pinned in both self-tests. The extractor and hintCovers are untouched: that refusal of bare single-segment literals is measured and deliberate. No scanning behaviour changes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AeA3nU1B5Q2pgxqxgUrexd
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 32333808972 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
Uh oh!
There was an error while loading. Please reload this page.
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 32333758325 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 32334242692 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
Uh oh!
There was an error while loading. Please reload this page.
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 32335241395 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
⛔ merge queue 构建失败 — 先分诊,再决定要不要重排队列构建 32335486523 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集), 失败的 job(日志抽取,best effort):
历史信号:
分诊清单:
Generated by Claude Code · merge-queue-triage workflow (#4859) |
Fixes#10107
scripts/check-role-word.mjswalksROOTS = ['content/docs', 'skills'], butscripts/pm/dispatch-gates.mjsbuilds a gate's watch hints from the pathliterals in its own source, and a literal only "looks pathy" when it carries a
separator.
content/docshas one; the bare wordskillsdoes not, so no hintwas ever built for it. A card touching only the skills tree derived the content
half, scored this gate
silent, and the dev who ran the derived union locallynever saw it. PR #10038 (a skills-only docs fix) paid one repair round for
exactly that: a green local union, then
role-word count grew 2 to 3in CI.What changed
One provenance-only constant in the gate's own source, in the subtree spelling
dispatch-gates compares in, plus the pins that keep it honest:
scripts/check-role-word.mjs—ROOT_DIR_WATCH_HINTS = ['skills/**'], witha docblock stating that nothing in the gate reads it and why the glob form
must never appear in
ROOTS(walk()sits behindexistsSync, so the globspelling there would skip the root in silence). Four self-test cases pin the
coupling derived from
ROOTSon both sides, so renaming or widening aroot cannot leave the declaration describing the old population.
scripts/pm/dispatch-gates.mjs— self-test only: 334 cases to 341, added,none weakened. Positive pins read the real gate (not a fixture), so what is
pinned is that the tree still HAS the declaration; negative pins hold the
boundary the declaration must not buy.
The extractor and
hintCoversare untouched. That refusal of baresingle-segment literals is deliberate and measured (it was priced at +139084
fabricated gate/file pairs), and widening it would reintroduce the fabricated
leads it exists to refuse. Scanning behaviour is unchanged — the gate reads the
same 216 files and reaches the same verdicts.
Measured, at 4fb58de
Before,
node scripts/pm/dispatch-gates.mjs --residue skills/objectstack-platform/SKILL.md:After, same command:
And the derivation over that same skills path goes from
to
Hint extraction on the gate itself,
["content/docs","scripts/role-word-baseline.json"]to
["content/docs","scripts/role-word-baseline.json","skills/**"]— one hintgained, none lost, and
.claude/skills/pm-dispatch/SKILL.mdstaysfalse(that tree is not in
ROOTS, so the gate must not be named for a card editing it).Reverse verification
Predicted in writing first, then measured. Ablation: the declaration emptied to
[]rather than deleted, because the self-test references the constant and adeletion would red as a
ReferenceErrorcrash instead of as named failures.Predicted direction: reddening. All six predictions held exactly:
skills/**gone["content/docs","scripts/role-word-baseline.json"]--residuerole-word namesnames: content/docs, scripts/role-word-baseline.json1 matched above · 35 undetermined · 79 silent✗ the role-word ratchet reaches the published skills catalog it declares/✗ dispatch-gates self-test: 1 of 341 case(s) failed.exit 1skillscase,check-role-word --self-test: 2 failure(s).exit 1readFileSyncthe gate's SOURCE, noexports/dist in the path, so no stale build can mask either legRestored with
git checkout HEAD -- scripts/check-role-word.mjs;git status --shortandgit diff HEAD --statboth empty afterwards, and both self-testsre-run green (341 cases, exit 0).
Gates, at 4fb58de
Union derived by
node scripts/pm/dispatch-gates.mjsfrom the real diff (nohand-written path list), all four run, each quoting its own verdict line:
pnpm check:role-wordexit 0 —check-role-word: OK, no new occurrences of the reserved word./Scanned: 216 .md/.mdx file(s) read across 2 root(s) — content/docs 180, skills 36.pnpm check:pm-dispatch-gatesexit 0 —✓ dispatch-gates self-test: 341 cases pass.pnpm check:cross-package-test-inputsexit 0 —OK: 12 package(s) read outside themselves, all declared, and turbo.json hashes every declared glob.node scripts/check-cross-package-test-inputs.mjs(the ci.yml half) exit 0 — same verdict linenode scripts/check-nul-bytes.mjsexit 0 —check-nul-bytes: OK (scanned 6369 text file(s) ... no raw ASCII control bytes).Exit codes captured by redirecting to a file before any pipe, never through
tail.No changeset:
scripts/**only, nothing published changes.Generated by Claude Code