TL;DR
Adversarial Review (AR) is a three-role protocol: a main agent produces code or text, a reviewer checks it, and a critic checks the review itself before the main agent touches anything. The key mechanic: the critic and reviewer argue with each other in a separate "internal" loop — and only once their positions settle do the edits land in the actual document.
The paper's main finding: when you put two roles in an LLM dialogue and task them with reaching one shared conclusion, they quickly converge on agreement, even when it's wrong. In one test, the critic raised a real problem in the code, but the reviewer brushed it off with a confident-sounding but empty statement with no reference to the actual code — and the critic just gave up. On paper, this looked like "structured disagreement," but in reality it was a false consensus.
The method fixes this not by adding more agents, but with a rule: the critic must pick one of three response types — agree, point to a specific quote as evidence of disagreement, or raise a concern without evidence (in which case the reviewer must either back up the point with a quote or drop it). A simple text rule — "argue with evidence or stay quiet" — and finding accuracy jumps noticeably.
Method Blueprint
STEP 1: Main agent (M) produces an artifact (code/text/document) → version N
STEP 2: Reviewer (R) checks the artifact → list of comments with quotes
STEP 3: Critic (C) evaluates each comment from R and picks one:
- AGREE
- DISAGREE_EVIDENCE: <quote> (disagree, here's the evidence)
- DISAGREE_CONCERN: <question> (disagree, but no direct quote)
STEP 4: R responds per the rule:
- on AGREE → leaves the comment as is
- on DISAGREE_EVIDENCE → revises the comment
- on DISAGREE_CONCERN → either backs it up with a quote or drops it
STEP 5: Steps 2-4 repeat (up to 5 rounds) until the review stabilizes
STEP 6: M edits the artifact per the final review → version N+1, cycle repeats
You can run all of this in a single chat with one prompt — the model plays all three roles in turn.
Example Application
Task: Before signing, a freelancer received a website-development contract and wants to check it for hidden unfavorable clauses — not just get a polite "looks fine."
Prompt:
You will take turns playing two roles: Reviewer (R) and Critic (C).
The artifact to review is the contract below.
[insert contract text]
STEP 1 — R: find clauses in the contract that could be unfavorable to the freelancer
(payment deadlines, penalties, rights to the work product, force majeure).
For each clause, give an exact quote from the contract.
STEP 2 — C: evaluate each of R's comments. For each, pick one:
- AGREE — you agree with the comment
- DISAGREE_EVIDENCE: <quote> — you disagree, here's the contract clause
that contradicts the comment
- DISAGREE_CONCERN: <question> — you disagree, but without a direct quote
STEP 3 — R: respond to C's reaction.
On AGREE — keep the comment.
On DISAGREE_EVIDENCE — revise the comment in light of the quote.
On DISAGREE_CONCERN — back up the comment with a quote from the contract
or drop it.
Repeat steps 1-3 until the list of comments stabilizes (max 3 rounds).
At the end, output the final list of real contract risks with quotes.
Result: The model will show 1-3 rounds of exchange: the reviewer's initial comments, the critic's reactions with or without quotes, and final revisions. At the end — a list of risks, each backed by an exact quote from the contract, rather than vague phrases like "this clause seems off."
Why It Works
An LLM playing two "collaborating" roles tends to agree rather than search for the truth — much like human politeness in teamwork, minus any real stakes for being wrong. If you simply ask the model to "critique your own review," it often just rubber-stamps what's already written — because the implicit goal of the dialogue is perceived as "reach agreement," not "find the truth."
On the other hand, LLMs are good at following explicit text formats with mandatory fields. If you say "pick one of three options, and for two of them quote a specific spot," the model follows this almost literally, because it's a concrete structure rather than an abstract request to "be more rigorous."
The method leverages this strength to route around the weakness: instead of a vague "don't just agree for the sake of it," it gives a concrete rule where disagreement without a quote automatically gets bounced back for review. This turns empty agreement into forced justification.
Control levers: - Number of rounds (5 max in the original) → 2-3 is enough for a simple task, saving tokens. - Type of evidence ("code quote") → swap for "quote from the text/contract/figures in the report" depending on your task. - Exit condition ("first round with no comments = accepted immediately") → keep it, or replace with "explicit confirmation from both sides." - Roles can be given specific names ("Skeptical Lawyer" instead of "Critic") — sharpens the reaction.
Prompt Template
You will take turns playing three roles: Main Author (M), Reviewer (R), Critic (C).
Artifact to review: {text/code/document}
STEP 1 — M: if the artifact doesn't exist yet, create it.
If it already exists, treat it as version 1.
STEP 2 — R: review version {N} of the artifact and produce a list of comments.
For each comment, give an exact quote from the artifact.
STEP 3 — C: evaluate each of R's comments. For each, pick one option:
- AGREE — you agree with the comment
- DISAGREE_EVIDENCE: <quote> — you disagree, here's the spot in the artifact
that contradicts the comment
- DISAGREE_CONCERN: <question> — you disagree, but without a direct quote,
this is an open question
STEP 4 — R: respond to C's reaction.
On AGREE — leave the comment as is.
On DISAGREE_EVIDENCE — revise the comment in light of C's quote.
On DISAGREE_CONCERN — back up the comment with a quote from the artifact
or drop it.
Repeat steps 2-4 until R and C reach a stable list of comments
(max {number_of_rounds} rounds). If there are no comments in round one,
finish immediately.
STEP 5 — M: based on the final list of comments, edit the artifact
and describe what changed.
Fill in {text/code/document} with whatever needs reviewing, and {number_of_rounds} with your cycle limit (2-3 for simple tasks, 5 for complex ones).
🚀 Quick Start — paste this into your chat:
Here's an Adversarial Review template for checking text/code through two roles
with mandatory evidence whenever they disagree. Adapt it to my task:
{your task}. Ask me questions to fill in the fields.
[paste the template above]
The LLM will ask what exactly needs reviewing and what kind of "evidence" makes sense (a code quote, a contract clause, a figure in a report) — because without that, the critic can't back up any disagreement. The model will take the pattern from the template and adapt it to your task.
Limitations
⚠️ Without the evidence rule, the method is worse than a regular review. The naive version of AR (without mandatory quotes) produced the worst result of all tested methods on code-review tasks — the critic and reviewer simply agreed with each other.
⚠️ Scope creep. The critic may raise a hypothetical question ("what if a user does this?"), and the main agent starts reworking things nobody asked for — the method sometimes drifts beyond the original task.
⚠️ Cost. The method burns noticeably more tokens than a plain request without review — on real-world tasks the gap reached nearly 5x. Not worth it for simple, low-stakes tasks.
How It Was Studied
The researchers built the method up step by step: starting with a plain request with no review, then adding self-critique, a separate reviewer, two reviewers, and a five-agent system (MARS) — measuring at each step whether the added complexity actually helped. They tested on 105 coding tasks (LiveCodeBench), 100 real pull requests with human comments (SWE-PRBench), and 500 real bugs from open-source repos (SWE-bench Verified).
Interestingly, on simple coding tasks, AR with its two arguing roles beat the five-agent system while using fewer agents — interactivity mattered more than headcount. But on the task of evaluating the quality of the reviews themselves, AR unexpectedly delivered the worst result among all methods tested — precisely because of false consensus. After adding the mandatory-evidence rule, the method became the best in that same category. On real bugs, AR fixed the root cause more thoroughly than simpler methods (the matplotlib example), but sometimes expanded edits beyond the scope of the task (the astropy example) — showing that structured disagreement acts as an amplifier: it amplifies both good instincts and unnecessary ones.
Adaptations and Extrapolations
🔧 Technique: code quote → quote from any source
The original calls for a reference to a specific line of code. Swap it for a quote from a text, contract, financial report, or design mockup — the principle "disagreement without evidence doesn't count" works the same way for any content you can quote.
Example: when reviewing ad copy, the critic must quote the exact phrase in the ad rather than just saying "this sounds weak."
🔧 Technique: capping the number of rounds to fit a budget
For a quick check of a short text (a post, an email), 1-2 rounds are enough instead of 5 — saving tokens and time without losing the essence of the method.
Resources
Eric S. Qiu (Cornell University), Joyce Gill (Stanford University) — "Adversarial Review: Structured Disagreement for Grounded Agentic Code Review," PMLR 306, 2026. The method was compared against Self-Refine (Madaan et al., 2023) and Multi-Agent Review Systems (MARS, Wang et al., 2025), and tested on the LiveCodeBench, SWE-PRBench, and SWE-bench Verified benchmarks.
Want this for your own case? Apply this study to your task: AI adapts its method to what you are working on and writes the prompt.