`[2026-08-11]` **TTS migrated chatterbox-fast → dots-tts (v0.22.2, `38b78d8`).** Operator-directed after an infra-ops A/B win ("very good"). dots-tts = rednote-hilab `dots.tts-soar` on irv-ml1, replacing chatterbox-fast. `tts.py` stays the single swap seam. **Deltas (everything else — streaming placeholder-header WAV shape, browser Web-Audio PCM decode, POST `/api/tts`, the DEC-5 serialize lock, INV-TTS-1..4 — unchanged):** - **Gateway body OpenAI-shaped:** `{input, voice, response_format:"wav", stream:true}` — `input` not chatterbox's `text`, `response_format` not `format`. Closer to the Zonos-era client. `DOTS_TTS_URL = http://10.100.79.3:8198/v1/audio/speech` replaced `CHATTERBOX_TTS_URL`. - **Sample rate 24000 → 48000 Hz** (browser `SR = 48000` in `index.html`, else ~2× too fast). - **Default voice `glados_25s` → `glados`** (dots voices: donut/glados/emmie/miranda). donut carries over. - **Serialized single-consumer** — dots renders one generation at a time; satisfied by the existing DEC-5 lock, no code change. - **Affect stays dropped** (DEC-7): dots has no emotion knob, same as chatterbox — NOT a fresh loss. Live-verified end-to-end on `:8765` (RIFF/WAVE 48kHz mono s16le through `/api/tts`); 520 tests green. Contract `donut_voiced_interview.contract.md` amended (migration banner + DEC-1/3/8/9a + FN blocks). chatterbox-fast `:8197` kept as rollback, then reclaimed by infra-ops once operator ear-confirmed. Superseded next day by config-driven voices (see [[2026-08-12-config-voices-two-voice]]).