Writing code is cheap now. Verifying it is the bottleneck.

A fleet of agents can rewrite a million-line runtime in eleven days. No team on earth can review a million lines in eleven days. The scarce resource in software is shifting from generation to verification, and model collapse is about to make the gap worse.

AI Made Writing Code Cheap. Verifying It Is the New Bottleneck

Image: METAHEURISTIC

Alexander Myasoedov

+Alexander Myasoedov Alexander writes about the operational side of shipping production AI - agents, retrieval, evals, and the guardrails that keep them from going sideways.

In July, Jarred Sumner announced he had ported Bun from Zig to Rust in about eleven days, using a fleet of Claude agents running in parallel. The port added over a million lines of Rust and burned roughly $165,000 in tokens at API list prices: 5.9 billion uncached input tokens against a TypeScript test suite acting as the conformance oracle. Whatever you think of the outcome, the economics are the story. A rewrite that would have taken a team years of effort now costs about one senior engineer-year of salary and less than two weeks of wall clock.

Zig’s creator had a different read. He called the result “unreviewed slop”, and whether or not you agree, the adjective doing the work in that phrase is not “slop.” It is “unreviewed.” A million lines appeared in eleven days, and there is no version of human code review that absorbs a million lines in eleven days. The tests pass. The benchmarks look fine. And the honest answer to “has anyone verified this?” is: the same class of model that wrote it.

That gap is the trend I keep running into everywhere, not just in headline rewrites. AI is not reducing the need for engineers. It is relocating the engineering effort. Writing software is becoming dramatically cheaper. Verifying software is becoming dramatically more expensive, because the volume of plausible, test-passing, unreviewed code is exploding.

Every PR looks fine. The system gets worse.

For contrast, the entire 1993 Doom engine that id Software open-sourced is about 57,000 lines of C. One coherent architecture, small enough that a single person can hold the whole design in their head. That was not just discipline; it was a constraint imposed by the cost of writing code. When every line is expensive, you are forced into elegance.

Doom, 1993

  • ~57k lines of C
  • One architect, one design
  • A person can read all of it
  • Constraint forced coherence

Bun rewrite, 2026

  • 1M+ lines of Rust
  • A fleet of parallel agents
  • No person will read all of it
  • Cheap generation, expensive verification

When generation is nearly free, you get what I have started calling architectural diffusion. Instead of one coherent design you get thousands of individually reasonable changes. Every function looks fine in isolation. Every PR passes CI. But nobody is holding the whole design, so the system quietly accumulates duplicated logic, three different retry implementations, inconsistent auth patterns, and the occasional endpoint that checks the session but not the tenant. No single diff is wrong. The sum is.

The failure mode is invisible at review time by construction. A reviewer approves the diff in front of them, and the diff in front of them is locally correct. The defects live in the relationships between changes: the helper that duplicates a policy check slightly differently, the new route that skips the middleware everyone assumed was global. Diffusion is a property of the system, and nothing in the PR workflow looks at the system.

Model collapse comes for your codebase

There is a second-order effect stacked on top, and it has a name in the research literature. When models train on the output of previous models, the resulting distribution degrades in a specific, measurable way.

Indiscriminate use of model-generated content in training causes irreversible defects in the resulting models, in which tails of the original content distribution disappear.

Shumailov et al., Nature 631, 2024

The Nature paper describes two phases. Early collapse: statistical errors compound and the model drifts from the true distribution. Late collapse: low-frequency events vanish entirely. Now map that onto code. AI-generated repositories are already flowing back into training corpora. The unusual-but-brilliant designs, the rare idioms, the carefully considered security patterns: those are the tails. What gets statistically reinforced, generation after generation, is the middle of the distribution. Play with the figure below and watch where the mass goes.

Figure - Recursive training narrows the distribution of designs a model can produce
Synthetic share: 60%
Each press of Train next generation retrains the model on a mix of real code and its own previous output. Watch the tails - the rare, expert, occasionally brilliant designs - lose mass first while the peak climbs toward the mean. Drag synthetic share to 0% and the distribution holds; push it up and the collapse accelerates.

