Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
T
Tidal
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
PLN
Tidal
Commits
0d30a73a
Commit
0d30a73a
authored
Sep 05, 2026
by
PLN (Algolia)
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
docs(log 039): one list, one painter — the LCXL3 driver joins the crew
parent
96f13223
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
75 additions
and
0 deletions
+75
-0
039-one-list-one-painter.md
armada/tasks/039-one-list-one-painter.md
+75
-0
No files found.
armada/tasks/039-one-list-one-painter.md
0 → 100644
View file @
0d30a73a
---
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=`
.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment