Our AI Reviewer Never Missed a Bug — A Senior Engineer Killed the PR in 15 Seconds Anyway
We hooked up an agent whose entire job is reviewing the pull requests our other agents write. It didn't miss a single bug a human reviewer caught — not one, across weeks of shadow testing. It also never once said 'wait — why are we building this.' That second detail is the whole post.
For about three weeks, the scorecard looked embarrassingly good. Off-by-ones, unhandled nulls, race conditions — the stuff our senior engineers catch by habit — the agent caught just as reliably, and faster, even on PRs written by other agents in the pipeline. We ran a shadow diff for weeks: human review versus agent review, side by side, before letting it anywhere near gating merges on its own. Its hit rate on 'is this code correct' beat some of our junior engineers, honestly. We were one good week away from writing the smug internal Slack post.
The PR that broke the narrative
Then one PR landed and killed the smugness in a single glance. It was clean. Tests passed. It refactored a pricing calculation exactly the way the ticket asked. The agent reviewer approved it in under two minutes, with a short, accurate summary of what changed and why the logic held up. One of our senior engineers opened it fifteen seconds later, scrolled once, and closed it: 'We're not doing this — we killed this exact change in Q2 because finance flagged a compliance issue, and nothing about that changed.' The ticket shouldn't have been picked up that sprint. The code was correct. The PR was wrong.
That's the moment I stopped grading the agent on bugs and started asking a harder question: what does a good senior reviewer actually have loaded into their head when they open a PR, that never makes it into the diff?
- ▹The Slack thread from four months ago where this exact approach got vetoed, and why
- ▹The standup aside where a customer asked for something adjacent, not identical, to what the ticket describes
- ▹The knowledge that whoever filed the ticket wasn't the one who'd actually use the feature
- ▹The unspoken sense that this team is already stretched thin and this isn't the hill to spend a sprint on
- ▹The memory of who tried this before, and what broke when they shipped it
None of that lives in the repo. It lives in people's heads, in old Slack threads nobody bothers linking from the ticket, in the institutional memory of a team that's been together a while. A diff is a snapshot of code. A senior reviewer's judgment is a snapshot of the org.
What the agent actually is
Once I stopped being impressed by the bug count, the shape of the thing got obvious: our reviewer agent is a very fast, very consistent, completely stateless intern. Hand it a diff and it'll tell you, reliably, whether that diff does what it claims and whether it's likely to break. That's a real, valuable skill — just a narrower one than 'code review' as senior engineers actually practice it. It's structurally blind to 'is this the right code to be writing,' and that's not a prompt-engineering gap you fix with a better system prompt. It's an architecture gap. The agent has no seat in the room where scope gets decided, so it has no way of knowing the room exists.
Here's the reframe that actually mattered, and it took me longer than I'd like to admit to land on it. 'The agent caught nothing new' isn't a verdict on the agent's competence. It's a measurement of where our human reviewers' time was going before we had it. If a fast, context-free bug-detector matches your senior engineers' hit rate on correctness, that tells you those engineers were spending real cycles on pattern-matching — null checks, off-by-ones, missing test cases — instead of the judgment calls only they can make. That time was always reclaimable. The agent didn't create the opportunity. It just made it visible.
What we actually changed
We didn't bolt on a second AI reviewer or tune the first one harder. We changed what we ask humans to spend their fifteen seconds on.
- ▹Before: senior engineer reads the diff line by line, hunting for logic errors, null handling, edge cases
- ▹After: senior engineer skims the diff for shape, reads one line, decides scope
- ▹Before: 'does this test cover the branch conditions' — now the agent's job, checked automatically
- ▹After: 'should this PR exist this sprint, and does it match what the customer actually asked for' — still, and only, a human's job
- ▹Before: review queue sorted by who's free next
- ▹After: review queue sorted by 'does this touch a decision that's already been made' — those go to whoever remembers making it
The one new rule we added, and the one I'd tell any EM to steal outright: every PR now needs a one-line 'why now' — not what the ticket says, but why this, this sprint, from this person. It's a field the agent reviewer explicitly can't verify and isn't asked to. It exists purely so a human has to make the call the agent structurally can't make, instead of quietly assuming someone already did.
The uncomfortable generalization, for anyone about to buy or build a smarter review agent because the current one 'still misses things': go find out first whether bug-detection was ever your actual bottleneck. If your senior engineers were already fast at spotting logic errors and slow at the scope conversation, a faster bug-detector doesn't shorten your queue — it just moves where the queue backs up. We didn't get faster shipping out of this. We got our best people spending their attention on the one thing that was never going to be an agent's job in the first place.
Discussion
Chat with Chi Cong (AI) about this article. Your conversation is private to you — you can publish a summary for others when you're done.