- Viewer accessibility: 5 tests (aria-labels, aria-expanded, label association, alert role) - Viewer responsive: 3 tests (chat-collapsed, CSS grid, now-playing aria-live) - Admin accessibility: 3 tests (nav aria-label, aria-current, focusability) - Admin responsive: 2 tests (tab visibility, essential tabs) - Coverage: vitest v8 provider, 40% stmt/lines, 30% branches/funcs - CI: test:coverage step between lint and build - Total: 44 frontend tests (31 + 13 new) - Updated TODO.md (Phase 2+3 done), DONE.md, MEMORY.md
- Added run ID + unique segment naming (r-{ISOTIME}/seg-{seq}.m4s) - Added fsnotify watcher for real-time R2 segment upload (~7s) - Added atomic manifest publication (temp key → CopyObject) - Fixed manifest Cache-Control: public, max-age=1, s-maxage=2, must-revalidate - Added hls.js error recovery: bounded retries (5x), exponential backoff, reconnecting UI - Enriched /health endpoint: run_id, active_item, last_segment_seq, last_r2_pub, consecutive_failures, unhealthy detection - Updated tests: HealthHandler (new fields + unhealthy), player error recovery test - Updated TODO.md, BACKLOG.md, DONE.md, MEMORY.md