W3 T1 Set list: proof (2026-10-11)
Worktree ~/trc-lighting/wt-setlist, branch w3-setlist, base 562d9a1. Dry run tools/mac-dryrun.sh 7088 ~/trc-lighting/wt-setlist. /api/dmx/nodes never called.
Raw output: proof-w3-setlist/run-final.json (script proof-w3-setlist/prove.py 7088).
Three-step GO (one id in live[] per step, fade seen in frame bytes from /api/dmx/state)
| Step | Fade | live[] | Channel tracked | From > to | Distinct frame values | Reached at | Channels changed |
|---|---|---|---|---|---|---|---|
| VERSE | 2 s | [701] | 2201 PAR DS 1 Dimmer | 0 > 115 | 41 | 2006 ms | 127 |
| ANTHEM | 1 s | [703] | 6101 BLINDER 1 Dimmer | 0 > 217 | 22 | 1039 ms | 114 |
| DEEP | snap | [710] | 6101 BLINDER 1 Dimmer | 217 > 0 | 1 | 5 ms | 121 |
GO during a running timeline
boston running before GO: true. After GO: false, live [701].
Auto-follow at 120 BPM, 4 beats
| Measure | Value |
|---|---|
| followMs | 2000 |
| autoAt minus at | 2000 ms |
| Server step 0 > 1 | 2001 ms |
| Observed GO > index 1 | 2005 ms |
| Seconds follow 1.5 s, step 1 > 2 | 1501 ms |
/api/status carries setlist (index 2 at the end).
Transport
Back > index 1. Jump n=2 > index 2. GO at the end > end:true. Stop > id null.
Headless renders (bundled Chromium, scratch pages, deleted before commit)
| Surface | Size | Targets under 44 px | Page scroll | Console errors |
|---|---|---|---|---|
| Screen 2 Set list tab | 1920x1080 | 0 | none | 0 |
| Desk strip (434x44 beside the timeline row) | 1536x864 | 0 | none | 0 |
| Phone | 390x844 | 0 | none | 0 |
| Phone | 844x390 | 0 | none | 0 |
G and Shift+G stepped forward and back on desk screens. Drag reorder proven, then restored.
Shots: ../v2-shots/w3-setlist-1.png, w3-setlist-2-follow.png, w3-setlist-desk.png, w3-setlist-phone-390x844.png, w3-setlist-phone-844x390.png.
Regression
tools/regress-v2.sh 7088: GREEN, 14 passed.
Build
dotnet build LightDesk.csproj -c Release: 0 warnings, 0 errors.
Deviations and findings
- status.setlist is added by a middleware on HTTP GET /api/status only. The 1 Hz SSE status tick does not carry it; the UI listens to SSE
setlist. Cleaner at merge: addsetlist = Setlists.View(),to the status object in Program.cs (the middleware skips when present). - Jump n is 0-based.
- Beam and timeline steps ignore fade and act like their own taps. A beam plays over the current mood, not solo.
- A missing data/setlists.json seeds the Friday night example, so lightdesk-next gets it without a data copy.
- The module opens its own EventSource, because api.js SSE_EVENTS lacks
setlist. - Finding for T2: the rig model
dimdoes not show fade-in, only fade-down. Frame bytes do. - On the merged head, screen 1's bottom rail may crowd beside the tempo strip.