docs(handoff): scoreboard units 1-10 landed; providers + goal inputs remain

This commit is contained in:
2026-10-30 14:43:26 -07:00
parent b205ce9ba9
commit d4a4b1c80e
+20 -17
View File
@@ -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