# Commentary Latency

V2 AI commentary has an indicative 800 ms budget from KO trigger to playable
commentary audio. The budget is enforced outside rollback and is split across
the asynchronous presentation pipeline:

| Component                                         |     Budget |
| ------------------------------------------------- | ---------: |
| Iris LLM round trip                               |     420 ms |
| Calliope persona TTS render through `@iris/voice` |     240 ms |
| Psyche lipsync and expression render              |     100 ms |
| Safety margin                                     |      40 ms |
| **Total from KO trigger**                         | **800 ms** |

`@v2/iris-commentary-orchestration` passes only the reserved 420 ms LLM
round-trip budget to `@iris/conversation-orchestration`. If the Iris call misses
that reserved window, or if any downstream presentation stage would exceed the
800 ms envelope, the commentary path falls back to a pre-recorded
`@calliope/persona-live` bank line.

Fallback selection is deterministic and keyed by
`(cueKind,ruleset,commentatorId,seed)`. The seed is supplied by V2 from the cue
context, not by rollback simulation, and the selected line remains
audio/subtitle-only. Live generated output is still recorded by
`(matchId,cueId,cueTriggerFrame,branchId)` for replay parity; the fallback key
only chooses the deterministic pre-recorded line when the latency budget misses.

This target is expected to be measured during alpha playtest against actual LLM
round-trip, persona TTS render, and lipsync render timings. Until measured data
is available, the constants above are the release-gate contract for KO-trigger
commentary.
