Commit 0d30a73a by PLN (Algolia)

docs(log 039): one list, one painter — the LCXL3 driver joins the crew

parent 96f13223
---
log: 039
title: "One list, one painter the LCXL3 driver joins the crew"
date: 2026-09-05
task: "n/a (mid-session convergence pass, PLN's ask)"
tags: [tooling, rig, systemd, lcxl3, convergence]
shareable: true
---
## Cap (what & why)
A new track ("Veridis Quo", algoraoke) played to a silent room twice in one
night — first the recurring saved-at--inf Ardour faders, then the LCXL3 sitting
untranslated because `lcxl3-driver.py` only ran when a session remembered to
start it. When the session's background copy got OOM-reaped, the surface went
deaf **with every check green**. PLN: *"lets ensure we converge on the tooling,
all these should be auto setup, discoverable, unified."*
## Manœuvre (how)
- **`tools/lcxl3-driver.service`** — repo-owned like its siblings, symlinked
into `~/.config/systemd/user`. Retry-forever hotplug posture (the
`StartLimitIntervalSec=0`-in-`[Unit]` lesson from lcxl-leds-watch), follow
mode (no `--track`; it tracked rose_rouge on its own within a second),
deliberately not niced (it is the surface's nervous system).
- **`Conflicts=lcxl-leds-watch.service`** — one painter per board, enforced by
systemd instead of by memory. Starting either painter stops the other, so
plugging a surface generation picks its painter.
- **`rig_units.py`** — the driver and `perf-tray` join THE list (gear managed
perf-tray but the inventory didn't know it — the "list lived in three
places" failure, again). New third boot policy **`manual`**: never enabled,
never started by `--ensure` or the target, because auto-starting the v2
painter would Conflicts=-kill the LCXL3 driver mid-bring-up. `--list --boot`
filter added for shell consumers.
- **`parvagues-gear`** moved from a loose file in `~/.local/bin` into
`tools/`, and now **derives** its unit sets from `rig_units.py --list`
instead of being the fourth hardcoded copy. Its `autostart-on` used to
`enable ALL` — including parvagues-sc at login, against the rig's own
policy; it now defers to `--ensure --apply`.
- **`gig-up.sh leds()`** detects the plugged surface generation: LCXL3 →
restart the driver unit; v2 board → the old paint path, now invoked via
`python3` so a lost exec bit can't kill it.
- **63 scripts got their exec bit back in the INDEX** (`git update-index
--chmod=+x`) — `core.fileMode=false` means working-tree chmod never reaches
the repo, which is why 203/EXEC (log 032) kept recurring.
## Prise (findings / artifacts)
- `rig_units.py --status`: **9 units, 0 problems** — lcxl3-driver active +
enabled, lcxl-leds-watch `manual — start by hand for its hardware`.
- The night's earlier debugging, now structural: LCXL 1 worked plug-and-play
because it *natively* spoke the corpus's CC map; the LCXL3 only speaks it
through the driver, so the driver is rig infrastructure, not a session tool.
- Also confirmed on the way: nothing in the toolbox reads **live** Ardour
record/transport state — check-mix and friends parse the *saved* session
(and say so). A live REC lens is an open want (OSC port 3819, or polling
the growing stem files in `interchange/`).
## Sel (the shareable learning)
- **A tool that must run for hardware to work is a unit, not a command.** The
test: if the OOM killer reaping it leaves the rig lying ("every check
green, surface deaf"), it was infrastructure all along.
- **Mutual exclusion belongs to the init system.** "Only one painter may own
the board" lived in a comment; `Conflicts=` makes it a law that holds even
when nobody remembers it.
- **An inventory earns its keep by being complete, then by having policies.**
Two policies (login/on-demand) couldn't express "never auto-start this";
the third policy existed the moment two units could kill each other.
## Hameçon (hook)
The surface worked perfectly all night — for the person clicking with a mouse.
The story of why a fader is a *protocol*, and why the fix was a systemd
directive from 1992's playbook: `Conflicts=`.
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