Commit e85dc610 by PLN (Algolia)

log 049: four green lights and a dead lens

Captured at task close, not reconstructed. The learning worth keeping is
that a green light is a claim about liveness and liveness was never the
question — and that a test in this repo had pinned the MIDI re-resolve
design so firmly that 'cheap by construction: an idle surface costs
nothing at all' went un-re-examined until an idle surface cost a gig.
parent dd851bc2
......@@ -34,3 +34,20 @@ Each line pays off a `TODO_GIG` "NOT TONIGHT" entry or a loss measured in
- [ ] **7. Propose, PLN's call:** a `Mix` track inside Ardour (input =
`Master/audio_out 1+2`, armed) so the mix lands in the same take at stem
grade. Solves "one orbit unarmed", not "forgot REC".
---
## Done 2026-09-25 — and the three things only PLN can do
Commits `ce66317` · `6a94b47` · `187b17c` · `83ced8f` · `dd851bc`.
Log: `armada/tasks/049-four-green-lights-and-a-dead-lens.md`.
- [ ] **Arm `Tidal 08` in Ardour, then Ctrl+S.** The gate says NO-GO until you
do. Same pass: raise the nine faders sitting at −∞ and save, so the
session boots the mix you play.
- [ ] **`systemctl --user restart gig-log`.** The rebind only helps a reader
started after it. The current one is still holding the dead subscription
from the 24th — `tools/gig-log.py status` now says so in words.
- [ ] **Install the black box unit:** `tools/rig-install.sh` (or
`systemctl --user link ~/Work/Sound/Tidal/tools/gig-record.service`).
Until then the Bridge shows `black box — unit not-found`, which is honest.
---
log: 049
title: "Four green lights and a dead lens"
date: 2026-09-25
task: "TODO.d/2026-09-25-post-gig-belt-and-braces.md, 1-5 of 7"
tags: [tooling, rig, gig, surface]
shareable: true
---
## Cap (what & why)
The 2026-09-24 set went well and the rig held — 5 xruns in 94 minutes, zero
throttle. What it lost, it lost silently: 17m44s of audio to a late REC, one
whole orbit to a record button nobody had ever looked at, and every control
move of the night to a MIDI lens that was reading a dead wire. PLN, the morning
after: *"we should have belt sus and logs validation before a gig and a better
'tableau de bord' to confirm all is armed"* — and then, *"too bad these TODOs
were not done 20 days ago. second best time is now"*.
## Manœuvre (how)
Five changes, one commit each, every one of them measured against the gig's own
logs before a line was written. Two turned out to be deletions.
## Prise (findings / artifacts)
- **The `^42` double-press has a mechanism.** PLN: *"moving from track X to Y, i
had to press states like ^42 twice to 'apply their state'"*. `carry_values`
deliberately sends no CC for buttons (a 0 into a `midiOn` gate is
`someCyclesBy 0` — the stream stops), and it also cleared the driver's latch.
Both halves cannot be right: nothing is sent, so Tidal's bus keeps 127, while
the driver now believes 0. The next press computes `not False` = ON and
re-sends 127 into a bus already at 127. Inaudible — and the press after it
closes the gate he was opening. The journal logged **37 of these across 14 of
the set's 15 track changes**. Fixed by deleting the clear.
- **`Tidal 08` was never armed**, alone among twelve. `check-mix.py` now audits
the record button and `check-gig.py` says NO-GO on it, naming the track.
- **gig-log's MIDI lens: two independent faults.** The re-resolve lived *inside*
`for line in self._proc.stdout`, so it only ran after a line arrived — a
silent port blocks that iterator forever, and `aseqdump` never exits. Now a
timed `select`. And the liveness test itself was wrong: 38 hours later the
port still resolved to the same name at the same address, because
lcxl3-driver had restarted and the kernel reused the client number. So ask
the kernel's own wiring table. Verified live: client 133 was `Connecting To:
129:0, 14:0` and gig-log's aseqdump, client 135, was not in the list.
- **The black box had never run.** `tools/gig_record.sh` has existed since OPAL
and is item 9 of the RUNBOOK. No unit, no row in `rig_units.py`, no
`recordings/` directory. It also recorded the wrong thing: the default sink,
which was the laptop card while Master was hand-linked to the UMC. It now
follows `ardour:Master/audio_out 1`.
- **A GATE panel on the Bridge**, rendering `check-gig --json` — 43 checks with
their fixes, not a second opinion.
- **Nothing checked that `rig_units.SERVICES` and `rig-install.sh`'s `UNIT_SRC`
name the same units.** Three tests now do.
## Sel (the shareable learning)
**A green light is a claim about liveness, and liveness was never the question.**
Every dot on the dashboard was green that night. SuperDirt up, driver up,
gig-log up, Ardour up, log growing at 1 Hz. And: one orbit recording nothing,
one lens reading a wire that had been cut nine hours earlier, one safety net
that had never existed. "Is it running" and "is it doing its job" are different
questions, and only the first one is cheap.
The second lesson is smaller and sharper. This repo's own test file asserted
that the MIDI re-resolve *should* run inside the read loop, with the reasoning
written out: *"cheap by construction: an idle surface costs nothing at all"*.
That is true, and it is the bug. **"Costs nothing when idle" and "notices when
idle" are the same code path, and only one of them can be true.** A test can
pin a design decision so firmly that the decision stops being re-examined —
so when the gig disagreed with the test, the test was what changed.
And a third, from being wrong in the middle of it: a name is not an identity.
The first fix rebound on "the port vanished" and "the address moved", and
*neither* describes what happened. Only the kernel's subscription table did.
The same morning, `pkill -f "server.py --port 8791"` matched its own command
line and killed the shell that ran it — the rule against identifying processes
by name, broken by the person writing the fix for identifying ports by name.
## Hameçon (hook)
Twelve tools audited this rig: faders, mutes, routing, ghost orbits, sample
banks, preload coverage, thermals, xruns, clocks, units, symlinks, MIDI paths.
None of them audited the record button.
## Sillage (what it unlocks)
- The gate now fails on the two things that cost the last gig, before a note.
- Ardour's OSC arm lens is still lying (`arm:false` for 76 recorded minutes,
`conflict:true` on every record) — diagnose before anything reads it, and a
REC reminder must key on the FILES lens only.
- Open proposal: a `Mix` track inside Ardour, input `Master/audio_out 1+2`,
armed — the mix at stem grade, in the same take. Solves an unarmed orbit; the
black box is what solves a forgotten REC.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment