Turn-taking, timed to the millisecond.
Three signals, re-derivable by hand from two audio channels, with no model in the path.
Each channel already belongs to one party, so timing needs no words. From two lanes of energy, Hotato reads exactly three numbers, and you can check every one with a ruler on the waveform.
- did_yield
- bool: did the agent stop once the caller started?
- seconds_to_yield
- how long from the caller’s onset to the agent’s stop.
- talk_over_sec
- how long both channels carried energy at once.
$ hotato run --stereo call.wav --onset 12.4 --expect yieldEnergy is not intent.
The scorer measures when each side spoke and for how long. It flags a candidate moment; you decide whether it was an interruption, a backchannel, or a clean handoff.
Timing is read from energy over time, one lane per party: which channel was live, and when. It measures the clock of the exchange, not the speakers, the words, or the feelings behind them, so every number stays re-derivable from the waveform alone. It identifies no speakers either: each channel already belongs to one party, and a transcript stays opt-in context for the phrase and PII checks elsewhere, never itself scored here.
A flagged moment starts as a question. It becomes a trustworthy finding only by climbing: from a candidate you label, to a shareable card with the two channels and the overlap window in milliseconds, to a result that reproduces outside your environment, on a pinned build. See the five-stage ladder →
Measure the yield, not the intent.
Three timing signals from two audio channels, re-derivable by hand, in one command.
$ uvx hotato start --demo
One recording is enough to start. Get started → · external proof →