# HANDOFF — 2026-11-05 (alert stack + media/chroma fixes) ## State - `main`. TASK 21 (video layer + soundtrack), TASK 64 (green/blue screen) and TASK 32·4 (fragmented MP4) are complete; TASK 49 is retired (YouTube owns chat moderation — we just don't paint tombstones). - **Left panel alert stack** shipped: Steam licence indicator pinned at row 1 (`Entitlement 30 fps · Maximum 60 fps`, pin → close once owned, permanent while owned), event rows LIFO beneath, click → About or the Logs tab with that event's lines painted. Detail: `docs/ai/ui-surface.md`. - Video layer fixes this session: the preview-pane trigger whitelist (a video layer was invisible), a quadratic frame copy that capped 1080p playback at 2 fps, and deadline pacing for video *and* audio. - Tests: 575 green, 1m50s; `FAST=1 ./scripts/verify.sh` = 527 in ~62s. ## Next action - **32·1 + 32·2 shipped**: blip retry (immediate/+1/+2/+3 s), and the RECONNECTING sign driven by the status poll (4 s cadence while recovering) with **measured** elapsed/attempt only — the countdown was dropped after the creator pointed out YouTube's cutoff depends on variables we cannot see. The `chatEndedEvent` in the chat feed now prompts an immediate status check. - Next: 32·5 (ingest pre-flight), then 32·2/32·3 (countdown + Back on air) which need YOUR measurement take: pull the network on a private stream and time how long YouTube holds the broadcast. - Open loop: `32·4` is proven by construction only — kill ffmpeg mid-recording and play the file. - Do not push absent a checkpoint request. ## Landmines - **The preview pane draws frame-source layers from a whitelist of DataTriggers.** A layer type with no trigger is invisible in the preview while its decode looks healthy (alert box 2026-09-26, scoreboard, video layer 2026-11-05). Add the trigger with the layer type; pin it with `MediaPreviewDisplayTests`. - Nothing in the suite drives the real cursor any more; the drag arithmetic is pure (`DragReorderMathTests`). - Integration tests constructing `MainWindow` must set a temporary `LayoutPathOverride` and clear it in `finally`. - Media sessions are keyed by **path + look** (`MainViewModel.MediaSessionKey`); never acquire by raw path. - Bundled FFmpeg stays outside the single-file exe (`ExcludeFromSingleFile="true"`).