Commit 60fbec90 by PLN (Algolia)

docs(archive): the set-judge, and what it found on first use

Archive entry for the set-judge build. The entry worth reading later is not the
tool but its first run: it was built to collect go/no-go verdicts and what it
actually established is that the OPAL-26 masters are fine and every middle CUT
is wrong — nine boundaries ear-verified in one sitting, with errors of 3 to 21
seconds that two automated detectors had certified clean.

Also records the four silent traps the build walked into (heads are intros; a
green build with dead playback; three verification probes that tested nothing;
two latent bugs surfaced by reusing existing components).
parent d683d786
...@@ -1522,3 +1522,45 @@ Commits 6ab09ea, 8d30740. 16/16 green on the live rig. ...@@ -1522,3 +1522,45 @@ Commits 6ab09ea, 8d30740. 16/16 green on the live rig.
**Deps.** Closes the assert+converge half of the "big red button". Feeds #116, #119. **Deps.** Closes the assert+converge half of the "big red button". Feeds #116, #119.
Left open: `--audio` integration, and #122 (does Tidal actually resume?). Left open: `--audio` integration, and #122 (does Tidal actually resume?).
---
## Set-judge — go/no-go a whole gig in one pass (2026-08-16)
**Description.** PLN: *"make me a tiny spa to see the heads, soundwaves and
metadata of what dX are runnning 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."* The call was being made in a music player with the
answers landing in a chat log, so three weeks later nobody could say why a track
was cut.
**Done.** `armada/tide-table/build_judge_set.py` (spec-driven; a new gig is a
copy of a JSON file), `armada/ui/judge.html` + `src/judge/`, `JudgeSet`/
`DecisionSet` in models.py with TS regenerated, `audio-mounts.json` shared by
vite and serve.py, an 11-assertion Playwright smoke. Commits `9c6a24c`,
`20b9151`, `73e9d79`. Narrative log: `armada/tasks/025-fifteen-intros-are-not-a-set.md`.
**Learnings.**
* **It found the thing it was built to find, on first use** — and the answer was
that the masters are fine and the CUTS are wrong. Nine boundaries were
ear-verified in one sitting; errors of 3, 4, 9, 10 and 21 s that two automated
detectors had certified as clean.
* **A 30-second head is an INTRO.** Heads are bit-exact with each track's first
16 s (r=1.0000), so "1–4 orbits per track" was true and useless — these tracks
run 7–10 orbits once open. Judging a set on heads judges fifteen intros.
* **Green build, dead feature.** `tsc -b` and `vite build` both passed while
pressing play threw `No audio loaded` — passing wavesurfer `peaks` + `url`
makes it treat a track as pre-decoded and never wire up playback.
* **Three verification probes in a row tested nothing**, each green or red for
reasons unrelated to the app (fetching the empty string and getting the page;
`querySelector` not piercing wavesurfer's shadow root; matching `"2 judged"`
against `"2/15 judged"`). The probe that works asserts what a human sees.
* Reusing existing components surfaced two latent bugs: `classify_family` filed
claps as Melodic, and `mmss()` had padded a spurious zero onto every sub-10 s
time since it was written.
* **Chain playback was the feature PLN asked for once he used it** — a per-track
list hides transitions, which for a livecoded set is the main thing to judge.
**Deps.** Unblocks #147/#152 (publish Sunset Forest). Spawned #177 (re-cut),
#178 (crossfade-blind detection), #180–#182 (the floor problem and HUD v2),
#183 (REVOLUTION mix).
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