Home/Writing/Full-duplex turn-taking

Both sides can talk at once now. What is your voice test suite still measuring?

Full-duplex voice lets the caller and the agent hold the floor at once: interrupt mid-word, drop a backchannel, keep going. That is a better conversation, and the moment most voice test suites stop meaning anything. A transcript flattens two overlapping voices into one column of words and throws away the timing that now decides whether a call feels human or ships a wrong action.

The builders living this are already asking for the missing layer in public. A LiveKit community thread on 2026-07-09 asks, plainly, how teams profile per-turn latency: user-stop through playback, every tool call in between, p50 and p95 across runs (community.livekit.io, thread 1584). A separate report describes instrumenting ASR, LLM, and TTS, watching the core services total under one second, and still hearing a three to four second gap before the agent speaks (community.livekit.io, thread 1277). The seconds that decide the call live between the words, and the words are all a transcript keeps.

When both sides can speak at once, the failures stop being about wording and start being about timing and floor control:

  • One HN comment describes a bug where a barged-in appointment confirmation still triggered the downstream booking pipeline: the caller cut in to stop it, and the booking went through anyway (news.ycombinator.com item 47230233).
  • One production report estimates an agent interrupting itself through its own echo in about ten percent of calls, where turning the sensitivity down risks the agent no longer yielding to the caller at all (Retell community, thread 2864).

None of that is scorable from text, and none of it is cosmetic. One developer ties 1,242 calls with zero conversions directly to three to four second response latency and needs sub-second behavior to recover the funnel (Retell community, thread 1046). Another links a three second initial silence to prospects hanging up before the agent ever speaks (Retell community, thread 1022). The turn-taking is the product surface, and right now it is the untested one.

Hotato measures that surface. Give it a two-channel recording, one party per channel, and it scores the timing physics directly from the audio: talk-over duration, how fast the agent yields when the caller takes the floor, and whether a backchannel was correctly held through instead of treated as an interruption (the atlas carries that one as voice-activity detection treating a backchannel as a floor claim). Timing between two voices is measurable only when they arrive on separate channels, so a mono or mixed export is marked NOT SCORABLE and refused rather than guessed at. That is the boundary of the measurement, and it is the one full-duplex makes unavoidable: you cannot measure who held the floor from a single mixed track.

A person labels each candidate moment as a yield the agent should have made or a hold it was right to keep. That labeled moment locks into a content-addressed contract that returns the same exit code on every machine, so a talk-over you catch once re-measures under the pinned policy on every pull request.

If full-duplex just changed what your agent can do, it also changed what your tests need to see. Point it at one call:

bash
hotato autopsy ./call.wav

Repo: github.com/attenlabs/hotato