13 Phases. 63 Decisions. 138 Bugs in the Spec.
An adversarial code review protocol — designed by one model, scrutinized by every model that didn't build it.
I asked Claude to review my code. Clean. GPT agreed. Gemini agreed. Five models, same conversation, shown each other's work. Unanimous PASS.
Then I pasted the same code into five separate browser tabs. No shared context. No anchoring. No awareness of who else was reviewing.
Thirteen bugs. Two catastrophic.
The difference wasn't the models. It was the architecture of the question.
The structural problem
LLMs exhibit three distinct review behaviors depending on context architecture. Same thread, re-run the prompt — self-preferencing. New thread with prior findings — anchoring bias dressed as independence. New thread, open-ended, no prior context — genuine independent discovery.
Most developers live in the first. Fresh context per reviewer is the only reliable mechanism. Not a best practice — a hard architectural constraint.
The protocol
Five commands. Two review phases.
RESEARCH — validate design decisions before writing code
research → bundle → [paste to 4+ LLMs] → resolve → close
╰── repeat until converged ──╯
IMPLEMENTATION — adversarial audit after research is locked
implement → bundle → [paste to 4+ LLMs] → resolve → close
╰── repeat until converged ──╯Research locks design decisions via majority agreement across independent models before code is written. Implementation hunts bugs until every model on the panel returns PASS. Different cognitive modes, different convergence criteria. Neither is optional — the agent enforces the sequence. Try implementation without completed research and it refuses.
Before external models see the code, the agent spawns four parallel copies of itself — Security, Correctness, Architecture, Test Coverage — each in isolation with defined scope boundaries. They catch the straightforward bugs. They share the same blind spots.
The pre-filter is a net, not a gate.
The protocol iterates until every model — minimum four — returns PASS. Three safety gates prevent false convergence: adversarial confirmation when round 1 is clean across all models, spot-check of dropped models before declaring convergence, and force-disposition of findings that persist unresolved for three consecutive rounds. A hard round cap forces explicit triage when convergence isn't reached.
The noise floor
Round 1 findings are roughly 60% wrong. The protocol is built around this fact.
Five false positive categories, each epistemic — why is the model's claim wrong about the current code? A two-step procedure: check factual correctness first, then check whether preconditions exist. Order matters.
Four severity levels with one bright-line rule: if a finding can produce materially wrong behavior, it cannot be P3. Severity modulates how much corroboration you need — a potential catastrophic bug demands investigation from a single model, a documentation suggestion requires 75% agreement.
Corroboration has two vocabularies because same-family agreement is weaker than it looks. Four copies of Claude agreeing is roughly equivalent to two unrelated models agreeing — shared training data creates correlated blind spots. The protocol separates internal from external corroboration. When the coding agent and Claude on the web both flag something but no other model agrees, their agreement doesn't count. The rule is finding-specific — Claude counts normally whenever any other model family also sees the issue.
What makes it converge: each round carries forward every dismissed finding with reasoning. By round 3, false positives are near zero.
Not because models are told to stop. Because the argument is sound.
Five dispositions for real issues. The constraint that matters: DEFERRED requires an explicit owner and target. No finding leaves the system undecided.
The numbers
| Target | Phases | Bugs | Rounds | Models |
|---|---|---|---|---|
| The protocol itself | 13 | 138+ | 60+ | 5–7 |
| Sweep (Python CLI) | 4 | 77 | 5–9 | 5 |
| WiFi hardening (OpenWrt) | 8 | 57 | 2–5 | 5 |
| Stage (Spring Boot + Next.js) | 7 | 38+ | 3–8 | 5–6 |
| BarberOS (Spring Boot) | 3+ | — | — | 6 |
Model performance
Empirical rankings from per-finding attribution across 300+ triaged findings. Not benchmarks — adversarial performance under real review conditions.
| # | Model | Observed behavior |
|---|---|---|
| 1 | ChatGPT | Late-round persistence. Finds bugs after every other model converges. |
| 2 | Gemini | Consistent across all rounds. No caveats. |
| 3 | Codex | Highest unique-finding rate. Often catches what the coding agent missed. |
| 4 | Claude | Thorough R1, converges by R2–3. Subject to the sole-agreement rule. |
| 5 | Grok | Strong independent perspective. |
| 6 | DeepSeek | Good R1 breadth. Diminishing returns after R2. |
| 7 | Kimi | Capable. Breaks on large intakes (~170KB). |
New models enter a three-phase probation — promotion requires a unique P0/P1 find or ≥50% corroboration rate. Existing models are re-evaluated on events, not schedules.
Reviewing the review
The methodology was designed entirely by Claude. It worked — hundreds of bugs across multiple projects. But the design itself had never faced external scrutiny.
13
phases
63
decisions locked
138+
bugs in the spec
25
constraints
When it started, the protocol had no research phase, no severity mapping, no convergence criteria, and commands named after cognitive steps — triage, ship — that meant nothing to a model that didn't invent them. What the external models found were Claude-isms: designs optimized for one model's internal reasoning but hostile to cross-agent reproducibility.
The dominant bug class across all 13 phases: the coding agent compressing the canonical spec into its own instruction file in ways that silently changed behavior. Three of six external P2 fixes in one phase were behavioral compressions that went unnoticed until adversarial audit. This became the protocol's most-cited constraint — compression must be non-behavioral.
The hardest subsystem was model strategy — seven audit rounds, the only topic to invoke the hard round cap. The central debate: whether Claude-family overlap should reduce corroboration globally or only when no other model agrees. Round 1 split 3–3. Round 2 resolved 5/5 after DeepSeek delivered a mathematical proof that the opposing camp's concern produced no different outcomes under the existing threshold math.
They called it a mathematical phantom.
Specifications converge slower than code. Code has a test suite. A spec about how to review code has infinite surface area for wording precision and semantic drift between the summary and the operative section.
What the models get wrong
Across 300+ triaged findings, the dominant false-positive pattern is designing for imaginary teams. Persistent scope artifacts for a 30-second conversation. JSON state-transfer files when the filesystem is the state. Error recovery appendices for every conceivable failure mode.
This is a solo workflow. One person's terminal. The models don't know that, so they design for a team that doesn't exist. By round 3, they stop — the dismissal reasoning is already in the prompt.
Sixty-three decisions locked by models that didn't build the system. A hundred thirty-eight bugs found by a spec auditing itself. It runs on one developer pasting documents into browser tabs.
Most specifications stop being reviewed long before they stop being wrong.
Research it. Implement it. Bundle it. Resolve it. Close it.