Commit 71516e25 by PLN (Algolia)

docs(log): land three captain's logs that were written and never committed

Written 2026-08-14, uncommitted for three weeks: the -inf fader forensics on
Tidal Live.ardour, the corpus triage that found '51 broken tracks are actually
22 — the harness was the biggest bug', and the 192 kHz master-format audit
('probe, never assume'). All three are marked shareable: true, which is the
whole point — these logs are the source material for the posts and videos,
and they were sitting one bad rm away from not existing.

The rule in armada/tasks/README.md is 'write the entry when the task lands,
while it's fresh'. It worked: the writing happened same-day. It was the
committing that didn't, because git status had become unreadable (see a5a5b37).
Documentation discipline is not one habit, it is two, and the second one is
the one that survives a hard drive.

Left for PLN, one line: all three carry 'log: 025' in their frontmatter, which
025-fifteen-intros-are-not-a-set.md already owns. They also use dated filenames
like 2026-08-03-j5-audio-dropout.md rather than the README's NNN-slug.md.
Renumbering is a call about his own archive's spine, not mine — and the dates
are 2026-08-14, which lands them BEFORE 039, so the next free numbers would
read out of order.

    the log was kept. the log was not carried.
    a ship's record that never leaves the desk
    is a memory, not a record.
parent 039ff575
---
log: 2026-08-14
title: "The -inf faders: read-only forensics on Tidal Live.ardour, mid-gig"
date: 2026-08-14
task: "n/a (forensics request, no board task)"
tags: [ardour, mixing, forensics, tooling]
shareable: true
---
## Cap (what & why)
Four times now, several `Tidal NN` faders in `~/Work/Sound/Ardour/Tidal Live/Tidal
Live.ardour` have shown up at -inf dB (6/12 today, 9/12 the three prior times), always
"fixed" by manually re-raising and saving. Nobody had checked whether this is a real bug
(automation override, active corruption) or just a faithful save of faders that happened
to be down. Read-only investigation, done live during a set — no writes to the session,
no process touched.
## Manœuvre (how)
Reused `tools/check-mix.py`'s XML paths (`Route > Processor[name=Amp,type=amp] >
Controllable[name=gaincontrol]` for the linear gain; `Automation/AutomationList` for
automation state; `MuteMaster`, `IO`/`Connection` for mute/routing). No git repo under
`~/Work/Sound/Ardour/` — history had to come from Ardour's own `.bak` rotation and the
`.history`/`.history.bak` undo log. Compared three real snapshots of the 12 `Tidal NN`
gain values: `Tidal Live.ardour.premap-20260729` (2026-07-29, oldest artifact on disk),
`Tidal Live.ardour.bak` (the save immediately before the current one), and `Tidal
Live.ardour` (current, saved live at 21:18:43 while this investigation ran).
## Prise (findings / artifacts)
**1. Automation override — ruled out.** Every `Tidal NN` route's gain
`AutomationList` reads `state="Off"` with **zero automation events** (`n_events=0` on
all 12). Ardour's automation states are `Off / Write / Touch / Play / Latch`; none are
`Play`. There is no automation lane that could push a value on transport roll — the
`gaincontrol` `value=` attribute is the only thing driving the fader. Example (Tidal
02): `<AutomationList automation-id="gain" ... state="Off" />`,
`<Controllable name="gaincontrol" ... value="0" />`.
**2. No shared control path.** `<VCAManager>` and `<RouteGroups>` are both empty; every
`Tidal NN` route has `route-group=None`. Each track's gain is fully independent — there
is no group/VCA master that could zero several tracks in one action, which rules out a
single-event mechanism behind "many faders down at once."
**3. -inf is exactly `0.0`, nothing anomalous.** All -inf tracks store `value="0"` on
`gaincontrol` (linear), never `NaN`/negative/denormal. This is what a fader pulled fully
down produces — not a parse artifact or corrupted float.
**4. The dead-track SET moved during tonight's own set, mid-investigation.** PLN's
report for tonight was dead = {02,03,05,07,08,12}, alive = {01,04,06,09,10,11}. Reading
the session live just now (saved 2026-08-14 21:18:43, literally while this forensics ran)
shows dead = {01,02,03,04,06,07,08,12} (8/12), alive = {05,09,10,11}. Three tracks
reported alive (01, 04, 06) had since gone to -inf; one reported dead (05) had come up to
-18.5 dB. The composition changed **within the same gig**, between the report and this
read.
**5. Save-to-save diff confirms independent, non-uniform drift.** `Tidal
Live.ardour.bak` and `Tidal Live.ardour` are Ardour's own before/after pair from the
current save (mtimes 21:18:43.117 vs .137, i.e. same save operation); `Tidal
Live.history.bak` mtime is 21:18:21 — ~22s before the save that produced the current
pair, giving a real inter-save timestamp. In that ~22s window, 4 of 12 tracks moved
independently, in both directions, to non-round values:
| track | .bak (prior save) | .ardour (now) |
|---|---|---|
| Tidal 05 | -inf | **-18.5 dB** (came up) |
| Tidal 08 | -12.3 dB | **-inf** (went down) |
| Tidal 10 | -23.4 dB | **-10.5 dB** (came up) |
| Tidal 11 | -inf | **-16.1 dB** (came up) |
The other 8 tracks were unchanged across that same window. This is the fingerprint of a
human riding faders (LCXL, MIDI-learned per `check-mix.py`'s own docstring) live, not a
bug rewriting values on save or load — a corruption mechanism would be expected to act
uniformly or on a fixed trigger, not drift a random subset by arbitrary non-round
amounts every ~20 seconds.
**6. No structural correlate for "dead" vs "alive."** Checked mute (`MuteMaster
muted="0"` on all 12, always), routing (`reaches_master() == True` on all 12), route
`active="1"` on all 12, and record-enable (`None`/not set on all 12) — no difference
between the dead and alive groups on any of these axes, in any of the three snapshots.
Route `id=` attributes are identical across `.ardour`/`.ardour.bak` (170, 240, 380, 450,
520, 590, 660, 730, 800, 870, 940, 17945) — same 12 routes throughout, none recreated.
**7. `.history` has no gain entries at all.** 12 `<UndoTransaction>`s total, spanning
2026-05-22 through 2026-08-10 (`capture` and `move marker` only) — Ardour does not push
control-surface parameter changes through undo history, so this file can't date
individual fader moves. It does confirm nothing GUI-edited the gain since 08-10; all
movement since is consistent with control-surface (physical fader) input, which bypasses
undo by design.
## Sel (the shareable learning)
**Verdict: faithful restore of a save taken mid-motion — not automation override, not
active corruption.** The strongest single fact: the *set* of silent tracks changed
twice within one evening (once between PLN's report and this read, and again between the
`.bak` and current save 22 seconds apart), with different tracks moving by different,
non-round amounts in different directions. A code bug that zeroes faders would not
produce that texture — it would hit the same tracks, or all of them, or move them to a
uniform poisoned value. What's on disk is exactly what physical faders sitting at
whatever position they were in at the instant of `Session::save_state()` would produce.
Point 1 (automation state, the task's highest-priority check) is a clean, unambiguous
negative: `state="Off"`, `n_events=0`, on every route, every snapshot.
## Hameçon (hook)
"We've fixed the -inf bug four times" and there was never a bug — there's a session file
that photographs whatever the hands were doing at save-time, and four times the photo
landed mid-dip. Ardour is a faithful narrator; the story it's telling just isn't the one
being assumed.
## Sillage (what it unlocks)
Not a code fix. If this verdict holds up, the actionable surface is *when/what gets
saved and reloaded*, not the session format — e.g. never boot a set from a save taken
mid-performance, and/or have `check-mix.py` gate the *specific file about to be loaded*
before a set starts (it already exists and already does exactly this check; the gap is
procedural, not tooling). Not proposing that gate here since it wasn't evidenced by this
investigation, only flagging that the evidence points away from needing new code.
---
log: 025
title: "Probe, never assume the 192 kHz audit"
date: 2026-08-14
task: "#144 (192 kHz loudnorm defect audit)"
tags: [mastering, tooling, salvage, opal2026, montreuil26]
shareable: true
---
## Cap (what & why)
Task #144 established two silent format bugs in our mastering tool: `loudnorm`
leaves the render at 192 kHz unless `-ar` is forced, and `flac -c copy` keeps the
*source* file's STREAMINFO (so a header can claim the wrong duration/rate). Log
020 (2026-08-12) caught both on OPAL-26 the same afternoon. This pass audits
every released/candidate master under `Prod/` plus the live SoundCloud catalog
to see how far the 192 kHz defect actually spread, and whether anything already
public is affected. Done cold — `ffprobe` only, no re-encoding, no rig contact,
because PLN was performing live during the audit.
## Manœuvre (how)
`ffprobe -show_entries stream=sample_rate,bits_per_raw_sample,channels` (+ format
duration) across every FLAC/WAV/MP3 under the Opal26 and Montreuil26 master
trees, the Take95 Bandcamp candidate, and — critically — `sc_catalog/audio/`,
which holds masters *recovered from live SoundCloud* (numeric SC track-ID
filename prefixes = confirmed public). Cross-checked local pre-upload masters
against their SC-recovered counterparts to see whether the bug travelled.
Also diffed per-track durations against plausible track length to re-test the
log-020 "FLAC header claims the whole set" bug specifically.
## Prise (findings / artifacts)
**Verdict table**
| release | files | sample rate(s) | bit depth | verdict |
|---|---|---|---|---|
| Take95 (`Tidal/output/Take95/`, master + 11 tracks + 11 mp3) | 23 | 48000 Hz, uniform | 24-bit (flac) | **clean**`master.log` explicitly confirms "2 ch @ 48000 Hz" |
| Opal26_master `tracks/`, `tracks_v3/`, `tracks_v4_club/`, `tracks_v4_streaming/` | 60 | 48000 Hz, uniform | 24-bit | **clean** — current candidates |
| Opal26_master top-level, current (`archive_24bit.wav`, `SunsetForest_club.flac`, `SunsetForest_streaming_48k.flac`, `SunsetForest_v4_club.flac`, `SunsetForest_v4_streaming.flac`) | 5 | 48000 Hz | 24-bit | **clean** |
| Opal26_master top-level, superseded (`premaster_14.flac`, `SunsetForest_streaming.flac`) | 2 | **192000 Hz** | 24-bit | **defective, but superseded** — both have a corrected sibling on disk with a later mtime; risk is only "grabbed by mistake later" |
| Montreuil26_master top-level (`club`, `streaming`, `streaming_filled`, `streaming_final`) | 4 | **192000 Hz, uniform** | 24-bit | **defective — the only version on disk**, no fixed sibling exists |
| Montreuil26_master `tracks_bandcamp/` (15 per-track splits, Bandcamp-ready) | 15 | **192000 Hz, uniform** | 24-bit | **defective — Bandcamp release candidate**, needs re-render before shipping |
| `sc_catalog/audio` — Live39c3 House of Tea Party (SC id 2238245696) | 1 | **192000 Hz** | 24-bit | **defective — CONFIRMED PUBLIC on SoundCloud right now** |
| `sc_catalog/audio` — LiveMontreuil Algorave III (SC id 2326200872) | 1 | **192000 Hz** | 24-bit | **defective — CONFIRMED PUBLIC on SoundCloud right now** |
| `sc_catalog/audio` — remaining 33 flac/mp3 files | 33 | 44100 or 48000 Hz, each internally consistent | 16- or 24-bit (era-dependent) | **clean** |
| Prod top-level local masters (`39c3_HoT_master.flac`, `..._master_crowd.flac`, `39c3_TOILETRAVE_master.flac`) | 3 | **192000 Hz** | 24-bit | **defective — the local source of the confirmed-public bug** |
**Root-cause confirmation**: `39c3_HoT_master.flac` (local, 192 kHz) matches the
publicly-live `2238245696_Live39c3_House_of_Tea_Party.flac` (also 192 kHz) exactly
— the bug was baked in locally and shipped as-is. The `39c3_TOILETRAVE_master.flac`
local render is also 192 kHz, but its SC upload happened to go out as MP3
(2240961797, 44100 Hz) — MP3 structurally can't carry 192 kHz, so that one track
escaped by accident of format, not by the pipeline being fixed.
**Within-release consistency**: no mixed-rate album found. Montreuil26 is
uniformly 192 kHz (masters + all 15 tracks) — wrong everywhere, but not a
partial/mixed defect. Opal26's *current* candidates are uniformly 48 kHz; the
192 kHz files there are dead-but-not-deleted intermediates from the Aug 12
incident, sitting next to their fixed replacements.
**Header-lie cross-check (the `flac -c copy` half of #144)**: re-tested by
diffing per-track durations against plausible track length instead of trusting
a single global read. Opal26 tracks (e.g. "01" at 524–530s vs "15" at
225–252s across all four track dirs) and Montreuil26 tracks (362s vs 424s)
each report a distinct, plausible per-track duration — none show the "whole
set" duration log 020 caught. **That half of the bug looks fixed in every file
checked this pass**; only the sample-rate half is still live.
**Bit depth / channel sanity**: no mono-should-be-stereo, no 8-bit, nothing
truncated. The 16-vs-24-bit split in `sc_catalog` tracks by era (older
SoundCloud uploads are 16-bit, current pipeline outputs 24-bit) — not a defect.
**Hard-clipping (OPAL-26 precedent)**: not re-tested this pass — confirming
clip state needs a decode-based peak scan, which is more CPU than a STREAMINFO
read and was explicitly out of scope while PLN is performing. No new evidence
either way; flagged as a follow-up, not a finding.
## Sel (the shareable learning)
The 192 kHz bug wasn't a one-off — it's the tool's *default* behavior any time
`-ar` isn't threaded through, and it reproduced on at least three separate
render runs after the one log 020 already caught and "fixed." Two of those
renders are sitting live on SoundCloud today. The fix that matters isn't
re-rendering the two known files — it's making `-ar 48000` (or whatever the
target is) impossible to omit in the shared render path, because every
standalone `ffmpeg`/`sox` invocation that bypasses it will reintroduce the same
bug with zero error output.
## Prioritised action list
1. **Re-render and re-upload** (already public, confirmed defective):
- Live39c3 House of Tea Party (SC 2238245696) — local source is
`Prod/39c3_HoT_master.flac`
- LiveMontreuil Algorave III (SC 2326200872) — local source not yet
identified precisely in this pass (see gaps below)
2. **Re-render before shipping** (not yet public, but the only copy on disk is
defective): Montreuil26_master's 4 top-level masters + all 15
`tracks_bandcamp/` files — this is the active Bandcamp release candidate.
3. **No action needed**: Opal26_master's current tracks (`tracks_v4_*`) and
top-level masters are already clean; the 192 kHz siblings there
(`premaster_14.flac`, `SunsetForest_streaming.flac`) are dead weight —
worth deleting so nobody grabs the wrong one later, but not a release risk
as-is. Take95 is clean end to end.
## Gaps — what this pass could NOT confirm
- Did not locate the exact local render that produced the public
`LiveMontreuil_Algorave_III` (SC 2326200872) upload — `sc_catalog` only holds
the recovered-from-SC copy, and it doesn't obviously correspond 1:1 to the
in-progress `Montreuil26_master/` Bandcamp package (different pipeline, README
there describes work still in the mastering-tooling build-out per task #009,
not a shipped release). Whether that SC upload predates the current
`Montreuil26_master/` rebuild, or was made from it, is unconfirmed.
- Did not check `content/lives/2026/` for either OPAL or Montreuil — the
directory is empty, so neither gig has a canonical published-metadata entry
yet on the site; treating both as pre-release for the *website* even though
the SC-recovered file proves at least one Montreuil recording is public
*somewhere*.
- Did not probe the `*_data/eff/*` per-orbit stem renders under `Prod/`
(dozens of directories, not final masters) or the remaining ~25 `sc_catalog`
mp3 files individually beyond the one spot-check — mp3's rate ceiling makes
this defect structurally impossible there, so risk is low, but it is
unverified, not verified-clean.
- Did not re-run the FLAC frame-level clipping/peak check from log 020 on any
file in this pass — decode-based, deliberately skipped given the live-rig
constraint.
- Could not confirm whether Take95 was ever actually pushed to Bandcamp (found
no upload log); it exists as a clean local candidate either way.
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