What was said, without scoring how it was said.
Four deterministic checks read the words — phrase, PII, entity accuracy, latency — and the transcript stays opt-in context, never a graded artifact.
# transcript artifact: the matched value is never stored turn 6 caller: my card is [redacted] turn 7 agent : thanks, I have [redacted] on file pii_hits: - detector: card_luhn turn: 6 role: caller value: [redacted] # never echoed
Four checks on the words. Every one deterministic.
Regex, a checksum, or a lookup against the timing envelope — no model, byte-stable on a fixed version.
A pattern is present, or absent.
A regex match against one role, at a first / last / any position — or confirmed absent.
A value that must never leak.
Four detectors sweep in must_not_leak mode. A hit fails the check without ever echoing the value.
The right name, number, ID.
The captured entities match your reference, exactly — a lookup, not a judgment call.
The reply landed in time.
A tool or turn answered inside its millisecond budget, read from the timing envelope — no transcript, no model.
The transcript is context you turn on.
Point Hotato at a transcript you have, or produce one with --transcribe (faster-whisper, local, the [transcribe] extra) on run, assert run, or test run.
Four detectors — ssn, card_luhn (Luhn checksum), email, phone — sweep whatever transcript arrives. A hit is a FAIL: which detector, which turn, which role, and a [REDACTED] line. The matched digits enter no result, log, or report.
$ hotato assert run --stereo call.wav --assertions assertions.yaml --transcribeSpeech checks what was said. Outcome checks whether the task happened; Timing checks whether it listened. Privacy posture →
version: 1 assertions: - id: disclosure # transcript-derived kind: phrase regex: "recorded for quality" role: agent position: first - id: no-value-leak kind: pii detectors: [ssn, card_luhn, email, phone] mode: must_not_leak
Check the words. Never the value.
Four deterministic speech checks and a redacted transcript, in one command.
$ uvx hotato start --demo
One recording is enough to start. Get started →