Review — the gate between AI memory and trusted fact
AI-written memory must never be recalled as fact until a human has checked it. This skill is
that gate: a batch double-check that promotes vetted claims to canonical and discards the
rest. The cabinets double as repo memory, so an un-reviewed claim is an unverified claim.
Trust tiers (the status: of every dossier)
| tier |
meaning |
written by |
recalled as |
proposed |
AI claim, unchecked |
compile |
"unverified — verify before relying" |
verified |
passed an automatic ground-truth check |
compile |
"checked against the repo on <date>" |
canonical |
a human approved it |
review (this skill) only |
fact |
stale |
a verified source changed / a claim was superseded |
review's staleness re-check; lint (--apply) |
"was true on <date> — re-verify" |
contested |
two claims disagree |
compile (conflict); lint (--apply) |
"disputed — do not rely" |
(Capture writes the logbook, never a dossier — only compile, lint, and review touch a
page's status:.)
Only canonical is recalled as fact. Everything else carries its tier as a warning. The AI
never writes canonical itself — that tier exists only on the far side of this gate.
What review does
- Locate the workspace (
bureau.json; default canon). If none, tell the user to run
bureau:init first and stop.
- Re-check staleness first. For each
verified/canonical page, run
node "${CLAUDE_PLUGIN_ROOT}/press/bin/gazette.mjs" ledger recheck --dir <workspace> --page "<title>".
The press (in code) re-hashes every recorded artifact from <workspace>/_verify.json —
path-jailed inside the repo (absolute paths, .. escapes, and symlinks pointing outside are
rejected/reported, never read). Any page reporting DRIFTED (or an unreadable artifact) is
demoted to stale and added to the queue. If the page has no recorded fingerprints, skip it.
- Build the queue — use the engine's typed order. Run
node "${CLAUDE_PLUGIN_ROOT}/press/bin/gazette.mjs" review --dir <workspace> (ADR-0005): it returns
the review work items in DEPENDENCY order (upstream-first), each typed by the action that clears it —
approve (a new claim), reapprove (approved then edited), confirm-dependencies (canonical but its
upstream span changed → confirm, not approve), resolve-conflict (a contested component — decide
which claim stands, do NOT approve both sides), repair-edge (a broken rests_on). Review upstream
pages first. If the queue is empty, report "nothing to review — the canon is approved and current"
and stop. Also surface any ADR-0006 finding from gazette fsck: a supersedes-cycle BLOCKS (two
approved ADRs retire each other — it must be resolved before the canon is clean), while
broken-supersedes (dangling target) and supersedes-ineligible-target (the target was never an
effective decision) are advisory.
- Present a batch digest. Review is page-level — a page is one claim (compile keeps it
so), and its
status: is the page's tier. For each queued page show, in one compact block:
- the page and its claim;
- its provenance — the
[[session …]] it traces to (and whether that link resolves);
- its check result —
verified against <artifact> for an auto-checked fact, or
unverifiable (judgment — needs your eye) for rationale/design claims;
- if the item carries a
supersedes target (the queue names it on an ADR's approve item),
warn "approving this retires <target>" — approving this ADR demotes that prior decision to
superseded (ADR-0006). Make sure the human intends to retire it.
Group facts (auto-verified) apart from judgments (need human reasoning) — the judgments are
the ones that actually need the human.
- Prepare the decisions — the HUMAN commits them. This is the human-authority gate: per BUREAU.md
and ADR-0004 the AI must NEVER commit a human-authority event — never run
gazette approve, never
assert --by human. So present the queue in batches and, for each page the human approves, hand
them the exact command to run themselves:
node "${CLAUDE_PLUGIN_ROOT}/press/bin/gazette.mjs" approve "<title>" --dir <workspace> --by human
The press appends an approve event to the decision log; canonical is a projection of that
event, not the frontmatter — so do NOT author status: canonical yourself (gazette fsck flags
an authored canonical no approval backs, and ADR-0004 makes effective trust log-only). reviewed:
is likewise projected from the approve event, not stamped by you.
- A reviewed backlog, applied at once (ADR-0005). For many pages, the human can author a JSON
manifest while reading and apply it in one command — still per-page judgment, and a reviewable
artifact. Seed it with
gazette review --json (each approvable item carries its current digest);
keep the pages you vetted, move the rest to reject with a because, then approve --from decisions.json --by human (each approval pins the reviewed page digest; a page that drifted since
is refused, and the batch commits atomically). approve --all --by human
bulk-approves the whole approvable queue after a warning — a deliberate weakening of the
human gate (the log marks it as a bulk batch_id); it is the human's call to run, never yours.
- reject → hand the human
… reject "<title>" --dir <workspace> --by human [--reason "…"] (an
unauthorized reject is inert, so naming the human authority is what makes it stick). Once they
confirm, remove the claim — delete the page only if it holds no other claim, else strike just this
claim, never unrelated content — and append a NEW review minute naming what was rejected (the
logbook is append-only; never rewrite a minute).
- Structural check. Run
bureau:inspect; report the gazette state.
- Report. Counts approved / rejected / left pending, and the path to anything still
contested (those are resolved by re-deciding in a session, not by review).
Ground-truth, honestly
- A fact about an artifact (a path, a build command, a function signature, a config value,
a dependency version, a commit) is mechanically checkable —
compile marks it verified
and review confirms. The fingerprint in _verify.json lets staleness auto-demote it later.
- A judgment ("we chose X because Y", "this module is fragile") cannot be verified, only
provenanced and read by a human. Do not label a judgment
verified; route it to the
human in step 4. This is the split the gate exists for.
Recall convention (how memory is read back)
Whoever reads the cabinets as memory MUST honor the tier on each claim: treat canonical as
fact; treat verified as checked-but-not-approved; treat proposed, stale, and contested
as claims to confirm before relying, never as fact. The tier travels on every recalled line so
an unverified claim can never masquerade as truth.
Rules
- Human-gated; the AI never commits.
canonical is a projection of a human-run approve
event. The AI presents and prepares the decisions but NEVER runs gazette approve/reject, never
asserts --by human, and never authors status: canonical — the human runs the commands (ADR-0004).
- Reject is guarded and logged, never silent erasure. Confirm before removing; delete a
page only when it holds no other claim; otherwise strike just the rejected claim. Record the
rejection by appending a NEW minute — existing entries are never rewritten.
- No prose invention. Review promotes, demotes, or removes claims — it does not author new
ones. New claims come from
compile.
- Stale before approve. Re-check fingerprints (step 2) before presenting the queue, so the
human never approves something the repo already moved past.
Examples
Scope note
This skill covers ONLY the human approval gate and staleness re-check. It does not capture
sessions (capture / bureau:file-session), does not distil the logbook (compile /
bureau:compile), and does not run the semantic sweep (lint / bureau:lint). It acts on
the cabinets those produce and is invoked by the bureau:review command.
To have Codex pre-screen the same queue as your representative — recommending approve/hold, then
either handing you the --by human command or (only where the workspace opted the codex authority
in) committing --by codex — reach for bureau:codex-review (codex-review) instead. It drives the
identical gazette review --json / approve --from surface; this skill stays the human-only gate.
1---2name: review3description: The human double-check gate for AI-written memory. Show every cabinet claim not yet approved — with its provenance and automatic check result — and let the human promote it to canonical or reject it. Use when running bureau:review, or when the user asks to approve / vet / sign off on what the AI wrote to memory before it is trusted as fact.4---56# Review — the gate between AI memory and trusted fact78AI-written memory must never be recalled as fact until a human has checked it. This skill is9that gate: a batch double-check that promotes vetted claims to `canonical` and discards the10rest. The cabinets double as repo memory, so an un-reviewed claim is an unverified claim.1112## Trust tiers (the `status:` of every dossier)1314| tier | meaning | written by | recalled as |15|------|---------|------------|-------------|16| `proposed` | AI claim, unchecked | compile | "unverified — verify before relying" |17| `verified` | passed an automatic ground-truth check | compile | "checked against the repo on `<date>`" |18| `canonical` | a human approved it | **review** (this skill) only | fact |19| `stale` | a verified source changed / a claim was superseded | review's staleness re-check; lint (`--apply`) | "was true on `<date>` — re-verify" |20| `contested` | two claims disagree | compile (conflict); lint (`--apply`) | "disputed — do not rely" |2122(Capture writes the logbook, never a dossier — only compile, lint, and review touch a23page's `status:`.)2425Only `canonical` is recalled as fact. Everything else carries its tier as a warning. The AI26never writes `canonical` itself — that tier exists only on the far side of this gate.2728## What review does29301. **Locate the workspace** (`bureau.json`; default `canon`). If none, tell the user to run31 `bureau:init` first and stop.322. **Re-check staleness first.** For each `verified`/`canonical` page, run33 `node "${CLAUDE_PLUGIN_ROOT}/press/bin/gazette.mjs" ledger recheck --dir <workspace> --page "<title>"`.34 The press (in code) re-hashes every recorded artifact from `<workspace>/_verify.json` —35 **path-jailed** inside the repo (absolute paths, `..` escapes, and symlinks pointing outside are36 rejected/reported, never read). Any page reporting `DRIFTED` (or an unreadable artifact) is37 demoted to `stale` and added to the queue. If the page has no recorded fingerprints, skip it.383. **Build the queue — use the engine's typed order.** Run39 `node "${CLAUDE_PLUGIN_ROOT}/press/bin/gazette.mjs" review --dir <workspace>` (ADR-0005): it returns40 the review work items in DEPENDENCY order (upstream-first), each typed by the action that clears it —41 `approve` (a new claim), `reapprove` (approved then edited), `confirm-dependencies` (canonical but its42 upstream span changed → `confirm`, not approve), `resolve-conflict` (a contested component — decide43 which claim stands, do NOT approve both sides), `repair-edge` (a broken `rests_on`). Review upstream44 pages first. If the queue is empty, report "nothing to review — the canon is approved and current"45 and stop. Also surface any ADR-0006 finding from `gazette fsck`: a **`supersedes-cycle`** BLOCKS (two46 approved ADRs retire each other — it must be resolved before the canon is clean), while47 `broken-supersedes` (dangling target) and `supersedes-ineligible-target` (the target was never an48 effective decision) are advisory.494. **Present a batch digest.** Review is **page-level** — a page is one claim (compile keeps it50 so), and its `status:` is the page's tier. For each queued page show, in one compact block:51 - the page and its claim;52 - its **provenance** — the `[[session …]]` it traces to (and whether that link resolves);53 - its **check result** — `verified against <artifact>` for an auto-checked fact, or54 `unverifiable (judgment — needs your eye)` for rationale/design claims;55 - if the item carries a **`supersedes`** target (the queue names it on an ADR's `approve` item),56 warn **"approving this retires `<target>`"** — approving this ADR demotes that prior decision to57 `superseded` (ADR-0006). Make sure the human intends to retire it.58 Group facts (auto-verified) apart from judgments (need human reasoning) — the judgments are59 the ones that actually need the human.605. **Prepare the decisions — the HUMAN commits them.** This is the human-authority gate: per BUREAU.md61 and ADR-0004 the AI must NEVER commit a human-authority event — never run `gazette approve`, never62 assert `--by human`. So present the queue in batches and, for each page the human approves, hand63 them the exact command to run **themselves**:64 `node "${CLAUDE_PLUGIN_ROOT}/press/bin/gazette.mjs" approve "<title>" --dir <workspace> --by human`65 The press appends an `approve` event to the decision log; `canonical` is a **projection of that66 event**, not the frontmatter — so do NOT author `status: canonical` yourself (`gazette fsck` flags67 an authored `canonical` no approval backs, and ADR-0004 makes effective trust log-only). `reviewed:`68 is likewise projected from the approve event, not stamped by you.69 - **A reviewed backlog, applied at once (ADR-0005).** For many pages, the human can author a JSON70 manifest *while reading* and apply it in one command — still per-page judgment, and a reviewable71 artifact. Seed it with `gazette review --json` (each approvable item carries its current `digest`);72 keep the pages you vetted, move the rest to `reject` with a `because`, then `approve --from73 decisions.json --by human` (each approval pins the reviewed page digest; a page that drifted since74 is refused, and the batch commits atomically). `approve --all --by human`75 bulk-approves the whole *approvable* queue after a warning — a **deliberate weakening** of the76 human gate (the log marks it as a bulk `batch_id`); it is the human's call to run, **never yours**.77 - **reject** → hand the human `… reject "<title>" --dir <workspace> --by human [--reason "…"]` (an78 unauthorized reject is inert, so naming the human authority is what makes it stick). Once they79 confirm, remove the claim — delete the page only if it holds no other claim, else strike just this80 claim, never unrelated content — and append a NEW `review` minute naming what was rejected (the81 logbook is append-only; never rewrite a minute).826. **Structural check.** Run `bureau:inspect`; report the gazette state.837. **Report.** Counts approved / rejected / left pending, and the path to anything still84 `contested` (those are resolved by re-deciding in a session, not by review).8586## Ground-truth, honestly8788- A **fact about an artifact** (a path, a build command, a function signature, a config value,89 a dependency version, a commit) is mechanically checkable — `compile` marks it `verified`90 and review confirms. The fingerprint in `_verify.json` lets staleness auto-demote it later.91- A **judgment** ("we chose X because Y", "this module is fragile") cannot be verified, only92 **provenanced and read by a human**. Do not label a judgment `verified`; route it to the93 human in step 4. This is the split the gate exists for.9495## Recall convention (how memory is read back)9697Whoever reads the cabinets as memory MUST honor the tier on each claim: treat `canonical` as98fact; treat `verified` as checked-but-not-approved; treat `proposed`, `stale`, and `contested`99as claims to confirm before relying, never as fact. The tier travels on every recalled line so100an unverified claim can never masquerade as truth.101102## Rules1031041. **Human-gated; the AI never commits.** `canonical` is a projection of a **human-run** `approve`105 event. The AI presents and prepares the decisions but NEVER runs `gazette approve`/`reject`, never106 asserts `--by human`, and never authors `status: canonical` — the human runs the commands (ADR-0004).1072. **Reject is guarded and logged, never silent erasure.** Confirm before removing; delete a108 page only when it holds no other claim; otherwise strike just the rejected claim. Record the109 rejection by appending a NEW minute — existing entries are never rewritten.1103. **No prose invention.** Review promotes, demotes, or removes claims — it does not author new111 ones. New claims come from `compile`.1124. **Stale before approve.** Re-check fingerprints (step 2) before presenting the queue, so the113 human never approves something the repo already moved past.114115## Examples116117<example>118Context: After a compile run, three dossiers sit at `proposed`/`verified`.119user: "bureau:review"120assistant: "I'll re-check staleness, then show the queue. 3 claims pending — 2 facts auto-verified against the repo (build command, dep version), 1 judgment ('the queue module is fragile') that needs your call. Approve the two facts and the judgment? You approved the facts; I set them canonical. You rejected the judgment; I removed it and logged the rejection to today's minute."121<commentary>The gate promotes vetted claims to canonical and logs rejections — facts and judgments are presented apart because only the judgment needs human reasoning.</commentary>122</example>123124<example>125Context: A page `Build command` was `verified` last week; src has changed since.126user: "Vet what the AI remembered before I trust it."127assistant: "Running bureau:review. Staleness re-check first: `Build command`'s source fingerprint changed, so I demoted it to `stale` and added it to the queue rather than letting you approve a claim the repo already moved past."128<commentary>Step 2 re-checks fingerprints before presenting the queue, so a stale claim can't be approved as current.</commentary>129</example>130131## Scope note132133This skill covers ONLY the human approval gate and staleness re-check. It does **not** capture134sessions (`capture` / `bureau:file-session`), does **not** distil the logbook (`compile` /135`bureau:compile`), and does **not** run the semantic sweep (`lint` / `bureau:lint`). It acts on136the cabinets those produce and is invoked by the `bureau:review` command.137138To have **Codex** pre-screen the same queue as your representative — recommending approve/hold, then139either handing you the `--by human` command or (only where the workspace opted the `codex` authority140in) committing `--by codex` — reach for `bureau:codex-review` (`codex-review`) instead. It drives the141identical `gazette review --json` / `approve --from` surface; this skill stays the human-only gate.