Commit 368747eb by PLN (Algolia)

docs(archive): A3-b — the OPAL SoundCloud diagnosis, for the long term

Structured archive entry for the session, written as standalone learning rather
than a board line. Fourteen findings, of which the four that will outlive the
task: SoundCloud accumulates generations and never replaces (so a stale upload
is permanent until deleted); the wrong cut wore the cover art, which is why
PLN's ear beat every tool to it; the 'matches to the second' tolerance was the
bug, because full_duration is millisecond-exact and a loose window made two
different cuts identical; and roll call cannot find a stray, because a check
that only looks where it expects a thing never discovers it elsewhere.

Written for a reader months out with no memory of any of it.
parent 33794e36
...@@ -1814,3 +1814,91 @@ suite 112 → 128. ...@@ -1814,3 +1814,91 @@ suite 112 → 128.
**Deps.** Built on #20's `engine/stempack.py`; produced the data #21 browses. Unblocks #22 **Deps.** Built on #20's `engine/stempack.py`; produced the data #21 browses. Unblocks #22
(the acapellas, instrumentals and ~27 demucs catches) with no new code. (the acapellas, instrumentals and ~27 demucs catches) with no new code.
## A3-b — The OPAL SoundCloud cuts: a stale generation, not a bad cut (2026-09-05)
**Description.** PLN: *"on soundcloud i see our private cuts of OPAL and they are
badly cut begin/end unaligbed we need to reupload and save their images tho wheres
out catalog at?"* Diagnose why the ear-verified v4 release sounds wrong on the
account, preserve the artwork before touching anything, and report where the
catalog stands. The board's standing theory was that `/take-five-drops` had
uploaded "24 s short" while every other track "matched to the second".
**Done.**
- `master sc pull --out ~/Work/Sound/Prod/sc_pull_2026-09-05 --artwork` — read-only,
token still live, no login. 132 tracks, 10 playlists, **101 artwork originals**.
Also the state recovery: no `sc_state.json` had ever been written.
- `armada/tide-table/sc_generation_lens.py` (`fe8ec16`) — roll call + whole-account
stray scan, duration-keyed, date-gated, plan-authoritative titles.
- `armada/tide-table/build_delete_manifest.py` (`bd3a680`) and
`master sc delete --manifest` in tidal-ears (`ae1ca0c`, merged `ab3285b`) — the
"explicit, separate call" `scwrite.py` had promised since August. Dry-run
default, identity verified in both directions, public refused, per-entry reason
required, batch capped before any API call, full receipt. **Dry run: 14
deletable, 0 refused**, audited independently. Nothing deleted — `--go` is PLN's.
- Catalog rebuilt (`f1fa484`): generated 73→**81 tracks**, 23→**25 gigs**, now
identical to the view, OPAL and CosmicFest present.
- OPAL `tracks.json` regenerated from v4 (www `5654047`) — was off by up to 21 s.
- `tools/ardour_session.py` + check-mix fix (`27f2351`); tree triage 39→5 paths
(`039ff57`, `71516e2`, `a14aee7`, `f5d3461`, `ec9c7d4`, `1b03cb0`); CLAUDE.md
path fix (`577767a`); log 040 + resume points (`33794e3`).
**Learnings.**
- **SoundCloud accumulates generations.** It will not replace the audio behind a
permalink (paid feature) and our uploader is idempotent by permalink, so every
re-upload under a fresh slug ADDS a copy. Nothing ever replaces anything. The
entire Aug-12 first cut of OPAL-26 was still up — 15 tracks — beside the 6
correct v4 ones, under junk slugs (`/opal26-wap`, `/12-mafia-12`,
`/ceci-nest-pas-une-bombe`).
- **The wrong cut wore the cover art.** 8 of the 14 stale uploads had artwork;
none of the 6 correct v4 tracks did. The superseded audio looked *finished* and
the correct audio looked like drafts. PLN's ear was reading the artwork. A
completeness signal attaches to whatever was last fussed over — usually the
older thing, because it had more time.
- **`/take-five-drops` was never "24 s short".** It was 417.000 s — to the
millisecond, the Aug-12 cut. Not truncation, a different generation. The board
had been carrying a plausible wrong cause for three weeks.
- **The tolerance was the bug.** SoundCloud's `full_duration` reproduces the
source **to the millisecond** (477.600 → 477.600), so the working tolerance is
0.05 s, not the seconds a transcode seems to deserve. At ±1.5 s the Aug-12 and
v4 cuts of `/wap` (361.0 vs 361.6) and `/perfect` (315.0 vs 314.6) are the same
track — exactly how six stale uploads passed an August duration check.
- **Roll call cannot find a stray.** Checking each *expected* permalink
structurally cannot see a stale cut under a different slug; the whole-account
scan is what found 13 of the 14. A check that only looks where it expects a
thing can never discover that thing somewhere else.
- **A duration collision is not provenance.** `/au-revoir-lord-toyota` (2020) and
`/saria-demo` (2025) matched OPAL cuts to 50 ms by chance on a 132-track
account. Strays are now hard-gated on a date floor and the discards are printed.
A coincidence must never reach a delete manifest.
- **Refuse to re-render before measuring.** The obvious move on "the cuts are bad"
is to re-cut. All 14 v4 FLACs matched `segments_v4.json` to the millisecond
(CRIME's 2 s rest and REVOLUTION's reverb tail included), and the ear file's
mtime postdating the renders was the *signoff record* being written, not a late
boundary edit — checked specifically because it looked like a smoking gun.
- **Filenames are not authoritative for a permalink.** `Perfect <3` uploads to
`/perfect-3`, so a filename-derived slug reported two live tracks as NOT
UPLOADED. Titles must come from the release plan.
- **`AS_OF` was a hardcoded literal.** `build_catalog_view.py` re-stamped
`"2026-06-06"` on every rebuild forever. A generated artifact that lies about
its own freshness is worse than a stale one, because it defeats the check.
- **`/me`'s `track_count` counts PUBLIC tracks only** — 70 reported against 132
held. Any tool sizing a walk from it under-counts by 47%.
- **A generator compared by track number across a re-cut.** The Aug-12 set had 15
tracks and v4 has 14, so dropping *Desire* renumbered *REVOLUTION* 15→14 and the
manifest confidently reported "#14 Desire, 388.1s vs 205.6s" — REVOLUTION's
length. Key on identity, never on position, across generations.
- **`git push origin master` from a non-master HEAD is a silent no-op.** A
concurrent session moved this shared checkout to its own branch between two of
my commits; four landed there, and the push pushed the already-current local
`master` ref, printed nothing, exited 0. Recovered by worktree cherry-pick. The
worktree rule for shared repos has no orchestrator exemption.
- **Assembling a check revalidates it.** check-mix went from *unrunnable* straight
to *failing*: Tidal 07/08/10/12 at -inf dB in the saved session, the third
recurrence of that bug. A closed fader and a silent instrument are identical on
a post-fader meter.
**Deps.** Closes the diagnosis half of A3 and supersedes its "two known defects"
note. Blocks on PLN for `--go` and for `/desire`. Unblocks the 8 remaining uploads,
then OPAL's empty `audio:` field on the website and the catalog release links
behind it. `sc_generation_lens.py` is reusable and CosmicFest will need it.
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