Note from production
From demo to production: what usually breaks first
A practical map of the first reliability, workflow, and observability gaps I look for.
A demo proves that an idea can work once. Production asks a harder question: can the system keep working when data is messy, users behave strangely, and the team is tired?
The first failures are usually not exotic. They are missing boundaries, unclear ownership, background jobs nobody can inspect, retries that hide the real problem, and observability added only after trust is already gone.
When I review a system, I start by mapping what happens, where state changes, what can fail, and who notices. The goal is not to rewrite everything. The goal is to find the smallest set of changes that makes the system legible enough to improve.
The first gap is usually a missing boundary
A demo is optimized for one visible path. It often runs with known inputs, one operator, one environment, and a dependency that is assumed to answer. Production introduces boundaries the demo did not need to resolve:
- two requests arrive at the same time;
- a provider accepts work and then times out;
- a user closes the application halfway through;
- a deployment changes one service before another;
- a background job succeeds locally but fails before publishing its result;
- support needs to explain what happened after the original logs have disappeared.
These are not unusual edge cases. They are normal conditions once a product has independent users, networks, services, and releases.
The fastest way to find the weak boundary is to draw one real workflow from request to durable outcome. Mark every point where state crosses a process, data store, queue, provider, device, or team. Each crossing needs an explicit contract and a way to recover when only one side completes.
Background work needs a visible lifecycle
Long-running work is a common dividing line between a persuasive demo and a dependable product.
The demo may start an asynchronous task and display a spinner. Production needs to know whether the task was accepted, claimed, progressing, retried, completed, cancelled, or abandoned. A generic processing flag is rarely enough because it cannot distinguish healthy work from work that will never finish.
A useful job lifecycle includes:
- A durable request identifier and duplicate policy.
- A bounded processing time or heartbeat.
- Retry rules that distinguish temporary from permanent failure.
- A dead-letter or review path for work automation cannot recover.
- Enough stage context to resume safely or explain why the job stopped.
- Retention rules that prevent partial user data from disappearing too early.
In the production AI reliability case study, the important change was not merely adding another queue. It was connecting processing state, retry behavior, worker health, quality evidence, and operating signals into one recoverable system.
Observability must follow the workflow
Adding logs is not the same as making a system observable. A page of unrelated messages still leaves the team reconstructing the product by hand during an incident.
For the critical path, the evidence should answer:
- What entered the workflow and what reached a durable result?
- Where is work waiting right now?
- Which failures are growing, repeating, or isolated to one dependency?
- Can the team trace one request across every boundary?
- Did the release change reliability, latency, usage, or cost?
This normally requires a stable correlation identifier, structured state transitions, service and queue health, and product-level outcome events. The exact tools matter less than whether the evidence follows the same model the team uses to reason about the workflow.
Releases should be repeatable before they are frequent
A demo can be deployed by the person who built it. A production system needs a delivery path another engineer can inspect and repeat.
The minimum useful path is usually smaller than a large platform initiative:
- one documented build;
- automated checks for the critical contracts;
- explicit configuration and secret boundaries;
- a migration strategy for stateful changes;
- a health signal that represents real readiness;
- a rollback or forward-fix decision made before the release fails.
The objective is not ceremony. It is to remove hidden steps that exist only in one person’s memory. The analytics platform stabilization case study shows this pattern: typed integration boundaries and a repeatable build and deployment path made routine change safer without requiring an all-at-once rewrite.
Ownership breaks before infrastructure does
Production failures often last longer because the system has no clear owner for the end-to-end outcome.
One team owns the API, another owns a worker, a third owns the client, and an external provider owns the dependency. Each local dashboard can look acceptable while the user journey remains broken. The missing piece is a shared definition of success and a named owner for coordinating recovery.
Before launch, I want the team to know:
- who receives the first signal;
- who can decide whether to stop, retry, or degrade the workflow;
- which evidence support can safely share with a customer;
- who owns the follow-up when several components contributed;
- where the learned behavior becomes a test, alert, or runbook.
Ownership is not an org-chart exercise. It is part of the architecture because it determines whether failure can be contained and corrected.
The smallest production-readiness review
I use five questions to turn a demo into an actionable production plan:
- Outcome: What must remain true for the user even when one component fails?
- State: Which transitions are durable, retryable, or irreversible?
- Evidence: How will the team know the outcome occurred and reconstruct one failure?
- Recovery: Which failures are automatic, which need a person, and what is the safe fallback?
- Delivery: Can the team test, release, observe, and reverse the next change consistently?
The answers reveal the first useful controls. Sometimes that is a job timeout and retry model. Sometimes it is a typed provider boundary, a release gate, or one product outcome metric. It is rarely “rewrite the system.”
If the product is already serving users, a Production Systems Review applies this map to one fragile workflow and turns the findings into a 30 to 60 day sequence. If the product is still choosing its production shape, an Architecture Decision Sprint resolves the expensive boundaries before implementation multiplies them.