Commit 080a203c by PLN (Algolia)

feat(faders): stop depending on PLN remembering to raise them

Third session running, he raised faders by hand and hit Ctrl+S, then asked the
right question:

    "ok raised and saved 10 and 12, saved, check again.
     but ideally we should not depend in that?"

He is right. The gate CAUGHT the problem all three times — the dependency was
never on the check, it was on him having hands free to fix it. On a Saturday at
19:00 in a field that is not a dependency you want.

THE MECHANISM, now understood: the Ardour session IS the boot state. He ends a
set with the faders pulled down, which is what you do at the end of a set,
Ardour saves that, and the next launch comes up silent. Today's save had NINE of
twelve at -inf, and all 15 setlist tracks would have lost an orbit — d10 carries
the riser convention (#33), so all ten risers would have been silent and he
would never have heard them go.

tools/fader-baseline.py: --capture / --check / --restore.

WHY THIS IS ALLOWED TO WRITE FADERS when the standing rule says never to. The
rule exists for three reasons — it desyncs the file from the physical desk,
CC77 down is total silence, and levels are MUSICAL INTENT an agent must not
invent. All three are about INVENTING a level on a LIVE desk. This does neither:
it replays a value PLN set and approved (stamped with date and source session),
it refuses to write under a live session so the desk always wins, and it can
only address routes named "Tidal NN" — Master, monitor and busses are not
reachable by this tool at all. It writes a .bak first, because a corrupted
performance session six days out is not a recoverable mistake.

--capture REFUSES if any fader is silent. Capturing end-of-set silence as the
baseline would enshrine the exact bug this undoes.

Baseline captured while the mix was green: 12 faders, 01 at 0.0 dB through 09/12
at +6.0 dB.

PROVEN BY MUTATION on a COPY, never his live session: pull the same nine faders
to 0.0, --check reports all nine with their baseline deltas and exits 1,
--restore puts them back, and check-mix.py independently agrees every orbit
reaches master again.

AND THE TEST FOUND A REAL BUG IN THE GUARD. The first version asked "is ANY
Ardour running" — the safe-LOOKING answer and the wrong one, because it refuses
to repair a session nobody has open, and it made the restore path untestable
while his live session was up. The hazard is writing UNDER a live session, so
the guard now matches on the resolved session path. Still refuses his open one;
no longer refuses everything.

Wired in two places: a HARD "fader baseline" check in the gate, and a --converge
action that restores automatically when Ardour is closed. gig-up: GO, and
--converge is a clean no-op on a healthy rig.
parent ad91ff1a
{
"captured": "2026-08-02T12:08:54+02:00",
"session": "/home/pln/Work/Sound/Ardour/Tidal Live/Tidal Live.ardour",
"note": "Levels PLN set and approved. Replayed by --restore, never invented.",
"faders": {
"Tidal 01": 1.0,
"Tidal 02": 1.0719250440597534,
"Tidal 03": 0.9858513474464417,
"Tidal 04": 0.9582463502883911,
"Tidal 05": 1.0719250440597534,
"Tidal 06": 1.0719250440597534,
"Tidal 07": 1.0719250440597534,
"Tidal 08": 1.1945180892944336,
"Tidal 09": 2.0,
"Tidal 10": 1.9106513261795044,
"Tidal 11": 1.0,
"Tidal 12": 2.0
},
"faders_db": {
"Tidal 01": 0.0,
"Tidal 02": 0.6,
"Tidal 03": -0.12,
"Tidal 04": -0.37,
"Tidal 05": 0.6,
"Tidal 06": 0.6,
"Tidal 07": 0.6,
"Tidal 08": 1.54,
"Tidal 09": 6.02,
"Tidal 10": 5.62,
"Tidal 11": 0.0,
"Tidal 12": 6.02
}
}
......@@ -164,6 +164,24 @@ if (( CONVERGE )); then
tools/check-preload.sh --fix >>"$LOG" 2>&1 && { echo " ${G}+${Z} preload plan regenerated"; did=1; }
fi
# THE FADERS, if and only if Ardour is closed. PLN, on being told to raise two of
# them by hand for the third session running: "but ideally we should not depend in
# that?" — correct, and the dependency was on him REMEMBERING.
#
# fader-baseline replays levels HE captured; it never invents one, it only ever
# addresses routes named "Tidal NN", and it refuses to write under a live session
# because the physical desk must always win. So this is a restore, not a mix
# decision, which is what makes it safe to automate at all.
if ! python3 tools/fader-baseline.py --check >/dev/null 2>&1; then
if python3 tools/fader-baseline.py --restore >>"$LOG" 2>&1; then
echo " ${G}+${Z} Ardour faders restored from baseline"; did=1
else
# Almost always "Ardour is open" — a legitimate refusal, not an error.
echo " ${Y}!${Z} faders differ from baseline and could not be restored"
echo " ${D}close Ardour, then: tools/fader-baseline.py --restore${Z}"
fi
fi
# The exact failure of 2026-08-01: unit ACTIVE, audio server DEAD. `start` is a no-op
# on an active unit, so this case needs a RESTART — and distinguishing the two is the
# entire lesson (a green unit is not sound).
......@@ -226,7 +244,7 @@ run "tools executable" \
bad=0
for f in tools/gig-up.sh tools/check-boot.sh tools/check-tracks.sh \
tools/check-preload.sh tools/sc-watchdog.sh tools/setlist.py \
tools/check-drift.sh tools/take-segments.py; do
tools/check-drift.sh tools/take-segments.py tools/fader-baseline.py; do
[ -e "$f" ] || continue
[ -x "$f" ] || { echo "not executable on disk: $f"; bad=1; }
m=$(git ls-files -s "$f" 2>/dev/null | awk "{print \$1}")
......@@ -274,6 +292,10 @@ run "surface grid intact" \
exit 1; }'
# --- 2. the saved Ardour faders ----------------------------------------------
run "fader baseline" \
"tools/fader-baseline.py --restore (close Ardour first) — or --capture if these levels ARE the new intent" \
python3 tools/fader-baseline.py --check
run "ardour faders" \
"raise it on the desk, then Ctrl+S in Ardour, then re-run. Still -inf after a save = genuinely down." \
python3 tools/check-mix.py --quiet
......
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