Every release, on the record.
The seven most recent, newest first, each mapped to a tagged release on GitHub.
- 1.20.0current release
- 56dated releases
- MITlicense
The last seven releases.
Each release bundles what shipped that day. Dates come from the CHANGELOG, and a release-guard test blocks a version bump unless the entry and the git tag line up.
-
1.20.0
2026-08-03Current- Overlap that never happened is no longer reported. The energy detector keeps a channel marked active for a moment after its energy drops. Between two words that bridges a gap, which is what it is for; after the last word it reports silence as speech, and the other party's onset lands inside it. So when the agent stopped and the caller began a fraction of a second later, the tool reported exactly that much talk-over. Boundary measurements now read a track whose runs end at their last frame of measured energy. Across the 177 bundled two-channel clips this removes 25.7s of reported talk-over — 17.9% of the total, and 45.3% on the AMI real-audio subset — while every clip built around a genuine barge-in still reports one.
- The gap before the agent answered was understated by exactly one pad.
response_gapwas measured from a caller turn-end detected that much late, andpremature_startwas fabricated at fast turn-taking for the same reason. Measured at the frame index across every clip where both derive, the caller's turn end moves earlier by one pad and the agent's response onset does not move at all. Presence signals are untouched: caller onset, input health, burst counts and which candidates a scan finds are byte-identical across all 338 bundled recordings. - A manifest pinned before this release is flagged, not silently rescored.
recomputerebuilt a pinned config by giving any key the manifest omitted today's default, so an older pin came back looking like it still held. Divergence is computed on that path now, which is the production default. Bench rows from either side of this release are not comparable and no longer claim to be:BENCH_VERSIONmoves 0.1 → 0.2 and the engine identity 0.1.0 → 0.2.0. SetVADParams(trim_tail_to_raw=False)to reproduce the earlier numbers.
-
1.19.1
2026-07-31hotato checkis the front door.autopsysignals that something died, and developers do not autopsy their code — they check it. The first line of--helpteacheshotato check ./call.wavnow. It is a second spelling, not a second command: both resolve to one parser, one exit-code table and one help line, so every existing script keeps working andautopsystays canonical.- A single-channel recording no longer overstates talk-over. The diarized mono path masked the audio by each speaker's frames and re-ran the energy detector over the result, inflating sub-second talk-over by 0.1–0.36s and sometimes bridging a backchannel gap. The spike that found it used a perfect diarizer, so better speaker labels could not have removed it — the error was in the re-read. Both terms of it are deterministic, so the path inverts them and hands the timeline to the scorer unchanged.
- The docs answer the mixed-recording question. “I only have a mono file” was the likeliest reason to stop reading, and no surface answered it while the tool had always accepted one. A recording of any shape is accepted, with the boundary attached: a mixed channel measures silence timing and says so; barge-in and talk-over need the parties on separate channels.
-
1.18.1
2026-07-29- A slow-starting event loop no longer refuses the LiveKit connect. The driver set its ready flag from the thread body, before
run_forever(), so a thread scheduled late releasedconnect()against a loop that was not running and the submit path refused it outright. Readiness is signalled withloop.call_soon()now, which cannot fire until the loop is actually running, so a slow start costs latency instead of an error.
- A slow-starting event loop no longer refuses the LiveKit connect. The driver set its ready flag from the thread body, before
-
1.18.0
2026-07-29- Every artifact hotato writes uses one palette. The report, the shareable card, the failure record, the counterexample card, the gauntlet badge, the load-test page, the suite report and the served console each carried their own colours — five copies of one theme, plus a renderer shipping browser defaults. They all read one palette now, and every text pair in it clears 4.5:1, which two did not before.
- The copy answers to a first read. Every user-facing line was read cold by someone who had never seen hotato and rewritten where it assumed context the reader does not have. The banner, social preview, README screenshot and sample reports were re-rendered from their own generators, so what a visitor sees on GitHub and PyPI is what the tool produces today.
-
1.17.1
2026-07-28- The Twilio setup steps name the two forms that record two channels. Twilio's
<Record>verb writes a single mixed channel, so a setup that followed the old line produced a mono file the two-channel fetch then rejected. The steps now name<Dial record="record-from-answer-dual">and the RESTRecordingChannels=dual, and every per-stack adapter row was re-checked against that vendor's published API on 2026-07-28. --sincereturns the whole window it names on Twilio. The recordings lister sent a filter Twilio does not document and therefore ignored, so a busy week came back as one page of the newest recordings. It sends Twilio's documentedDateCreated>filter now, so--since 7dcovers seven days.
- The Twilio setup steps name the two forms that record two channels. Twilio's
-
1.17.0
2026-07-28hotato lab: the everyday commands up front, the deep toolkit one level down. Top-level--helplists only the commands a normal run needs; capture, simulation, load, benchmarking, the fix ladder and the fleet control plane moved underhotato lab <cmd>, each with a one-line description inhotato lab --help. Every pre-1.17 top-level spelling keeps working unchanged.pip install 'hotato[mcp]'resolves the SDK the server calls. The extra was pinnedmcp>=1.2.0with no ceiling, so a fresh install pulled mcp 2.0.0, which dropsmcp.server.fastmcp;hotato-mcpthen reported the SDK missing while it sat installed. The extra readsmcp>=1.2.0,<2now, the range whose API the server uses.- The four-tier evidence policy, written down once.
docs/EVIDENCE-CONTRACT.mdholds it: tier 1, caller and agent on separate channels, is the only tier a verdict may stand on; tier 2, one mixed channel plus provider metadata, names the source behind each finding; tier 3, raw mixed audio, detects symptoms with a measured confidence; tier 4 is refused with the reason and the next step. The README, the autopsy docs and the docs index link to it instead of restating it.
-
1.16.0
2026-07-24hotato vapi|retell|bland|synthflow|millis health: an API key to a report on every recent call, one command. Lists your recent calls on the platform, downloads each recording, checks every one, and prints the report led by the Voice Stability Score. You never touch a WAV; the analysis runs on this machine.- Voice Stability Score: the share of two-channel calls with no critical incident. Folder and platform reports lead with it and print the formula, how many calls qualified, and a digest of the settings that produced it. Calls analyzed from one mixed channel report in their own best-effort block. No weights, no blended composite.
- Every count says what it was measured over. Each report lists the evidence the run had, and each incident kind carries a measured recurrence state (observed, RECURRING, ELEVATED) read from the stored envelopes, the one JSON record each checked call leaves behind.
Every release, entry for entry, lives with the source: CHANGELOG.md on GitHub →
Read the log. Then run it.
Local call forensics and regression guards for AI agents, MIT-licensed. One recording starts it.
$ hotato autopsy ./call.wav
Read the docs, or browse the source. Get started → · GitHub →