Reliability engineering for voice
It is almost never the model
Every voice-agent post-mortem we have seen or run blames the model first and finds the system second. The model produced a reasonable sentence; the platform fed it the wrong state, cut the caller off, lost the transfer, or ran a version nobody had reviewed. This is the failure map — and what a beautiful demo never shows you.
Failure 1: shared state between calls
One conversation works. Forty concurrent conversations expose every place your architecture shares context — history bleeding between callers, a tool result landing in the wrong session, an agent answering caller B with caller A’s appointment. Session isolation is not an optimization; it is the difference between a product and an incident. Every call needs its own state, history, audio stream, and tool-execution context, with nothing shared by default.
Failure 2: turn detection, both directions
Barge-in gets the attention: the caller interrupts, the agent must stop talking and cancel downstream work. The quieter killer is premature end-of-turn: a caller pauses mid-sentence to find an order number, voice-activity detection declares the turn over, and the agent confidently answers a half-question. In the transcript this reads as a stupid agent. The model never erred — the detection did. Test silences as deliberately as interruptions.
Failure 3: the transfer that drops the context
The highest-stakes moment in a business call is the handoff to a human — and it is where voice deployments fail most expensively, because the caller has already spent their patience. A transfer needs the human to receive who is calling, why, and what the agent already collected. If your platform treats transfer as “dial a number and hope,” every escalation deletes the work the agent just did.
Failure 4: tool calls without guardrails
A voice agent that books appointments is executing writes against a real calendar under a nondeterministic controller. Every tool call needs validation before execution, permission checks per client, idempotency where the action allows it, and a log entry regardless. The failure mode without this is not a bad conversation — it is double-booked appointments and phantom orders that a client discovers before you do.
Failure 5: the unversioned prompt edit
The most common failure has no incident at all. A client asks for a change; someone edits the prompt in a dashboard; the change fixes their case and quietly shifts three other behaviors. Repeat for six months and nobody — not the agency, not the client, not the person who made the edits — can state what the agent is supposed to do. This is why VoiceForge treats the agent as a versioned Agent Spec JSON contract: changes are diffs, diffs are reviewable, versions are testable, and rollback is a selection rather than an archaeology project.
What the demo was never going to tell you
A demo is one call on the happy path with a cooperative speaker and zero concurrency. Production is the caller with a barking dog, the double question, the mid-call transfer during peak load, and the client who wants one behavior changed by Friday. The fix is not a better demo — it is running the full call path against a known version before telephony is attached, and keeping every subsequent change reviewable. That loop is the product.
Frequently asked questions
- Why do AI voice agents work in demos but fail on real calls?
- Because a demo exercises the happy path once, and production exercises everything else at once: callers who interrupt, go silent mid-sentence, ask two things in one breath, or need a transfer while another call is mid-tool-call. The model is usually fine. The system around it — state isolation, turn detection, transfer logic, versioning — is what breaks.
- What is the most common production failure?
- Unreviewable change. Someone edits a prompt to fix one client call, nobody records what changed, and a different behavior quietly breaks. Six months later no one can say what the agent is supposed to do. This is why VoiceForge stores agents as versioned Agent Spec JSON: every change is a diff you can read, test, and roll back.
- How should interruptions be handled?
- Both directions matter. Barge-in — the caller talks over the agent — needs real voice-activity detection and cancellation. The opposite case is worse: a caller pauses four seconds mid-thought, the system calls it end-of-turn, and the agent answers half a question. Turn detection failures read as stupidity in transcripts even when the model never erred.
- How do you test a voice agent before it takes real calls?
- Run the complete call path in a browser against the exact version you intend to publish: live transcript, event stream, tool activity, and outcome — before any phone number is attached. Test transfers, silences, interruptions, and the caller who refuses every option. Our testing checklist covers the paths that break most.