A Voice Agent That Sounds Natural Can Still Fail: A Turn-Taking Acceptance Harness A developer has proposed a turn-taking acceptance harness for conversational voice agents, arguing that fluent demos and fast median response times are insufficient grounds for authorizing an agent to handle real customer workflows. The harness calls for replaying representative calls, classifying true interruptions separately from noise and backchannels, verifying that cancelled speech is purged from both playback and conversation state, and confirming callers can reach a human without repeating their task. It ships with a test matrix, a small executable scoring tool, a release decision rule and a failure-recovery protocol, which the author frames as design proposals rather than measured vendor claims. Decision in one minute. Do not authorize a conversational voice agent to handle a real customer workflow because a demo sounds fluent or a vendor reports a fast median response. Authorize it only after replaying representative calls, classifying true interruptions separately from noise and acknowledgments, proving that cancelled speech is removed from both playback and conversation state, and confirming that a caller can obtain a human without repeating the task. This article supplies a test matrix, a small executable scoring tool, a release decision rule, and a failure-recovery protocol. They are design proposals, not measured claims about any vendor. The starting conversational voice guide https://vocalis-ai.org/en/conversational-ai-voice correctly separates bidirectional dialogue from one-way text-to-speech and describes recognition, reasoning, synthesis, and escalation as a connected system. Its useful architecture overview does not answer a harder procurement question: how can a buyer tell whether the system knows when to listen, when to continue, and when to stop speaking? A call that passes a pleasant scripted demo may still fail at precisely that boundary. The distinction matters because real callers pause, correct themselves, speak over the agent, cough, use a speakerphone, have different speech patterns, and sometimes want no automated conversation at all. The W3C research module on voice systems and cognitive accessibility https://www.w3.org/TR/coga-voice/ identifies memory, processing-speed, language, and speech-production barriers. It recommends pauses, longer timeouts, simple recovery, and access to a human when errors persist. Those are user needs, not optional polish. A Zendesk community PoC report https://community.zendesk.com/zendesk-eap-voice-ai-agents-123/noise-interrupts-ai-agent-22237 describes traffic, coughing, and speakerphone noise stopping an AI answer mid-sentence. That report is one user observation, not a prevalence estimate. Its value is to expose a realistic failure case that a clean-room demo can miss. A system can optimize its response delay yet make a call worse by interrupting a thoughtful caller. Conversely, delaying every turn to avoid false starts can make a simple booking task frustrating. The acceptance target must be a task outcome with recoverable turn-taking , not one speed number. For a low-risk appointment inquiry, the result may be a confirmed slot, a correct callback request, or an honest transfer. For a complaint, eligibility dispute, payment issue, or health-related conversation, the acceptable automated scope may be much narrower. Write that boundary before changing VAD thresholds. The team should define three separate questions. First, did the system hear a meaningful user turn? Second, did it act on the correct, final version of that turn? Third, did the caller receive an accurate and accessible outcome? A false barge-in can fail the first question. A correction such as “Tuesday—sorry, Thursday” can fail the second if the calendar call happened too early. A polished summary that never reaches a human can fail the third. A single “success” label hides these differences. McKinsey's voice-agent operations analysis https://www.mckinsey.com/capabilities/operations/our-insights/operations-blog/when-ai-voice-agents-struggle-and-how-to-raise-them-better similarly argues for resolution rather than deflection and calls out interruption, ambiguity, recovery, and context-rich human handoff. That is consulting advice, not proof that any particular vendor meets these conditions. This article uses interruption for a caller attempt to take the floor while the agent is speaking; backchannel for short acknowledgments that do not request the floor; transient for non-speech noise; endpointing for deciding that a caller has finished a turn; and playback state for audio actually heard by the caller. These are operational labels for the harness. They are not claims that every person, language, or vendor uses identical categories. Review the categories with people who will receive the calls, including users with varied speech patterns. The LiveKit turn-taking documentation https://docs.livekit.io/agents/logic/turns/tuning/ separates activity detection, interruption handling, preemptive generation, and audio preprocessing. That separation is the key engineering insight: one slider cannot fix a multi-stage pipeline. Its reference configuration includes interruption duration, false-interruption recovery, and an adaptive mode; those are product-specific starting points, not universal optimum values. OpenAI's Realtime event reference https://platform.openai.com/docs/api-reference/realtime-client-events/session likewise exposes VAD threshold, silence duration, interruption behavior, and semantic turn detection. These controls should be evaluated against calls, not accepted as proof of call quality by their mere presence. Many evaluations inspect the generated transcript and the final CRM record. Neither necessarily reflects the audio that reached the caller. In a streaming system, the model may have generated a whole answer while the caller heard only its first clause. If an interruption clears queued audio but the model retains the unplayed text as if delivered, its next sentence can assume knowledge the caller never received. This is not a theoretical mismatch: the Twilio Media Streams message specification https://www.twilio.com/docs/voice/media-streams/websocket-messages documents mark acknowledgments for completed playback and clear for emptying queued audio. It explains that marks returned after clear can identify audio that was cleared rather than played. The exact event behavior belongs to Twilio's transport; other providers need an equivalent playback receipt or explicit uncertainty. The durable conversation record therefore needs at least three versions of an agent turn: intended text, generated audio, and confirmed-played audio. A transcript should not silently replace the third with the first. If a provider cannot supply per-chunk playback evidence, mark the turn as partially delivered and ask a clarifying question before relying on it. That recommendation may add a turn, but it avoids a more serious error: “As I just explained…” when the explanation was cancelled. php flowchart TD A Agent audio queued -- B{Caller signal while playing?} B -- No -- C Playback receipt: delivered B -- Yes -- D{Meaningful turn confirmed?} D -- No -- E Resume from last confirmed-played boundary D -- Yes -- F Clear queued audio and cancel pending response F -- G Reconcile heard content and pending tool actions G -- H Answer corrected intent or transfer C -- I Continue normal task E -- I The diagram is a control proposal. A deployed system must also handle a third branch—insufficient evidence—by marking playback or intent unknown and asking for confirmation rather than pretending that uncertainty has disappeared. Consider a booking agent saying, “I can offer Tuesday at ten or Thursday at—”. The caller says, “Thursday, but after lunch.” A naive system may treat the last generated answer as delivered, use “Thursday at four” from an unplayed suffix, and book four. A robust system records that the offer was interrupted before the time was heard, keeps the caller's new constraint, reads available slots again, and confirms a specific time before any write. The failure is not simply latency or word-error rate. It is an invalid assumption about shared conversational state. Use a per-call trace with stable identifiers that link audio, turn detection, model response, tool action, playback, and handoff. The ledger should contain timestamps from the same monotonic clock where possible. Wall-clock time is useful for operations, but elapsed time between events should not be calculated across hosts without clock synchronization. Retain only the data justified by the use case and applicable obligations; redact personal data before sharing test traces. The following schema is an implementation proposal, not an industry standard. | Field | Why it exists | Example evidence | |---|---|---| | call id , turn id , event id | Join records without relying on transcript text | Provider stream ID and local sequence | | event type | Separate detection from decision and delivery | speech start , interrupt candidate , clear sent , playback mark | | mono ms | Order events within one clock domain | Milliseconds since call start | | detector output | Reproduce the decision path | Speech probability or semantic end-of-turn result | | agent audio chunk | Link generated audio to playback | Chunk ID and hash, not necessarily retained audio | | playback status | Distinguish heard from queued or cleared | played , cleared , unknown | | tool intent , tool receipt | Prove which external action happened | Idempotency key and API response | | handoff state | Verify that escape was offered and completed | Request, accepted, connected, failed | Do not treat a detector's probability as ground truth. Annotators should hear or inspect a permitted recording and judge whether the caller intended to take the floor. Record uncertainty when intent is ambiguous. Likewise, a mark is a transport receipt to interpret according to the provider's documented semantics, not an all-purpose proof that a human understood the sentence. The ledger is valuable because it makes ambiguity visible instead of hiding it inside a success percentage. An owner should define the maximum retention for raw audio, redacted transcript, aggregate metrics, and incident examples separately. A short aggregate record may be kept when raw audio is removed. If the organization cannot explain why it retains a field, it should not collect it by default. Accessibility testing requires consent and appropriate accommodation, not silently profiling callers. These are governance recommendations; local legal advice may impose different requirements. The original asset here is a reproducible case matrix rather than a fabricated benchmark. It contains twenty scenarios selected to cross four caller behaviors with five environmental or task conditions. The matrix is a design artifact, not results from twenty real people. It is deliberately small enough for a team to run manually and precise enough to repeat after changing turn-detection settings. Expand it with actual traffic patterns only after privacy and sampling reviews. The four caller behaviors are: direct answer, mid-sentence correction, meaningful barge-in while the agent speaks, and a non-turn sound or backchannel. The five conditions are: quiet headset, speakerphone echo, background activity, slow or hesitant speech, and a high-stakes handoff request. Crossing them yields twenty planned cases. The last condition must be implemented carefully: even a “direct answer” case can explicitly request a human. Each case needs a script, audio stimulus or actor instruction, expected outcome, and a human-adjudicated label. | Caller behavior | Quiet headset | Echo | Background activity | Hesitant speech | Human handoff | |---|---|---|---|---|---| | Direct answer | Complete task | Do not answer own echo | Ignore unrelated voices | Allow thinking pause | Connect when requested | | Correction | Use final choice | Preserve correction under echo | Do not commit early | Keep both clauses | Transfer corrected context | | Meaningful barge-in | Stop playback | Stop despite echo | Distinguish caller voice | Keep the new constraint | Stop and transfer | | Non-turn sound/backchannel | Continue coherently | Avoid self-interrupt | Ignore cough/door | Do not misread “mm” | Do not mask later request | For each case, capture expected observable behavior, not only a category. “Pass” might require the agent to stop speaking within an approved window after a true barge-in, avoid issuing a tool write until the corrected intent is confirmed, and deliver a human handoff within the service's supported hours. The values of those windows and service hours must be chosen by the buyer based on task risk and real user testing. This article intentionally does not invent a universal millisecond threshold. A 500 ms starting value in a framework's documentation describes that framework's default; it is not a safety standard for every call. The matrix also exposes a contradiction. A setting that ignores short signals may reduce cough-triggered false interruptions while missing a brief but meaningful “stop.” A setting that eagerly cuts playback may honor “stop” yet react to every breath or echo. These outcomes cannot be collapsed into “lower is better.” The trade-off is why the harness measures both false interruption and missed interruption on the same case set. TurnBench, a 2026 research preprint https://arxiv.org/abs/2608.25218 , reports that interruption false positives in its hand-labeled corpus vary strongly by conversation type and cluster in backchannel-heavy interactions. Its corpus and tested systems are not the same as this buyer's calls, so this finding motivates scenario coverage rather than a transferable performance estimate. If one setting improves one rate but worsens the other, choose according to the task and show the trade-off to the owner. The protocol was assembled on 22 October 2026 by comparing the source site's architecture guide with official LiveKit https://docs.livekit.io/agents/logic/turns/tuning/ , Twilio https://www.twilio.com/docs/voice/media-streams/websocket-messages , and W3C https://www.w3.org/TR/coga-voice/ material, a TurnBench research preprint https://arxiv.org/abs/2608.25218 , McKinsey's operational analysis https://www.mckinsey.com/capabilities/operations/our-insights/operations-blog/when-ai-voice-agents-struggle-and-how-to-raise-them-better , and two public problem reports from Zendesk's community https://community.zendesk.com/zendesk-eap-voice-ai-agents-123/noise-interrupts-ai-agent-22237 and the OpenAI developer forum https://community.openai.com/t/short-background-noises-transients-interrupting-realtime-voice-agents-and-breaking-the-conversation-how-are-you-handling-this/1408109 . These are selected evidence chains, not a statistical sample of voice-agent deployments. The twenty cases above are generated from a four-by-five design, not twenty measured calls. No success rate, improvement estimate, or vendor ranking can be inferred from them. Excluded from this article are live customer recordings, vendor-specific private logs, clinical or emergency calls, and jurisdiction-specific legal approval. Those exclusions matter. A team must add its own languages, accents, device types, accessibility needs, legal restrictions, and contact-center policies before using the harness as a launch gate. A single public complaint shows that a failure is possible; it does not show how common it is. Official documentation establishes available controls and event semantics; it does not establish that a particular deployment has configured them correctly. The evidence gap worth closing is therefore practical: many introductions explain what an agent is, while buyers need a repeatable way to prove which utterance caused which action and what audio was actually delivered . The ledger and case matrix are meant to fill that gap. Their value should be judged by whether another team can reproduce a release decision and diagnose a failure, not by whether they sound novel. Start with a staging number, synthetic account data, disabled outbound actions, and an agent configuration identical to the proposed release except for safe endpoints. Give each scenario a case ID. For actor-led tests, give the actor the intent and constraints, not an exact sentence to memorize. Exact scripted wording can make speech recognition look better than it will be in service. For audio replay, document the recording device, codec, gain, room, and telephony path. Replay through the actual transport whenever feasible; a local microphone test bypasses compression, packet jitter, and echo characteristics of telephone calls. For each case, run at least one clean baseline and one controlled variation. Do not call that a reliable estimate of a rate; one trial can only reveal a failure. If a setting change is proposed, replay the same corpus against both versions and preserve the original labels. Add new cases discovered in production to a separate regression set so that “tuning” cannot quietly remove hard examples. Rotate annotators, adjudicate disputed labels, and avoid showing them the configuration under test. These steps reduce bias but do not eliminate it. Before starting, state exactly what the agent may do. A booking test might allow searching availability but block booking until explicit verbal confirmation; a complaint test might allow reading a policy but not closing the complaint. Keep the same action boundary for both configurations. Otherwise, a version can appear better merely because it attempts fewer difficult actions. Capture the tool request and the external system's receipt, including idempotency key, so the review can distinguish “agent said it booked” from “calendar accepted the booking.” During the call, inspect the event ledger as well as the audio. Annotate: Did a caller attempt to speak? Was the interruption meaningful? Did playback stop? Was the interrupted content resumed appropriately? Did the agent ask for missing information? Was a human requested, and did the transfer connect? Did the backend record the intended action once? A fluent voice does not excuse a double booking. A technically correct API response does not excuse talking over the caller. After the call, compare three artifacts: the caller-heard audio, the model's internal conversation, and the business-system state. Differences are often more diagnostic than a single transcript. If the model says it offered two options but the audio shows only the first was played, the system must not treat the second as shared context. If the CRM shows a status change but no receipt links it to a confirmed caller instruction, block that action class until traced. If the human agent receives no context, the handoff may be technically connected but operationally failed. Assign every case an expected label and a set of required observations. Use a confusion matrix for interruption classification: true interruption correctly honored, meaningful interruption missed, non-turn sound correctly ignored, and non-turn sound falsely honored. Keep endpointing errors separate, because finishing a user's turn too early is not identical to cutting off an agent. Report counts with denominators and confidence intervals only when the sample is large and drawn appropriately. For a small design corpus, report raw counts and case IDs. Avoid a percentage such as “95% accurate” from twenty hand-picked tests; it gives a false sense of precision. The release rule is intentionally asymmetric. A high-risk unconfirmed write, a blocked request for a human, or a context mismatch after cancelled audio is a critical failure even if every other case passes. In a low-risk informational workflow, repeated false interruptions may be a user-experience failure that warrants redesign rather than a safety incident. The owner should define both classes in advance. The NIST AI Risk Management Framework https://www.nist.gov/itl/ai-risk-management-framework is voluntary and frames evaluation and use as part of managing risks to people and organizations; it does not prescribe the numerical gate in this article. A suggested classification follows; it is a governance model, not a measured threshold. | Finding | Default release decision | Required evidence to reconsider | |---|---|---| | Wrong or duplicate external write | Block action class | Idempotency and confirmation test pass | | Human request ignored or transfer loops | Block automated path | End-to-end handoff receipt and caller test | | Cancelled audio treated as heard | Block multi-turn action | Playback/context reconciliation trace | | False interruption on noise | Tune and rerun paired corpus | Both false and missed interruption counts | | Long pause mistaken for end of turn | Tune endpointing and accessibility check | Hesitant-speech replay and user review | | Slow but correct low-risk answer | Review service objective | Task completion and abandonment evidence | Notice that the table does not demand zero errors across every possible call. It demands a known failure boundary and an escape path. If the service cannot transfer at night, the agent must state that limitation and provide a callback or alternative contact method; it cannot pretend a human is available. If it is only tested in one language, it should not silently accept unsupported languages. A scope limit that is honest and usable is better than an automation claim that fails under ordinary variation. The following Python 3 program consumes a JSON file of annotated case results. It is intentionally dependency-free and refuses a release when a critical failure is present. It counts classifications and prints the case IDs that need review. It does not listen to audio, infer intent, or certify legal compliance; humans provide the labels after inspecting permitted evidence. This is a worked implementation of the decision rule, not a production monitoring product. python import json import sys from collections import Counter REQUIRED = {"case id", "expected", "observed", "critical", "playback verified"} VALID = {"interruption", "non turn"} def review path : with open path, encoding="utf-8" as stream: cases = json.load stream if not isinstance cases, list or not cases: raise ValueError "Expected a non-empty JSON list of annotated cases" counts = Counter failures = seen = set for case in cases: missing = REQUIRED - case.keys if missing: raise ValueError f"{case.get 'case id', '?' }: missing {sorted missing }" case id = str case "case id" if case id in seen: raise ValueError f"Duplicate case id: {case id}" seen.add case id expected, observed = case "expected" , case "observed" if expected not in VALID or observed not in VALID: raise ValueError f"{case id}: invalid interruption label" counts f"{expected} as {observed}" += 1 if case "critical" is True: failures.append f"{case id}: critical failure" if case "playback verified" is not True: failures.append f"{case id}: playback not verified" if expected = observed: failures.append f"{case id}: {expected} classified as {observed}" print f"cases={len cases } counts={dict counts }" for failure in failures: print "REVIEW", failure print "RELEASE CANDIDATE" if not failures else "HOLD" return 0 if not failures else 2 if name == " main ": sys.exit review sys.argv 1 For example, save this as cases.json : {"case id":"Q1","expected":"interruption","observed":"interruption","critical":false,"playback verified":true}, {"case id":"N1","expected":"non turn","observed":"interruption","critical":false,"playback verified":true} . The checker returns HOLD because N1 is a false interruption. That is an illustrative two-record input, not an experimental result. In a real review, an accessibility specialist may also require a passing handoff path and additional labels beyond the binary distinction. Extend the schema deliberately; do not hide new failure classes under critical=false . The checker is strict on purpose. A missing playback receipt is not automatically evidence of bad audio, but it makes the release claim unverifiable. If the transport cannot provide receipts, replace playback verified with a documented manual listening procedure and mark its limits. A team may choose to release a low-risk pilot with known unknowns under human supervision. It should document that as a controlled exception, not rewrite the test result as a pass. Suppose a cough triggers a false barge-in. The worst recovery is silence followed by a fresh opening: “How may I help you?” The caller hears a broken agent that forgot the task. A safer recovery records the interruption candidate, waits briefly for a meaningful transcript, and, if none arrives, resumes from the last confirmed-played boundary. LiveKit's turn-handling reference https://docs.livekit.io/reference/agents/turn-handling-options/ includes a false-interruption timeout and a resume option for this pattern. The exact timing and resumption behavior need testing against your transport and callers; a default is not an acceptance criterion. Now suppose the caller genuinely says “stop, that is the wrong account.” The system must stop playback, cancel any pending external write, preserve the correction, and avoid resuming the old answer. A false-interruption recovery feature can become harmful if it resumes speech after a meaningful but poorly transcribed short instruction. This is why the test suite pairs coughs with short imperative utterances. The failure modes are coupled. A buyer who tests only the cough has not proven that “stop” still works. Recovery also has to handle network uncertainty. A clear message may be sent, but the service may lose its WebSocket before a mark arrives. Mark the playback state unknown. On reconnection, avoid claiming that the caller heard a sentence unless another receipt proves it. Ask a short confirmation if the missing content affects the next action. Make tool writes idempotent and reconcile their receipts before retrying, because reconnecting a call should not book the same appointment twice. These are implementation recommendations derived from the general event model, not claims that a specific provider automatically solves them. Finally, define a human escape route for persistent misunderstanding. The W3C voice-system guidance https://www.w3.org/TR/coga-voice/ explicitly includes simple error recovery and a human operator when errors persist. A transfer should carry a compact, accurate context: caller goal, confirmed facts, unresolved question, action receipts, and uncertainty. It should not dump an unreviewed transcript with sensitive data into a broad queue. The human should be able to correct the agent's summary before acting. Measure whether the transfer connected and whether the human could continue, not merely whether a transfer API was called. A test corpus built from fast, confident speakers with clean microphones can exclude people who most need a careful interface. W3C notes that memory demands, processing speed, spontaneous speech, and interpretation of spoken prompts vary. A user may need more time to answer, simpler phrasing, a repeat option, or an alternative channel. Longer endpointing delays are not always a “performance regression”; for some tasks they are the difference between being heard and being cut off. The right setting may depend on the step, such as reading a long reference number versus saying yes or no. Do not equate one accent or disability with one setting. Let the user request repetition, slow the speech, or transfer without disclosing a diagnosis. During tests, recruit diverse participants through an ethical process and pay attention to consent, comfort, and recording rules. Report the composition and exclusions of any participant sample before drawing a population conclusion. This article provides no participant data. It proposes test cases because inclusive testing cannot be inferred from a vendor's generic recognition claim. An accessible phone workflow should also avoid forcing voice as the only input when another channel is reasonable. The W3C module discusses visual support and alternatives to heavy memory demands. A contact center might offer DTMF, SMS, a web link, or a callback, depending on user preference and security requirements. These channels can introduce their own risks—wrong-number messages, phishing-like links, or fragmented context—so the owner must validate each. The goal is user control, not a longer menu that traps the caller. Request a demonstration with the twenty-case corpus, not only the vendor's preferred script. Ask for the raw trace format, definitions of the events, and a way to identify which generated audio was actually played. Ask whether the model context is truncated to the heard portion after interruption. If a response is cancelled midway, have the vendor show both the transport buffer and the conversation state. A polished recording without those records cannot prove the state transition. Ask what happens when the caller says “wait” while the agent is speaking, when a second person talks in the background, when the caller pauses for several seconds while reading a number, and when the caller asks for a human twice. Require the vendor to state the supported languages, codec paths, quiet-hour behavior, and handoff staffing. These questions are specific enough to reveal implementation choices. They also expose when an apparently universal product is actually tuned for a narrow, clean environment. Ask about change control. A new STT model, VAD threshold, prompt, voice, telephony provider, or codec can change turn-taking even if the business workflow code is untouched. The team should rerun the fixed corpus after each such change and compare raw counts, critical failures, and case IDs. Preserve the old trace under a release identifier. A model update that improves fluent responses but increases missed “stop” commands should not be approved by averaging the two outcomes into one score. Ask who owns a failed call. Engineering may own detection, operations may own transfers, product may own the task boundary, and privacy may own recording retention. If no one owns the cross-boundary event ledger, failures can bounce between teams without a cause. Assign one incident owner who can reconstruct the path from caller audio to action receipt. That organizational control is part of the product; it is not something a model provider can supply with a prompt. The source guide describes low latency and conversational naturalness as important. That is sensible, but speed is not always the dominant objective. LiveKit's documentation https://docs.livekit.io/agents/logic/turns/tuning/ explicitly treats endpointing, interruptions, and preemptive generation as separate knobs, while W3C https://www.w3.org/TR/coga-voice/ emphasizes processing time and recovery for people who may need longer pauses. These are not mutually exclusive findings; they apply to different failure costs. The release owner must choose a scope where the configuration works and provide escape paths outside it. Community reports about false barge-in are useful for generating cases, not for estimating incidence. One report about traffic noise does not imply that every voice platform fails in traffic. Conversely, the absence of such reports on a vendor page does not prove the issue is solved. The harness should discover failures in the buyer's own transport and workflow. Without that local evidence, this article can offer a method but cannot certify a system. The executable checker is intentionally conservative and simplified. It cannot tell whether an interruption was correct without human annotation; it cannot establish statistical confidence from hand-picked cases; it cannot substitute for accessibility testing with users; and it cannot certify compliance with local recording or outbound-calling rules. It makes release assumptions explicit. In a mature program, pair it with sampled production reviews, incident analysis, and privacy-preserving telemetry, always with scope and denominator stated. Bottom line: The acceptance question is not “Does the agent sound human?” It is “Can we reconstruct what the caller said, what the agent actually played, what action occurred, and how the conversation recovered when turn-taking failed?” If the answer is no, the agent may still be a useful supervised pilot, but it is not ready to own an unsupervised customer workflow.