-
feat(rig): a preflight that reads LIVE STATE — the gap that let gMask sit armed for 74 minutes · 764accb1
PLN, after a change of mine reached his ears before a check did: "we gotta make things work bro we cant break as we move i thought we had clarity and confidence by now :) go on, take the longshorter path not hte immediate one". Right, and the honest diagnosis is not "be more careful". It is that this toolbox had a whole missing category of check. Everything in it is COLD: pvlint parses .tidal text silent-eval queries patterns against an EMPTY control map, in a fresh ghci surface-columns reads .tidal text check-boot loads BootTidal in a throwaway ghci check-mix reads the SAVED Ardour session All five were green all afternoon. Meanwhile gMask sat ARMED AT 127 on the live board from 15:36 to 16:50 — a global chopping the last eighth out of every bar of every orbit wrapped in gM1/gM2/gM3, which is every orbit of every track. Nothing was broken. A switch was on, and NOT ONE tool in the chain looks at the switches. PLN found it by ear, and the ear should never be the smoke detector. `gig-log preflight` closes that. It reads the live recorder's surface state and returns a verdict on the controls that can silence a whole rig from outside any pattern: gPanic armed, any gMute engaged, a DJ filter parked in a band-killing position, gMask armed if it is still active. == THREE DESIGN DECISIONS, EACH FROM A PAST FAILURE == 1. A STALE LOG FAILS. Exit 2, and distinct from exit 1 (surface unsafe) so a caller can tell "I could not check" from "I checked and it is bad". A preflight that reports SAFE because it read yesterday's session converts an unknown into a false reassurance, which is precisely the shape of every bad afternoon this rig has had. is_live() already existed; this is the first thing to gate on it. 2. gMASK'S MEANING IS READ FROM BootTidal.hs, NOT HARDCODED. ^41 was a global gate this morning; since 37857225 it is d1's gate and gMask is `id`. Same CC, opposite verdict. Hardcoding either answer would be wrong half the time and would go stale exactly the way every other cached binding here has (feedback_stale_binding_pattern). An unreadable BootTidal assumes the mask is STILL ACTIVE — the cautious read, because guessing "retired" silences a real FAIL. 3. IT NEVER FAILS ON THE STATE BUTTONS. Gates on 41-44/57-60/76/89-92 are gestures PLN arms on purpose. They are LISTED ("armed on purpose (not a failure)") so nothing is silently on, but they do not block. A gate that cries wolf about intentional performance state is a gate that gets ignored, and then it is worth nothing on the night it matters. It also names what it cannot see rather than implying completeness: Ardour faders are invisible over MIDI, so the output points at check-mix.py and says that reads the SAVED session. == AND IT IS WIRED IN, WHICH IS THE ACTUAL POINT == gig-up.sh now ends with a readiness gate that runs BOTH preflight and check-mix. Everything above that line only proves processes STARTED; these two are the only steps that ask whether the rig will make a SOUND. Neither aborts the launch — you may be starting up precisely to fix them. This is the "real readiness gates" half of feedback_simple_setup, and it means the surface check happens whether or not anyone remembers to ask for it. Verified: live run reports SAFE with the board as PLN just left it (48 controls touched, gMask correctly detected as retired, ^93 untouched and flagged as sitting at the #55 seed). Negative-tested against a truncated log: exit 2, "recorder is NOT running", no verdict offered. 5 new tests (309 total), including the load-bearing one that a stale log must FAIL rather than pass, and that a COMMENTED-OUT `gMask = id` does not count as retired.PLN (Algolia) authored764accb1
×