"task":"GUI launcher did not spawn the MIDI lens or the tray",
"learning":"The launcher (gig-up.sh) and the unit converger (rig_units.py --ensure) disagreed on SuperDirt topology \u2014 raw sclang vs parvagues-sc.service \u2014 so the launcher never called ensure; the fix is ensure()'s proof-process skip, not another hand-copied unit list."
},
{
"date":"2026-09-17",
"task":"perf-tray double-click mystery + menu restyle",
"learning":"The double click was the appindicator extension's, not ours: it reserves double-click for SNI Activate (instant) and delays single-click 400 ms. The menu got the Ship's Bridge QSS with measured contrast, and '&' in Qt labels exports as '_' over DBusMenu, so mnemonics survive into the shell-drawn twin; literal & does not survive, so the copy avoids it."
},
{
"date":"2026-09-18",
"task":"tray GIG UP did nothing + midimon silent",
"learning":"The Bridge ran 'gig-up.sh --converge --quiet' but gig-up.sh's arg guard only knew --headphones/--help, so every tray GIG UP died on flag 1 (exit 2, output captured). Flags now parsed: --converge boots SuperDirt + converges units with NO app windows, --quiet mutes ok/info. midimon watches 132:0 (the lcxl3-driver's translated virtual port), not the raw surface \u2014 silence there just means the driver had no input yet."
},
{
"learning":"Two gig-up.sh exist: root (1-click, owns leds()) and tools/ (the GO/NO-GO gate the Bridge calls, where lcxl3-driver is boot=manual so nobody starts it). The v3 LCXL3 enumerates as 'LCXL3 1', breaking every v2 'Launch Control XL' grep \u2014 present/LEDs/path checks all silently misread. lcxl-path must match the driver's virtual PORT name 'ParVagues LCXL3' (under RtMidiOut client), never chase the PipeWire relay mesh (everything reaches everything via 143)."