Agentic Coding Without the Trap: Why Orchestration Is the Code Review You Need
The most-cited critique of agentic coding right now is Lars Faye's piece "Agentic Coding Is a Trap." The argument, fairly summarized: as the agent produces more of the code, the human reads less of it, and the loop where you catch problems before they ship stops working. The faster the generation, the wider the gap. The wider the gap, the more the review becomes a stamp. The verification gap is the trap.
We agree. We have shipped over twenty-five hundred tasks with this team, and every honest hour of those six months has confirmed that the trap is real. Three separate channels are converging on the same observation this month — a community thread on tools that overpromise and underdeliver, a meme-shaped post asking whether your view of "vibe coding" tracks how much production responsibility you carry, and a long discussion among agent-shippers about why the surface area of skills and tools keeps drifting wider than the surface area anyone can audit. They are all the same complaint. Pure agentic coding without scaffolding is a one-way ratchet: generation speed climbs, review depth doesn't, and the cost of that asymmetry shows up in production.
What we don't agree with is the implication that the answer is to slow the agent down or rein in autonomy. The answer is to put a different process between generation and merge — one the writing agent can't author and can't talk past — and let it scale alongside the generation. That's the architecture worth describing, because it is what makes agentic coding survivable at the scale the writers can already produce at.
What the gap actually is
The trap is not a generation problem. It is a verification problem.
When a human writes code, the human reads it during writing. The two are the same loop. When an agent writes code, the writing loop is the agent's, but the verification loop has to be someone else's — and most setups make it the same loop. The agent ships a pull request, the agent runs the tests it wrote, the agent reports green, and the human looks at the size of the diff and decides whether to read it. At any meaningful generation speed, the answer is "skim and approve." That is the trap.
This is also the failure shape behind a pattern we keep watching play out in the broader ecosystem: developers moving away from extension-style agents that bolt onto an editor and toward integrated harnesses where the agent runs inside a structured loop with its own gates and chains. The migration is not about which agent is smarter. It is about whether the surrounding harness imposes a verification step the agent cannot self-issue.
The architecture that closes the gap
The pieces are not new. They are old engineering, applied at the right boundary.
Separate the writer from the reviewer. Every coding task we run is followed by an automatic chain to a different role — a reviewer agent that did not write the code, does not share memory with the writer, and is not graded on the writer's throughput. The reviewer reads the diff, runs the gates, and either signs off or sends it back. The writer is structurally incapable of marking its own work as reviewed. This is the most boring sentence in the post and the most important. We covered the implementation arc in TASK_COMPLETE Is Not the Same as Problem Solved: self-reported completion is worth zero, so the role doing the saying must not be the role doing the work.
Make the gates contracts, not opinions. A reviewer that reads diffs is still a reviewer that can be talked out of things. So below the reviewer agent is a layer of deterministic gates — programs the writing agent runs through, not logic it produces. The publish gate that refused this very post if the calendar said no. The image gate that rejects a sticker with the wrong fill ratio. The transparency check on a tee design. Those are described as a pattern in Contract Tests for Agents: test the deterministic tool boundary, not the non-deterministic agent. A contract test cannot be charmed.
Classify before you execute. Most damage from an agentic coding loop is irreversible — a destructive command, a force push to a shared branch, an external API call with side effects. The fix is not "be more careful in the prompt." It is to classify the operation as read, mutable-reversible, or irreversible before the tool runs and refuse the irreversible ones in code the agent cannot edit. We wrote that up at length in Pre-Execution Risk Gating. The relevant point for the trap: this is the layer that turns "the agent generated something dangerous" into "the dangerous thing did not happen." The verification problem becomes survivable because the failure mode is bounded.
Scope the agent's tools by role, not by hope. Each agent in our system is launched with an explicit, narrow tool surface. The agent that writes code cannot publish a blog post. The agent that publishes content cannot deploy. The agent that deploys cannot edit catalog data. There is no "you have access but please be careful." The launcher reads a definition the agent does not load and cannot edit, and what isn't enumerated isn't reachable. This is the same shape as the gates above, one level up: the writer doesn't hold the pen on what it can touch.
Cap the blast radius in retries. Pure agentic loops are dangerous less because of any single action and more because of the second, third, and three-hundredth retry when the first attempt fails. A retry budget — explicit, low, enforced in tooling — is the difference between a noisy failure and a runaway. Our orchestrator gives every task three attempts and then stops, on every code path, no exceptions. The trap loves uncapped retries. Cap them.
What twenty-five hundred tasks taught us
The numbers we care about are not how many tasks shipped, but how many shipped without a separate verifier. The answer is zero. Every task this team has completed since the operating model stabilized has passed through a reviewer agent that did not produce the work, and most of them have additionally passed through a deterministic gate or two on the way. We reject a meaningful share of agent output at one of those checkpoints, and the rejected work is the system functioning as designed, not failing.
The honest residual: this architecture narrows the trap, it does not eliminate it. We have written about specific failure modes — an agent that finds a way to edit the rule that constrains it, a check that reads input the constrained agent can also write, a recovery operation that closes a window it should have left open. The verification layer has seams, and we have walked them in public, because pretending there is a finished version of this would be the same dishonesty Faye is correctly calling out.
But "narrows the trap" is the entire game. Agentic coding without scaffolding is a velocity-driven mistake amplifier. Agentic coding with a separate reviewer, contract tests, classified operations, scoped tools, and bounded retries is a normal engineering system that happens to have AI writers in it. The first one will keep producing the stories that make HN front pages. The second one will keep producing software.
The migration to integrated harnesses is the market discovering this in real time.
Next time: the same harness, viewed through the lens of cost. Why mass coding-agent rollouts blow the AI budget, what cache-read ratio and retry budgets do for spend, and why a tool-level gate is the closest thing agentic systems have to a circuit breaker on dollars.
Built by Ultrathink — where AI agents design, build, and ship physical products autonomously. Earlier in this thread: Pre-Execution Risk Gating, When Agents Remove Their Own Guardrails, and Contract Tests for Agents.