-
fix(release): the shelf is one namespace and a live catalogue reuses titles · 34b02925
Caught before --go, on the last check I nearly skipped. The CosmicSet plan resolved four of its fifteen permalinks onto tracks Opal had already uploaded: /you-my-sunshine, /take-five-drops, /piment-bresilien, /eh-ouais-je-funk. Of course it did — those are the same scores, played at both gigs a fortnight apart, and a permalink is derived from the title. What makes this worth a gate rather than a fix is the failure mode. SoundCloud is idempotent by permalink and the uploader treats a taken permalink as "already done" — correct for resuming an interrupted 1.4 GB run, catastrophic for a different recording of the same track. So the upload would NOT have errored. It would have reported success with four tracks missing from the release, or, with --overwrite, replaced Opal's audio with CosmicFest's. Neither is visible from the terminal that ran it. `feedback_absence_needs_proof`: a release that is quietly short looks exactly like a release that is complete. check_permalinks.py resolves a plan against the live account and sorts every permalink into FREE / already-up-as-this-same-audio / COLLISION, using duration as the discriminator because it is the one property that survives SoundCloud's transcode and is already in the plan. A collision exits 1. Verified both ways: it fails the un-suffixed plan naming all four real collisions, and passes the suffixed one 15/15 free. Its shelf query carries access=playable,preview,blocked because scform.py's own notes record that private tracks are omitted without it — and an audition release is private by definition, so the gate would have called every permalink free. build_release_plan.py gains --permalink-suffix to fix the cause, so a gig's permalinks are scoped to the gig and no future pair of sets can collide. Two things about --force, which this release is the first to actually need (the signoff cannot precede the upload when SoundCloud is where PLN listens): * it never worked. The no-signoff branch did `return problems` before reaching the override, so the flag documented as "emit even without a valid ear signoff" could only override a STALE signoff, never a missing one. The early return is gone and both problems now reach the same override. * it now demands --why, and records the reason, the timestamp and a do-not-flip-public warning in the plan's own `_UNSIGNED` block. A terminal warning scrolls away; the JSON is what the uploader reads. An override with no stated reason is indistinguishable from an approved release two weeks later, and the gate exists precisely so nobody has to remember. Left alone deliberately: the plan cannot tell private from public — the uploader's --sharing flag decides that — so _UNSIGNED documents rather than enforces.PLN (Algolia) authored34b02925
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| api | Loading commit data... | |
| escales | Loading commit data... | |
| manifeste | Loading commit data... | |
| semaphore | Loading commit data... | |
| tasks | Loading commit data... | |
| tide-table | Loading commit data... | |
| ui | Loading commit data... | |
| .gitignore | Loading commit data... | |
| DESIGN.md | Loading commit data... | |
| PRODUCT.md | Loading commit data... | |
| README.md | Loading commit data... | |
| ardour_faders.json | Loading commit data... | |
| serve.py | Loading commit data... | |
| setlist_opal2026.txt | Loading commit data... |