| name | review |
| description | Code review via risk-routed judgment lanes — static tools first, then only the lanes the diff's surface warrants, blocker findings refuter-verified and fixed green-to-green |
| argument-hint | Optional — file paths or git diff range to review |
Code Review
Review a diff with machine checks first and model judgment only where the diff earns it. No orchestrator agent: routing is a path-glob table, aggregation is yours, and each lane is one focused reviewer.
Step 1: Scope
$ARGUMENTS names files or a range → use it. Otherwise git diff --name-only HEAD~1. Hold the concrete file list; everything routes off it.
Step 2: Tools before models
Run the project's static battery over the scope first (lint, format check, ArchUnit-tier tests, semgrep — whatever the project's fast gate declares). Tool findings are findings; a model reviewing import order is the most expensive linter ever built. Only what tools cannot judge proceeds to lanes.
Step 3: Route lanes by surface
| Diff touches | Lanes |
|---|
| anything | reliability (always) |
| SQL, migrations, queries, loops over collections | + performance |
| auth, input parsing, secrets, network boundaries | + security |
| module seams, new files, public interfaces | + architecture |
Spawn the routed lanes in parallel (foreground), each with the file list and CLAUDE.md for conventions; reliability and security additionally get the task's requirements.md/mechanics.md when a task path exists — the other lanes derive nothing from spec docs. Lanes return finding rows: file, line, severity, failure scenario, fix sketch. Severity calibration comes from the project's CLAUDE.md; when in doubt a lane scores one level lower.
Step 4: Verdict and fixes
- Aggregate the rows; dedupe by file+line; spot-check each surviving finding against the source before acting — a reviewer citing a line that doesn't exist is a discarded finding, not a fix.
- Blockers (at or above the project's blocking bar): verify each with a parallel refuter vote — three refuters prompted to refute, each spawned with an explicit
model: sonnet (a bare spawn inherits the session model, which is the expensive tier), the finding surviving only if at most one succeeds. Survivors you fix yourself, green-to-green (test files untouched); commit through the session's normal consent flow.
- Sub-blockers: report as follow-up rows; no fix loop, no re-review.
- Re-run the static battery after fixes. One re-review pass at most, scoped to the fixed files plus the reliability lane; carry anything still open into the report.
Step 5: Report
Verdict (ship / fix-first), the finding table (blockers with refuter tallies, follow-ups), fixes with SHAs, and what the tools caught that lanes never had to — the cheapest finding is the one a model never made.