Commit 8dde011a by PLN (Algolia)

CHANGELOG, archive, TODO.d: rig signal-path health, and what is left open

Sprint 12 entry, one learning line, and the follow-ups: the two owner decisions
(Master sinks, built-in mics), the witnessed drills, the work blocked on
uncommitted changes in gig-up.sh and rig_units.py, and the measured idle CPU of
the watchers.
parent f9c4df6d
......@@ -4,6 +4,48 @@ Sprint entries, newest first. Player-facing: what changed about *playing*, not
about the code. Task IDs reference the L'Armada board; `n/a` where the work was
unplanned (which, on a gig night, is most of it).
## Sprint 12 — 2026-10-11 · the rig says when its own signal path is dead
Four faults on one afternoon, every unit `active` the whole time: the faders did
nothing, the rig was silent, and the launch gate cried NO-GO at something fine
while the real fault sat unread.
### Fixed
- **Faders that did nothing.** The LCXL3 enumerated *after* `gig-up` had chosen
its painter, so nothing ever started `lcxl3-driver`. `midi-autoconnect` now
starts it whenever a raw LCXL3 is on the bus (bounded retries, never the v2
painter). The unit stays `manual` on purpose: enabling it at login would
crash-loop on every day the surface is unplugged.
- **A silent rig.** PipeWire's graph was clocked by the MIDI bridge instead of
a sound card, so nothing played and no MIDI crossed to Ardour. After a card
toggle Ardour's Master was left linked to nothing. `tidal-ardour-autoroute`
now gives Master the default sink whenever it has no hardware output
(additive: it never prunes your own routing).
- **The control-feed link was a silent no-op** on this PipeWire (it used an old
port spelling). It is now named from the live graph.
- **A gate that cried wolf.** `gig-preflight` compared EPP and the clock ceiling
to fixed values and blocked every launch against the thermal pilot's own
resting rung. It now judges them against the rung the pilot declares. A dead
surface driver is now a blocking failure, because that is "there is no gig".
### Added
- **Rig health, in the tray and the Bridge.** `gig-log` now publishes
`~/.cache/parvagues/health.json`: is the graph hardware-clocked, does the
LCXL3 have its driver port, is `scsynth` alive. The tray shows a red dot on
trouble (nothing when healthy) and the Bridge a "signal path" row. A desktop
notification fires on a failure *transition* only, with an evidence snapshot
saved under `~/.local/share/parvagues/health-evidence/`. A dead observer reads
as stale, never as green.
### Changed
- `tidal-ardour-autoroute` went from ~15% to ~3% of a core at idle: it now
issues `pw-link` only for links that are actually missing.
### Still open
See `TODO.d/2026-10-11-rig-health-followups.md`: which sinks Master should feed
(three at once is the leading suspect for the xruns), whether SuperDirt needs the
built-in mics, the idle CPU of the other watchers, and the witnessed drills.
## Sprint 11 — 2026-09-17 · the tray learns which click is which
### Fixed
......
# Rig health: what is deliberately still open (2026-10-11)
Everything shipped today is committed and tested (see CHANGELOG, Sprint 12). These
are the threads left, in the order they cost to leave. Two need a human decision.
## 1. Decisions (blocking the xrun A/B)
- **Which sinks should Ardour Master feed, at home and on stage?** It was linked to
Headphones + Speaker + HDMI 1 at once. On 2026-10-11 the xruns sat on the two
*follower* sinks (HDMI 14, Headphones 13) and almost none on the driver (Speaker 3),
and they did not track heat (0 s of overlap with throttling). Leading hypothesis:
the fan-out forces adaptive-resample followers. Hypothesis, not finding: A/B it,
one variable at a time, ten minutes each.
- **Does SuperDirt need the built-in mics?** SC's JACK driver auto-connects the
SoundWire mic captures to `in_1/in_2` and Ardour has its own Mic track. The mic
capture streams threw `Broken pipe` xruns from the moment the rig launched. If SC
does not need them, stop the auto-connect at the source (SC's JACK input
connect, via the parvagues-sc drop-in) rather than cutting links afterwards.
Verify against SuperCollider's docs first.
## 2. Witnessed drills (need a quiet moment and the owner's OK, not mid-play)
The unit tests prove the logic; only these prove the wiring.
1. Stop `lcxl3-driver`: tray goes red and notifies within ~10 s; midi-autoconnect
restarts it within its cooldown; tray recovers.
2. Unlink Master from every sink: autoroute re-links it within 2 s.
3. Stop `gig-log`: the tray shows "observer stale" (red dot), not green.
4. Unplug and replug the LCXL3 with `lcxl3-driver` stopped: the driver starts on its
own within a few seconds.
5. `check-gig.py` returns GO at pilot rung 1 and a BLOCK with the driver stopped.
## 3. Blocked on someone else's uncommitted work
`gig-up.sh`, `tools/gig-up.sh`, `tools/rig_units.py`, `tools/check-stale-units.py`
carry uncommitted changes that are not from this work (the tree had 22 modified files
at the start). Editing them would sweep that work into a commit. Once it is landed:
- `gig-up.sh` `leds()`: call the same chooser midi-autoconnect now uses, and wait a
bounded time for the surface before giving up (today it decides once, instantly).
- `rig_units.py`: document that lcxl3-driver is started by midi-autoconnect rule 4.
## 4. Idle CPU of the watchers (measured 2026-10-11, no one playing)
About 48% of one core in total. `xpswatch` 8.6, `lcxl3-driver` 8.1,
`fipindicateur-watchdog` 7.9, `midiviz` 5.0, `midi-autoconnect` 4.6, autoroute 3.6
(was 14.9), `gig-log` 3.6, `perf-tray` 2.3, `sc-watchdog` 2.2, SuperDirt 1.9.
Cheapest win: `midi-autoconnect` forks ~8 times per 2 s tick; drive it from
`System:Announce` events with a slow heartbeat instead of polling. This matters for
the fan: the heat source in play is Pulsar (~105% mean, 228% peak), see SRE TODO.d #92.
## 5. Small, independent
- `tools/bridge/tests/test_perf_tray_midi.py` fails on a clean checkout: midiviz grew a
`devcon` theme the tray never offers (and `midimon-devcon` has no launcher row).
Also failing before today: `test_one_tidal_parser`, `test_gearbox::test_label_falls_back_to_the_raw_key`.
- `test_surface_state` fails in a combined run and passes alone: an ordering flake.
- Optional udev rule so a plug event starts the driver with no polling (needs sudo, and
midi-autoconnect already covers it during a rig session).
- The rtmidi client is named `RtMidiOut Client`, which is why 'ParVagues LCXL3' is hard
to find in qjackctl. Naming it would end that confusion. First `rg` for anything that
matches on `RtMidiOut`.
......@@ -82,5 +82,10 @@
"date": "2026-09-26",
"task": "Both masters uploaded to SoundCloud as private drafts via headful real Chrome + Playwright (set 2408162466, rose 2408154918); duplicate rose deleted via api-v2 DELETE",
"learning": "DataDome walls every scripted SC upload path (TLS-fingerprint-bound clearance); the working lane is Playwright driving system Chrome with Firefox cookie injection. Success = Saved dialog, URL never changes; verify+dedupe via api-v2. Playbook: memory reference_soundcloud-upload-playbook."
},
{
"date": "2026-10-11",
"task": "Rig signal-path health: surface driver on hot-plug, Master relink, pilot-aware gate, health.json in tray + Bridge",
"learning": "A green unit is not a live signal path: all four faults left every unit active. Observe the path from data the recorder already reads (pw-top follower-of-alsa-driver, /proc/asound/seq driver port), owners repair, observer notifies on transitions only. And check rig_units.py before enabling any unit: lcxl3-driver is 'manual' because it crash-loops with no board. Measure the watchers: autoroute re-issued 24 pw-link per tick = 15% of a core."
}
]
\ No newline at end of file
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