Why I Ship Smaller Releases Now That AI Writes Code
AI writes most of my code, so the release became the risk. Here is the small-release gate I run solo across live products with paying users.
The code stopped being the expensive part of my week, so I stopped shipping it in big batches. An agent produces a working feature faster than I can describe it to another developer. What it cannot do is carry the consequence when that feature meets ten thousand paying users on a Thursday night. So every release I push now is deliberately small, runs through a gate I wrote before the code existed, and has a rollback I already ran once on staging. That is the whole change. Writing got cheap, so releasing got careful.
The bottleneck moved to the one seat an agent cannot take
Most of what I read this week about AI-native development tells the same story: the model joins design, the model writes the code, the model opens the PR. In my repos that is exactly what happens. The part nobody writes about is what happens downstream. When a feature gets built over an afternoon instead of a sprint, my queue of unreviewed, undeployed work grows faster than my ability to prove any of it is safe. The pipeline did not get shorter. The pressure slid to the end of it, and that is where I sit alone.
Across Brainers Club, The Next Level, Luma.ai, Tadam and Arvuyot Yashir, I am the only person on call. There is no second engineer to catch a bad migration at 2am. That constraint, not a methodology I read about, is what shaped the process below.
What one release actually looks like
- 01One outcome per release. If I need the word and to describe what it does, that is two releases.
- 02Write the gate before the feature: the test that fails if the behavior breaks, plus the check I will run in production once it is live.
- 03Let the agent implement against that gate, then read the full diff as a reviewer rather than as the person who asked for it.
- 04Staging first, against real data shapes, never fixtures alone. A green fixture suite has never once told me a data change was correct.
- 05Know the rollback before deploying. Revert commit ready, migration additive or reversible, new behavior behind a flag that defaults to off.
- 06Deploy, then verify the live end state by hand: the commit running on the server, the actual user flow clicked through, the one query that proves the data moved.
None of those steps are clever. The point is that all six fit inside the time the agent needs for the next feature, so the gate never becomes the thing I skip because I am in a hurry. A process that only survives calm weeks is not a process.
Small is not a style choice, it is a rollback plan
A big release has one property I cannot afford: when it breaks, I do not know which part broke it. A small release answers that question for free. If I touched one checkout path this morning and support messages start arriving this afternoon, I have exactly one suspect and a revert that takes a minute. Bundle five agent-built changes into one deploy and I am now debugging under pressure, with paying members watching, trying to work out which of the five to pull. That math gets worse as the agent gets better. More changes per week means more chances that one of them is wrong, and keeping each one individually revertible is how I take the speed without taking the 3am incident that usually comes with it.
What I stopped doing once agents wrote most of the code
- Stopped collecting a week of agent output into one release PR. It reviews worse and it reverts worse.
- Stopped treating a passing test suite as deployment evidence. Tests prove the code does what I described, not that I described the right thing.
- Stopped accepting migrations that drop or rewrite a column in one step. Add the new column, backfill, switch reads, remove the old one later.
- Stopped letting the agent decide scope. It is excellent at building what I ask for and has no opinion about whether it should exist.
- Stopped saying I will verify it in production later. Later is the word that comes right before an incident.
What my students get wrong first
I teach Claude Code to more than 600 students at nCode and to more than 600 business owners who came through my workshop. Almost everyone optimizes the same thing first: a faster writing loop. Better prompts, bigger tasks, more agents in parallel. It works, for about two weeks. Then they are sitting on a pile of generated code nobody has shipped, and the agent is editing code it wrote three days ago with no memory of why. The fix is not a better prompt. It is a release habit: one outcome, one gate, one revert, repeat.
AI-native development is not really about the model joining the lifecycle. It is about which stage becomes the constraint once writing code is no longer it. For me that stage is release, and the answer was to make every release so small that being wrong costs ten minutes instead of a weekend.
FAQ
Does shipping smaller releases slow me down if an AI agent writes the code?
No, because the agent was never the slow part. The slow part is proving a change is safe, and that cost grows with the size of the change, not with the number of releases. Ten small deploys that each carry one outcome and one revert take me less total time than one combined deploy I have to debug blind. The only thing that really slows down is how fast I can decide what deserves to be built at all.
What should I verify before deploying code an AI coding agent wrote?
Three things beyond the test suite. Read the entire diff as a reviewer and look for behavior you did not ask for. Run it on staging against realistic data, because fixtures agree with whatever assumptions the agent made. Then after deploying, confirm the live end state yourself: the commit hash running in production, the user flow clicked through in a browser, and one query showing the data is what you expected. A green pipeline is evidence about the code, not about production.
How do I stop AI generated migrations from breaking production data?
Make every migration additive first and never let an agent destroy a column in the same step that introduces its replacement. Add the new field, backfill it, switch reads over, and drop the old one in a separate release once the new path has run in production. Before any data transformation, read the actual affected rows instead of trusting a fixture gate, and expect staging and production to differ. Reversibility is the requirement, not elegance.
Do I still need tests if I review every diff the agent produces?
Yes, for anything that can fail silently. Review catches code that is obviously wrong. Tests catch the regression six weeks later when the agent refactors a file and nobody remembers the rule that used to live there. I write the failing test before the feature, which also forces me to state the behavior precisely enough that the agent builds the right thing. Pure styling and copy changes get runtime proof instead of a new test.
More from the blog
AI Writes My Code. Verification Is the Real Work
I ship seven products solo with Claude Code. The code is the cheap part. This is the verification workflow that decides what actually goes live.
Sep 5, 2026The Security Gate I Run Before Any AI Code Ships
AI writes most of my code, so one security gate runs before every merge. What it checks, where Claude Code quietly gets authorization wrong, and how to copy it.
Oct 3, 2026I Run Seven SaaS Products Solo. Here's What My AI Coding Stack Actually Looks Like
How one developer ships and maintains seven live SaaS products solo in 2026 using Claude Code as an orchestration layer, not just an autocomplete tool.
Jun 21, 2026