#3366 retired 4 hooks, so two prose counts in the docs went stale. They were
corrected in the generated pages rather than the sources those pages
are built from, which means every npm run build put the wrong
numbers back. Nothing went red, because the drift gate does not watch that
directory.
Ground truth: bin/count-hooks.sh → GLOBAL=149 TOTAL=215.
SOURCE stale src/skills/doctor/references/hook-validation.md 152 global entries src/skills/setup/references/readiness-scoring.md 218 hooks active │ │ npm run build (overwrites, every time) ▼ GENERATED correct, and discarded docs/site/content/docs/reference/skills/doctor.mdx 149 global entries docs/site/content/docs/reference/skills/setup.mdx 215 hooks active
Two independent gates, and the file falls between them.
ci.yml:77 GENERATED=(plugins/ src/hooks/dist/ README.md docs/site/lib/generated/)
docs/site/content/ is NOT here
test-docs-site-drift.mjs TOTAL_CLAIM matches: "OrchestKit's 219-hook system"
does NOT match: "OrchestKit uses 152 global hook entries"
"218 hooks active"
The build-drift gate would have caught a rewritten committed file, but only
inside four watched directories. The docs-site drift gate would have caught a
stale plugin-wide total, but its pattern requires the
OrchestKit's N-hook phrasing. Each gate is individually
reasonable; the overlap is where this lives.
count-hooks.sh.npm run build idempotent: a second run leaves
docs/site/content/ clean. That is the falsifiable part — before this
change a second build always produced a diff.
Deliberately not done here: widening the drift gate to cover
docs/site/content/, or loosening the TOTAL_CLAIM pattern.
Both are real gaps and both are pre-existing, but changing a required gate's scope
is its own decision with its own blast radius, not a rider on a two-line fix.