The pipeline was green. Fourteen checks, every one of them passing, and the merge button sitting there in that confident blue it gets when absolutely nothing is standing in your way. Somebody had asked an assistant for a retry wrapper around a payment callback, read the top of it, skimmed the rest, and shipped it, because it looked exactly like the wrapper a competent engineer would have written by hand on a Tuesday afternoon. It was. Almost. The duplicate charges surfaced nineteen days later, and the two days spent chasing them ended at a sentence nobody in the repository could produce: what this code was supposed to do when a network timeout and a possibly-already-applied authorization arrive together.

Nobody skipped review. That is the part worth sitting with, because the reflex when this happens is to go shopping for another scanner. Sonar's State of Code Developer Survey, published January 8, 2026 from more than 1,100 developers globally, puts AI at 42% of all committed code, and the developers surveyed expect that to reach 65% by 2027. In that same survey, 96% report they do not fully trust that AI-generated code is functionally correct. Only 48% say they always check it before committing.

Line those three up and they stop being a story about lazy engineers. Distrust is near total. Verification is a coin flip. Across 25 years in enterprise software delivery I have never watched a group of professionals distrust something this thoroughly and act on it this inconsistently, and the easy explanation, that everyone is cutting corners under delivery pressure, covers maybe half of it. The other half is quieter, and it is the one nobody puts on a slide. Verify against what?

42% / 96% / 48%
AI accounts for 42% of all committed code. 96% of developers do not fully trust that it is functionally correct. Only 48% always verify it before committing.

Why does so much AI code go unverified?

Because verification has a denominator nobody states out loud. To check something you need a standard to check it against, and for a typical change that standard lives in three places: the compiler, the test suite, and a person's memory of what the feature is supposed to do. Two of those are written down and machine-enforced. The third is not. AI pushed code volume past the point where an unwritten standard in one person's head can keep pace, and the failure mode is almost invisible, because it does not look like a failure at all. It looks like a passing build.

Notice what happens to a reviewer in that setting. Reading a human colleague's pull request, you get intent for free: the commit message, the ticket, the fact that Priya sat two desks over and mentioned on Wednesday that the reconciliation job was flaky. Context arrives with the code. AI code arrives without any of that, fluent and confident and structurally perfect, and the reviewer is left inferring what it was meant to do from what it does. That is not review. That is reverse-engineering, performed at speed, on a Friday, by someone with four other pull requests open.

Volume compounds it. The 42% figure is not spread evenly across throwaway scripts either, which is the detail that changed how I read this survey. Sonar found 88% of developers reaching for AI on prototypes and 83% on internal non-critical software, both unsurprising, but 73% on customer-facing applications and 58% on business-critical services. The code going in fastest is landing closest to the money.

58%
of developers use AI on business-critical services, and 73% on customer-facing applications. This is not confined to prototypes, which is exactly why an undefined standard gets expensive.

Is the verification gap a tooling problem or a requirements problem?

Both, but not in equal measure, and I want to be straight about the tooling half rather than sell a false choice. Static analysis genuinely catches things a tired human at 5:40pm will not: the null dereference, the unclosed resource, the injection path threading through four call frames. The newer AI review layers are legitimately good at recognizing the shape of a defect. We wrote about what that review load costs a team in the hidden cost of the AI coding stack, and the answer was not nothing. Buy the tools. They pay for themselves.

Then notice the question every one of them is answering. Is this code wrong in a way I recognize? Not one of them answers the other question: is this code wrong in a way only your business knows about? A scanner has never once flagged a flawless implementation of the wrong rule. It cannot. The rule was never given to it, and a clean report on an undefined standard means only that the tool found nothing it knows how to look for, which teams read as safety and is in fact silence.

This is the same defect wearing different clothes across three of our recent pieces. When developers say AI output is almost right but not quite, almost right against what is doing the work in that sentence. When AI-assisted commits leak secrets at roughly twice the baseline rate (GitGuardian, State of Secrets Sprawl 2026), as we covered in AI security debt, the missing artifact is a stated rule about what may touch a credential. Different symptoms. One cause. The acceptance criterion was never written, so nothing downstream could enforce it.

Three gates between a commit and production Two of them have a written standard behind them. The third is where AI code walks straight through. GATE 1 Does it compile? Standard: written Enforced: by machine PASS GATE 2 Do the tests pass? Standard: written Enforced: by machine PASS GATE 3 Does it match the acceptance criterion? Standard: never written PASSES BY DEFAULT You can automate a gate. You cannot automate the standard behind it. Gate 3 is not a tooling gap. It is an authoring gap.
Two gates out of three are already machine-enforced. The third one has to be written by a human before any tool can check it.

What does a verifiable standard actually look like?

Concrete enough that a machine or a stranger can disagree with the code. "Retry on failure" is not a standard; it is a wish, and an assistant will happily satisfy it in a dozen mutually incompatible ways. "Retry at most twice on a connection timeout, never on a response that may already have been applied, and emit a reconciliation event when the outcome is unknown" is a standard. Same feature. One of them can be tested, prompted against, and argued with. The other one cannot, and that difference is the whole article.

Google published an experience report on using large language models for internal code migrations, and the numbers are the opposite of timid. On the Google Ads migration of 32-bit identifiers to 64-bit, inside a codebase of more than 500 million lines, the team found that 80% of the code modifications in the landed changelists were fully AI-authored, and estimated that total migration time fell by roughly half. Half. A separate JUnit3 to JUnit4 effort moved 5,359 files and more than 149,000 lines of code in three months, and about 87% of what the model generated was committed without any change at all.

