
TL;DR
- 134 of the 147 defects that escaped our review between May and October 2026 were in the diff, so an AI reviewer stays a required gate.
- Graded by a blind judge, the commercial reviewer's real-defect count fell from 72 to 37, pending a hand spot check of 29 findings.
- A frontier model dropped into our review harness at default settings found 17 of 70 real defects, where the incumbent found 48 to 49.
- Replaying data-transform changes against stored production inputs surfaced problems no diff could show, such as 177 flags from one client's conventions.
- We cap automated review at 3 rounds and require file-and-line or test evidence to reject a high-severity finding.
The faster AI coding agents produce code, the more judgment is worth, and a reviewer that reads only the diff can't supply enough of it. We run an AI diff reviewer as a required merge status on every change, and we'd tell any engineering leader to do the same. Most of the defects that escaped our review between May and October 2026 were in the diff: 134 of the 147 in our escape corpus. Better review still matters. But the problems that taught us the most were not diff problems. They came from a third-party API's behavior, from a client's production data, from review loops that kept generating new findings, and from triage, where a correct finding was dismissed. So we moved judgment to those places as well. This piece explains why, using what we measured across our own engineering operations, mostly from August to October 2026.
Code got cheap. Review didn't.
Between August 1 and October 8, 2026, our repositories merged 1,050 pull requests. Most were built by AI coding agents and merged on a human's authorization. Of those 1,050, 354 merged with at least one finding still open in the automated reviewer's final verdict.
That second number needs care. An open finding is a reviewer's claim, and plenty of reviewer claims are wrong. Each of those merges was a decision to ship over an open finding, and about a quarter of them (88 of 368 in a later recount of the same period) had no triage note recorded before the merge. Sometimes shipping over a finding is the right call. It does mean that at this volume, the deciding layer is human triage of reviewer output, and that layer has its own failure modes. We'll come back to that.
The volume also broke the economics of the review layer. A usage-billed commercial AI reviewer burned through its entire monthly allowance in under four days: 149 reviews on 131 pull requests, about 37 pull requests a day. After that it ran on capped overage. The vendor's usage notice valued our consumption at about $1,480 against a $152 monthly plan, and only the overage cap held that period's bill to about $327. We suspended it on October 11, 2026.
That's the first lesson of agent-speed development. Every per-call cost in your pipeline gets multiplied by a throughput nobody planned for. A review tool priced for human-paced engineering becomes a budget line you have to defend weekly once agents write the code.
A reviewer that grades itself looks better than it is
Before you can decide whether a reviewer is worth what it costs, you have to know what it catches. The obvious measurement is the wrong one.
On a pool of 52 pull requests, we first counted a finding as a real bug when the reviewer itself later marked it "Resolved", which means the flagged lines changed, plus a few findings that were accepted outright. By that count, the commercial reviewer found 72 real defects. Then one blind judge, from a different model family than our own reviewer, graded every reviewer's findings on the same pool. The commercial reviewer's count fell to 37. One caveat: the judge rated 29 of the commercial reviewer's Resolved findings as nits, and the hand spot check of those 29 that we planned has not been done, so the size of this drop rests on a single judge pass.
Half the apparent catches disappeared under independent grading. That isn't fraud by anyone. "Resolved" means the flagged lines changed. It doesn't mean the comment identified a defect. AI coding agents act on nearly everything a reviewer flags, stylistic nits, speculative warnings and harmless refactor suggestions included, and a raw resolve count tallies every one of them as a catch.
The fix is structural. The grader has to fail differently from the reviewer being graded. We've argued this before in No learner without a decorrelated checker, and the review pipeline made the point again. A reviewer's own outputs, filtered through author behavior, will flatter it.
Under the blind grading, the pool held 75 distinct real defects across all reviewers. An open-source agentic review harness we run found 50 of them, at about $0.167 per pull request. The commercial reviewer found 37 of 75 at about $0.98 per review.
So on our own code, under independent grading, the cheaper harness found more real defects at roughly a sixth of the per-unit cost. We don't offer that as a verdict on review tools in general. We offer it as a reason to measure your own pool with a decorrelated judge before you trust anyone's catch rate, including your vendor's dashboard and including ours.
On a sealed test, the diff-only reviewer missed what lived outside the diff
Blind grading on organic pull requests tells you about real-world mix. It can't tell you what a reviewer misses when nobody knows the misses exist. For that you need planted defects and a sealed answer key.
We built a 12-pull-request benchmark: 8 planted defects, 2 context-dependent cases and 2 clean controls. We hashed the answer key and checked the hash before grading.
The results:
- Our agentic reviewer caught 8 of 8, at about $0.056 per review.
- The commercial reviewer caught 8 of 8.
- A single-pass reviewer that reads only the diff caught 6 of 8.
The diff-only reviewer missed a mapping file outside the diff that had drifted out of step with the change, and it missed an authorization wildcard. The first miss is the shape of the problem this article is about: a reviewer that only reads the diff can't see a file it was never shown. Seven of the eight planted defects sat inside the diff, so this benchmark mostly measures in-diff catching.
We then ran a cold rematch. Our reviewer and the commercial reviewer tied again at 8 of 8. The commercial reviewer raised 1 false flag on a clean control, and ours raised none. The commercial reviewer also found 2 real issues outside the answer key, and ours found none.
Here's how we read that. Agentic reviewers that can open other files, follow callers and inspect the surrounding code beat a pure diff reader on defects with reach. That's real progress, and it's why we keep an AI reviewer as a required gate. But even the agentic reviewers are bounded by the repository. Neither one can call the live third-party API your parser depends on. Neither one has seen last month's production inputs. Neither one knows the conventions a specific client uses on its documents. The repository is a bigger window than the diff. It's still a window.
The harness does the reviewing, and the model is a component
When a new frontier model ships, the tempting move is to drop it into your review pipeline and expect better catches. We tried exactly that.
A frontier model released the day we tested it, October 13, 2026, dropped into the same review harness at default settings, found 17 of the 70 real defects that round's reviewers found between them on the same 52 pull requests. The incumbent model found 48 to 49. The new model also cost 1.3 times as much.
We don't conclude that the new model is weak. We conclude that review quality comes from the system around the model: the prompts, the tool access, the settings, the way findings get structured, and the tuning that built up against a particular codebase. Swap the model without re-tuning and you can lose two-thirds of your catches while paying more.
For an engineering leader, that turns a model upgrade into a change that needs its own evaluation against a fixed pool, with the same blind grading you'd apply to any reviewer. Treat "newer model" as a hypothesis to test, never a default to accept.
Where the defects actually escaped
The benchmark tells you what a reviewer can catch in principle. Production tells you where your gaps are. Most of our escapes were in the diff, and better review is the answer to those. The ones that taught us the most fell into four places a diff reviewer can't reach.
Third-party behavior
In May 2026, someone wrote a line that parsed the response from a third-party SEO data API. Over the following months, five pull requests changed that file. None of their diffs touched that line, so nothing pointed a reviewer at it.
On October 12, 2026, the API intermittently returned responses with no task data. The parser failed on 36 keyword lookups in one weekly run. Two clients lost between a third and a half of that week's ranking data. The run still reported "complete." The job's monitor stayed green. The errors reached our error tracker only as a side effect of logging, without a stack trace.
A health check of production logs found it two days later.
We reproduced the failure against the live API. For one keyword, 2 of 3 calls failed. We shipped a fix the same day: one retry per lookup, and run-level alerting that counts lost data. A green "complete" status no longer means anything unless the run also reports how much data it lost.
Look at where judgment would have had to sit to catch this earlier. No reviewer could have caught it from the diffs, because the defect only existed in the interaction between old code and a third party's new behavior. The signal that mattered was a count of lost data, and nothing in the pipeline was counting it. The job's definition of success was "the run finished," when it should have been "the run produced the data it exists to produce."
One more detail from the fix pull request. The AI reviewer caught a real budget-accounting bug in its first round. Then, in its second round, it repeated the same finding after the fix had landed. Same reviewer, same pull request: one valuable catch and one stale echo. A human had to tell them apart.
Production data
For any change that alters how production data is transformed, classified or scored, we replay the candidate code against stored production inputs before review. Here's what that replay surfaced on three consecutive changes in October 2026, and on two earlier ones:
- On one change, the replay produced 177 flags caused by one client's purchase-order conventions. The client's documents didn't look the way the code assumed. No reviewer reading the diff could see those conventions, because they live in the data, not in the repository.
- On the next change, the replay sized the needed fix at 4 real releases. That's a scope estimate a reviewer can't produce, because it depends on counting real cases.
- On a third change, the replay showed 0 verdict changes. That's also a result. It tells you the change is behavior-neutral on real inputs, which is a stronger statement than "the diff looks fine."
- In June 2026, a simulation predicted an 86% flip rate for an address-handling fix. The shipped result matched.
- In July 2026, a text-splitter replay showed 96% agreement with a human-corrected corpus and caught 2 rule gaps before any reviewer saw the code. The splitter still shipped with a defect that its 12 unit tests passed over, and the replay harness had never been checked in. That is why we now keep every replay harness as a test fixture.
The replay has to run the real pipeline, not the function in isolation. Later stages can reverse earlier outcomes, and an estimate that skips them will mislead you. We wrote that up in Replay the Pipeline, Not the Function.
The address-handling prediction matters for a reason beyond the number. We wrote the prediction down before the fix shipped and then checked it against production. When predictions keep matching outcomes, you've earned the right to trust the replay on the next change. When they don't, you've learned your replay is missing something, and you learned it cheaply.
Review loops
One pull request went through five automated review rounds with findings, and from the second round on, each round raised new high-severity findings after the previous round's fixes. The agent fixed what the reviewer flagged, the reviewer flagged something new in the fix, and the loop kept going.
At agent speed, a loop like that can look like progress. Each round closes a finding. But a reviewer and an agent trading changes can drift away from the design the change was supposed to carry out, and nobody in the loop is asking whether the overall approach is right.
We now cap automated review at 3 rounds. After that, the change goes to an operator-supervised review, where it is reviewed by hand, simplified or closed. Three is a judgment call, and we'd adjust it if the data argued for a different number. The principle stands either way. Repeated high-severity findings on successive fixes signal a design problem, and design problems need a person.
Triage
This is the escape that bothers us most. A production defect had been flagged almost word for word by the AI reviewer. During triage, the finding was dismissed. The reviewer saw the defect. The decision missed it.
At 1,050 pull requests in about ten weeks, with hundreds merging over open findings, triage stops being a formality. It's where the judgment happens. And the volume of findings works against careful triage. When a reviewer raises many findings and some fraction are noise, the person triaging learns to dismiss quickly. That habit is rational right up until it dismisses the one finding that mattered. We've written about why a human gate doesn't protect you just by existing in Human-in-the-Loop Is Not a Safeguard.
Our rule now: rejecting a high-severity finding requires file-and-line evidence or test evidence. "I don't think that applies" no longer closes it. Either point to the code that shows the finding is wrong, or write a test that proves it. That makes dismissal a decision with evidence attached instead of a reflex.
The gates we run on every change
Here's the full stack. Each gate covers something the others can't.
- A deterministic structural gate. It checks for new dead code, complexity and duplication. Same input, same answer, every time, at no per-call cost. If a rule can be written as code, we write it as code.
- Deterministic security scans. Static analysis and dependency vulnerability scanning, reporting new findings only, so the signal doesn't drown in legacy noise.
- The AI diff reviewer as a required merge status. It reads the change and the surrounding code. On our sealed benchmark, agentic review caught defects a diff-only pass missed. It stays required.
- A production-data replay for data-transform changes. Anything that changes how production data is transformed, classified or scored runs against stored production inputs before review.
- A human check that the change actually reaches the downstream system. Code that passes every gate and never arrives where it's supposed to has done nothing. A person confirms it got there.
Our shorthand for the split between gates 3 and 4: the diff reviewer reads the diff. The replay reads the world.
Notice what the stack doesn't include yet. Nothing in that list would have caught the SEO parser failure before October 12, because the failure depended on a third party's behavior changing after the code shipped. The fix we deployed addressed it at runtime: retries, and alerting that counts lost data. Runtime checks on data completeness belong in the same conversation as review gates, because some defects can only appear after deployment.
What we'd tell an engineering leader shipping with AI agents
If your teams ship code with AI coding agents, here's where we'd put judgment, in priority order.
Keep an AI reviewer as a required gate, and measure it with a judge that fails differently. Don't count resolved markers as catches. On our pool, that method nearly doubled the apparent catch count. Grade findings with a blind judge from a different model family, and keep a sealed benchmark with planted defects and clean controls so you can see false flags as well as misses.
Budget review for agent throughput, not human throughput. At about 37 pull requests a day, a usage-billed reviewer ran out of allowance in under four days. Price review per pull request at your real merge rate before you commit.
Re-evaluate whenever the model changes. A newer model at default settings found 17 of 70 defects where the incumbent found 48 to 49. Test any swap against your fixed pool before it reaches production review.
Replay data-transform changes against production inputs. The replay found 177 flags from client conventions no diff could show, sized a fix at 4 releases, and confirmed a behavior-neutral change at 0 verdict changes. Write predictions down before shipping, check them after, and keep the harness as a test.
Cap automated review rounds. We use 3. When fixes keep producing new high-severity findings, hand the change to a person.
Make dismissal cost evidence. A high-severity finding gets rejected only with file-and-line or test evidence. Triage is where our worst escape happened, so triage is where we added friction.
Define success as data delivered. A job that reports "complete" while losing a third to half of a client's weekly data has a broken success criterion. Count what was lost and alert on it.
Where we could be wrong
Most of our evidence comes from our own repositories over about ten weeks, from August to October 2026, with a few earlier results from May to July. The sealed benchmark is 12 pull requests, and the blind-graded pool is 52. Most escapes in our corpus were still in the diff, so none of this argues for less review. Those numbers are large enough to change our practice and too small to settle the question for every codebase. If agentic reviewers gain reliable access to production data, live third-party behavior and client-specific conventions, the gap we describe would shrink, and we'd move more of the gate stack back into the reviewer. Until a reviewer can read the world as well as the repository, we'll keep judgment in the places it can't reach.
Judgment scales with output
AI coding agents made code cheap. That makes it tempting to treat review as the last cheap step: run a reviewer, merge on green, move on. Our numbers point the other way. When output speeds up, each judgment call covers more change, and the cost of a bad call grows with it. Most defects are still in the diff, so the reviewer stays. The judgment it can't supply sits elsewhere: in replay against real data, in runtime checks on third parties, in round caps, and in triage that has to show its evidence.
We build operational software for manufacturing, distribution and supply-chain operations this way. We deploy in modules that run alongside existing systems, replay data-transform changes against real production inputs before they ship, and keep humans on the decisions that need them. If your team ships with AI agents and you want to know where your review gaps actually sit, book a discovery call.