The output of a collapsed distribution is not bad. That would almost be easier to deal with. It is average. Average architecture, average abstractions, average security practices, the same mainstream stack reproduced with the same mistakes propagated through every step of the training loop. And small mistakes do not disappear when they are averaged; they get normalized. A questionable pattern that appears in enough training data stops looking questionable to the next generation of tools.

The uncomfortable arithmetic: Average code at enormous volume is not an average problem. It is an enormous verification problem, because the cost of checking scales with the volume generated, and the volume is no longer bounded by human typing speed.

Average code at scale is a verification problem

This is why I think the biggest opportunity of the next few years is not another coding assistant. Generation is served. The unserved questions are the ones that come after the code exists, and they are all verification questions:

Authz
Who can read this?
Did the change introduce an IDOR, skip a row-level security policy, or widen a role beyond what anyone intended?
Data
What just leaked?
Are secrets, tokens, or PII sitting in client code, verbose errors, or an unauthenticated endpoint?
Behavior
Does it do what we think?
Not "do the tests pass" but "does the running system behave the way the spec in your head says it does?"

Notice these are questions about the running system, not about the diff. Static review already failed us in the diffusion section, and it fails here for the same reason: the authorization bug is not in any single function. We have written before about what verification has to look like in this world - asserting on the delta, not the state, and probing the live deploy instead of trusting fixtures. The June field report covered the industry version of the same realization: the demo stopped counting. What counts is whether the thing survives contact with an attacker who has a browser console.

Generation keeps getting faster. Verification is becoming the scarce resource. Every week of AI-assisted shipping widens that gap, and the tooling on the checking side is years behind the tooling on the writing side.

Smoke test the output before it ships

This idea shaped what we built. VibeEval is our answer to the narrow, urgent slice of the problem: a security smoke test for AI-generated apps. You point it at your running application, and an autonomous agent maps every route, endpoint, parameter, and API it can reach, then fires over 310 real probes at it: auth bypass, IDOR, Supabase row-level security, exposed keys, SSRF, CORS misconfiguration, role escalation. First triage lands in under a minute; a full scan takes three to eight. It tests the live app the way an attacker would, which is the only vantage point where diffusion-style bugs are visible at all.

Figure - One event walks the pipeline; typed results stream back
Profile:
Press Run probe. One event flows Event → Meta → Prompt → Agent → Inbox. The meta pre-pass lands its checks first - deterministic HTTP, zero tokens - then the agent probes the live target and POSTs typed findings one at a time. Switch the profile to watch what it goes looking for change.

Two design choices matter here. Every finding ships with a captured exploit: the request, the response, a reproducible proof of concept, verified by a security engineer before it reaches you, so you are never triaging a linter’s guess. And it is built for the workflow that created the problem: apps generated with Lovable, Bolt, Cursor, Replit, v0, and Claude Code, with paste-ready fix prompts that go straight back into the tool that wrote the bug. The pattern in the scan data matches the collapse thesis, by the way: missing row-level security is the most common critical finding, and exposed secrets in client code turn up in roughly one in four apps scanned. Average security practices, at scale, exactly as predicted.

The smell test for your own stack: If your app was largely written by a model, what part of your pipeline was not written by a model and independently checked the result? If the answer is “the tests the same model wrote,” you have a generation pipeline, not a verification one.

There is a 14-day free trial, no card required, and plans start at $49 a month, which is cheap insurance against the class of bug that turns into a disclosure email. Whether you use VibeEval or something else, the direction seems clear to me: the interesting tools of the next few years will not generate more software. They will tell you whether the software you already generated is safe to ship.

I am curious whether people working with AI coding tools daily are seeing the same pattern. Has verification become a bigger share of your workflow than it was a year ago? Because from where I sit, writing the code was never the hard part. Proving it does what you think it does - that was always the job, and now it is nearly the whole job.

Work with us

Production AI, with guardrails.

Start with a fixed-scope AI Workflow Audit. We map the opportunity and quote a build.

Start a Discovery Sprint →