Field notes · 2026-08-19 · 7 min read

AI Code Review Automation: What to Automate, and What to Keep Human

AI code review automation fails when you point a model at a diff and ask if it looks good. Here is the layered review setup we actually run, and why it holds.

AI Code Review Automation: What to Automate, and What to Keep Human
Fig. 01 · Field notes

Writing code got cheap. Reviewing it did not. That is the whole shape of the problem in 2026, and most teams are still trying to solve it by adding another bot that leaves comments on pull requests.

We build and ship production software with agents every week, across a dental SaaS platform, a dispatch platform for trucking fleets, a run club platform, and a B2B wholesale build. The review layer is where we have changed our approach the most, and the thing that finally worked was not a smarter reviewer. It was putting different kinds of checking in different places.

The numbers say the bottleneck moved

The 2025 Stack Overflow Developer Survey found 84 percent of respondents using or planning to use AI tools, up from 76 percent the year before, with 51 percent of professional developers using them daily. Adoption is settled. Trust is not.

Only 3.1 percent of those developers say they highly trust the accuracy of AI output. Nearly 46 percent actively distrust it. The single largest frustration, cited by 66 percent, is "AI solutions that are almost right, but not quite," and 45 percent say debugging AI-generated code takes longer than debugging their own.

Google's DORA research puts a sharper point on it. In the 2025 report, 90 percent of technology professionals use AI at work and over 80 percent believe it made them more productive, while 30 percent report little to no trust in the code it generates. DORA also found that higher AI adoption is associated with an increase in both software delivery throughput and software delivery instability. More ships. More breaks.

DORA calls the gap a hidden verification tax. Time saved writing gets reallocated to auditing. If you do not build for that, you do not capture the speed, you just move the work.

Why pointing a model at a diff does not work

The obvious version of AI code review automation is to hand a model the diff and ask whether it looks good. It produces something immediately, which is why so many teams stop there. Three things go wrong.

False positives are not free. Every wrong comment spends a little of the team's willingness to read the next one. The cost of a noisy reviewer is not the noise. It is that six weeks later everyone scrolls past every comment the tool leaves, including the correct one.

A clean pass creates a bias. When an automated reviewer says nothing is wrong, humans review less carefully than they would have with no tool at all. The tool did not just fail to catch the bug. It actively lowered the odds a person would.

The model has no stake in being right. Ask "is this good?" and you get an agreeable answer, because agreement is the cheapest response that satisfies the prompt. Nothing in that setup rewards finding a real problem.

The layer that is not allowed to be wrong

Before any model touches a change, the deterministic layer runs. Type checks, linters, formatters, the test suite, dependency and secret scanning, migration checks, build. Everything with a right answer that a computer can compute.

This sounds obvious and it is routinely skipped, because agents generate code fast enough that teams start reviewing output before the cheap checks have even run. That is backwards. A type error found by a compiler costs nothing. The same error found by a model costs a token bill and a judgment call about whether the model is right.

The rule we hold to: nothing goes to a model that a deterministic tool could have decided. It is faster, it is cheaper, and it is never wrong in the specific way models are wrong, which is confidently.

What a model is actually good for

What survives the deterministic layer is the interesting part, and it is exactly what linters cannot see. Does this code do what the change was supposed to do. Does it handle the empty case, the concurrent case, the second call. Does it quietly break an assumption somewhere else in the system. Is there an existing helper that already does this.

That is judgment against intent, and it is genuinely where a model earns its place. Two things make it work.

Give it the intent, not just the diff. A reviewer that sees only changed lines can tell you the code is valid. It cannot tell you the code is correct, because correctness is relative to what you were trying to do. The ticket, the surrounding files, the calling code, the existing patterns in the repo. Context engineering is most of the quality difference here, and it is the part teams skip because assembling context is boring and pasting a diff is easy.

Split it by lens. One reviewer asked to find everything returns a shallow sweep. Several narrow reviewers, each with one job, return findings the generalist misses. Correctness. Security. Does this match what already exists in this codebase. Each one is cheap, they run at the same time, and they are looking for different things.

Make the reviewer argue with itself

The change that moved our signal-to-noise ratio the most is embarrassingly simple. We stopped asking models whether a finding was real and started asking them to knock it down.

A finding from the first pass goes to a second pass whose job is to refute it. Show the code path that makes this a non-issue. Prove it cannot happen. Default to rejecting when uncertain. Only findings that survive that get shown to a person.

The asymmetry matters. "Is this a bug?" invites agreement. "Prove this is not a bug" invites work. The second framing kills most plausible-sounding findings, which are the exact category that erodes trust, because they read as competent right up until you spend twenty minutes disproving them yourself.

You do lose some real findings this way. That is the trade, and we take it deliberately. A reviewer people read is worth more than a reviewer that is technically more thorough and universally ignored.

Where the human stays

The human stays at the merge. Not as a formality, as the only party accountable for the change.

Everything above exists to make that moment cheaper. Deterministic checks remove the mechanical questions. Narrow reviewers surface the handful of judgment calls worth reading. Adversarial verification means the ones that got through are probably real. What reaches a person should be short enough that they actually read it.

The failure mode to watch for is not a missed bug. It is the slow drift where nobody feels responsible for the merge because so much machinery ran before it. Review that nobody owns is not review. It is paperwork with a green check on it.

We keep the person in the same place for the same reason we ship anything at all: somebody has to be able to explain, later, why this was the right change. A model cannot hold that. It was not there in the meeting where you decided what the thing was for.

What this looks like in practice

Concretely, on the platforms we run, the shape is consistent. Deterministic gates on every change. A small set of narrow model reviewers, given the intent and the surrounding code, not just the patch. An adversarial pass that has to survive before anything reaches a human. A person at the merge.

The stack underneath varies by problem, which is deliberate. Smile PreVue runs its AI on Google Vertex AI Gemini specifically because it needed HIPAA-grade handling under a BAA. Other workloads run on Anthropic Claude or OpenAI GPT. The review harness is provider-agnostic on purpose, and we would rather rebuild a prompt than be unable to move.

None of it is exotic. It is mostly the discipline to run the cheap check first, keep each reviewer narrow, make findings earn their place, and refuse to let the tooling absorb the accountability.

The thing worth measuring is not how many comments the system produces. It is what share of surfaced findings a developer agrees with, and whether that share is going up. Comment volume looks like productivity and behaves like noise. Agreement rate is the number that tells you whether anyone will still be reading the tool in three months.

It is also the number that tells you when to widen scope. A reviewer people trust on one service earns the right to run on a second one. A reviewer nobody trusts does not get better by covering more code.

Start narrow

If you are adding AI review to an existing team, do not turn it on across the whole repo. That is how you generate a thousand comments in week one and lose the team by week three.

Pick one thing you already care about. One service, or one class of bug that has bitten you before. Make the reviewer good at that, with real context, with an adversarial pass, and let people see it be right a few times. Trust in a tool is built the same way it is built in a colleague, by being correct on things the reader can verify.

Then widen it. The methodology matters more than the model you pick, and it will outlast whichever model is currently best.

If you are working through what to automate in your own development pipeline and where the human still belongs, tell us what you are building.

AI development automationcode reviewagent harnessengineering practice

Liked this?

Want this built for your team, or want to learn it yourself? Either way, start here.

Next read →

Using AI Agents for Large Migrations and Codemods