Now read how they earned the right to move that fast. The toolkit "produces verified changes that only contain code that passes unit tests," with validation configured per migration: build the changed files, run their tests, feed any failure back to the model for repair. Then the important part. The rules for each migration were written out before generation started, as explicit instructions in the prompt, down to details like "if the previous id was negative, the new value should be negative." Humans still reviewed every change the way they would review any other, and the team was candid that in most cases somebody had to revert at least something the model got wrong or did unnecessarily.

That is the lesson, and it is a hopeful one. Google did not close the verification gap with a better model. They closed it by defining correct as a machine-checkable contract first, writing the rules down somewhere a build server could enforce them, and only then letting the model run hard inside that boundary. Speed was safe. The standard existed before the code did.

Source: Nikolov, Codecasa, Sjovall, Tabachnyk, Chandra, Taneja and Ziftci (Google Core and Google Ads), "How is Google using AI for internal code migrations?", arXiv:2501.06972, January 12, 2025.

Most teams have the order backwards. They generate first, then go looking for a way to check what came out, which is how you end up buying a scanner in month four and still shipping the payment bug in month five. Google inverted it. The rules went in the prompt, the validation ran automatically, and the human review had something specific to review against instead of a vague feeling that the diff looked fine. None of that required a frontier capability. It required somebody to sit down and write what correct meant.

Where does a team start on Monday?

Not with a policy. Pick the three services where a wrong answer costs actual money, and leave the other forty alone for now, because a standard nobody has time to write is worth exactly as much as no standard at all. A week of work, maybe two. Four steps, in this order:

  1. Scope it to the blast radius. Rank services by what a wrong answer costs, not by how much AI touches them. Take the top three.
  2. Write the rules, the forbidden states, and the edges. For each service: what the code must respect, what states it must never reach, and what should happen at the boundaries people keep arguing about in Slack and never resolve. The edges are the part everyone skips, and the part that produces duplicate charges.
  3. Put the criteria in the prompt. Feed them to the assistant before it generates, the way Google wrote per-migration rules into the prompt before a single line was produced.
  4. Put the same criteria in the review. The reviewer stops guessing at intent and starts checking against something. That is the whole difference between review and reverse-engineering.

Then the word "verify" finally has something behind it. Not discipline. The 48% is a measure of how many teams ever got as far as step two, and if that sounds like a small thing to be missing, consider that every scanner, every test and every audit downstream inherits whatever you wrote there.

The verification gap is a requirements gap.

AI now writes 42% of committed code, heading for a projected 65% by 2027. 96% of developers do not fully trust it is functionally correct, and only 48% always verify before committing. Not a discipline problem. Verification needs a standard, and for correctness, security and compliance that standard usually lives in someone's head rather than in a requirement, which is exactly where no test, no scanner and no reviewer can ever reach it.

Review tooling genuinely helps and is worth buying, but notice that every scanner on the market is answering exactly the same question: is this code wrong in a way I already recognize? None of them can flag a flawless implementation of the wrong rule. Google let AI author 80% of a migration safely because correct had been defined as a machine-checkable contract before a single line was generated. Write it down first. Everything downstream, the test, the review, the audit trail, is only ever as good as that one sentence.

What are the most common questions about verifying AI-generated code?

It is the distance between how much AI code teams ship and how much of it anyone actually checks against a defined standard. In Sonar's State of Code Developer Survey, published January 8, 2026 from more than 1,100 developers, AI accounts for 42% of all committed code and 96% of developers say they do not fully trust that AI-generated code is functionally correct, yet only 48% state they always check it before committing. Distrust is nearly universal. Verification is close to a coin flip.
Delivery pressure explains part of it, but not the larger part. Verification needs something to verify against, and for most changes that standard sits in three places: the compiler, the test suite, and a person's memory of what the feature is supposed to do. The first two are written down and machine-enforced. The third is not. AI pushed code volume past the point where an unwritten standard in someone's head can keep up, and the failure is invisible because it looks like a passing build.
Partly, and they are worth having. Static analysis and AI review layers reliably catch injection risks, null dereferences, resource leaks and other defects that have a recognizable shape. What no scanner can catch is a correct implementation of the wrong rule. If the requirement was never stated, a clean report means the tool found nothing it knows how to look for, which is not the same as the code being right for your business.
It has to be checkable by something other than the person who wrote it. In practice that means naming the observable behaviour, the boundary conditions, and what must happen at each boundary, in language specific enough that a test or a reviewer can disagree with the code. Retry on failure is not verifiable. Retry at most twice on a connection timeout, never on a response that may have already been applied, and surface a reconciliation event if the outcome is unknown, is verifiable.
No, and the evidence points the other way. Google's own experience report on internal code migrations describes letting AI author 80% of the code modifications in landed changelists, and it worked precisely because correctness was defined up front as a machine-checkable contract: the change had to build, the unit tests had to pass, and per-migration rules were written into the prompt before generation started. Speed was safe because the standard existed first. The constraint is not model quality. It is whether anyone wrote down what correct means.
You recover them before you scale generation, starting where the blast radius is largest rather than everywhere at once. Take the handful of services where a wrong answer costs real money, and for each one write down the rules the code must respect, the states it must never reach, and what should happen at the edges everyone argues about. Those become acceptance criteria the assistant is prompted against and the review is measured against. Requirements intelligence is the discipline of getting that intent out of heads and into a form both a human and a machine can check.
Nicolas Payette, CEO and Founder of Specira AI
CEO and Founder, Specira AI

Nicolas Payette has spent 25 years in enterprise software delivery, leading digital transformations at companies like Technology Evaluation Centers and Optimal Solutions. He founded Specira AI to solve the root cause of project failure: unclear requirements, not slow code.