Back to the resultsSource: night-2026-10-11/PLAN.md

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

  1. Ship authority tonight. Repo CLAUDE.md: ship darkens 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=false and /api/status.selection.by has not changed to an id that is not ours in the last 10 minutes. Interpretation, moderate confidence. Tripwire in section 4.
  2. Camera-safe key floor. Program.cs:1766-1805 clamps 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.
  3. 4d7b9bc follow-up fix. Wave 1 worktrees are cut only after it lands; the conductor confirms git log -1 first.
  4. 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

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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.
  9. 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

6. Tutorial outline (first-time operator)

  1. 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.
  2. Pick lights: map, kinds, lasso, Clear, hold to find a light in the room.
  3. Point them: stage picture, nine marks, Point / Halo / Fan / Cross / Wash / Auto, Moves.
  4. Shape a light: level, shutter, colour and the colour fan, gobo, beam sliders, DMX strip, Back to the look.
  5. Moods and beams: wall, families, search, fade, Stack, the Playing rail, Recent, Undo.
  6. Save a scene: one tap, rename, Photograph all moods (two-button sheet, room must be empty).
  7. Rhythm: tap tempo, BPM, hits on picked or usual lights, beat lengths, effects on picked lights.
  8. Key light and safety: the KEY and FOH caps, camera-safe, hold-to-blackout, the undo ring, Close.
  9. Running a show: set list GO, timelines Play / Stop / Next, a scene tap overrides a timeline, where the show builder lives.
  10. The phone remote.
  11. 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

  1. Public tutorial URL on gregbot-pages, also at /help/ on the PC's 7070.
  2. PC 7070 on the night's final build, both monitors, phone page at /phone.html.
  3. 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.
  4. Branch two-screen local on Mac and PC at the same head; nothing on GitHub.
  5. 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.