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
  • ui
  • public
  • judge-opal-festival-2026.json
Find file
BlameHistoryPermalink
  • PLN (Algolia)'s avatar
    feat(judge): a set-judge — 15 tracks, a verdict each, one decisions.json · 9c6a24cb
    PLN: "make me a tiny spa to see the heads, soundwaves and metadata of what dX
    are running at that moment / what samples/synth they are, so i can go/nogo /
    comment each, then download decisions.json. its a reusable tool tbh we do this
    flow often."
    
    That flow was being run in a music player with the answers landing in a chat
    log, so three weeks later nobody could say why a track was cut. Ear-feedback is
    the scarcest input in this pipeline and it was the only one with no artifact.
    
    Built on the existing A/B Judge rather than beside it: OrbitRail now takes
    binS + orbits instead of a whole Take, so one rail serves both UIs. Shapes live
    in models.py and the TS is regenerated from them, as before.
    
    FIFTEEN 16-SECOND HEADS ARE FIFTEEN INTROS. The first build showed 1-4 orbits
    per track and I nearly shipped that as a finding. The heads are bit-exact with
    each track's first 16s (r=1.0000 by correlation against the full track), so the
    sparse lanes were TRUE and completely misleading — these tracks run 7-10 orbits
    once they open. A ship/cut call on an intro is a call on the wrong evidence.
    Activity now spans the whole track; the head stays as a running-order scan,
    with a banner saying exactly what it is.
    
    PEAKS ARE THE FEATURE, NOT AN OPTIMISATION. Without precomputed peaks
    wavesurfer downloads and decodes the entire file before drawing one pixel —
    102 MB per track here. Blank screen at the desk, unusable over wifi on a phone,
    which is where the mono-compat check happens. But passing `peaks` + `url`
    together makes wavesurfer treat the track as pre-decoded and never wire up
    playback: waveform draws, transport looks alive, play throws "No audio loaded".
    Both `tsc -b` and `vite build` were green through all of that. Fixed by owning
    the <audio> element via `media:`.
    
    THREE VERIFICATION PROBES IN A ROW TESTED NOTHING, each green or red for
    reasons unrelated to the app:
      1. fetch(document.querySelector('audio').src) asserting 206 — there was no
         <audio> in the light DOM, so it fetched the empty string, got THE PAGE,
         and read a 206 from somewhere else. It passed.
      2. querySelectorAll('li canvas') — wavesurfer renders into a SHADOW ROOT.
         Playwright's selectors pierce it; querySelector inside evaluate does not.
         It failed while the waveform drew perfectly.
      3. A tally assertion matching "2 judged" against text reading "2/15 judged".
    The probe that works asserts what PLN can see: the clock advances and the
    button flips to Pause. Prefer the assertion a human could make by looking.
    
    Two bugs fell out of reusing existing parts, which is the argument for reusing
    existing parts:
      - classify_family filed vec1_claps, drumtraks, realclaps, clubkick and 808bd
        under MELODIC — it matched perc names by exact-match or prefix, and in
        these scores the perc word is a suffix or an underscore token. A rail that
        shows claps as melody is worse than no rail. Widened to suffix + token
        matching; the test pins that cpluck, dropbass and snippet still must NOT
        match, since those collisions are why exact-matching existed.
      - mmss() padded a spurious zero onto every sub-10s time ("0:002.2"), off by
        one since it was written, in the shared helper. Caught by the smoke test
        reading the clock back.
    
    Titles carried markdown into the release path: tracks.json holds
    "There's **Something About Drums**" because backlog.md is prose, and those
    strings flow decisions.json -> upload metadata. Emphasis stripped; "<3" and the
    shouting caps are PLN's and stay.
    
    Spec-driven so the next gig is a copy of a JSON file, not a code change. The
    master->stem map is explicit numbers (keeps summing to 4786.370s, the master's
    duration to the millisecond) and the builder asserts it rather than trusting
    it. audio-mounts.json is read by BOTH vite's dev middleware and serve.py, so a
    URL that works in dev works on the phone over LAN.
    
    Validated: 11/11 smoke green in dev AND against serve.py on the built dist;
    22 classifier tests; path traversal out of an audio mount returns 404.
    PLN (Algolia) authored Aug 16, 2026
    9c6a24cb
judge-opal-festival-2026.json 229 KB
EditWeb IDE
×

Replace judge-opal-festival-2026.json

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.