-
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) authored9c6a24cb
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| Meter.tsx | Loading commit data... | |
| OrbitRail.tsx | Loading commit data... | |
| TakePanel.tsx | Loading commit data... | |
| WaveformPlayer.tsx | Loading commit data... |