W1 lane D proof: rig and harness, 2026-10-11
Branch w1-harness in worktree ~/trc-lighting/wt-harness, cut from two-screen 4dbe8af. Commit 0248d89, five files, nothing pushed.
Dry runs used: 7084 (head) and 7085 (broken copy). Both stopped. No call to /api/dmx/nodes or /api/dmx/output.
Files
| File | What |
|---|---|
tools/mac-dryrun.sh |
<port> [worktree] builds when the dll is missing or older than any .cs/.csproj, starts the dry run, waits for /api/status, refuses unless dryRun=true and dmx.running=false, prints the pid. stop <port> kills that pid only after checking its args. status <port>. Refuses 7070. Pid and log in <worktree>/tools/tmp/ (gitignored). |
tools/regress-v2.sh |
<port\|host:port>; full run refused unless the server is a dry run. --read-only (GETs only) and --read-only --live-anthem (one ANTHEM recall, one undo) for 7070. |
tools/tutorial-capture.mjs |
steps.json to GIF (<10 s, two-pass ffmpeg palette, sped up to fit rather than cut) plus stills at 1536x864, 1920x1080, 390x844, 844x390. Headless bundled Chromium, --mute-audio. |
wwwroot/help/index.html |
Skeleton on v2/tokens.css, left rail with the 11 chapters of PLAN section 6, each chapter with empty gif, stills, keys, proof slots. |
wwwroot/help/steps/ch04-tap-a-mood.json |
The sample steps file. |
Regress checks (14)
status, pick, aim, stack, mood-solo, hit, blackout, undo, timeline, userscene, page /desk.html, page /screen2.html, page phone, page /help/.
- pick: POST
/api/ui/selection[1201,1202]; GET returns it,bymatches, version rises,/api/status.selection.bymatches. - aim: two
/api/aimtaps for SPOTS (u 0.25 then 0.75); spot 1101 pan changes in/api/dmx/stateand its Pan channel changes in/api/dmx/frame. - stack: scene 701 on, scene 703 on; rig and engine
live= [701,703]. - mood-solo: POST
/api/look {id:703, off:[701]}; rig and enginelive= [703]; fixtures lit in the frame > 0. - hit:
selflashpressed on 2101, 2102 reads dim 1; after release every fixture's dim equals the ANTHEM snapshot. - blackout: no fixture lit in the frame (a fixture counts as lit when its Dimmer channel is above 0 and it has no emitter channels or one above 0), no engine dim above 0,
live[]. - undo: top ring label is
blackout; POST/api/undogives live [703] and every dim equal to the snapshot. - timeline:
openerplays (running, position > 0.3 s), POST/api/undois refused 409 while it runs, stop gives running false. - userscene: save, blackout, recall gives live [703] with every dim equal, then DELETE and it is gone.
- pages:
/phone.htmlwhen the build has it, else the legacy/index.html(noted in the line)./help/is SKIP on builds without it.
Green on head (7084)
harness-proof/regress-green-head-7084.log: GREEN, 14 passed, exit 0.
Red on a broken copy (7085)
Throwaway detached worktree from 4dbe8af, one deliberate break in Program.cs (/api/hit/release no longer sends the restore lines), diff in harness-proof/deliberate-break.diff. Never committed; the worktree was removed.
harness-proof/regress-red-broken-7085.log: FAIL hit (held dims [1,1], restored=no), FAIL undo (the undo put back a stage that still carried the stuck hit), RED: 2 failed: hit undo, exit 1.
Sample GIF: tap a mood
harness-proof/tap-a-mood/ch04-tap-a-mood.gif: 5.75 s, 960 px wide, 12 fps, 1.0 MB. Stills ch04-tap-a-mood@1536x864.png, @1920x1080, @390x844, @844x390, plus ch04-tap-a-mood-anthem-live.png. After the run /api/rig/state live = [703]. At 390x844 the desk has no mood strip, so the two tile steps were logged as warnings; chapter files for the phone should point at the phone page.
/help/ served by the desk
/help/ 200, /help 301 to /help/, /help/index.html 200, /help/steps/ch04-tap-a-mood.json 200. UseDefaultFiles + UseStaticFiles already serve subfolders: no Program.cs change needed.
Headless shots harness-proof/help-skeleton@1536x864.png and @390x844.png: no horizontal page scroll, no console errors, fonts Barlow 400-700 and Barlow Condensed 700 loaded, no link under 44 px.
Findings for other lanes
- Blinders 6101 and 6107 (
Audience Blinder 2x100W, 8 ch mode) keep channel 1Dimmerat 255 after a blackout with both lamp channels (WW/CW) at 0. The light is dark, but a harness that reads "Dimmer = 0" would call it lit. Enginedimis null for them. /api/dmx/frameanswers 404 "no frame yet" on a fresh dry run until something calls/api/dmx/state(which renders a frame). The harness reads state first.- A dry run rewrites
data/user-scenes.json(PowerShell JSON layout to .NET layout) on any save or delete.mac-dryrun.sh stopprints the reset command; never commit it. - In one probe run (look VERSE, look ANTHEM, hit selflash press and release, blackout) the undo ring listed only blackout, ANTHEM and VERSE: the hit press did not appear, although V2-API.md lists hit press as a step. Worth a check by the server lane.