Skip to content

  • Projects
  • Groups
  • Snippets
  • Help
  • This project
    • Loading...
  • Sign in / Register
T
Tidal
  • Overview
    • Overview
    • Details
    • Activity
    • Cycle Analytics
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Charts
  • Issues 0
    • Issues 0
    • List
    • Board
    • Labels
    • Milestones
  • Merge Requests 0
    • Merge Requests 0
  • CI / CD
    • CI / CD
    • Pipelines
    • Jobs
    • Schedules
    • Charts
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Collapse sidebar
  • Activity
  • Graph
  • Charts
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
  • PLN
  • Tidal
  • Repository

Switch branch/tag
  • Tidal
  • armada
  • tide-table
  • check_permalinks.py
Find file
BlameHistoryPermalink
  • PLN (Algolia)'s avatar
    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) authored Sep 02, 2026
    34b02925
check_permalinks.py 4.96 KB
EditWeb IDE
×

Replace check_permalinks.py

Attach a file by drag & drop or click to upload


Cancel
A new branch will be created in your fork and a new merge request will be started.