@@ -456,17 +456,33 @@ node scripts/docs-audit/check-audit-scope.mjs --write # regenerate the list fr
456456node scripts/docs-audit/check-audit-scope.mjs --self-test
457457```
458458
459- The ` docs-accuracy-audit ` workflow (part 3) carries its default scope ** inline** , as
460- ` ALL_HANDWRITTEN ` . It has to: a workflow script runs inside a ` node:vm ` context whose
461- only globals are ` log ` /` phase ` /` console ` /` budget ` /timers plus
462- ` agent ` /` parallel ` /` pipeline ` /` workflow ` /` args ` , with code generation disabled — no
463- ` require ` , no ` import ` , no filesystem. It can neither walk ` content/docs/ ` nor read a
464- JSON artifact, so the list cannot be derived * at run time* .
459+ ** THE single source is ` scripts/docs-audit/handwritten-docs.json ` ** — one generated file,
460+ with two consumers: this gate, and whoever invokes the ` docs-accuracy-audit ` workflow
461+ (part 3), who reads it and hands its ` docs ` array in as ` args.handwritten ` .
465462
466- It is therefore derived at * generation* time instead: ` --write ` rewrites the block from
463+ The workflow body cannot read it itself. A workflow script runs inside a ` node:vm `
464+ context whose only globals are ` log ` /` phase ` /` console ` /` budget ` /timers plus
465+ ` agent ` /` parallel ` /` pipeline ` /` workflow ` /` args ` , with code generation disabled — no
466+ ` require ` , no ` import ` , no filesystem. It can neither walk ` content/docs/ ` nor open a
467+ JSON artifact. But it does not have to: ` args ` ** is** an injection channel, delivered
468+ verbatim from the invocation, so the read happens in the ** caller** , outside the sandbox,
469+ and the list arrives as data.
470+
471+ The list used to live inline in the workflow body, as ` ALL_HANDWRITTEN ` . ` .claude/** ` is
472+ a governed surface (human-merge-only, never armed, never queued), so adding one customer
473+ documentation page forced a governed edit — through a bookkeeping list that merely
474+ happened to live there, and invisibly: nothing in such a card's file list showed a
475+ governed path until this gate ran. Maintainer ruling, 2026-09-01, verbatim 「同意」: move
476+ it off. ⚠️ The governed register itself is ** unchanged** — narrowing it was the option
477+ that ruling explicitly rejected, and this file is no precedent for relocating anything
478+ else out of ` .claude/** ` .
479+
480+ The list is derived at * generation* time: ` --write ` rewrites the artifact from
467481` affected-docs.mjs --all ` (one definition of "hand-written doc", not two), and the plain
468- run is a CI gate in ` lint.yml ` that fails when the block and ` content/docs/ ` disagree
469- ** in either direction** .
482+ run is a CI gate in ` lint.yml ` that fails when the artifact and ` content/docs/ ` disagree
483+ ** in either direction** . It also runs the workflow against stub agents and checks that the
484+ body still * consumes* what it is handed — an artifact in sync with ` content/docs/ ` proves
485+ nothing about a body that has stopped reading it, and that failure would be silent.
470486
471487Both directions matter, and only one had ever been noticed (#4851 ):
472488
@@ -642,15 +658,22 @@ a consumer, add it to that list.**
642658A Claude Code multi-agent workflow (` .claude/workflows/docs-accuracy-audit.js ` ). For each
643659doc: an agent reads it, locates the real implementation, and applies evidence-backed
644660fixes in place; a second ** adversarial verifier** re-checks every fix against the code and
645- repairs over-corrections. Scope it with ` args.docs ` ; omit for a full audit.
661+ repairs over-corrections. Scope it with ` args.docs ` ; for a full audit hand in the whole
662+ set as ` args.handwritten ` .
646663
647664``` js
648665// scoped to the docs a code change touched:
649666Workflow ({ name: ' docs-accuracy-audit' , args: { docs: [/* output of affected-docs.mjs */ ] } })
650- // full audit of all hand-written docs:
651- Workflow ({ name: ' docs-accuracy-audit' })
667+ // full audit of all hand-written docs — read the artifact first, OUTSIDE the sandbox:
668+ // node -e "console.log(JSON.stringify(require('./scripts/docs-audit/handwritten-docs.json').docs))"
669+ Workflow ({ name: ' docs-accuracy-audit' , args: { handwritten: [/* that array */ ] } })
652670```
653671
672+ ⛔ There is no "omit ` args ` and audit everything" invocation, and there cannot be: the
673+ body has no filesystem, so with nothing handed in it does not know what "everything" is.
674+ It refuses by name rather than inventing a scope — the two shapes it could invent are a
675+ silent audit of nothing and a stale list, and both report success.
676+
654677It edits files in place (frontmatter preserved, no moves) and returns a per-doc log of
655678fixes, verifier repairs, and residual items that couldn't be confirmed against code —
656679** except** for ` content/docs/releases/** ` , which is reviewed read-only and returns
0 commit comments