Approve-all — a one-confirmation human bulk-approval, prepared not forged
This is the fast path to draining the review backlog: promote every approvable claim to canonical
in one go. The catch it respects — the AI must not sign for you. So it does everything up to the
write (find the batch, show it, confirm it) and then hands you the exact one-line command to run
yourself. You fire it; the log records by: human because a human really did.
Why the AI hands off instead of committing
canonical · by human is supposed to attest that a human approved (ADR-0004, BUREAU.md). The
decision log is unsigned, so by: is a claim, not proof — the whole gate rests on the AI never
writing by: human. An in-session "yes" cannot be seen at the log layer: if the AI's process ran
the approval, every by: human entry would become indistinguishable from a fabricated one. Running
the command yourself (via the ! prefix) keeps the attestation true at one keystroke. approve --all is also a documented weakening (ADR-0005) — it promotes the backlog sight-unseen — which
is all the more reason it is the human's to fire.
Steps
Locate the workspace. Read bureau.json for the workspace dir (default canon); honor
--workspace <name>. If no workspace exists, tell the user to run bureau:init first and stop.
Build and split the queue. Run
node "${CLAUDE_PLUGIN_ROOT}/press/bin/gazette.mjs" review --json --dir <workspace> — invoke it
with the ${CLAUDE_PLUGIN_ROOT} variable literally; never substitute a hand-picked
~/.claude/plugins/cache/…/<version>/… path (a stale cache silently runs the wrong engine). Parse
{items, counts, total} and split by kind:
- approvable —
approve and reapprove: exactly what approve --all promotes.
- not covered —
confirm-dependencies, resolve-conflict, repair-edge: approve --all
leaves these untouched (a confirm can't be an approve, a conflict needs a decision, a broken
edge needs an edit). They stay in the queue.
If review --json exits non-zero or returns output that is not valid JSON, report the raw error
and stop — never fabricate the queue or hand off a run command against an unknown backlog.
Stop if there is nothing to approve. If the approvable set is empty, report "nothing to
bulk-approve" plus any not-covered items, and stop. Never confirm approving an empty batch.
Show the batch, then confirm in-session. List the approvable titles (what would become
canonical) and the not-covered items. Then take the confirmation with AskUserQuestion:
"Approve all N page(s) as canonical — by you (by: human)?" with options Approve all and
Cancel. On Cancel, stop — nothing is approved.
Hand off the one line (never run it yourself). On Approve all, resolve the absolute path
to gazette.mjs (expand ${CLAUDE_PLUGIN_ROOT}) and print the ready-to-run command, --dir
pre-filled, for the human to fire with the ! prefix:
! <abs path>/press/bin/gazette.mjs approve --all --dir <workspace> --by human
Explain briefly: running it via ! executes it as you, so by: human is true; it is
non-interactive, so it proceeds without a y/n and content-binds each page (capturing every
digest, refusing any page it cannot bind). Do not run gazette approve yourself, and do
not pass --by human from your own process.
Offer the reviewed alternative. Note that if approving sight-unseen is too blunt, a per-page
reviewed batch keeps human authorship AND records exactly the bytes vetted:
gazette review --json > decisions.json → prune it → approve --from decisions.json --by human;
and that bureau:codex-review can pre-screen the queue first.
Rules
- The AI never approves and never signs
--by human. It prepares and hands off; the human runs
the one line. This is the non-negotiable core of the gate.
- Confirm before handing off. Always show the batch and take an explicit in-session confirmation
first — an empty or unconfirmed batch is never handed a run command.
- Only approve/reapprove are in scope. Name the not-covered items so the user knows the queue is
not fully cleared; route them to
bureau:review.
- Name the weakening.
approve --all promotes sight-unseen (ADR-0005); say so, and offer the
approve --from per-page alternative.
- Read-only until the handoff. The skill only reads the queue; the sole state change happens when
the human runs the printed line.
Output format
Report, in order: (1) the workspace; (2) would approve — the count and titles that become
canonical; (3) not covered — the confirm/resolve/repair items left in the queue; (4)
your one line — the exact ! … approve --all --dir <workspace> --by human command, plus the
approve --from reviewed-batch alternative.
Example
Scope note
This skill ONLY prepares a human bulk-approval and hands off the command. It does not run any
approval, capture sessions, compile the logbook, resolve conflicts, or render the board. It is
invoked by bureau:approve-all, and is the bulk companion to bureau:review (per-page human gate)
and bureau:codex-review (Codex pre-screens the queue as your representative).
1---2name: approve-all3description: Prepare a human bulk-approval of the whole approvable review backlog — show what would be promoted to canonical, take an in-session confirmation, then hand the human the single pre-filled `gazette approve --all --by human` line to fire themselves. Use when running bureau:approve-all, or when the user asks to approve everything / approve the whole queue / bulk-approve at once. The AI never runs approve and never signs `--by human`.4---56# Approve-all — a one-confirmation human bulk-approval, prepared not forged78This is the fast path to draining the review backlog: promote every approvable claim to `canonical`9in one go. The catch it respects — the AI must not sign for you. So it does everything up to the10write (find the batch, show it, confirm it) and then hands you the exact one-line command to run11yourself. You fire it; the log records `by: human` because a human really did.1213## Why the AI hands off instead of committing1415`canonical · by human` is supposed to attest that a human approved (ADR-0004, BUREAU.md). The16decision log is unsigned, so `by:` is a claim, not proof — the whole gate rests on the AI never17writing `by: human`. An in-session "yes" cannot be seen at the log layer: if the AI's process ran18the approval, every `by: human` entry would become indistinguishable from a fabricated one. Running19the command yourself (via the `!` prefix) keeps the attestation true at one keystroke. `approve20--all` is also a **documented weakening** (ADR-0005) — it promotes the backlog sight-unseen — which21is all the more reason it is the human's to fire.2223## Steps24251. **Locate the workspace.** Read `bureau.json` for the workspace dir (default `canon`); honor26 `--workspace <name>`. If no workspace exists, tell the user to run `bureau:init` first and stop.27282. **Build and split the queue.** Run29 `node "${CLAUDE_PLUGIN_ROOT}/press/bin/gazette.mjs" review --json --dir <workspace>` — invoke it30 with the `${CLAUDE_PLUGIN_ROOT}` variable **literally**; never substitute a hand-picked31 `~/.claude/plugins/cache/…/<version>/…` path (a stale cache silently runs the wrong engine). Parse32 `{items, counts, total}` and split by kind:33 - **approvable** — `approve` and `reapprove`: exactly what `approve --all` promotes.34 - **not covered** — `confirm-dependencies`, `resolve-conflict`, `repair-edge`: `approve --all`35 leaves these untouched (a confirm can't be an approve, a conflict needs a decision, a broken36 edge needs an edit). They stay in the queue.3738 If `review --json` exits non-zero or returns output that is not valid JSON, report the raw error39 and stop — never fabricate the queue or hand off a run command against an unknown backlog.40413. **Stop if there is nothing to approve.** If the approvable set is empty, report "nothing to42 bulk-approve" plus any not-covered items, and stop. Never confirm approving an empty batch.43444. **Show the batch, then confirm in-session.** List the approvable titles (what would become45 `canonical`) and the not-covered items. Then take the confirmation with `AskUserQuestion`:46 "Approve all N page(s) as canonical — by you (`by: human`)?" with options **Approve all** and47 **Cancel**. On **Cancel**, stop — nothing is approved.48495. **Hand off the one line (never run it yourself).** On **Approve all**, resolve the absolute path50 to `gazette.mjs` (expand `${CLAUDE_PLUGIN_ROOT}`) and print the ready-to-run command, `--dir`51 pre-filled, for the human to fire with the `!` prefix:5253 ```54 ! <abs path>/press/bin/gazette.mjs approve --all --dir <workspace> --by human55 ```5657 Explain briefly: running it via `!` executes it **as you**, so `by: human` is true; it is58 non-interactive, so it proceeds without a y/n and content-binds each page (capturing every59 digest, refusing any page it cannot bind). Do **not** run `gazette approve` yourself, and do60 **not** pass `--by human` from your own process.61626. **Offer the reviewed alternative.** Note that if approving sight-unseen is too blunt, a per-page63 reviewed batch keeps human authorship AND records exactly the bytes vetted:64 `gazette review --json > decisions.json` → prune it → `approve --from decisions.json --by human`;65 and that `bureau:codex-review` can pre-screen the queue first.6667## Rules68691. **The AI never approves and never signs `--by human`.** It prepares and hands off; the human runs70 the one line. This is the non-negotiable core of the gate.712. **Confirm before handing off.** Always show the batch and take an explicit in-session confirmation72 first — an empty or unconfirmed batch is never handed a run command.733. **Only approve/reapprove are in scope.** Name the not-covered items so the user knows the queue is74 not fully cleared; route them to `bureau:review`.754. **Name the weakening.** `approve --all` promotes sight-unseen (ADR-0005); say so, and offer the76 `approve --from` per-page alternative.775. **Read-only until the handoff.** The skill only reads the queue; the sole state change happens when78 the human runs the printed line.7980## Output format8182Report, in order: (1) the **workspace**; (2) **would approve** — the count and titles that become83`canonical`; (3) **not covered** — the `confirm`/`resolve`/`repair` items left in the queue; (4)84**your one line** — the exact `! … approve --all --dir <workspace> --by human` command, plus the85`approve --from` reviewed-batch alternative.8687## Example8889<example>90Context: a repo with a bureau canon; six proposed claims and one contested pair await review.91user: "bureau:approve-all"92assistant: "In `bureau/`, `approve --all` would promote **6** page(s) to canonical: [Retry Policy,93Token TTL, …]. **Not covered:** 1 resolve-conflict (Auth model × Session model) — that needs a94decision, not an approval, so it stays in the queue. Approve all 6 as canonical, by you?"95[AskUserQuestion → Approve all]96"Fire this yourself — it runs as you, so `by: human` is true:97`! /Users/…/press/bin/gazette.mjs approve --all --dir bureau --by human`98(Prefer to vet per page? `gazette review --json > decisions.json`, prune it, then99`approve --from decisions.json --by human`.)"100<commentary>The AI shows the batch, confirms, and hands off — it never runs approve or signs101`--by human`. The contested pair is surfaced as out of scope, not silently bulk-approved.</commentary>102</example>103104## Scope note105106This skill ONLY prepares a human bulk-approval and hands off the command. It does not run any107approval, capture sessions, compile the logbook, resolve conflicts, or render the board. It is108invoked by `bureau:approve-all`, and is the bulk companion to `bureau:review` (per-page human gate)109and `bureau:codex-review` (Codex pre-screens the queue as your representative).