Send live segments without waiting for captions; record them synced master
Holding each segment for SP_CAPTIONS_MASTER_DELAY traded latency for caption timing: 7 s gave well-placed captions but 7 s of delay, while the 1.5 s default put most words in later segments. Live and recorded segments now get separate layouts. - Live: the signer no longer waits for speech recognition, only (at most 0.5 s) for the ingest caption tap. Late words keep playing in order from the next GoP, as before. - Recorded: an archive pass in the caption master lays each signed GoP out again once recognition covers it, bounded by SP_CAPTIONS_MASTER_DELAY (now 10 s, recording-only). When that layout differs from the live one it signs fresh text runs with the streamer's key (muxl SignTextRuns, same span and dc:date). The director swaps them into the completed segment before the S3 upload; audio, video and the node's AAC run stay byte-identical. S3 operations keep arrival order while copies wait in parallel. - Isolated workers sign their archive runs and send them to main as Captions frames before End, so resumed workers need no key in main. In-process, the archive rides the ingest context, so segments validated after the signer returns still find it. - Entries are keyed by the GoP's media-timeline start: after a stall, re-anchored GoPs can share a signed start millisecond. - A real-speech run (2 minutes, real time, bundled models) placed 54/54 phrases in the GoP where they were spoken, once three fixes it prompted were in: on-time cues no longer queue behind a late one in the archive; recognition coverage stops short of the window's last 2 s unless the speaker paused; and a cue timed at its predecessor's start follows it instead of erasing it. - Audio completion inserts its AAC run in ascending track-ID order instead of after any text runs; the VOD indexer rejects that order. - Every declared text track now appears in every GoP, so a recorded copy never drops one.