---
log: 030
title: "The rig that only half-connected"
date: 2026-08-23
task: "n/a (found live, at launch)"
tags: [rig, tooling, systemd, midi, infra]
shareable: true
---

## Cap (what & why)
PLN launched the rig and reported two faults in one breath: the LCXL was dark
except three yellow knobs, and Tidal's twelve orbits weren't reaching Ardour's
`Tidal 01..12`. Both had a script that was *supposed* to make them automatic.
The question wasn't "how do I fix it" but "why doesn't this hold by itself?"

## Manœuvre (how)
Checked the instruments before the rig — the habit that has paid three times now.
The LED watcher was healthy and *painting correctly*: its log said
`rose_eternelle.tidal → 3 controls`, and that file was **0 bytes**. The surface
was telling the truth about an empty track. Not a MIDI fault at all.

The orbits were a real regression. `tidal-ardour-autoroute.service` was
`disabled` + `inactive`. Orbits 1-4 and 10-12 were still wired as *leftovers*
from an earlier session, so it presented as "half works" rather than "the
service is off" — the shape that sends you debugging audio instead of units.

Then the root cause, one layer up: both reconcilers existed **only** as plain
files in `~/.local/bin` and `~/.config/systemd/user`, while every other unit
symlinks into `tools/`. Nothing version-controlled ⇒ a `disable` was
unrecoverable and invisible to `git status`.

## Prise (findings / artifacts)
- `4d9f105` — both units + scripts into the repo, `$HOME` symlinked back.
- `406a461` — `tools/rig_units.py`, THE inventory. Three consumers, no
  re-typing: the Bridge imports `SERVICES`, `gig-up.sh` calls `--ensure`, and
  `tools/parvagues-rig.target` is *generated*. One handle:
  `systemctl --user start parvagues-rig.target`.
- 24/24 orbit links restored; 6/6 units enabled-per-policy and active.
- The list had been in **three** places (Bridge table of 5 rows, gig-up loop of
  4 names, each unit's `[Install]`) — and the Bridge's copy silently omitted
  `parvagues-bridge`.

## Sel (the shareable learning)
**`enable` and `start` are different fixes, and confusing them is how a service
stays dead for weeks while every pre-gig check passes.** `gig-up.sh` only ever
ran `start`. A start repairs tonight and changes nothing about the next login.

Three smaller ones, each earned:
- `is-enabled: linked` reads like a healthy word and means **not enabled**.
- `systemctl disable` on a *linked* unit **deletes the symlink itself**, leaving
  a running-but-unresolvable unit.
- A unit file symlinked into a **feature branch** vanishes on `git checkout` — I
  broke the live rig's symlinks doing exactly that. Live infra belongs on master.

## Hameçon (hook)
"Three yellow knobs on a dark controller. I went looking for a MIDI feedback
loop and found a zero-byte file — the board was telling me the truth and I
almost called it a liar."

## Sillage (what it unlocks)
Adding a service to the rig is now one row in `rig_units.py`. `--status` gives a
one-line answer to "why isn't it wired", which is the check I should have run
first instead of reading the audio graph.
