LightDesk overnight plan, 2026-10-11, 01:00 to 09:00 Pacific
Fable planner output. The Opus conductor executes this verbatim.
Grounding: AUDIT.md (18 gaps), VERDICT.md, V2-API.md, PC-DEPLOY.md, repo CLAUDE.md, wwwroot/v2/README.md, the memory file project_lightdesk_v2_two_screen_2026_10_10.md, grep of desk.js / screen2.js / Dmx/Engine.cs / Program.cs, data/hits.json, shots v2-shots/desk-polish-1.png and screen2-linear-1.png. The Mac dry run on 7075 answers /api/dmx/frame with real values while dmx.running=false, so wire proof works on the Mac with zero output.
0. Named gaps in the brief
- Ship authority tonight. Repo CLAUDE.md:
shipdarkens the stage and "needs Greg's word that the room is free, every time". Greg's 01:00 words "building the entire thing on the lighting computer ... the lights themselves are off" are read as that word for tonight, limited to at most three restarts of 7070, each only when/api/status show.running=falseand/api/status.selection.byhas not changed to an id that is not ours in the last 10 minutes. Interpretation, moderate confidence. Tripwire in section 4. - Camera-safe key floor.
Program.cs:1766-1805clamps KEY to a floor of 25 when camera-safe is on. Greg 23:57: "Don't use the key light almost at all." Ruling: the new inhibit cap applies after the clamp and wins. If camera-safe is ON on 7070 (GET /api/safety), record it in tutorial chapter 7; do not silently change it. - 4d7b9bc follow-up fix. Wave 1 worktrees are cut only after it lands; the conductor confirms
git log -1first. - Unanswered push question. "Push to the unstable branch or the stable branch?" stays unanswered; nothing reaches GitHub. The results page repeats the question.
1. Mechanics for every wave
- Branch and isolation. One branch
two-screenin~/trc-lighting/unstable, local only. Each lane works in its own worktree~/trc-lighting/wt-<lane>cut from the current head, commits only its owned files, never rebases others. The conductor merges in the stated order, rebasing the lane branch onto head thengit merge --ff-only. A conflict means an ownership breach; the merge is refused and the lane redoes it on its own files. - Proof harness (built in W1 lane D).
tools/regress-v2.sh <port>against a Mac dry run asserts on/api/dmx/frame,/api/dmx/state,/api/rig/state live[],/api/undo: pick via/api/ui/selection; aim via/api/aim; mood solo (live[] has exactly one id); stack; hit press and release restores dims; blackout zeros every dimmer; undo restores; timeline play and stop; user scene save and recall; phone page returns 200. Green before every merge and before every PC ship. - Dry runs on the Mac. Each lane runs its own
LightDesk --dry-run --ui-standalone --port 708N --camera-from audit-2026-10-10/.camera-scratchfrom its worktree (7081 to 7088). Integration head runs on 7075. Nothing calls/api/dmx/nodesor sets output targets. - Headless only. Screenshots at 1536x864 (screen 1), 1920x1080 (screen 2), 390x844 and 844x390 (phone) in bundled Chromium. Nothing opens in Greg's Chrome until the results page at done.
- PC transport.
pc-push-file.shcarries agit bundleof new commits (3000-char chunks);pc-run.shscripts under 6 KB; one job at a time;FLEET_GREG_OKset to Greg's 01:00 words verbatim. Build inC:\Users\Tiny Room\lightdesk-v2(dotnet build LightDesk.csproj -c Release -p:UseSharedCompilation=false), prove on the 7075 preview, then ship intolightdesk-nextthe waygo-live.ps1did (ship -NoBuild, wait for streaming, reopen both windows withtwo-screen.ps1). Before ship 1 take a fresh copy of the livelightdesk-nextbinaries tolightdesk-next-backup-2026-10-11-0100;lightdesk-next-backup-50d3ea9stays untouched. Never copy overlightdesk-next\data. - Judge.
fable-judgeafter W2, W3, the final ship, and once on the tutorial (four spawns). Artifact = headless renders plus regress log plus frame proofs. 3/4 ships; below 3 the owning lane fixes and an opus reviewer re-checks the named items only. If Fable is limited:fable-gate addand an opus adversarial judge as interim. - Models. Explicit
modelon every spawn.opusfor every lane that writes code or prose.sonnetonly for the regress run and the screenshot sweep.haikuonly for the DOM 44 px measurement and the tutorial selector check. - Rules carried in every UI spawn. 44 px targets, no page scroll, state grammar green LIVE / blue SELECTED / amber HELD / red KILL / grey neutral, real stage photos only, Barlow / Barlow Condensed / JetBrains Mono from
wwwroot/vendor/fonts, no native dialogs (two-tap or sheet), no em dashes, no-ai-slop prose, every slider linear, read WORKER-DESIGN-BRIEF.md first.
2. Waves and lanes
Shared-module ownership rule: v2/api.js, v2/controls.js, v2/sync.js, v2/tokens.css belong to the screen 1 lane in each wave. Other lanes add exports only through new files and ask the screen 1 lane for shared changes by message.
Wave 1, 01:15 to 03:00, four lanes
| Lane | Model | Owns | Deliverable |
|---|---|---|---|
| A Benchmark | opus-researcher with Exa | audit-2026-10-10/night-2026-10-11/BENCHMARK.md only |
Feature table across grandMA3, ETC Eos, Avolites Titan, Obsidian Onyx, ChamSys MagicQ, Lightkey, Daslight / SoundSwitch, Resolume-style busking. About 30 features, each marked have / weak / missing in this codebase with file:line or AUDIT gap, value for a busking operator in a 40-fixture room, buildable tonight, provable without lights. Top 12 ranked. Every claim cites a URL. No fabricated features. |
| B Server core | opus-engineer | Dmx/Engine.cs, Program.cs, RigState.cs, API.md, new data/inhibits.json, data/tempo.json |
(1) Inhibitive group masters. GET /api/inhibit and POST /api/inhibit {group, max}; applied in Render after looks, programmer, hits and timelines and after the camera-safe clamp; defaults KEY 21 at 5, FOH 22 at 10; persisted; shown in /api/status.inhibits and the SSE rig event. Benchmark: Eos inhibitive submaster, grandMA3 group master inhibit. Evidence: 86adb53 edited scenes, shows, hits and timelines by hand; memory notes group-fader edits "do not survive the next cue". (2) Tempo clock. POST /api/tempo {bpm}, POST /api/tempo/tap (average of the last 4 taps, 2 s window), POST /api/tempo/nudge {ms}, POST /api/tempo/resync, GET /api/tempo; in /api/status.tempo; SSE event tempo. Hits accept beats per step beside ms; ms behaviour unchanged when beats is absent. Benchmark: Titan tap tempo, MA speed masters, Lightkey rhythm. Evidence: TAP exists only in index.html:734-747 hidden (AUDIT gap 10); data/hits.json steps are fixed ms; no bpm symbol anywhere in the server. (3) Highlight. POST /api/highlight {fixtures, on} pulses dim between 20 and 100 at 1 Hz on a layer above the programmer; released by on:false, by a new pick, and by blackout; never recorded, never in the undo ring. Benchmark: Eos Highlight, MA Highlight. Evidence: wwwroot/v2/desk.js pick() sends nothing to the rig. |
| C UX walk | opus-reviewer | audit-2026-10-10/night-2026-10-11/PUNCHLIST.md only |
Every control on desk.html, screen2.html and the phone page: click depth, 44 px measured from headless bounding boxes (haiku sub-step), state hue lint (one hue one meaning), no-scroll check at both sizes, keyboard reach, label clarity, Greg's "linear not circular" rule on every slider and wheel. Ranked P0 / P1 / P2 with selectors. |
| D Rig and harness | opus-engineer | tools/regress-v2.sh, tools/mac-dryrun.sh, tools/tutorial-capture.mjs, tools/two-screen.ps1, tools/ship-night.ps1, audit-2026-10-10/pc-run.sh, pc-push-file.sh, PC-DEPLOY.md, wwwroot/help/ skeleton |
Regress harness (section 1). PC pipeline rehearsal end to end: bundle push, fast-forward in lightdesk-v2, build, 7075 preview restart, screenshots of both PC monitors back through fleet put / fleet get. Fix window-2 placement (commit 250da40) and prove it from a job. Capture harness: Playwright video to GIF via ffmpeg palette, stills at the three sizes, a scripted walkthrough file format (steps.json per chapter). wwwroot/help/index.html skeleton on tokens.css, served by the desk at /help/. |
Proof W1: lane B on a Mac dry run recalls ANTHEM (KEY 15 in data) with inhibit 5 and reads lekos 1 and 2 dim at or below 13/255 in /api/dmx/frame; taps 120 BPM, presses a beats:1 hit and measures the dim period from 40 fps frame samples at 500 ms ±10 ms; highlight pulses only picked fixtures and GET /api/undo depth is unchanged. Lane D proves the harness green on head and red on a deliberately broken worktree.
Merge order W1: B, then D. A and C produce documents only. No PC ship in W1.
Wave 2, 03:00 to 05:15, four lanes
Contract fixed before spawn: lane B's W1 endpoints plus lane S4's below. Default pick stands unless BENCHMARK.md's top three contain two items not in this wave; that is a narrow Fable re-escalation (one question: which lane swaps).
| Lane | Model | Owns | Deliverable, benchmark, evidence, proof, chapter |
|---|---|---|---|
| S4 Server playbacks | opus-engineer | Dmx/Engine.cs, Program.cs, API.md |
Per-look level POST /api/look/{id}/level {v 0-100} and GET /api/look/levels; HTP merge across live looks (_playback entries gain a level, default 100); levels reset to 100 when a look goes off; SSE event levels. Benchmark: playback faders on every console, Lightkey live sliders. Evidence: /api/look {id,fade,stack,off} is on or off only (Program.cs:819). Colour fan POST /api/colour/fan {fixtures, from:{h,s,l}, to:{h,s,l}}: server orders fixtures by their map position left to right, interpolates in HSL, emits per-fixture ColorRGB_* lines as one undo step. Benchmark: Titan and MA fan on colour. Evidence: desk.js popFor sends one colour to a group. Proof: a par's dim equals max(lookA·levelA, lookB·levelB) from /api/dmx/state; the fan reads monotonic hue across the 12 pars in the frame. Chapters 3 and 4. |
| S1 Screen 1 | opus-builder | wwwroot/desk.html, v2/desk.js, v2/desk.css, shared v2/api.js, v2/controls.js, v2/sync.js, v2/tokens.css |
Tempo strip in the bottom bar: TAP (key T), BPM readout, nudge, ×2 ÷2, beat LED; hit pads show beat length when a hit has beats; KEY and FOH faders show the inhibit cap mark and a tap-to-edit cap (two-tap to raise); hold 400 ms on a map light = Highlight until release; PUNCHLIST P0 items for screen 1; Desk menu gains Help (/help/) and the PHONE QR points to /phone.html. Proof: headless 1536x864, no scroll, haiku 44 px sweep clean, tempo and highlight visible in the frame log. Chapters 1, 6, 7. |
| S2 Screen 2 | opus-builder | wwwroot/screen2.html, v2/screen2.js, v2/screen2.css, v2/inspector.js, v2/wall.js, v2/save.js |
Playing rail: when Stack is on, every live look gets a 44 px horizontal level slider in a rail above the wall, reading SSE levels, with a Solo and an Off per row; colour fan two-end picker in the inspector colour card for 2+ picked (two linear hue rows and one depth row, Greg's linear rule); mixed readouts checked per VERDICT graft 5; PUNCHLIST P0 items for screen 2. Proof: headless 1920x1080, 60 whole tiles still visible at M with the rail open (rail takes at most 96 px), no scroll. Chapters 3, 4. |
| S3 Phone | opus-builder | new wwwroot/phone.html, v2/phone.js, v2/phone.css only; index.html untouched |
Rebuilt remote on v2 tokens: tabs Moods / Hits / Mixer / Point; Blackout hold and Undo fixed at the bottom on every tab; master, fade segment, tempo tap; scene tap stops a timeline (server 5adc40f already); 44 px throughout. Benchmark: grandMA3 web remote, Lightkey Remote, Onyx remote. Evidence: AUDIT 2.14, the phone is the 1,698-line desk reflowed under 900 px. Proof: headless 390x844 and 844x390, each tab fits without page scroll. Chapter 9. |
Merge order W2: S4, S1, S2, S3. Then regress on 7075, judge 1, PC ship 1 (about 05:15 to 05:45) run by the conductor with lane D's ship-night.ps1; both PC monitors screenshotted back to the Mac; regress read-only against 7070 (/api/status, /api/dmx/frame, one ANTHEM recall and one undo at most).
Wave 3, 05:30 to 07:15, four lanes
| Lane | Model | Owns | Deliverable |
|---|---|---|---|
| T2 Effects engine | opus-engineer | new Dmx/Effects.cs, a new region in Dmx/Engine.cs, map lines in Program.cs, API.md |
Dim and colour phasers on a selection or group clocked by the tempo: kinds sine, ramp, chase (step), colourcycle; POST /api/fx {fixtures, kind, beats, size, spread, phase}, POST /api/fx/stop {id} and /api/fx/stop all; GET /api/fx; status in /api/status.fx and SSE fx; sits under hits in priority, cleared by blackout, recorded in the undo ring as one step, survives a mood recall unless the recall touches the same fixtures. Benchmark: grandMA3 phasers, Titan shapes, Onyx and MagicQ FX engines. Evidence: MotionRunner (Program.cs:1746) moves pan and tilt only; no dimmer or colour generator exists. Proof: frame sampling shows period = 60/BPM × beats within 2 % and per-fixture phase offset equal to spread. Chapter 6. |
| T1 Set list | opus-engineer | new Setlists.cs, data/setlists.json, new v2/setlist.js, v2/setlist.css; one hook line each in screen2.html, desk.html, phone.html applied by the conductor at merge |
Ordered steps (scene, beam or my scene, per-step fade, optional auto-follow in beats); GET/POST /api/setlists, PUT /api/setlists/{id}, POST /api/setlist/{id}/go, /back, /jump {n}, /stop; status in /api/status.setlist; a Set list tab on screen 2 with drag order and inline step edit; GO and Back in the screen 1 timeline row (key G) and on the phone. Benchmark: Avolites Titan Set List, Eos cue list, QLab. Evidence: no playlist concept in data/ or wall.js; timelines are WAV-locked (showtimeline.js:29). Proof: live[] after each GO shows one id per step and the fade is visible in frame deltas. Chapter 8. |
| T3 FX UI and polish | opus-builder | v2/inspector.js (new Effect card for picked lights: kind, rate in beats, size, spread, Go, Stop, every control linear), v2/desk.*, v2/screen2.*, v2/wall.js, v2/save.js, v2/phone.* for judge-1 fixes and PUNCHLIST P1 |
Chapter 6 UI, judge-1 follow-ups, P1 polish. Proof: headless renders at all sizes, 44 px sweep clean. |
| T4 Tutorial, first half | opus-builder (prose and page) plus sonnet-qa for the capture sweep | wwwroot/help/**, ~/claude-grid/public/responses/lightdesk-overnight-2026-10-11/ |
Chapters 0 to 5, 7, 9 and 10 written against the W2 merged head on 7075; one GIF under 10 s per chapter, 1 to 3 stills, a keys table, a proof footer linking the shot or frame log. |
Merge order W3: T2, T1, T3. Regress, judge 2, PC ship 2 about 07:15 to 07:45.
Stretch (only if BENCHMARK ranks it top 3 AND data/console/fixturetypes/channel-functions-*.txt for the Colorband bar mode shows clean contiguous RGB cell runs): pixel chases across the 6 bars inside T2. Otherwise deferred and named on the results page.
Wave 4, 07:15 to 08:45, three lanes
| Lane | Model | Owns | Deliverable |
|---|---|---|---|
| U1 Tutorial, second half | opus-builder, haiku for the selector check | wwwroot/help/**, the results folder |
Chapters 6 and 8 against the W3 head; PC screenshots of both monitors as the chapter 0 hero; haiku check that every control named in the tutorial (data-help attributes) resolves in the shipped DOM, a miss deletes the sentence; ~/bin/publish-page lightdesk-overnight-2026-10-11; no LAN IPs, tokens or PC paths beyond the two launcher .cmd names. Judge 3 (Fable) reads it as a first-time studio assistant: "could I run a Friday night from this alone?" |
| U2 Final verification | opus-reviewer | nothing in the repo | Regress read-only against 7070, both PC windows placed on their monitors, /phone.html and /help/ served from 7070 on the LAN, git log on Mac and PC at the same head, no remote has new commits. |
| U3 Results page and morning text | opus-builder | the results folder | 🆕 block with the tutorial button as the largest element, the three ship times, judge scores, proof links, BENCHMARK and PUNCHLIST links, deferred list, the unanswered push question; opened once in Greg's Chrome at done after a headless render; text through ~/bin/text-greg after 08:30 (quiet hours) carrying the public tutorial URL only. |
If a server change lands after ship 2 (judge-3 fixes), PC ship 3 is the last allowed restart, by 08:30. UI-only fixes go with new-desk.ps1 -Action ui and a window reopen (a posted F5 does not reload Edge app windows).
3. Discernment calls
- Inhibit masters first. Greg's repeated complaint tonight is key light. Data edits leak through cues, hits and future scenes. A render-stage cap closes it structurally and is provable in one frame read.
- Tempo clock in W1, generators in W3. Every benchmark console's busking identity is a clock plus generators. Generators without a clock are toys; the clock first lets hits, set-list auto-follow and FX share one heartbeat.
- Per-look levels over more scene features. Seeing many scenes is solved (60 tiles). Blending two looks at 70/30 is the busking move the desk cannot make at all today.
- Phone rebuilt, not patched. Greg: "think about user interface in every aspect." The old page reflowed is the one surface still on the September grammar.
- Pixel chases deferred. High payoff for club nights but channel mapping cannot be eye-checked tonight; a wrong cell map lands on strobe or macro channels.
- Page 2 show builder left as is. 1,600 lines of WAV-locked timeline UI; rewriting it risks the flow Greg used all evening. The tutorial documents it in one chapter as it stands.
- Tutorial inside the app at
/help/plus a public copy. Best-in-world desks ship their manual inside; the public copy is for the phone link. - Worktrees per lane, conductor merges ff-only. The 10/10 failure mode was lanes committing into one working copy while a dry run served from it.
- Three restarts maximum under Greg's 01:00 word. Each one is 2 s dark with no one in the room; more than three turns a build night into a restart night.
4. Risks and tripwires
| Risk | Tripwire | Action |
|---|---|---|
| Engine change regresses a live flow | regress-v2.sh red after a server merge |
Revert that merge within 20 min, no fix-forward; Fable only if the contract itself is wrong |
| PC ship leaves 7070 dark or down | No /api/status within 60 s after ship, or dmx.frames not increasing |
Roll back from lightdesk-next-backup-2026-10-11-0100 at once, report; no third attempt without Fable |
| Someone is using the room | show.running=true, or selection.by changes to an id that is not ours, or Edge pid 22212's window is foreground |
Freeze all ships; keep building on the Mac |
| Inhibit vs camera-safe floor | Faces moods read KEY above the cap in the frame | Inhibit applies after the clamp; if it cannot, surface in chapter 7 and on the results page |
| Tempo changes existing hits | Any hit's step period differs from its ms in regress |
beats opt-in only; fix before merge |
| Benchmark lane upends the W2 pick | Its top 3 contain two items not in W2 | Narrow Fable re-escalation: which lane swaps |
| Lane edits outside ownership | Conflict or a diff touching another lane's file | Refuse the merge; lane redoes on its own files |
| Time slips | W2 merge not done by 05:30 | Cut T1 to GO-only, keep T2 server and T4; tutorial keeps 90 minutes minimum |
| Tutorial describes a missing feature | Haiku selector check finds a control not in the DOM | Delete the sentence, never soften it |
| Fable burn | A fifth judge spawn is wanted | Opus adversarial judge as interim, fable-gate add for the final |
| Transport stall | A PC job over 10 min with no output | Do not queue another; wait it out, then fleet exec status |
| 8 GB PC memory | Working set of LightDesk.exe over 600 MB after ship | Disable FX at 40 fps colour interpolation to 20 fps, re-measure |
5. DONE per subtask
- A BENCHMARK.md: about 30 rows, each with a URL and a file:line or AUDIT gap; top 12 ranked.
- B Three endpoints answer on a Mac dry run; ANTHEM with inhibit 5 reads lekos at or below 13/255; 120 BPM
beats:1hit measures 500 ms ±10; highlight pulses only picked fixtures and leaves the undo depth unchanged. - C PUNCHLIST.md with measured violations (selector, px) ranked P0 / P1 / P2.
- D Regress green on head and red on a broken worktree; PC round trip proven with two monitor screenshots on the Mac; window 2 lands at x=1920 from a job; one GIF produced headless.
- S4 HTP equality and monotonic fan proven in state and frame; API.md updated.
- S1 / S2 / S3 Headless renders at their sizes with zero page scroll, 44 px sweep clean, every new control visible; S3 in both orientations.
- Ship 1 7070 runs the W2 build, both windows full screen on their monitors, PC screenshots on the Mac, read-only regress green.
- T2 FX period and spread proven in frame samples; blackout and undo clear it.
- T1 A three-step set list GO shows one id in
live[]per step with the fade visible in frame deltas. - T3 Judge-1 named fixes closed; Effect card linear only.
- Ship 2 as ship 1, on the W3 build.
- T4 / U1 Tutorial at
/help/on the PC and at the public URL; 11 chapters, each with a GIF, stills, keys and a proof link; selector check passes; Fable judge 3/4 as a first-time operator. - U2 Read-only regress green against 7070;
/help/and/phone.htmlreachable on the LAN; Mac and PC at the same head; no remote has new commits. - U3 Results page open once in Greg's Chrome; text sent after 08:30 with the public tutorial URL.
6. Tutorial outline (first-time operator)
- What you are looking at: two monitors, the phone, the five colours (LIVE green, SELECTED blue, HELD amber, KILL red, grey), preview versus live port.
- Pick lights: map, kinds, lasso, Clear, hold to find a light in the room.
- Point them: stage picture, nine marks, Point / Halo / Fan / Cross / Wash / Auto, Moves.
- Shape a light: level, shutter, colour and the colour fan, gobo, beam sliders, DMX strip, Back to the look.
- Moods and beams: wall, families, search, fade, Stack, the Playing rail, Recent, Undo.
- Save a scene: one tap, rename, Photograph all moods (two-button sheet, room must be empty).
- Rhythm: tap tempo, BPM, hits on picked or usual lights, beat lengths, effects on picked lights.
- Key light and safety: the KEY and FOH caps, camera-safe, hold-to-blackout, the undo ring, Close.
- Running a show: set list GO, timelines Play / Stop / Next, a scene tap overrides a timeline, where the show builder lives.
- The phone remote.
- When something is wrong: no camera, muted preview on top of the live desk, which port, never restart during a show, rollback, LEKO FOH 1 is dead at the unit.
Each chapter: one GIF under 10 s, 1 to 3 stills, a keys table, a proof footer.
7. Morning deliverable list
- Public tutorial URL on gregbot-pages, also at
/help/on the PC's 7070. - PC 7070 on the night's final build, both monitors, phone page at
/phone.html. - Results page 🆕 block: ship times, three judge scores plus the tutorial judge, BENCHMARK.md and PUNCHLIST.md links, deferred list (pixel bars, show builder rewrite), the unanswered push question.
- Branch
two-screenlocal on Mac and PC at the same head; nothing on GitHub. - One text to Greg after 08:30 with the tutorial link.
8. Clock
| Time | Event |
|---|---|
| 01:15 | Cut worktrees, spawn A B C D |
| 03:00 | Merge B, D; spawn S4 S1 S2 S3 |
| 05:15 | Merge S4 S1 S2 S3; regress; judge 1; ship 1 |
| 05:30 | Spawn T2 T1 T3 T4 (T4 on the W2 head) |
| 07:15 | Merge T2 T1 T3; regress; judge 2; ship 2 |
| 07:30 | Spawn U1 U2 U3 |
| 08:30 | Last allowed ship 3; tutorial judge |
| 08:45 | Results page open, text sent |
9. Conductor amendments after BENCHMARK.md (01:20)
BENCHMARK top 3 = blackout that keeps state, haze exempt from blackout and master, global BPM clock. Two are outside W2, so per section 2 the pick changes; the conductor decides without a Fable re-escalation because both are small server changes:
- S4 Server playbacks = per-look levels (as planned) + blackout keeps state (dimmers to 0 and haze held, looks and positions kept, release restores without Undo) + haze exempt from blackout and master (a separate /api/haze hold flag, default exempt). Colour fan moves out of S4.
- T2 Effects engine gains the colour fan endpoint (it already writes per-fixture colour lines).
- S1 / S2 add BENCHMARK items 8 and 9: selection tools (odd, even, halves, reverse, next, previous, pick order shown) and colour / aim / gobo acting on the picked heads only.
- Deferred to the results page: MIDI learn, autosave rotation + redo, audio follow, pixel mapping, blind.
- U2 checks whether the PC run folder has a 0-byte rigstate.json or groups.json.