Keep the raw audio file part alongside the transcribed text when true;
drop it (text-only) when false. Judge passes its multimodal knob here; the
user-simulator passes true so stripAudioContent's echo-safety reframing
(which keys on a message having BOTH audio and text) still triggers.
OptionallogWarning sink — defaults to console.warn.
Conversation history to transcribe over.
Per-run STT provider (from the resolved cfg.voice.stt).
OptionaltranscriptOptional cross-call transcript cache keyed by a STABLE audio key (the raw audio payload). Prevents re-transcribing the SAME audio on every call.
The judge builds a transcript once per verdict and passes no cache. The
user-simulator's STT fallback, by contrast, re-runs over the WHOLE history
on EVERY proceed() turn: without a cache, an audio-only agent turn that
stays in history is transcribed on turn N, again on N+1, N+2, … turning a
single dropped agent_response into O(turns^2) STT calls (#735 P2). The
simulator passes a per-instance Map so each distinct audio chunk hits the
provider at most once for the life of the simulator instance.
Arguments for the shared transcribeAudioMessages STT pre-pass.