diff --git a/HANDOFF.md b/HANDOFF.md index 5ab3e18..2a1f341 100644 --- a/HANDOFF.md +++ b/HANDOFF.md @@ -1,26 +1,29 @@ -# HANDOFF — 2026-10-30 (audio dock shipped; needs an eyes/hands pass) +# HANDOFF — 2026-10-30 (scoreboard built to the polling policy; two wiring items left) ## State -- Branch `main`, worktree clean. Ten dock units landed on top of the design conversion; nothing - pushed since `1724922` — this batch is local. -- **The sound bars exist**: `Controls/AudioDock` — master strip on top (nearest the preview), four - bays below (MIC / GAME / TRAX / LIP-SYNC), 148px, auto-collapsing to 36px below a 900px window - height. The dock is now the ONLY audio surface; the preview's mic row, game chip, TRAX button and - sync slider are deleted. -- Faders speak dB (`Helpers/GainDb`, 0 dB = unity). Ladders are measured (`SegmentMeter` + - `MeterScale`), never decorative. The duck badge prints the gain the mixer applied. -- **MONO output** (creator ruling): folds the finished mix to both channels, persisted as - `Audio.MonoOutput`, one click in the master strip. Exists because single-sided audio is inaudible - with profound right-side deafness, not merely unbalanced. -- Deliberately absent: L/R ladders (one ladder + an imbalance flag instead), TRAX scrub/prev-next - (OBS territory), CPU/GPU/NVENC readouts, acrylic. +- Branch `main`. The audio dock is shipped and pushed. **The scoreboard is built** in ten units, + local commits only: tallies (`Models/ScoreboardState`, session-scoped), lifecycle + (`ScoreboardRecorder`: start clears, End freezes), layout (`Models/ScoreboardLayout`: coupled + edges resolved at render time, shrink-then-wrap, never scroll), renderer + (`Services/Compositor/ScoreboardRenderer`: plate + text colour + opacity + 14–24px, cached), + tile selection (`Models/ScoreboardTiles`, opt-in, money per currency), the cached presenter, the + layer itself (`SourceType.Scoreboard`, strip geometry, resolver case), the properties panel + (eight fact switches + colours + plate + size, theme widgets only), the Analytics scope + (`yt-analytics.readonly`, incremental, `HasAnalyticsScope`), and the polling policy + (`Models/ScoreboardCadence`). +- Fixed on the way: the chat feed now reaches the tallies (the recorder had no caller). ## Next action -Nothing queued. **Needs the creator's hands**: launch and judge the dock at the real window size — -bay proportions at 148px, the master strip's ladder/label density, and whether the MONO fold sounds -right through their own ears/headphones (the one thing no test can answer). +1. **HTTP providers** behind the cadence policy: watch hours (`reports.query`, + `metrics=estimatedMinutesWatched`) and subscriber count (`channels.list?mine=true&part=statistics`), + both behind an interface with a fake for tests, plus the timer that calls + `ScoreboardCadence.Due(...)` and writes the values into `ScoreboardTiles`. +2. **Goal-target inputs** in the properties panel (the tiles read `SubscriberGoal`/`WatchHourGoal` + but nothing sets them yet). +3. **On-screen check** of the strip: one line at 24px, plate/opacity, and the edge swap against the + social bar. ## Landmines