On this page
- Pilots do not fail on model quality, they fail on the half nobody demoed
- The Demo-to-Production Delta
- The six gates a pilot has to pass, and who owns each
- Pilot success criteria and production entry criteria are different documents
- The cost curve nobody models before the pilot
- Non-determinism against a change process built for deterministic software
- Write the exit criteria before the pilot starts
- How to restart a pilot that has already stalled
- Definitions that keep the go-live meeting short
Pilots do not fail on model quality, they fail on the half nobody demoed
A pilot stalls because a demo and a production system share a model and very little else. The demo reads data, handles one case at a time, is graded by the person who built it, and is edited live. Production writes data, handles a queue, is graded by somebody who was not in the room, and cannot change without a release. Each of those four differences is engineering work, and almost none of it was in the pilot budget.
The conversation at the end of a stalled pilot is always the same. The output looks good, everybody agrees it looks good, and nobody can say whether it is better than what the team does today, because nobody measured what the team does today. There is no golden set, so no version can be compared to another version. There is no write path, so nothing has been proved about permissions or rollback. The pilot has demonstrated that the model can do the task, which was rarely the open question.
This is not a model problem and buying a better model does not fix it. It is a scope problem created at kickoff, when the pilot was defined as the cheap half of the system. The fix is to write the exit criteria before the pilot starts, so that the pilot is built as a small production system rather than as a persuasive demonstration.
- Read vs writeA pilot that only reads has tested none of the permissions, idempotency, audit logging or rollback work, which is most of the remaining effort.
- No baselineWithout a measurement taken before the pilot, nothing can be proved afterwards, so the approval decision falls back on taste.
- The tailDemo cases are chosen and production cases arrive. The exception tail is most of the difference between the two.
- Frozen at v1With no eval suite, nobody can safely approve a prompt change, so the system freezes and quietly decays as models and data move underneath it.
The Demo-to-Production Delta
For every capability a demo appears to have, it has implemented the cheap half. Naming the five halves that are missing is the quickest way to turn an argument about whether the pilot worked into a list of work items with owners.
The Demo-to-Production Delta
Five gaps, in the order they usually bite. Score a pilot by how many it has actually crossed, not by how the output reads.
Reading needs a credential and a query. Writing needs a scoped service account, an idempotency key so a retried run does not create a duplicate record, an audit entry naming the automation rather than a human, and a tested reversal path. A pilot that emits a spreadsheet for a person to paste has crossed none of this, and pasting is exactly where the eventual production system will differ most from the demo.
A demo processes the case in front of it. Production faces arrival patterns: a quiet Tuesday, then four hundred at once when a partner batches their overnight file. That needs a queue, concurrency limits set below your provider's rate limit, retries with exponential backoff and jitter, a dead letter queue somebody actually reads, and a way to replay the dead letters after the fix.
The demo shows an output and a room agrees it looks right. Production needs a fixed set of cases with agreed correct answers, a scoring function, a threshold, and a person who did not build the system doing the scoring. Without that, no future change can be approved, because nobody can distinguish an improvement from a regression that happens to read well.
Pilots have a champion who is excited. Production needs a named owner whose week gets worse when it breaks, a rota for the failure alerts, a budget code the running cost lands on, and a place in somebody's objectives. Champions get promoted, move teams and go on leave. When the champion leaves before the owner is named, the system is orphaned and no incident gets a response.
In a pilot, a prompt is edited in a playground and the improvement is obvious to the person editing it. In production, a prompt is a versioned artifact in the repository, deployed with the code, recorded in every run record, and revertible in minutes. If nobody can tell you which prompt version produced last Tuesday's output, you cannot investigate a complaint about last Tuesday.
The six gates a pilot has to pass, and who owns each
Turn the delta into gates with owners. A gate without a named owner is a gate nobody walks through, and the gates that stall pilots are almost never the model ones.
| Gate | Question it answers | Evidence that passes it | Usual owner |
|---|---|---|---|
| Baseline | Was this better than what we did before? | Pre-pilot numbers, dated, agreed by the process owner | Process owner |
| Write path | Can it act on a real system safely? | A reversed test write, with the idempotency key documented | Platform or integration team |
| Exceptions | What happens to the cases it cannot do? | Every case type either handled or routed to a named queue | Operations lead |
| Evaluation | Can we tell an improvement from a regression? | A golden set, a scorer, a threshold, and a run on every release | Build team |
| Cost | Does it still make sense at production volume? | Cost per case measured at full volume, with a written ceiling | Budget holder |
| Ownership | Who fixes it at 09:00 on a Monday? | A named owner, an alert rota and a budget code | Sponsor, before launch |
Pilot success criteria and production entry criteria are different documents
Write both, and write them before the pilot begins. Conflating them is what produces the meeting where a successful pilot is refused permission to go live and nobody can explain why the two facts coexist.
The useful discipline is to pick the pilot so that crossing from the left column to the right is short. That is mostly a selection decision rather than an engineering one, and it is covered in how to pick the first process to automate.
The cost curve nobody models before the pilot
Pilot economics mislead in two directions at once. Volume is a fraction of production, and the demo usually makes one model call per case while the production version makes several: a plan, two or three tool calls, a verification pass, and a retry when a tool times out. Multiply both factors and the monthly number can move by an order of magnitude between the pilot and the real thing.
Every price here is your assumption to supply, not a figure we are asserting. Provider pricing and rate limits change often, so take the current numbers from your provider's own price page on the day you run this. The peak output assumes a third of daily volume arrives inside one hour, which is what batch-driven upstream systems tend to do to you.
The monthly number tends to be survivable. The peak minute is what breaks a launch. If your peak calls per minute sits near your account limit, the system will fail exactly when volume is highest, which is the worst moment for a first impression. The fixes are a queue with a concurrency cap, request batching where the provider supports it, a smaller model on the high-frequency step, and asking for a limit increase weeks before you need it rather than during the incident.
Non-determinism against a change process built for deterministic software
This is the gate that surprises engineering-led teams. Your release process asks whether the software produces the expected output for a given input. An LLM system does not have one expected output, so the existing question has no answer and the release sits in a queue while people argue about whether that is acceptable.
Replace the question rather than fighting it. The new question is whether the graded quality of a sample stayed inside an agreed band. That needs four things: a golden set of real cases with agreed answers, a scoring function per case type, a threshold written down in advance, and a diff report showing which cases changed verdict between versions. Case-level diffs matter more than the aggregate score, because a change can hold the average steady while breaking one important category entirely.
First, shadow mode: run the system alongside the humans without letting it act, and compare daily. Second, a canary: route a small share of live traffic to the new version, watch the graded sample and the exception rate, and roll back on a metric rather than on a feeling. Third, version pinning: if your provider offers pinned model snapshots, use them, and find out the deprecation notice period before you build a dependency on one. Keeping the eval suite green is what makes re-qualifying on a new model a day of work instead of a quarter of anxiety.
The evals themselves are a discipline of their own, covered in writing evals for systems that are not deterministic. The short version: build the golden set from the pilot's own logs while the pilot is running, because that is the cheapest labelled data you will ever have.
Write the exit criteria before the pilot starts
This document does more for a pilot than any other hour you will spend, and an hour is roughly what it takes. It has to be written before anybody builds, because once the demo exists every criterion becomes a negotiation about whether the thing on the screen counts.
# Write this BEFORE the pilot starts. Signed by the pilot sponsor AND by the
# person who will own the system in production. If they are the same person,
# you do not yet have a production owner.
pilot: invoice-coding-agent
starts: 2026-09-01
decision_date: 2026-10-13 # a date, not "when we are happy"
baseline: # measured before the pilot, never after
cases_per_month: 0
median_minutes_per_case: 0
error_rate_definition: how the business defines an error today
error_rate_value: 0
measured_on: YYYY-MM-DD
exit_criteria: # all true, no partial credit
graded_sample:
size: 150 # fixed set, chosen before the pilot begins
scored_by: someone who did not build it
threshold: agreed with the golden label on N percent of cases
per_category_floor: no single case type below M percent
exceptions:
unhandled_case_types: 0 # every type handled or routed
escalation: named queue, named owner, response time
write_path:
proved_in: staging | production behind a flag
idempotency: key and dedupe window documented
rollback: one command, tested, time recorded
observability:
per_run_record: [input_hash, prompt_version, model_id, tool_calls,
output, cost, latency, verdict]
retention_days: 90
replay: can a past case be re-run against a new version, yes or no
cost:
cost_per_case_at_production_volume: 0
ceiling: the number above which this stops being worth doing
ownership:
production_owner: name
alert_rota: name or rota
budget_code: where the running cost lands
stop_criteria: # write these too, or the pilot never dies
- graded score below threshold after two improvement cycles
- export or write path still manual at the decision date
- no production owner named by the decision date
- cost per case above the ceiling at production volume
How to restart a pilot that has already stalled
A stalled pilot is usually recoverable in a few weeks, because the expensive discovery is done. Work in this order, and add no new capability until step five.
- Reconstruct the baseline from history
You missed the pre-pilot measurement, so rebuild it from the period before the pilot started: case counts, timestamps, correction and rework records. It is less clean than measuring properly, and it is enough to answer the comparison question. The method is in the baseline you must take before any automation.
- Build the golden set out of the pilot's own logs
Sample a hundred and fifty cases the pilot has already processed, stratified across case types rather than drawn purely at random, and have an expert mark each output right or wrong with a reason. Two or three hours of expert time converts an unfalsifiable pilot into a measurable one.
- Take one case type all the way to a real write
Pick the narrowest, safest case type and put it behind a feature flag with a scoped service account, an idempotency key, a full run record and a tested rollback. Depth on one type teaches you more than breadth across five, and it converts the write gate from a question into a fact.
- Name the owner and the budget code
Get a person, a rota and a code in writing before scope grows again. If nobody will accept ownership, that is the real finding, and it is better surfaced now than after launch when the alerts start arriving in an unwatched channel.
- Set a kill date and hold it
Put a decision date in the calendar with the stop criteria attached. Pilots rarely die of failure, they die of indefinite extension, which costs more than an honest cancellation and teaches the organisation that AI projects do not finish.
Definitions that keep the go-live meeting short
- Idempotency key
- A stable identifier attached to a write so that repeating the same request does not create a second record. It is what makes retries safe, and its absence is the most common reason an automation that recovers from an error leaves duplicate rows behind it.
- Dead letter queue
- The place a message goes after retries are exhausted, so that a failure is parked rather than lost. It only works if a named person reads it on a schedule and the items can be replayed once the underlying fault is fixed.
- Canary release
- Routing a small share of live traffic to a new version while the rest stays on the old one, then comparing graded quality and error rates before widening. It converts a release decision from a judgement call into a measurement with a rollback trigger.
- Regression suite
- The fixed set of graded cases run against every version of a non-deterministic system, reporting both the aggregate score and which individual cases changed verdict. The case-level diff is the part that catches a change which holds the average while breaking one category.
Building whole processes with these gates designed in from the start, rather than bolting them on after a demo, is the work described under business process automation.
Questions readers ask next
How long should an AI pilot run before we decide?
Our pilot output looks good but nobody will approve go-live. What is missing?
Should the pilot be built on the production stack or something quick?
Is a low-code tool a reasonable place to run a pilot?
What single change most improves the odds a pilot ships?
ChatGPTalker. "Why AI Pilots Fail: The Gap Between a Demo and Production." chatgptalker.com, 2026-08-26. https://chatgptalker.com/guides/why-ai-pilots-never-ship/