-
tooling: one launcher, one gate — and four bugs the split had been hiding · cd9d0d80
Two verbs instead of three names. gig-up.sh DOES; tools/check-gig.py PROVES. The collision was not a fork. `gig-up.sh` (root, 555 lines) launches the rig; `tools/gig-up.sh` (620) proved the set; `tools/gig-preflight.py` (522) already proved the machine. Both gates took --converge and --quiet, so the two paths looked interchangeable and were not: the preload gate sat only on the path not pressed, the readiness report only on the path the Bridge does not call. The gate is now a TABLE, not control flow: 23 probes, each carrying its command, its fix, its severity and its layer. The bash pipelines are kept verbatim — each was written the day a specific failure was found and the pipeline IS the finding. gig-preflight already emitted {check,state,detail,fix} over OK/WARN/FAIL, so the machine layer joined through its own --json with no rewrite. 23 + 16 = 39 checks in one report, one exit code. Measured: 16.5s full, 3.4s --fast, 0.3s machine. Found while wiring it, each verified against the failing leg: 1. The launcher rewrote preload.scd from setlist_opal2026.txt on EVERY launch — the Sept 6 set. Measured 132 banks -> 45, leaving 41 of Thursday's banks to be read off disk mid-set: the failure check-preload's own header calls "debuted as a crackle at the venue". The set is now named ONCE at the top of the launcher and read by both the plan generator and the gate. Generation also converges instead of clobbering — a plan that already covers the set is left alone, because a rewrite can only narrow it. 2. `LCXL present` reported the desk PRESENT with the board unplugged: it grepped all of `aseqdump -l`, whose third column is the PORT name, and lcxl3-driver publishes a virtual output called "ParVagues LCXL3". The gate was matching our own driver. Now anchored on the client name (old: present, new: absent, board off the bus). 3. `setlist compiles` proved backlog.md's 15 tracks, not the 17 being played. --setlist scopes the compile and preload probes to one gig's file, via setlist_samples.read_setlist — never a fresh regex. 4. `SC -> Ardour` was gated on scsynth, so it printed NO-GO on a healthy --headphones rig where there is legitimately no Ardour. Preconditions are per-probe now, and an unmet one is SKIP, never FAIL. Also: gig-preflight's `midi surface` warned that mk3 LEDs were unimplemented, untrue since lcxl3-driver took over painting. Both generations exercised against a recorded graph. And `gig-log preflight` (the armed-global check — gMask sat at 127 for 74 minutes while every cold check was green) lived only in the launcher's report where it could not block. It is a blocking probe now. Enforcement, because a rule in a docstring is not a rule: tools/tests/test_check_gig.py, 39 tests. No probe may mutate anything (read over argv, never the source text — a fix hint is SUPPOSED to say "systemctl restart"); the fence has its own detector; no check may be lost from the port while the old script exists; the launcher may not grow assertions of its own and must end by calling the gate. Suites 510 passed, 2 failed — both pre-existing (fold-orbits' PipeWire regexes tripping the Tidal-parser ratchet, test_gearbox's dash fallback). tools/gig-up.sh is kept, unrun, with a superseded banner: nothing is deleted until its replacement has run on a real launch, and it is the transcription check's reference until then.PLN (Algolia) authoredcd9d0d80
×