Living AI code review benchmark

As of September 2026, 5 AI models reviewed the same 202 PRs with a planted bug or a clean change. Overall recall runs from 86% to 98%. On security bugs recall ranges from 73% to 100%. On code that does not do what was asked, no model exceeds 96%. Every model asked for changes on 1–3 of 28 clean PRs.

What this measures

Each DiffDojo PR is a single change with written requirements and either one planted bug of a known class or nothing wrong at all. A model reads the diff and the requirements, leaves line comments and a verdict, and a pinned grader checks the comments against the rubric the way it grades a human. So this measures one thing: does the model catch the bug when it knows a bug may be there and where to look.

That is an upper bound, not a forecast for your repository. On bugs that reached production, public benchmarks put AI reviewers at 25–47% recall: multi-file changes, no requirements text, no hint that anything is wrong. The gap between the two numbers is the part of code review that still belongs to a person, and it is the part this library trains: the same PRs, the same grader, a blind-spot profile per reviewer instead of a leaderboard.

Where the models still miss

Results

Public and private holdout scores are shown separately. Recall is caught planted issues divided by all planted issues on buggy PRs.

ModelGrader modelPublic recallHoldout recallPublic clean PRs rejectedHoldout clean PRs rejectedPublic verdict accuracyHoldout verdict accuracyPublic parse errorsHoldout parse errorsPublic cost / PRHoldout cost / PR
anthropic/claude-sonnet-5@claude-codeOpenAI grader G198%96%2 / 281 / 598%93%0 / 2020 / 30≈ $0.0709 (subscription, API-equivalent)≈ $0.0721 (subscription, API-equivalent)
deepseek/deepseek-v4-pro-0813OpenAI grader G186%80%2 / 280 / 588%83%5 / 202 (3 on clean)1 / 30$0.0064$0.0063
google/gemini-3.8-flashOpenAI grader G190%88%1 / 280 / 591%90%1 / 2020 / 30$0.0042$0.0042
openai/gpt-5.6-sol@codex-cliOpenAI grader G194%100%3 / 281 / 594%97%0 / 2020 / 30$0 (subscription)$0 (subscription)
qwen/qwen3.8-max-0902OpenAI grader G195%96%2 / 280 / 595%97%4 / 202 (3 on clean)3 / 30 (3 on clean)$0.0146$0.0220

Recall by category

Public PRs only, models that scored every public PR; each category uses its own planted-issue denominator.

Categoryclaude-sonnet-5deepseek-v4-pro-0813gemini-3.8-flashgpt-5.6-solqwen3.8-max-0902
security100%82%73%95%91%
requirement-fidelity96%87%87%91%87%
edge-cases98%92%94%96%98%
hallucinated-apis100%88%100%100%100%
state-management93%83%90%83%90%
performance100%92%100%100%100%
data-correctness100%83%96%100%100%
deceptive-tests100%67%83%100%100%
over-engineering100%100%75%75%100%

Darker is higher recall. Cells under 85% are outlined: those are the classes where the model choice matters.

Trend

MonthModelGrader modelPublic recallPublic PRs
2026-09anthropic/claude-sonnet-5@claude-codeOpenAI grader G198%202
2026-09deepseek/deepseek-v4-pro-0813OpenAI grader G186%202
2026-09google/gemini-3.8-flashOpenAI grader G190%202
2026-09openai/gpt-5.6-sol@codex-cliOpenAI grader G194%202
2026-09qwen/qwen3.8-max-0902OpenAI grader G195%202

Methodology

DiffDojo PRs pair written requirements with an AI-written code change and a planted issue or a clean implementation. Every model receives the same versioned prompt (v1), including every file's unified diff with old and new line numbers. Each model gets one sample per PR, at temperature 0 where supported; reasoning snapshots that reject this parameter use the provider default.

A comment must point to the correct file, side and printed line; a correct description on another line is a miss, as in the product. Grading uses a pinned OpenAI model snapshot, versioned here as G1, G2, …; a snapshot change is announced on this page and never mixed inside one run. The grader credits an issue when the comment covers the rubric's core claim, without requiring supporting details. Grading fallback aborts a run rather than inflating recall. Only an off-target comment classified as a concrete false positive counts as a false flag; questions and nitpicks do not.

Thirty stratified PRs, including clean changes, remain in the app library but are excluded from the public per-PR CSV. Holdout results appear only as aggregates. The holdout is carved from an existing public-answer library, so it is weaker than never-published content. The OpenAI grader may favor OpenAI-family reviewers; this v1 benchmark discloses that bias but does not correct it.

Model-call costs use provider-reported cost when available, otherwise recorded prompt and completion tokens with the versioned price table; the separate grader cost is excluded. Parse errors (an empty or unparsable reply) count as approve with no comments; on a clean PR that reads as a correct verdict by accident, so the parse-error column says how many fell on clean PRs. "Clean PRs rejected" counts clean PRs where the model asked for changes. These are one-sample estimates, not confidence intervals.

Models suffixed @claude-code or @codex-cli ran through the vendor's local CLI on a subscription (anthropic/claude-sonnet-5@claude-code, openai/gpt-5.6-sol@codex-cli): the same prompt, one turn, no tools, an empty working directory, the CLI's default sampling. Their cost is the API-equivalent the CLI reports, when it reports one.

Download the CSV (CC BY 4.0): recall per model and category on the public set, aggregated so it cannot serve as an answer key.

Last updated: 2026-09-19.

Measure yourself

Your blind spots are scored the same way: same PRs, same grader.

Free, no signup. You get the canonical review after your verdict.

Review today's PR
Read next AI code reviewers miss about half the bugs in production, and nobody benchmarks the human catching the rest