After studying this material, you should be able to:
The most obvious way to measure an AI code reviewer is to watch what engineers do with its comments in production:
This feels intuitive. But it has a fundamental structural flaw.
A confusion matrix has four cells:
AI Said: Issue AI Said: Nothing
Actually an issue: True Positive FALSE NEGATIVE ← INVISIBLE
Actually fine: False Positive True Negative ← INVISIBLE
Acceptance-based measurement only ever fills two cells:
| Cell | What It Captures | Problem |
|---|---|---|
| True Positive | Engineer accepted comment | Assumes engineer is always right |
| False Positive | Engineer rejected comment | Assumes engineer is always right |
| False Negative | Bug the AI missed | Completely invisible |
| True Negative | Clean code, AI stayed silent | Completely invisible |
Key Insight: You can never know what the AI missed by watching what engineers accept. Silence is unobservable.
Engineers accept or reject comments for reasons unrelated to correctness:
This makes acceptance useful product telemetry but a weak benchmark label.
Before reading DashBench results, you need to understand the metrics it uses.
Think of a code reviewer casting a net to catch bugs:
PRECISION = Of all the issues the AI flagged, how many were real?
= True Positives / (True Positives + False Positives)
= "When it speaks, is it right?"
RECALL = Of all the real issues that existed, how many did the AI find?
= True Positives / (True Positives + False Negatives)
= "How much did it catch?"
The tension between them:
| Tradeoff | Effect |
|---|---|
| High Precision, Low Recall | Very accurate but misses many real bugs |
| High Recall, Low Precision | Catches most bugs but floods engineers with noise |
| Balanced F1 | Harmonic mean of both — overall quality score |
Not all bugs are equal. Missing a critical security flaw is far worse than missing a low-severity style issue.
DashBench applies severity weights:
| Severity | Weight |
|---|---|
| Critical | 4 |
| High | 2 |
| Medium | 1 |
| Low | 0.5 |
Weighted recall therefore penalizes missing a critical bug 8× more than missing a low-severity one.
Why this matters: A system could look good on raw recall by catching many trivial issues while missing every critical bug. Weighted metrics expose this.
DashBench is a measurement layer that replays historical PRs and scores whether the AI found real, human-actionable findings.
Historical PRs
↓
Replay through AI reviewer configurations
↓
AI produces structured findings (severity + evidence + file anchors)
↓
Compare against adjudicated ground truth labels
↓
Score: precision, recall, F1, cost, latency
↓
Disagreement audit → feeds back into judge calibration
DashBench deliberately includes different PR types to stress-test different behaviors:
| Case Type | Purpose |
|---|---|
| Historical PRs with real findings | Tests whether the AI catches known real issues |
| Benign PRs (near-zero real issues) | Tests restraint — a noisy reviewer on clean code is its own failure |
| Reverted/hotfixed PRs | Tests whether the AI catches genuine regressions |
Most benchmarks take a shortcut: they use human labels as ground truth. DashBench refused to do this.
Three sources were compared against each other:
Where they disagreed, the team manually re-reviewed the evidence and resolved it by hand. Those resolved cases then became calibration data for the judge.
Key Principle: Ground truth doesn't rest on any single fallible source. Human judgment, production feedback, and agentic evaluation each contribute — none is treated as infallible.
DashBench measures a staged (scout + reviewer) architecture against simpler single-pass baselines.
SINGLE-PASS:
Diff → [One LLM] → Comments
STAGED:
Diff → [Scout: flags suspicious areas]
↓
[Deep Reviewer: investigates leads, confirms or drops claims]
↓
Final Comments
This mirrors how strong human reviewers work:
Because every component is a variable you can hold fixed or swap independently:
This means DashBench can answer: "For this specific combination, what tradeoff between coverage, precision, cost, and latency do we get?"
| System | Real Findings | Weighted Precision | Weighted Recall | Cost/PR |
|---|---|---|---|---|
| DoorDash production (Sonnet 4.6 scout + Opus 4.8 reviewer) | 504 | 87.0% | 53.6% | $3.91 |
| No scout + GPT 5.5 high | 164 | 84.1% | 30.7% | $0.75 |
| No scout + Claude Opus 4.8 high | 115 | 89.8% | 20.2% | $0.65 |
What this tells us:
No single configuration dominates every axis:
| Configuration | Weighted Recall | Weighted Precision | Cost/PR | Best At |
|---|---|---|---|---|
| Kimi K2.6 + Claude Fable 5 | 65.2% | 89.2% | $3.81 | Recall & F1 |
| Composer 2.5 + GPT 5.5 medium | 18.0% | 92.2% | $3.53 | Precision |
| No scout + GPT 5.5 high | 30.7% | 84.1% | $0.75 | Cost |
Key Insight: "Best model" is a meaningless question until you specify best at what. DashBench makes the tradeoffs explicit rather than hiding them behind a single score.
Yes — significantly. Here is recall broken down by severity:
| Severity | Kimi K2.6 + Fable 5 | Sonnet 4.6 + Opus 4.8 | GPT 5.5 high (no scout) |
|---|---|---|---|
| Critical | 80.0% | 62.5% | 37.5% |
| High | 77.9% | 50.0% | 55.9% |
| Medium | 56.8% | 53.5% | 20.3% |
| Low | 46.8% | 51.4% | 4.2% |
Observations:
This is exactly why one aggregate score is insufficient.
No single signal is reliable ground truth:
Human labels → Reviewers miss valid issues, accept weak claims
Production data → Can't observe false negatives
Agentic judge → Non-deterministic, needs calibration
Solution: Use all three, treat none as infallible
Human attention degrades on complex tasks. AI judging is what makes labeling at scale tractable — but only with:
LLMs are non-deterministic. This has two implications:
| Implication | Consequence |
|---|---|
| A single run understates real coverage | Must run repeatedly and aggregate |
| The judge itself is stochastic | Needs calibration, not just deployment |
Design your measurement system for stochasticity rather than pretending it away.
These metrics move independently:
Weighted Precision ←→ Weighted Recall
Weighted F1 ←→ Cost per PR
High/Critical Recall ←→ Low Severity Recall
Latency ←→ Coverage
A system can win on one and lose on another in the same run. "Better" requires specifying better at what.
Here is how all the concepts connect:
PROBLEM: How do we know if our AI code reviewer is actually good?
WRONG ANSWER: Watch acceptance rates
→ Only sees 2 of 4 confusion matrix cells
→ Can't observe false negatives (missed bugs)
→ Human acceptance ≠ correctness
RIGHT ANSWER: Build a benchmark (DashBench)
→ Replay frozen historical PRs
→ Compare against multi-source adjudicated labels
→ Score with multiple metrics (precision, recall, F1, weighted variants)
→ Measure cost and latency too
→ Never trust any single signal as ground truth
WHAT YOU LEARN:
→ Staging buys recall at the cost of money and latency
→ No model mix dominates every axis
→ Severity splits reveal what aggregate scores hide
→ "Best" is meaningless without specifying the tradeoff you care about
| Concept | One-Line Definition |
|---|---|
| False Negative | A real bug the AI missed — invisible to acceptance metrics |
| Precision | Of what the AI flagged, how much was real |
| Recall | Of what was real, how much the AI found |
| Weighted metrics | Precision/recall that penalizes missing high-severity issues more |
| F1 | Harmonic mean of precision and recall |
| Staged architecture | Scout flags areas → Reviewer validates → Higher recall, higher cost |
| Single-pass baseline | One model does everything → Lower cost, lower recall |
| Ground truth triangulation | Using multiple fallible sources together rather than trusting any one |
| DashBench | DoorDash's replay-and-score measurement layer for code review quality |