/review — the review orchestrator (whether / when / which / how hard)
/review does not blindly review — it assesses the situation, picks the right review shape, sets
a round budget, and then runs it (either an in-session self-review, or by dispatching to a
cross-model gate). Reviewing badly is worse than not reviewing: reviewing before the plan is formed
wastes a pass, reviewing after every trivial edit trains you to ignore findings, and looping a
reviewer past convergence degrades the change.
The ladder (lightest → heaviest)
Escalate for independence and thoroughness, not out of habit. Start at the lightest tier the
risk justifies:
- light — in-session self-review (Phase 3B). I review the diff. Fastest and cheapest (no
external model, no process spawn). Its weakness is exactly its cost: it's the author grading its
own work — least independent — so it's for low-risk diffs and as a first pass before
escalating.
- cross-model —
/codex-review (if present). One independent external model (different
vendor), mechanically gated. Reach here when the diff is non-trivial or self-review's
independence isn't enough.
- panel —
/review-panel (if present). Multiple independent reviewers, pre-merge. For complex
or elevated-risk (privacy/cost/data-loss/money) diffs where a mistake is asymmetric.
Phase 1 — Assess (read, don't guess)
- Artifact state: a plan/spec with little/no code, a diff (
git diff --stat <base> — size,
file count), or both?
- Risk surface (the multiplier): elevated when the change touches auth/tokens, permissions/
access control, private data, per-user cost / metered spend, data deletion/migration,
persistent-store writes, money, or a shared wire contract. Low when it's docs, tests, copy, a
mechanical rename, or a localized pure-function tweak with tests.
- Blast radius: flag-gated & dark vs live-to-users vs shipped-on-merge.
- Review history this lane: rounds run, and is the trend converging (fewer/less severe) or
DEEPENING (new lower-severity findings each round)?
Phase 2 — Choose a shape and set a round budget
| Situation |
Shape |
| Plan/spec exists, little/no code |
Defer the diff review. Review the plan now. Catching an architecture gap here is ~free; after N tasks it's a rebuild. |
| Trivial / docs-only / tests-only / mechanical rename |
No review. Say why in one line. |
| Normal feature diff, low risk |
light (Phase 3B) or a single cross-model pass — one gate, not both. |
| Complex OR elevated-risk diff, pre-merge |
panel, --focus-flagged at the exact risk. |
| Multi-task lane |
Budget the lane: plan review now → one review per substantive task → one panel pre-merge. Don't panel every task. |
| Already reviewed, only trivial edits since |
Don't re-review. |
Round budget — set from risk, extend only on convergence:
- Skip 0 (trivial) · Standard 1 · Elevated/multi-file 2 · High-risk (auth/privacy/cost/data-loss) 2–3.
- Converging → may extend +1 with a one-line justification in the lane summary.
- DEEPENING (round 2+ surfaces new, lower-severity findings instead of confirming the round-1
fixes) → stop. Escalate the residual to the human. It's a scope call, not a convergence
problem — do not open another round.
- Hard backstop 6, absolute. Reaching it means escalate, never a 7th.
Conditional dispatch: use /codex-review for the cross-model shape and /review-panel for the
panel shape if they exist in this project; otherwise fall back to the light self-review at the
chosen budget, and say so.
Phase 3A — Dispatch (cross-model / panel)
Invoke /codex-review (single) or /review-panel (panel) for the target (--plan <file> before
build; --base/--staged after). Carry the anti-spiral rules (below). Those skills own their exit
codes — don't re-run the deterministic gates by hand.
Phase 3B — Light in-session self-review
The cheap mode: I review the diff for real problems and grade every finding by evidence.
Evidence ladder — each finding gets one tag; nothing is a confirmed bug unless provable:
- CONFIRMED — traced the full path (file:line → file:line, 3+ steps) or a concrete triggering
input. Only CONFIRMED is blocking.
- LIKELY — strong reasoning, one inferred link. POSSIBLE — an untraced smell, informational.
UNFOUNDED — considered and ruled out.
Rule: if I can't trace it to lines or produce a triggering input, it's at most POSSIBLE. Keeps the
blocking list short and trustworthy.
Assumption-verification (run first). For each changed file: "what must be true elsewhere for
this to actually run?" — then verify instead of trusting. Generic categories:
- Wiring — a new/edited unit is actually registered/imported where the system loads it
(coded-but-not-wired ships silently).
- Config/env — new settings/secrets are declared where the code reads them, gated, and
documented; deploy/CI config agrees (no sibling-file drift).
- Contract stability — public names, response keys, routes, and stored-data keys are unchanged
unless changing them is the point.
- Every mutation site — a new field on a stored shape is set at all write paths, not just the
new one.
Domain checks: schema/API consistency across consumers; concurrency correctness (unguarded
read-modify-write on eventually-consistent stores); auth on every new entrypoint; security
(secrets, input validation, injection, output encoding); common bugs (null/undefined, swallowed
errors, off-by-one, missing await); quality (dead code, needless complexity).
Output: per finding [TAG] file:line — what it is, why it bites, the fix; trace or
triggering input for CONFIRMED. Lead with CONFIRMED/LIKELY, then POSSIBLE as a short list.
Anti-spiral rules (apply in every mode)
- Pre-commit the fix bar BEFORE reading findings. Fix CRITICAL/IMPORTANT (core journey, data
loss, security, privacy/cost leak). MINOR/NIT → file as issues, don't fix in-loop.
- DEEPENING = terminal (Phase 2). Stop and escalate; don't open another round.
- Don't re-review after a trivial/mechanical fix — only after substantive change.
- The author never overrules a cross-model CRITICAL/IMPORTANT by re-arguing — that forfeits the
independence. Genuine disagreement is a human escalation, not a silent override.
1---2name: review3description: The top-level review verb — decide WHETHER, WHEN, WHICH, and HOW HARD to review a change before reaching for a review tool. Assesses the situation (a plan vs a diff, the risk surface, what changed since the last review, rounds already spent), picks the lightest review shape the risk justifies (in-session self-review → cross-model → multi-model panel), sets an initial round budget it will extend only on convergence, and dispatches. Exists to stop review spirals: reviewing before the plan is formed, reviewing after every trivial edit, or looping a reviewer past the point of convergence. Triggers on `/review`, "should I review this", "what review does this need", "is this worth a codex-review / panel".4---56# /review — the review orchestrator (whether / when / which / how hard)78`/review` does not blindly review — it **assesses the situation, picks the right review shape, sets9a round budget, and then runs it** (either an in-session self-review, or by dispatching to a10cross-model gate). Reviewing badly is worse than not reviewing: reviewing before the plan is formed11wastes a pass, reviewing after every trivial edit trains you to ignore findings, and looping a12reviewer past convergence *degrades* the change.1314## The ladder (lightest → heaviest)1516Escalate for **independence and thoroughness**, not out of habit. Start at the lightest tier the17risk justifies:18191. **light — in-session self-review (Phase 3B).** *I* review the diff. Fastest and cheapest (no20 external model, no process spawn). Its weakness is exactly its cost: it's the author grading its21 own work — **least independent** — so it's for **low-risk** diffs and as a first pass before22 escalating.232. **cross-model — `/codex-review`** (if present). One independent external model (different24 vendor), mechanically gated. Reach here when the diff is non-trivial or self-review's25 independence isn't enough.263. **panel — `/review-panel`** (if present). Multiple independent reviewers, pre-merge. For complex27 or elevated-risk (privacy/cost/data-loss/money) diffs where a mistake is asymmetric.2829## Phase 1 — Assess (read, don't guess)3031- **Artifact state:** a *plan/spec* with little/no code, a *diff* (`git diff --stat <base>` — size,32 file count), or both?33- **Risk surface** (the multiplier): elevated when the change touches auth/tokens, permissions/34 access control, **private data**, **per-user cost / metered spend**, data deletion/migration,35 persistent-store writes, money, or a shared wire contract. Low when it's docs, tests, copy, a36 mechanical rename, or a localized pure-function tweak with tests.37- **Blast radius:** flag-gated & dark vs live-to-users vs shipped-on-merge.38- **Review history this lane:** rounds run, and is the trend *converging* (fewer/less severe) or39 *DEEPENING* (new lower-severity findings each round)?4041## Phase 2 — Choose a shape and set a round budget4243| Situation | Shape |44|---|---|45| Plan/spec exists, little/no code | **Defer the diff review.** Review the *plan* now. Catching an architecture gap here is ~free; after N tasks it's a rebuild. |46| Trivial / docs-only / tests-only / mechanical rename | **No review.** Say why in one line. |47| Normal feature diff, low risk | **light** (Phase 3B) or a single **cross-model** pass — one gate, not both. |48| Complex OR elevated-risk diff, pre-merge | **panel**, `--focus`-flagged at the exact risk. |49| Multi-task lane | Budget the lane: plan review now → one review per *substantive* task → **one** panel pre-merge. Don't panel every task. |50| Already reviewed, only trivial edits since | **Don't re-review.** |5152**Round budget — set from risk, extend only on convergence:**53- Skip **0** (trivial) · Standard **1** · Elevated/multi-file **2** · High-risk (auth/privacy/cost/data-loss) **2–3**.54- **Converging** → may extend **+1** with a one-line justification in the lane summary.55- **DEEPENING** (round 2+ surfaces *new, lower-severity* findings instead of confirming the round-156 fixes) → **stop. Escalate the residual to the human.** It's a scope call, not a convergence57 problem — do not open another round.58- **Hard backstop 6, absolute.** Reaching it means escalate, never a 7th.5960**Conditional dispatch:** use `/codex-review` for the cross-model shape and `/review-panel` for the61panel shape *if they exist in this project*; otherwise fall back to the **light** self-review at the62chosen budget, and say so.6364## Phase 3A — Dispatch (cross-model / panel)6566Invoke `/codex-review` (single) or `/review-panel` (panel) for the target (`--plan <file>` before67build; `--base`/`--staged` after). Carry the anti-spiral rules (below). Those skills own their exit68codes — don't re-run the deterministic gates by hand.6970## Phase 3B — Light in-session self-review7172The cheap mode: **I** review the diff for real problems and grade every finding by evidence.7374**Evidence ladder** — each finding gets one tag; nothing is a confirmed bug unless provable:75- **CONFIRMED** — traced the full path (file:line → file:line, 3+ steps) or a concrete triggering76 input. Only CONFIRMED is blocking.77- **LIKELY** — strong reasoning, one inferred link. **POSSIBLE** — an untraced smell, informational.78 **UNFOUNDED** — considered and ruled out.7980Rule: if I can't trace it to lines or produce a triggering input, it's at most POSSIBLE. Keeps the81blocking list short and trustworthy.8283**Assumption-verification (run first).** For each changed file: *"what must be true elsewhere for84this to actually run?"* — then verify instead of trusting. Generic categories:85- **Wiring** — a new/edited unit is actually registered/imported where the system loads it86 (coded-but-not-wired ships silently).87- **Config/env** — new settings/secrets are declared where the code reads them, gated, and88 documented; deploy/CI config agrees (no sibling-file drift).89- **Contract stability** — public names, response keys, routes, and stored-data keys are unchanged90 unless changing them is the point.91- **Every mutation site** — a new field on a stored shape is set at *all* write paths, not just the92 new one.9394**Domain checks:** schema/API consistency across consumers; concurrency correctness (unguarded95read-modify-write on eventually-consistent stores); auth on every new entrypoint; security96(secrets, input validation, injection, output encoding); common bugs (null/undefined, swallowed97errors, off-by-one, missing `await`); quality (dead code, needless complexity).9899**Output:** per finding **[TAG]** `file:line` — what it is, why it bites, the fix; trace or100triggering input for CONFIRMED. Lead with CONFIRMED/LIKELY, then POSSIBLE as a short list.101102## Anti-spiral rules (apply in every mode)1031041. **Pre-commit the fix bar BEFORE reading findings.** Fix CRITICAL/IMPORTANT (core journey, data105 loss, security, privacy/cost leak). MINOR/NIT → **file as issues, don't fix in-loop**.1062. **DEEPENING = terminal** (Phase 2). Stop and escalate; don't open another round.1073. **Don't re-review after a trivial/mechanical fix** — only after substantive change.1084. **The author never overrules a cross-model CRITICAL/IMPORTANT by re-arguing** — that forfeits the109 independence. Genuine disagreement is a human escalation, not a silent override.