Commit d81816a6 by PLN (Algolia)

docs(board): the OPAL SoundCloud cuts are the Aug-12 generation, not v4

PLN opened the session hearing badly-cut begin/end on the private OPAL
uploads. Measured all three render generations against what the board
recorded on the account: /take-five-drops sits at 6:57 = 417 s, which is
exactly the Aug-12 first cut — four days and two boundary revisions before
the ear-verified v4. The complaint had a mechanical cause.

Ruled out before believing anything: tracks_v4_streaming matches
segments_v4.json to the millisecond on all 14 (CRIME's 2s rest and
REVOLUTION's reverb tail included), the upload plan's titles/files/durations
are aligned and exact, and the ear file's 19:33 mtime is the signoff record
being written, not a later boundary edit. Nothing needs re-cutting; the
approved audio is already on disk. This is a re-upload problem.

Two things stand in the way and one of them is PLN's call: SCW.delete() is
hard-gated to the test namespace so we cannot remove our own stale uploads,
and SoundCloud skips rather than replaces an existing permalink. Also: no
sc_state.json was ever written, so the account is the only record of what
landed — sc pull --artwork recovers ids, permalinks, durations AND the covers
PLN asked to save, read-only, in one pass.

Plus the catalog answer he asked for (generated.json is 2 gigs stale behind
the view, 14 gigs uncatalogued), www's OPAL tracks.json still on segments_v3
where Slopmotion reads it, the CLAUDE.md next/ path that no longer exists,
and two stale-opens git says already shipped.
parent b792c6f2
...@@ -1511,3 +1511,151 @@ with track/eval records). ...@@ -1511,3 +1511,151 @@ with track/eval records).
~150%. (It's a GTK2/XWayland app; Plasma's global zoom can't reach it sharply.) ~150%. (It's a GTK2/XWayland app; Plasma's global zoom can't reach it sharply.)
- [ ] **veridis_quo taste calls** — superhammond loaded? melody `|+ note 12`? breaks - [ ] **veridis_quo taste calls** — superhammond loaded? melody `|+ note 12`? breaks
`loopAt 2` vs `1`? (also listed above) `loopAt 2` vs `1`? (also listed above)
---
## AMENDMENT — 2026-09-05 (session 2), the SoundCloud cuts are a STALE GENERATION
PLN, opening the session: *"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?"* — a taste complaint, and per `feedback_taste_complaint_is_a_bug_report`
it had a mechanical cause. It does.
### 🔴 THE FINDING — the uploads are not the audio PLN signed off
Measured this session, three render generations of the same 15 cuts:
| # | title | `tracks/` **Aug 12** | `tracks_v3/` Aug 13 | `tracks_v4_streaming/` Aug 16 |
|---|---|---|---|---|
| 01 | Ceci n'est pas Une Bombe | 524.0 | 529.7 | **528.9** |
| 02 | WAP | 361.0 | 358.6 | **361.6** |
| 03 | There's Something About Drums | 213.0 | 224.0 | **225.4** |
| 04 | Am i Doing it Right | 433.0 | 444.3 | **431.0** |
| 05 | You My Sunshine | 253.0 | 239.4 | **258.7** |
| 06 | Take five Drops | **417.0** | 429.7 | **440.7** |
| 07 | Piment Bresilien | 506.0 | 492.2 | **477.6** |
| 08 | Eh ouais je Funk | 187.0 | 234.4 | **228.0** |
| 09 | Perfect | 315.0 | 297.9 | **314.6** |
| 10 | Gimme Acid | 309.0 | 307.9 | **288.3** |
| 11 | Ghosts in the Toilets | 154.0 | 121.4 | **124.4** |
| 12 | Mafia | 191.0 | 207.5 | **205.5** |
| 13 | Vague de CRIME | 279.0 | 289.6 | **271.1** |
| 14 | Desire | 388.1 | 367.4 | *(cut — #14 is now REVOLUTION, 205.6)* |
| 15 | REVOLUTION | 252.3 | 225.2 | — |
The board recorded `/take-five-drops` on SoundCloud at **6:57 = 417 s**. That is not
"24 s missing" from the v4 render — **it is exactly the Aug-12 first-generation cut**,
made before v3 and four days before the ear-verified v4. So at least one uploaded track
was never the approved audio at all, and "begin/end unaligned" is the correct description
of a cut taken from superseded boundaries.
⚠️ **The board's old note "every other track matches to the second" is now suspect**
it was a lens, not a verdict (`feedback_check_the_instrument_first`). Aug-12 and v4
coincide within ~1 s on #02 and #09, so a minute-resolution eyeball would have called
them equal; #07 (−28 s), #08 (−41 s), #11 (+30 s) would not have. Which generation each
of the 8 uploads actually carries is **unknown until the account is read**.
### ✅ RULED OUT — the local pipeline is clean, do not re-render blind
Measured, so nobody re-runs `apply_boundaries.py` on a hunch:
- `tracks_v4_streaming/` matches `segments_v4.json` **to the millisecond on all 14**,
including CRIME's `pad_end_s: 2.0` (269.05 → 271.05) and REVOLUTION's `reverb_tail_s`
(204.90 → 205.55). Every `edits` entry from the ear file is present in `segments_v4.json`.
- `release/opal26_plan.json` (15 entries) has titles, audio paths and `_duration_s`
aligned and exact — no off-by-one, no wrong file behind a title.
- The `opal26_boundaries_ear.json` mtime (19:33) postdating the renders (19:18) is **only
the `release_signoff` record being written**, not a later boundary edit. I checked this
before believing it; the renders are the signed-off audio.
- The continuous mix on SoundCloud (72:41 = 4361 s) **does** match `Opal26_SunsetForest_v4_streaming_nodrop.flac`
(4361.35 s). The full set is fine; it is the per-track uploads that are wrong.
**So: nothing needs re-cutting. The correct audio already exists on disk. This is a
re-UPLOAD problem, not a re-render problem.**
### 🔴 The blocker in the way of fixing it — we cannot delete our own uploads
- `SCW.delete()` (`tidal-ears/src/tidal_ears/scwrite.py:215`) is hard-gated by `_is_test()`
(`:64`) to the `zzz-tidalears-test-*` namespace and refuses everything else: *"Deleting
real catalog items needs an explicit, separate call"* — **and that call does not exist.**
- SoundCloud is idempotent by permalink, so a re-run **SKIPS** an existing track rather
than replacing it. The 8 stale uploads will not self-heal.
- **DECISION FOR PLN:** either he deletes the affected tracks in the SoundCloud UI, or we
build the gated delete — allowlist predicate seeded from the exact permalink list in
`opal26_plan.json`, nothing else reachable by construction (the standing rule in A3-old).
### 🟡 The artwork PLN asked to save — the tool already exists, and it is read-only
- `sc pull --out <dir> --artwork` (`tidal-ears/src/tidal_ears/sc.py`, `cmd_pull` + `art_original()`)
walks the account and downloads original-resolution covers. **This is also the state
recovery**: it returns per-track id, permalink and `duration` in one pass.
- It has to run **before** any delete, and it is the only thing that can answer which
generation each upload carries.
- **No `sc_state.json` exists anywhere on disk** (filesystem-wide search, zero hits) —
`form-album --state` was never passed, or the file was dropped. SoundCloud itself is
currently the *only* record of what landed. Pass `--state` on every future run.
- The plan carries `"artwork": null` on every entry, so the covers PLN sees were set
outside our tooling (SC web UI). Re-attaching them afterwards goes through `scwrite.py`'s
`sc album` PUT path — `scform.py` has no artwork verb.
- Unresolved board reference: the 2026-08-30 cluster table says "SC re-upload (6 artworks)"
with no expansion anywhere. `sc pull` settles what it meant.
### 📍 Where the catalog is at (PLN's second question, audited this session)
| artifact | state |
|---|---|
| `catalog.yaml` | ⚰️ **DEPRECATED** in its own header since 2026-06-06 |
| `catalog.authored.yaml` | hand-maintained overlay, **7 tracks** annotated, 2026-06-06 |
| `catalog_view.json` | current: **81 tracks / 25 gigs / 63 takes**, committed 2026-09-02 — but its internal `as_of` field still reads `2026-06-06` (never stamped on regen) |
| `catalog.generated.json` | 🔴 **STALE — 73 tracks / 23 gigs, committed 2026-06-23, never rebuilt.** Missing opal-festival-2026 and cosmicfest-2026 entirely |
Fix is two commands in order (`build_catalog_view.py``build_catalog.py`; the view must
exist first) plus stamping `as_of`. Neither track schema carries audio/video/archive links —
that concept lived only in the deprecated `catalog.yaml`. Both 2026 gig pages have
`video/audio/archive: ""`, correctly, because nothing is released yet.
🟡 **Coverage gap: 39 gig pages in `www/content/lives/` vs 25 gigs in the catalog — 14
uncatalogued**: algolia-fdlm-2022, mephisteuf, 38c3-chaos-music-club, 38c3-house-of-tea,
opal-festival-2024, toplap-solstice-2024, 39c3-house-of-tea, 39c3-toilet-rave,
algorave-lyon, ensad, opal-festival-2025, toplap-fromscratch-2025, ete-surprise, le-vortex.
(Per-year: 2022:2 · 2023:4 · 2024:14 · 2025:14 · 2026:5.)
📝 **CLAUDE.md path correction:** canonical gig metadata is `../../Web/www/content/lives/{year}/{slug}.md`.
The `next/` segment CLAUDE.md still names **does not exist** — it went away with the App
Router migration. Anyone following the documented path today gets a false "not found",
which is how `feedback_stale_read_makes_write_destructive` starts.
### 🔴 www's OPAL `tracks.json` is one boundary-generation behind too
Last touched `62cc2b0` (2026-08-14): *"OPAL tracks.json carried the old boundaries, off by
up to 50 s"* — regenerated from **`segments_v3.json`**. v4 landed 2026-08-16 and nobody
regenerated it. **Slopmotion reads this file to cut visuals to the set**, so EPIC G's
videos would inherit v3 timing. Regenerate from `segments_v4.json` via
`tools/gig-metadata.py` / `build_gig_tracksjson.py --meta`, from the same segments the
audio ships from.
### ✅ Stale-opens closed (board claimed pending; git says shipped)
- **tidal-ears `claude/scform-permalink-override`****MERGED to `main` and pushed**:
`f3af838` merge, with `a6da6f5` (one function decides a permalink) + `b89042f` (genre
listbox eats the next click). The branch is gone because it landed.
- **www `claude/cosmicfest-2026-metadata`****on `main` and pushed** (`origin/main...main`
= 0/0): `e8ba8d1` + `c4814d7`. Board said "local only, 2 commits".
### 🟡 Hygiene flags (not mine to commit)
- **www working tree is checked out on `claude/self-host`, 4 commits BEHIND `main`**, with
uncommitted edits to `app/parvagues/live/[slug]/page.js`, `app/parvagues/page.js`,
`components/parvagues/LiveEvent.js`, `next.config.js`, plus untracked `deploy/` and
`public/images/parvagues/logos.zip`. `content/lives/2026/cosmicfest-2026*` reads as
untracked **only** because self-host predates main's commit of it — nothing is lost.
PLN's call whether to rebase onto main. Do not `git checkout` anything here
(`feedback_volume_is_not_direction`).
- **Tidal: 39 modified/untracked paths.** Documentary debt first: three task logs from
2026-08-14 (`ardour-inf-forensics`, `corpus-triage`, `master-format-audit`) have sat
uncommitted for three weeks, against the "document as you go" rule and
`feedback_blog_archival`. Also uncommitted: the whole `mix/` toolbox, `tools/sweep_state.py`,
`armada/tide-table/kick_bass.py`, `bounds_opal-festival-2026.json`, `calibration.stem.json`,
`visuals/scenes/`, `live/collab/benoit/tous_ensemble.tidal`. Still parked and untouchable:
`piment_bresilien.tidal`, `sunny_side_up.tidal`.
- **No gig is scheduled.** OPAL 08-08 and CosmicSet 08-22 are both past; `armada/escales/`
holds no future escale. Release is the only shipping thread, so it gets the priority.
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