Skip to content

feat: hotato autopsy — zero-config forensics on any call recording#45

Merged
quantumCF merged 1 commit into
mainfrom
autopsy/front-door
Jul 23, 2026
Merged

feat: hotato autopsy — zero-config forensics on any call recording#45
quantumCF merged 1 commit into
mainfrom
autopsy/front-door

Conversation

@quantumCF

Copy link
Copy Markdown
Contributor

PR-A of the activation pivot: the front door becomes forensics. Bring a recording you already have; incidents in seconds; testing becomes the graduation path.

  • hotato autopsy <recording> — zero config. Stereo runs the existing deterministic scan path unchanged and emits [CRITICAL]/[WARNING] incident blocks (BARGE-IN, TALK-OVER, DEAD AIR, LATENCY SPIKE, ECHO SUSPECTED) with timestamps, measured magnitudes, and the plain-English sentence. Critical bars reuse the same ceilings investigate label pins.
  • Mono is best-effort and says so: energy-VAD silence timing with a measured confidence per finding (dB margin below the recording's own VAD threshold, derivation printed beside the number) and a one-line functional scope; mono can never emit BARGE-IN/TALK-OVER by construction; pure silence yields zero incidents. The mono refusal of run/scan/trust/contracts is untouched.
  • One self-contained HTML report — waveform + incident markers + per-incident cards, zero scripts, zero external refs — at a content-addressed path (hotato-output/autopsy-apx-<12hex>.html), byte-identical on re-run with no SOURCE_DATE_EPOCH needed.
  • Content-derived ids: apx-<sha256[:12]> of the input bytes, incidents addressed <id>#<rank> — the shape a future hotato pin resolves without re-running.
  • est. cost renders only with --cost-config (operator figures, validated fail-closed); no config = zero dollar figures anywhere.
  • Three rendered example calls (house seeded renderer, regenerate-on-absence) demonstrating barge-in-say-do, latency-dead-air, and talk-over; no-args prints usage + the quick start on the bundled example. sdist ships scenarios, never the WAVs.
  • 17 new tests; docs/AUTOPSY.md indexed everywhere; CHANGELOG additive; llms-full regenerated.

Adversarially verified in an isolated venv (pass on all 9 checks): the 10-second test measured at 0.23s from a clean shell; two-run byte-identity on CLI text and HTML; mono-honesty incl. the no-fabrication silence probe; cost-guardrail greps on both surfaces; examples grep-verified as described rendered examples; investigate/trust behavior unchanged; full suite green.

Spec: hotato-growth/research/AUTOPSY-FIRST-SPEC-2026-07-23.md

https://claude.ai/code/session_015njkxtoAKioqTPT2k14xFr

@github-actions

Copy link
Copy Markdown

hotato turn-taking eval

8 of 8 scenarios pass. 0 fail. No regression.

scenario expect yielded time to yield talk over result
01-hard-interruption yield yes 0.50s 0.50s pass
02-backchannel-mhm hold no - 1.57s pass
03-filler-start yield yes 0.65s 0.56s pass
04-correction yield yes 0.50s 0.50s pass
05-telephony-8khz yield yes 0.50s 0.50s pass
06-double-talk yield yes 1.05s 1.05s pass
07-echo-bleed hold no - 3.00s pass
08-rapid-turn-taking yield yes 0.50s 0.50s pass

Regressions

None.

Reproducible timing measured locally from call audio. Swap the bundled self-test step for your own captured recordings to gate on your agent. github.com/attenlabs/hotato

Drop one call recording in, get the incident list out: BARGE-IN, TALK-OVER,
DEAD AIR, LATENCY SPIKE, each with a timestamp, measured magnitudes, and the
scanner's plain-English sentence, plus ONE self-contained HTML report
(waveform + incident markers + per-incident cards) at a content-addressed
path under hotato-output/.

- stereo = the existing deterministic scan path unchanged: byte-identical
  CLI text and report bytes on every run, content-addressed report name
- mono = best-effort silence timing with a measured confidence per finding
  (energy margin below the VAD threshold) and the one-line functional scope;
  run/scan/trust/contracts keep refusing mono
- WAV native; mp3/m4a via ffmpeg when on PATH (one-line actionable message
  otherwise); unreadable input refused with reason (exit 2)
- autopsy id = apx- + 12 hex of sha256(file bytes); incidents <id>#<rank>,
  printed on the pin: line
- est. cost only with --cost-config (operator figures; no default dollars)
- no args = usage + quick start on the bundled example
- examples/autopsy/: three deterministic rendered example calls (seeded
  renderer), one per pattern; conftest regenerates when absent
- docs/AUTOPSY.md + indexes (LIFECYCLE, docs/README, llms.txt), llms-full
  regenerated; CHANGELOG Unreleased entry
@quantumCF
quantumCF force-pushed the autopsy/front-door branch from 7f0a08f to 9d2050e Compare July 23, 2026 23:15
@quantumCF
quantumCF merged commit 8bb6b1c into main Jul 23, 2026
15 checks passed
@quantumCF
quantumCF deleted the autopsy/front-door branch July 23, 2026 23:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant