How to deliver high-quality software with AI-native development / Release and operate
Releasing AI-written changes: flags, canaries and rollback
When change volume triples, the number of bad changes rises with it, and the only variable you still control is how many users meet one. Progressive delivery is how you keep that number small: separate deploy from release, turn it on for a small share of users first, widen it when the evidence supports it, and make undo a decision anyone can take in seconds.
Published September 1, 2026. Editorial.
Key takeaways
- Deploy and release are different events. Getting code onto the servers should be routine; turning it on for users is the decision.
- DORA's 2025 study found AI adoption has a positive relationship with throughput and a negative one with delivery stability [1]. Progressive delivery is the control for exactly that.
- A rollback plan that has never been run is only text on a page. Practise it, in production, on a normal day.
- Promotion should be decided by a named signal, not by how long it has been since the last complaint.
The numbers behind releases changed and most release processes did not. If one in twenty changes causes a problem, twenty changes a week means one bad change a week. Eighty changes a week means four. Your customers experience the total, not the rate.
DORA's 2025 report of nearly 5,000 professionals found AI adoption associated with higher delivery throughput and lower delivery stability, and attributes the instability to change volume meeting weak control systems: automated testing, version control practice and feedback speed [1]. Progressive delivery is the control that sits closest to the customer.
Deploy is not release
The single most useful separation is between getting code onto the servers and turning it on for users. Once those are different events, deployment becomes routine and reversible, and the risky moment moves to a switch you control independently of your build pipeline.
That is what makes flags worth their cost. Not the ability to run experiments, though that is nice, but the ability to answer "make it stop" in seconds without a build, a queue, or a person who knows the deploy tooling being awake.
Flags need their own upkeep, and an AI-native team adds them fast. Every flag is a branch in behaviour, and a codebase full of old, unused flags is a codebase where nobody can say what runs for whom. Give each flag an owner and a removal date at creation, and treat removing a flag as part of the work rather than as cleanup that happens later. In practice the flag count is a useful measure of how much unfinished work is in progress.
Exposure in stages
The pattern is old and it works: internal users, then a small percentage, then a larger one, then everyone. What changes in an AI-native team is that you are running this cycle far more often, so it has to be cheap and mostly automatic.
Three details make the difference between real progressive delivery and something that only looks like it.
The stages must be small enough to matter. A first stage of ten percent is useless if the failure only shows up for the one percent of users with a particular kind of data. Where possible, stage by group of accounts rather than by random percentage: the accounts most likely to expose the failure first.
Someone must be watching the right signal. A canary release (a first release to a small group of users) with no comparison is just a slower release. You need the error rate, latency and the business metric for the users who have the change next to the same numbers for everyone else. That instrumentation is the subject of what to instrument when nobody typed the code.
Promotion has to be a decision, not a timer. "It has been an hour and nobody complained" is the most common reason teams give for widening a release, and it is close to worthless: the absence of a complaint measures how quickly your users report problems, not whether the change is working. Name the signal and the threshold before you start.
What a rollback plan actually contains
Most rollback plans are one sentence: revert the deploy. That works for stateless changes and fails for everything else, which is why it is worth writing down four specifics per risky change.
The trigger. What condition means we stop, stated as a number where possible. Deciding this in advance is what prevents the twenty-minute debate that happens while the error rate is climbing.
The mechanism. Flag off, deploy revert, or something else. If it is something else, that is the sentence worth writing.
The data question. Whether anything was written that will still be there after the code is gone. This is the part that turns a rollback into a project, and it is why data changes are sequenced separately in decomposing work for coding agents.
Who can start it. Ideally anyone on call, without needing a second approval. A rollback that requires finding the author is a rollback that takes forty minutes.
Then practise it. A plan that has never been run is an assumption. Running a real rollback on a quiet Tuesday tells you which of your four answers was wrong while it is cheap to find out. Our post on what a rollback plan looks like for AI-written features has the format we use.
Why AI-written changes need this more
Two reasons beyond volume.
The first is that the person who can diagnose the change quickly may not exist. When a human wrote the code, the fastest debugging path was often the author's memory. With generated code that knowledge is harder to find, so the value of being able to turn the change off without understanding it goes up. Under time pressure, rollback replaces understanding, and in an AI-native team you will use it more.
The second is that the pattern of failures is different. Generated code tends to be competent on the path it was asked about and weak on the paths nobody mentioned, which means failures gather in unusual inputs, unusual accounts, and unusual load. Those are exactly the cases a staged rollout finds and a full release does not, because at one percent exposure you get the unusual cases at a rate you can handle.
Release size and cadence
There is a temptation, when volume rises, to batch releases: fewer, larger deploys to reduce the number of risky moments. It reliably makes things worse. A large release fails in a way nobody can attribute, and the rollback takes everything with it, including the twelve unrelated changes that were fine.
Smaller and more frequent is the safer direction, and it is what makes the gates in the quality gates that should block a merge worth having. The pipeline's job is to make each individual release boring enough that doing it fifty times a week is not a source of anxiety.
What to measure about releases
DORA's current model splits five metrics into throughput and instability: change lead time, deployment frequency and failed deployment recovery time on one side, change fail rate and deployment rework rate on the other [2]. For release practice specifically, the two worth watching weekly are change fail rate and failed deployment recovery time, because they answer the two questions a leader actually has: how often does a release cause harm, and how fast is the damage stopped.
Deployment rework rate gets less attention and it is worth adding, since it counts unplanned deployments caused by a production incident. In a team where volume has risen, that number moving is often the earliest sign that the gates are letting something through. The full explanation is in measure delivery, not generated output.
Staging tells you less than you think
Progressive delivery is partly a response to a fact most teams already know and few act on: the pre-production environment does not represent production. It has less data, cleaner data, no real traffic patterns, different credentials, and usually a different scale of everything.
For generated code that gap is wider than it used to be, because the failures gather exactly where the environments differ. Code that is competent on the described path and weak on the undescribed one will pass a staging test built from the same description, then run into the account with four hundred thousand records, the user in a timezone nobody considered, or the burst of repeated retries that only happens when a real dependency is slow.
The conclusion is not to delete staging. It is to stop treating a passing staging run as evidence and start treating the first percent of production traffic as the real test. That change of view changes what you build: less investment in making staging lifelike, which is expensive and never finishes, and more in making exposure gradual and reversible, which is cheap and works.
Two things do still belong in staging. Anything destructive that you want to rehearse before doing it for real, including migrations and rollbacks. And anything requiring a third party you cannot safely exercise in production. For everything else, the production canary is both cheaper and more honest, which is the argument in our post on why your staging environment is lying to you.
Where this connects
Progressive delivery depends on knowing what a change can affect, which is set in what done means when an agent writes the code, and on being able to see what is happening, which is observability. When it goes wrong anyway, the process is incident response for agent-written code. The main guide has the wider model.
Best for
- Any change that alters behaviour a customer can see, especially in a high-volume pipeline
- Changes where the failure would be hard to diagnose quickly, which includes most generated code
- Cohort-based staging where a specific group of accounts is most likely to expose the failure
Avoid if
- The change writes data that will persist after the code is turned off, which needs a separate sequence first
- You have no comparison metric for the users who have the change, in which case a canary is only a slower release
- The flag would be permanent, in which case you are adding a branch of behaviour nobody will remove
Check before you decide
- Name the promotion signal and its threshold before exposure starts, not after
- Confirm the rollback can be executed by anyone on call, with no second approval
- Rehearse the rollback in production on a quiet day and time it
Common questions
What is progressive delivery and why does it matter more with AI-written code?
It is releasing a change to a growing share of users rather than to everyone at once, with promotion decided by measured signals. It matters more because generated code tends to be strong on the path it was asked about and weak on paths nobody mentioned, so failures gather in unusual inputs and accounts, which a staged release finds at a rate you can handle.
Why separate deploy from release?
Because it moves the risky moment to a switch you control. Getting code onto servers becomes routine and reversible, and turning behaviour on for users becomes a decision you can undo in seconds without a build, a queue, or waking the person who knows the deploy tooling.
What belongs in a rollback plan?
Four specifics: the trigger condition stated as a number where possible, the mechanism such as switching a flag off or a deploy revert, whether any data was written that will remain after the code is removed, and who is allowed to execute it. A plan that requires finding the change's author is a plan that takes forty minutes to start.
How do we know when to promote a canary?
Name the signal and the threshold before exposure begins: error rate, latency and the relevant business metric for the users who have the change, compared against everyone else. Widening the release because an hour passed with no complaints measures how fast users report problems, not whether the change works.
Should we batch releases to reduce the number of risky moments?
No. A large release fails in a way nobody can attribute and its rollback takes the unrelated changes with it. Smaller and more frequent is safer, which is the point of automated gates: each individual release should be boring enough that doing it fifty times a week creates no anxiety.
How do we stop feature flags accumulating?
Give every flag an owner and a removal date when it is created, and treat removal as part of the work rather than cleanup for later. Each flag is a branch in behaviour, so a codebase full of old, unused flags is one where nobody can say what actually runs for whom, and the flag count is a useful measure of unfinished work in progress.
Is ten percent a good canary size?
Only if the failure is evenly distributed, which it usually is not. Where you can, stage by cohort instead of by random percentage and start with the accounts most likely to expose the specific failure, such as the largest data volumes or the unusual configurations. A percentage that never includes the affected users proves nothing.
Which delivery metrics say whether release practice is working?
Change fail rate and failed deployment recovery time, from DORA's five metrics, answer the two questions a leader has: how often a release causes harm and how fast the damage is stopped. Deployment rework rate, which counts unplanned deployments caused by production incidents, is the early signal that gets less attention that gates are letting something through.
Can rollback replace understanding what went wrong?
In the moment, yes, and that is the point. With generated code the author's memory is not available as a debugging shortcut, so being able to turn a change off without understanding it is worth more than it used to be. The understanding still has to happen afterwards, in the postmortem, when it is no longer costing customers.
What makes a rollback plan unusable when it is needed?
Never having run it. A plan that has not been executed is a set of assumptions about tooling, permissions and data that have not been checked. Rehearsing a real rollback on a quiet day tells you which assumption is wrong at a moment when being wrong costs nothing.
References
- [1] Google Cloud / DORA, 2025 State of AI-assisted Software Development report: AI adoption shows a positive relationship with software delivery throughput and product performance and a negative relationship with delivery stability, attributed to change volume meeting weak automated testing, version control practice and feedback loops. Nearly 5,000 respondents. Accessed 1 September 2026.
- [2] DORA, DORA metrics: the four (now five) keys: change lead time, deployment frequency, failed deployment recovery time, change fail rate and deployment rework rate, split into throughput and instability. Accessed 1 September 2026.
Related reading
What a rollback plan looks like for AI-written features
Reverting the commit is the easy half. The half that causes real problems is the data the feature already wrote, and nobody plans for that until they have to.
How to move fast without breaking the product
Speed and quality are usually described as a trade-off. In practice, the teams that work fastest over a long time are the ones that made quality cheap to keep.
Why your staging environment is lying to you
Staging passed. Production broke. That is not bad luck, it is a predictable consequence of the five ways staging differs from the place your users actually are.
More in Release and operate
What to instrument when nobody typed the code
Debugging used to start with the author's memory of what the code was supposed to do. Generated code removes that shortcut, so the system has to record what it is doing. This page covers what to instrument, why the decision belongs in the specification rather than in the postmortem, and how to avoid paying for telemetry nobody reads.
Incident response when nobody remembers writing it
Incident response has always depended on one person remembering why the code does what it does. With generated code that person may not exist. This page covers how to run an incident without them, why stopping the harm comes before understanding, and how to write a postmortem that produces a control rather than a lesson nobody can act on.