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
fix(pm): declare check:doc-authoring's real population to dispatch-gates (#10662)
* fix(pm): declare check:doc-authoring's real population to dispatch-gates
Three of the gate's four ROOTS were bare words the watch-hint extractor
refuses as too generic, while its SKIP_PATHS carry separators and were
taken. Five of the six paths it declared were therefore exclusions, and
383 of its 389 walked files were declared by nothing — so a card editing
the live corpus derived an empty union and met this REQUIRED gate as red
CI instead of as a local command.
Declares each ROOT in the subtree spelling the extractor compares in,
with both halves pinned: the gate's own self-test couples the
declaration to ROOTS and bounds its over-claim to SKIP_PATHS, and the
extractor's self-test pins that it reaches all four roots and claims
nothing under packages/, apps/ or examples/.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
* docs(pm): mark the .claude reach case as not pinning the declaration
Measured: deleting `.claude/**` from the gate leaves that case green,
because `.claude` is a dotted top-level dir the extractor admits bare.
The case still pins that the root stays reachable; the declaration is
pinned in the gate's own self-test.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DdCnBGcHeufjrq7drTD3wt
---------
Co-authored-by: claude <noreply@anthropic.com>
console.log('✓ check-doc-authoring self-test: scope wiring (.claude and the live docs/ corpus in, .claude/worktrees and docs/{audits,handoff,plans} out), detection, the dead-root hard error (red when a ROOT is renamed, green when restored) and the empty-scan hard error (red when a root yields nothing and when the whole scan does, green when restored) all hold.');
554
+
console.log('✓ check-doc-authoring self-test: scope wiring (.claude and the live docs/ corpus in, .claude/worktrees and docs/{audits,handoff,plans} out), detection, the dead-root hard error (red when a ROOT is renamed, green when restored), the empty-scan hard error (red when a root yields nothing and when the whole scan does, green when restored) and the dispatch-gates declaration (every separator-less ROOT declared as a subtree, nothing declared this gate does not walk, the over-claim bounded to SKIP_PATHS) all hold.');
// One case per declared root, because a single one passes for a declaration
3161
+
// that dropped the other three — which is the exact shape being fixed. Each
3162
+
// path is reachable ONLY through its root's subtree spelling, never through a
3163
+
// SKIP_PATHS literal.
3164
+
t('the doc-authoring gate reaches the live docs corpus it declares',docAuthoringHints.some((h)=>hintCovers(h,'docs/qa/platform-checklist/RUNNER.md')));
3165
+
t('and the top-level docs guides, which are files rather than a subtree',docAuthoringHints.some((h)=>hintCovers(h,'docs/protocol-upgrade-guide.md')));
3166
+
// ⚠️ This one case does NOT pin the declaration, and says so rather than
3167
+
// reading as though it does: `.claude` is a top-level DOTTED dir, which
3168
+
// `looksPathy` admits and `hintCovers` does not refuse, so the bare ROOTS
3169
+
// entry reaches this path on its own. Measured — deleting `.claude/**` from
3170
+
// the gate leaves this case green, exactly the way check-nul-bytes survives
3171
+
// the ablation above. What it pins is that `.claude` stays reachable AT ALL;
3172
+
// the declaration itself is pinned in the gate's own self-test, which
3173
+
// requires a subtree spelling for every separator-less ROOT.
3174
+
t('and the agent operating manual it took in for the same reason',docAuthoringHints.some((h)=>hintCovers(h,'.claude/agents/os-dev.md')));
3175
+
t('and the published skills catalog',docAuthoringHints.some((h)=>hintCovers(h,'skills/objectstack-upgrade/SKILL.md')));
3176
+
t('and the content tree',docAuthoringHints.some((h)=>hintCovers(h,'content/docs/deployment/cli.mdx')));
3177
+
// The negative half, load-bearing for a declaration spanning four roots: a
3178
+
// gate named on EVERY card is the louder version of naming none. These are
3179
+
// the three biggest trees in the repo and none of them is corpus.
3180
+
t('and claims nothing under packages/',!docAuthoringHints.some((h)=>hintCovers(h,'packages/spec/src/index.ts')));
3181
+
t('nor under apps/',!docAuthoringHints.some((h)=>hintCovers(h,'apps/console/src/main.tsx')));
3182
+
t('nor under examples/',!docAuthoringHints.some((h)=>hintCovers(h,'examples/crm/objects/account.object.ts')));
3183
+
3151
3184
// The second gate of that class (#9700): a whole-tree ESLint ratchet whose
3152
3185
// only literals were its own baseline artifact and the ref it diffs against,
3153
3186
// so it scored `silent` for every card in the tree while being REQUIRED in
0 commit comments