On this page
- The short answer
- Why rollouts fail, and it is rarely the software
- The Reversal Ladder
- Edit distance is the instrument nobody installs
- Tell people in the right order
- Keep the manual path alive, and sunset it on evidence
- What to watch while the rollout is live
- How much review capacity a rollout actually needs
- The rollout checklist
- The vocabulary, used precisely
The short answer
Roll out in rungs, never in one step. Run the automation in shadow first, then let it draft while a human commits, then let it act inside a window where the action can still be pulled back. Climb a rung only when a number agreed in advance crosses a line, and make every rung reversible by config rather than by shipping code. Most rollout revolts are not about the machine being bad. They happen because people found out that their work had become unreviewable and their mistakes had become someone else's problem.
- 5 rungsbetween shadow mode and unattended action, each reversible without a deploy
- p50 and p90the two edit-distance numbers that matter, because the mean hides the two populations underneath it
- 3/nthe rule of three: zero failures in n runs bounds the true rate at roughly 3/n, so 300 clean runs still allows 1 in 100
- Config, not codeif dropping a rung needs a pull request, you will not drop it at 4pm on a Friday
- 1 scepticin every pilot group, because volunteers make anything work and report nothing
This guide covers the part of the project that starts after the system works. The code is done, the evals pass, and twelve people who did not ask for any of this have to change how they work on Monday. That transition has its own failure modes, as specific and as diagnosable as a retry bug.
Why rollouts fail, and it is rarely the software
Rollouts fail for four reasons, and model quality is not one of them. The system replaced a step without replacing the accountability attached to it. The old path was closed before the new one had earned it. Nobody could see what the automation had done, so checking meant redoing the work. Or the queue of things the machine could not handle grew silently until it became somebody's second job.
Each has a signature you can watch for and a fix that is structural rather than persuasive. No amount of internal comms fixes a system whose output cannot be inspected.
| Failure | What you will hear | The actual cause | The fix |
|---|---|---|---|
| Silent replacement | "I did not know it was doing that" | A field changed or a message sent with no trace attributable to the machine | Every machine action carries an actor id and lands in the same activity feed as human actions |
| Accountability inversion | "It is not my fault, the bot did it" | The human still signs off but no longer decides, so blame and control separated | Either the human commits and owns it, or the machine commits and the owner is named in config |
| Cliff cutover | "We cannot go back now" | The manual path was retired on a date rather than on evidence | Numeric sunset criteria, plus a monthly drill proving the manual path still runs |
| The invisible queue | "There is a backlog nobody mentioned" | Exceptions route somewhere with no owner and no age alarm | One queue, one owner per exception type, alert on queue age rather than size |
| Pilot selection bias | "It worked in the trial" | The pilot ran with volunteers who would have made anything work | Include one sceptic and one person too busy to care |
The Reversal Ladder
Give the machine autonomy in rungs, and define each rung by two properties only: who commits the action, and how expensive the undo is. The second is the one usually left out, and it is the one that decides how much evidence you need before climbing.
The Reversal Ladder
Five rungs from watching to acting. You may only climb when the metric from the rung below crosses a threshold agreed before the rollout started, and you must be able to descend by editing a config value.
The automation runs on live input and writes only to a log nobody reads. You are testing plumbing, throughput and crash behaviour, not quality. Exit when it has survived a full business cycle including the month-end spike.
The human works as normal. After they commit, the machine's version is stored alongside theirs and the disagreement logged. Nobody changes how they work, and you get a labelled dataset from real production work at no annotation cost.
The machine drafts, the human edits and commits. This rung produces the most useful signal in the rollout, the edit distance between draft and committed version. Teams skip it because it looks like a half measure. It is the instrument.
The machine commits, but the action sits in a visible, cancellable window before taking effect: a delayed send, a queued write, a scheduled status change. Set the hold by how long a person realistically takes to notice, which is not the same at 9am and 6pm.
The machine acts directly and a sampled share is reviewed afterwards. Sampling is not optional here, because it is the only remaining source of quality data. Once nobody looks at anything, the first sign of drift is a customer complaint.
The rungs also answer the question people actually ask, which is not "is it accurate" but "what happens when it is wrong". At rung 2 a human catches it in the normal course of work. At rung 3 anyone can cancel it for half an hour. At rung 4 the answer has to be a documented reversal procedure, and if you cannot write that procedure you are not ready for rung 4.
# rollout.yaml -- one file per automation, read at boot, changeable without a deploy
automation_id: invoice-triage
rung: suggest # shadow | compare | suggest | act_with_hold | act
owner: name of the human who is paged
descend_authority: [ops_lead, on_call_engineer] # who may drop a rung, no approval needed
rungs:
shadow:
writes: none
human_sees_output: false
exit_when: "runs >= 500 and crash_rate < 0.5%"
compare:
writes: log_only
human_sees_output: after_commit
exit_when: "agreement_rate >= 0.85 over the last 300 records"
suggest:
writes: draft_field_only
human_sees_output: before_commit
exit_when: "median_edit_ratio <= 0.05 and p90_edit_ratio <= 0.40 over 300 records"
act_with_hold:
writes: real
hold_minutes: 30 # action is queued, visible, and cancellable for this long
exit_when: "reversal_rate < 1% over 400 actions and zero severity_1 reversals"
act:
writes: real
sample_review_pct: 5
descend_triggers: # any one of these drops the rung automatically
- "reversal_rate > 3% over any rolling 100 actions"
- "any severity_1 reversal"
- "exception_queue_age_minutes > 240"
- "upstream schema hash changed"
manual_path:
status: live
restart_minutes: 15 # measured, not estimated, by an actual drill
drill_cadence: monthly
sunset_when: "rung == act for 60 days and reversal_rate < 0.5%"
Volunteers are self-selected for tolerance. They work around rough edges without reporting them, and they hand you an accuracy number that will not survive contact with the rest of the team. Recruit three people: someone who wants it, someone who thinks it is a bad idea, and someone neutral with no spare time. The sceptic finds the failure modes and the busy person finds the friction, and friction is what kills adoption.
Edit distance is the instrument nobody installs
At rung 2 you get a measurement almost nobody captures: how much the human changed before committing. Store the draft and the committed version for every record, compute a normalised difference, and you have a continuous quality signal generated by work people were doing anyway. No annotation project, no eval budget.
Report the distribution, not the average. A median near zero with a ninetieth percentile near total rewrite does not describe a system that is mostly good. It describes two populations: one class of input the system handles perfectly and another it cannot touch. Find the feature that separates them, route the second class to a human, and perceived accuracy jumps with no change to the model.
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"title": "review_event",
"description": "One row per record a human touched. This is the rollout instrument.",
"type": "object",
"required": ["record_id", "automation_id", "rung", "machine_output",
"committed_output", "reviewer_id", "seen_at", "committed_at"],
"properties": {
"record_id": {"type": "string"},
"automation_id": {"type": "string"},
"rung": {"enum": ["shadow","compare","suggest","act_with_hold","act"]},
"input_hash": {"type": "string", "description": "so you can group by input class later"},
"machine_output": {"type": "string"},
"committed_output": {"type": "string"},
"edit_ratio": {"type": "number", "description": "0 = accepted as written, 1 = fully rewritten"},
"override_reason": {"enum": ["wrong_fact","wrong_tone","missing_context",
"policy","format","other", null]},
"reviewer_id": {"type": "string"},
"seen_at": {"type": "string", "format": "date-time"},
"committed_at": {"type": "string", "format": "date-time"},
"reverted": {"type": "boolean", "default": false},
"revert_reason": {"type": ["string", "null"]}
}
}
- Edit ratio. A character or token level diff normalised to the committed text length. The algorithm matters far less than using the same one every week.
- Override reason. A short closed list, chosen in one click. Free text does not get filled in, and a reason taxonomy is what turns a complaint into a backlog item.
- Time from seen to committed. Rising while edit ratio falls means people stopped reading and started rubber stamping.
- Input hash or class. Without it you cannot segment, and segmentation is where the wins hide.
- Reverted flag, set later. Committed then undone an hour afterwards is a different failure from edited before committing. Count it separately.
Watch the rubber-stamp signature specifically. Acceptance rising while review time falls towards a couple of seconds means you have all the risk of rung 4 with none of the sampling discipline. When you see it, either climb to rung 3 honestly or make review harder by showing only the parts the model was least confident about. Half-attention review manufactures a paper trail of approval nobody actually gave.
Tell people in the right order
Announcement order is a design decision, not a courtesy. The person whose name is attached to the output hears first, and nobody learns about the change from the tool itself. Discovering that your job changed by noticing a new button turns a rollout adversarial in one afternoon.
- The people doing the work today, individually, before any group announcement. Ask them what the automation will get wrong. They will be right, and their list becomes your test set.
- Their manager, with a specific answer on headcount and workload. Refusing that question is itself an answer, and the team hears the loudest version of it.
- The wider team, demonstrated on real records rather than slides. Show a failure on purpose, because a demo of only successes is believed by nobody who has worked with software.
- Anyone customer facing, with the escalation path written down. They will be asked "was that a bot" and they need a true sentence to say.
- Everyone else, including whoever inherits it later. Keep it short and link the runbook rather than restating it.
The most productive meeting in a rollout is thirty minutes with the two people who do the work, asking where a machine would go wrong. They know the exceptions by heart because they have been absorbing them for years. Turn every item into a test case and read the list back at the go-live review with a pass or fail beside each one. It converts the sceptic into a co-author and produces better coverage than any test plan written by the build team.
Keep the manual path alive, and sunset it on evidence
Keep the old path running until the numbers say otherwise, and make the sunset a threshold rather than a date. Dates get set in a plan written before anything was known, then defended out of pride. Thresholds get met or they do not.
Two paths cost real money and you should say so rather than pretending otherwise. It means two sets of permissions, two places a record can be created, and a reconciliation job to catch drift between them. Budget for the drill as well: once a month, push a real piece of work through the manual path and time it. A fallback nobody has exercised in four months is a story people tell each other about a fallback. The drill also tells you when the manual path has genuinely died, which is the honest moment to declare the sunset. See the baseline you take before any automation for what to measure on that run.
What to watch while the rollout is live
Six numbers, on one screen, read daily by a named person. Anything more and nobody reads any of it. Each metric needs a defined response, because a metric with no attached decision is decoration.
| Metric | Where it comes from | What it tells you | What it triggers |
|---|---|---|---|
| Median and p90 edit ratio | review_event rows | Whether output quality is one population or two | Segmentation work if p90 stays high while the median sits near zero |
| Override reason mix | review_event rows | Which specific defect dominates this week | A prompt, tool or routing fix aimed at the top reason |
| Seen to committed time | review_event timestamps | Whether reviewers are reading or rubber stamping | Confidence-based review, or an honest climb to rung 3 |
| Exception queue age, oldest item | The queue itself | Whether the human side has capacity | Escalate at four hours, descend a rung at a day |
| Reversal rate and severity | Reverted flags and incident log | The only direct measure of harm | Automatic rung descent on any severity 1 |
| Coverage, share of volume touched | Run log against total volume | Whether people are quietly routing around it | A conversation, not a dashboard change |
Coverage deserves a note. If the machine handles a falling share of total volume while quality metrics look fine, people are diverting work around it for reasons they consider obvious and have not mentioned because nobody asked. That is a workflow design signal, not a model signal, and it appears in no quality metric. The same applies to work arriving through a channel the automation does not watch, which is how a shared inbox becomes the escape hatch. Automating a shared inbox covers that case.
How much review capacity a rollout actually needs
Review capacity is the constraint discovered late and it hurts most. A rollout needing more human attention than the team has will either stall or degrade into rubber stamping, and both look like quality problems when they are staffing problems. Run the arithmetic before picking a sampling rate.
All inputs are yours. The detection figure uses the rule of three: seeing zero failures in n samples bounds the true failure rate at roughly 3/n, so it tells you the smallest fault rate your sampling could plausibly have caught.
The third output is the one that changes decisions. Reviewing a small share of a small volume for a short window can leave you unable to rule out a fault rate of several percent, and several percent of a customer-facing action is not a rounding error. If it comes back uncomfortable you have three levers: review more, run longer before climbing, or accept the risk in writing with the person whose budget carries it. Quiet hope is not a fourth lever.
A random sample estimates the overall rate and is the only thing that can honestly answer "how often is it wrong". A targeted sample, biased towards low-confidence or unusual records, finds specific defects faster but says nothing about the population. Run both, keep them in separate buckets, and never quote a rate computed from the targeted pile.
The rollout checklist
Work through this before the first real record touches the automation. Most items take under an hour, and every one is cheaper now than in week three. Ownership questions in particular are far easier to settle before launch, which is the argument of who owns the automation after launch.
The vocabulary, used precisely
- Shadow mode
- Running an automation against live production input while writing its output only to a log that nobody uses in the workflow. It tests throughput, integration and crash behaviour without exposing anyone to the results.
- Edit distance, or edit ratio
- The normalised difference between the output a machine drafted and the version a human committed. Zero means accepted as written, one means fully rewritten. Tracked as a distribution, it is the cheapest continuous quality signal in a rollout.
- Reversal window
- A deliberate delay between an automated action being committed and taking effect, during which any human can cancel it. Its length is set by how long a person realistically takes to notice.
- Descend trigger
- A pre-agreed condition that automatically reduces an automation's autonomy without a discussion, a deploy or an approval, such as a reversal rate crossing a threshold or an upstream schema changing.
- Rubber stamping
- A reviewer approving machine output without reading it, visible as acceptance rate rising while time between seeing and committing falls. It carries the risk of full autonomy while producing a false audit trail of approval.
- Sunset criterion
- The numeric condition under which the manual fallback path is retired, stated before the rollout begins. It replaces a cutover date, which is a commitment made when the least was known.
One closing note. Every rollout produces a version of the sentence "the system is fine, people just need to use it". Treat it as a bug report about the design. People route around automation for reasons that are legible once you ask, and they are specific: an exception type nobody handled, a field that is not shown, a customer who always calls. If the programme is to survive past the third automation, those reasons are the backlog. Business process automation is mostly this work, not the model.
ChatGPTalker, "Rolling Out Automation Without a Team Revolt" (2026). Roll out in five reversible rungs from shadow to unattended action, use edit distance between machine draft and committed output as the primary quality instrument, keep the manual path warm until a numeric sunset criterion is met, and make every autonomy reduction a config change rather than a deploy.
Questions readers ask next
How long should an automation stay in shadow mode?
What if the team refuses to use the automation at all?
Should the automation be introduced as an assistant or as a replacement?
How do we handle the person whose job the automation mostly replaces?
What is the right sampling rate once the automation runs unattended?
Can we skip the suggest rung to move faster?
ChatGPTalker. "Rolling Out Automation Without a Team Revolt." chatgptalker.com, 2026-08-26. https://chatgptalker.com/guides/rolling-out-automation-to-a-team/