Verification Must Keep Up With Generation
When output outruns verification throughput you have three options: expand verification, slow the agent down, or lower the bar. It must never happen by default.
When output volume exceeds your verification throughput, you have exactly three options: expand verification capacity, slow the agent down, or lower the quality bar. There is no fourth. The dangerous version is letting it happen by default: nobody measured throughput, nobody declared what was relaxed, and review turned from reading into skimming.
The gap is already here
The data points line up. Google's DORA research found heavier AI adoption correlates with lower delivery stability, and over a third of developers distrust AI-generated code. In METR's controlled experiment, experienced open-source developers on their own mature projects were 19% slower with AI assistance against an expected 25% speedup, the extra time going to prompting, waiting, reading, and correcting. Security testing across more than a hundred models found roughly 45% of AI-generated code introduces known security flaws; the ability to make code run has improved sharply while the ability to make code safe has stayed flat, and the gap is widening. bytebytego-verification
The cause is not a weak model but a reversal in the cost structure: writing code stopped being the slow step, so verification became the bottleneck. And the failure modes AI introduces, security flaws and duplicated code, are exactly what type checks and happy-path tests cannot see. There is a volume problem too: AI produces larger diffs, attention gets spread thin, and a 5,000-line pull request earns a single looks good to me.
The gap also reshuffles what matters when choosing a stack. When the same logic has a dozen idiomatic spellings, a model will inevitably produce a fragmented mix of styles that humans read slowly and machines verify with difficulty; conversely, stacks where formatting, testing, and dependency management ship inside one toolchain offer exactly what both humans and agents need — predictable, explicit, structurally uniform. Google's summary: once the bottleneck moves from generation to verification, rigor of review replaces speed of writing as the primary selection criterion go-ai-engineering. One more mechanism-level observation: an agent refactoring repeatedly without external verification may get 95% right on the first pass, and later interactions compound the error rate while polluting the context window — putting the toolchain's deterministic checks within the agent's reach is itself part of verification throughput.
The verification system itself gets crushed
This is not hypothetical — Anthropic is living it. First-hand data: per-engineer code shipped per quarter is 8x the 2021–2025 average, 80% of it written by Claude; total tests are up 10x while engineering headcount barely moved; the result is CI job volume up 25x in six months. Their deterministic "which tests does this change need to run" service hit overload repeatedly, with its owner woken two nights in a row.
The three patches each bought less time than the last: doubling the machine's cores lasted 70 days; sharded parallelism, 29 days; a daily restart, under a day. The ground-up redesign took one engineer three weeks — a redesign of comparable scale that would have taken about a quarter a year earlier. The judgment is blunt: once writing code is no longer the bottleneck, a patch's staying power decays with load growth while the redesign's schedule shrinks with AI assistance; leaving 10–20x headroom over current perceived scale in a v0 design is cheaper than patching over and over.
Remember the root cause: test result history was kept in-process, and ordering required a single writer — that structure blocked horizontal sharding from day one. The redesign's shape: stateless workers (receive a result, append it to the log, return), an independent consumer rolling the log into per-test history every few seconds, and the query side reading the summary directly. Lag is not just slow: when the listener falls an hour behind, the selector decides on stale data — a bad merge reddens everyone's tests, flaky dependencies turn red into a block on every merge, and a test that was just fixed stops running.
Two more practices are built for the agent era. First, make the service's metrics the agent's eyes and ears: how many CI jobs came in and how many went out, reconciled against each other, so the agent can climb the metrics itself and hunt incremental regressions one by one, far faster than a human watching. Second, agents self-verify differently than humans: a person can judge which failures are unrelated to their change, while an agent needs an explicit "valid test set" to know what to watch, or it treats every red in the suite as its own failure and loops on rework anthropic-ci-test-selection.
Match verification layers to feedback latency
The full chain runs static, unit, integration, runtime, baseline, end-to-end, human, and the depth is set by risk, not a fixed number of layers. A low-risk change can stop after the first two; anything touching money, permissions, or irreversible side effects has to reach end-to-end plus a human.
The matching principle: feedback latency sets the autonomous iteration rate.
- Second-level feedback, meaning compilation, type checks, and unit tests, supports high-frequency iteration: an agent can try dozens of approaches in one loop only if each is judged within seconds.
- Minute-level feedback, meaning integration tests, contract tests, and browser automation, covers more realistic behavior and costs an order of magnitude in iteration frequency.
- Human judgment is reserved for what machines cannot decide: whether the intent is reasonable, whether the trade-off is acceptable. Spending humans on automatable checks is using the most expensive resource on the cheapest work.
Shift left, and check for fake fixes
Shift left: move each class of check as early as it can go. Finding a defect in the editor or at commit time costs far less than finding it in review or production. What can be checked statically should not wait for runtime; what CI can check should not wait for a canary.
Watch for fake fixes at the same time: verify the root cause is gone, not that the error signal disappeared. Agents are creative about turning tests green: deleting the log line that reported the error, dropping a log level to debug, swallowing the exception, loosening the assertion threshold. Look for those patterns in review, and when a test assertion was modified, ask why first.
Write the check before the code
Giving the agent checks it can run itself beats asking for more rewrites. Three kinds of checks answer different questions and do not replace one another addy-agentic-verification:
- End-to-end tests answer "what should happen." They walk a real user flow (sign up, add to cart, check out, see a confirmation), ignore internal structure, and look only at what the user can see. They are the hardest oracle to fool: the whole flow either works or it does not. As a target for an agent, the definition of done changes from "implement this feature" to "make this E2E test pass," which the agent can chase on its own. The trade-off is that they are slow and flaky, so keep only a small set of high-value core flows.
- Property tests answer "what must never happen." Example-based tests only cover inputs you thought of; property tests invert the premise by writing a rule that must always hold and letting a generator throw hundreds or thousands of inputs at it to break the rule. Four properties recur: round-trip (encode then decode returns the original), invariants (sorting does not change the element count, a balance never goes negative), idempotency (doing the same operation twice equals doing it once), and equivalence (the optimized function matches the simple correct one). When a counterexample appears, minimize it and keep it as a regression case. The key is to have the agent write properties, not examples: the examples it invents follow its own internal logic, while a property forces it to face whatever input the generator produces.
- Differential tests answer "where do old and new differ." When replacing a system, run the old and new versions side by side on the same inputs; a mismatch is either a newly introduced bug or a breaking change you should record. Generate the inputs randomly or replay real traffic rather than hand-picking cases. Normalize differences that carry no meaning (ordering, irrelevant fields) before comparing, or you get an endless stream of false diffs; track every intended change in an approved-changes list so "different" never becomes an acceptable state. The old system is the oracle, so you need not explain every edge case to the agent, but the old system can be wrong too — a difference only says the two diverge, and a human still decides which behavior to keep.
The checks themselves have to be fast and deterministic. This is not about saving time; it is training. If a suite is slow or unstable, the agent learns from the loop's incentives that "retrying beats fixing" — once a rerun occasionally turns green, retrying becomes its preferred strategy, and a suite that takes fifteen minutes makes it batch more changes per run until it cannot pinpoint which one broke things. Flaky tests should be pulled out of the main suite immediately; a test that is red one day and green the next is worse than no test, because it destroys trust in every other result addy-agentic-verification.
One layer gets skipped more often than not: gates should be tailored per task type instead of sharing one vague "done." When one Java Champion migrated 900 teaching slides, he defined the gates as screenshots, visual diffs, animations, PDF output, and content completeness — running both versions side by side, comparing screenshots visually and algorithmically, even comparing the generated PDFs. In his words, "that meant the agent did not just say, 'Migration complete.' We had evidence." The same principle applied to a refactor yields different gates: tests pass, every intended file was handled, docs updated, no TODOs left behind. The items vary by task; the principle does not: the agent must produce evidence that the work satisfies the definition of done, and "the model says it is done" does not count java-champions.
That developer's summary is tighter still: delegate execution, not responsibility — the result is still yours. He draws the line explicitly: typos can be fixed automatically, but anything touching content, versions, dates, or meaning gets discussed first. Another practice from the same interview runs counter to instinct: for non-trivial work, have the agent interview you first to surface assumptions and expectations that are still implicit — "a good agent can execute the wrong idea incredibly quickly. That does not make the detour cheaper" java-champions.
Actionability
Report only problems a developer can act on. A check that is always red with no clear next step trains the team to ignore the dashboard, worse than no check. Track the false positive rate and tune thresholds, because once false alarms erode trust, real warnings are ignored too.
Speed, precision, and coverage cannot all be maximized, so state the trade-off explicitly instead of defaulting to all three, which produces something slow, leaky, and distrusted. Which you give up depends on risk: high-risk changes give up speed, prototypes can give up coverage.
The same test applies to the eval set itself, and there the saving is throughput rather than accuracy. When OpenAI curated SWE-bench Verified it drew 1,699 tasks from the original 2,294 and had 93 Python-fluent developers inspect them one by one against five questions: is the problem statement clear, do the tests cover boundary conditions, are the tests stable, does the reference patch introduce new errors, is the difficulty reasonable. Five hundred survived, about a 71% elimination rate among those reviewed. Cutting that hard buys signal and budget together, and evaluation cost fell roughly 80%. The cost side is not abstract: one complex agent task runs for minutes to hours, and a single full pass over an eval set on a frontier model is commonly a few thousand dollars of tokens ai-agent-book. Deleting cases you cannot judge is not the same as reviewing less. The first changes a case's acceptance definition and leaves a record; the second changes nothing and just looks at less.
The signal itself has noise
Another hardening technique is mutation testing: generate code variants and run the same suite, and if nothing fails the suite is missing what the agent introduced. AI-introduced defects often slip past hand-written cases, and invariants (see the previous section) catch more of them.
Then there is the reliability of the measurement. Anthropic quantified infrastructure noise in agentic coding evals: the gap between the most generous and the strictest resource configuration was 6 percentage points at p<0.01, while the top few leaderboard entries often differ by only a few points. Resource limits change what an eval actually measures, because tight limits reward lean strategies and generous limits reward brute force, and blending them into one score hides the difference. Specify both a guaranteed allocation and a hard kill threshold, treat resource configuration as a first-class recorded experiment variable, and view leaderboard gaps below three points with suspicion until the configuration is recorded and matched. anthropic-infra-noise
Hold your own score gaps to the same standard. A pass rate measured on n cases carries a standard error of roughly sqrt(p(1-p)/n). With 100 cases at 70%, the 95% interval is about 70 ± 9 percentage points, so "new model 73%, old model 70%" is not evidence for switching; both numbers sit inside the same noise band ai-agent-book.
Comparing two configurations calls for paired analysis. Record who wins on each case and test with McNemar or a paired bootstrap rather than subtracting two independently measured success rates; pairing means both sides share the same tasks and the same random conditions. Because a single agent run varies as well, give every configuration 3–5 random seeds and report the mean and the spread. A single run is only good for screening a direction. If the expected gain is 2–3 points and the set holds a few dozen cases, expand the sample first, since the standard error shrinks as 1/sqrt(n). When several hypotheses go at once, correct for multiple comparisons by tightening the threshold or re-running the positive results independently. A gap is worth acting on when it exceeds the noise, survives paired analysis, and reproduces ai-agent-book.
One cleanup rule is easy to forget: every hard constraint has to serve both quality and delivery flow, and a constraint serving neither should be removed. Constraints accumulate and rot on their own.
References
- Why Code Verification Matters More Than Ever in the Age of AI
- Quantifying infrastructure noise in agentic coding evals
- AI Agents in Depth, Chapter 7: Evaluating Agents
- Agentic coding is straining CI. Here's how we scaled test impact analysis at Anthropic
- Agentic Verification
- GitHub Blog: how three Java Champions use Copilot (delegate execution, not responsibility)
- Why Go is an Ideal Language for AI-Assisted Software Engineering (Google)
