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.
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| _corpus_cache | Loading commit data... | |
| judge_specs | Loading commit data... | |
| punkachien | Loading commit data... | |
| sources | Loading commit data... | |
| tests | Loading commit data... | |
| .gitignore | Loading commit data... | |
| README.md | Loading commit data... | |
| ardour_stem_export.py | Loading commit data... | |
| audio_lens.py | Loading commit data... | |
| backlog_setlists.json | Loading commit data... | |
| backlog_setlists.py | Loading commit data... | |
| boundaries_take89_validated.json | Loading commit data... | |
| boundary_bleed.py | Loading commit data... | |
| boundary_bleed_take89.json | Loading commit data... | |
| build_catalog.py | Loading commit data... | |
| build_catalog_view.py | Loading commit data... | |
| build_corpus.py | Loading commit data... | |
| build_eda.py | Loading commit data... | |
| build_finder_eval.py | Loading commit data... | |
| build_judge_set.py | Loading commit data... | |
| build_landing.py | Loading commit data... | |
| build_presence.py | Loading commit data... | |
| build_provenance.py | Loading commit data... | |
| build_tierlist.py | Loading commit data... | |
| build_track_recording_map.py | Loading commit data... | |
| build_triage_ui.py | Loading commit data... | |
| build_unwrapped.py | Loading commit data... | |
| calibration.json | Loading commit data... | |
| calibration.whole-mix.json | Loading commit data... | |
| catalog.authored.yaml | Loading commit data... | |
| catalog.generated.json | Loading commit data... | |
| catalog.yaml | Loading commit data... | |
| catalog_view.json | Loading commit data... | |
| corpus-viz-plan.md | Loading commit data... | |
| corpus.html | Loading commit data... | |
| eda-grounding-plan.md | Loading commit data... | |
| eda_Take14.json | Loading commit data... | |
| eda_Take15.json | Loading commit data... | |
| eda_Take16.json | Loading commit data... | |
| eda_Take17.json | Loading commit data... | |
| eda_Take18.json | Loading commit data... | |
| eda_Take19.json | Loading commit data... | |
| eda_Take20.json | Loading commit data... | |
| eda_Take21.json | Loading commit data... | |
| eda_Take22.json | Loading commit data... | |
| eda_Take24.json | Loading commit data... | |
| eda_Take28.json | Loading commit data... | |
| eda_Take29.json | Loading commit data... | |
| eda_Take3.json | Loading commit data... | |
| eda_Take30.json | Loading commit data... | |
| eda_Take32.json | Loading commit data... | |
| eda_Take33.json | Loading commit data... | |
| eda_Take34.json | Loading commit data... | |
| eda_Take35.json | Loading commit data... | |
| eda_Take36.json | Loading commit data... | |
| eda_Take37.json | Loading commit data... | |
| eda_Take38.json | Loading commit data... | |
| eda_Take39.json | Loading commit data... | |
| eda_Take4.json | Loading commit data... | |
| eda_Take40.json | Loading commit data... | |
| eda_Take42.json | Loading commit data... | |
| eda_Take45.json | Loading commit data... | |
| eda_Take49.json | Loading commit data... | |
| eda_Take5.json | Loading commit data... | |
| eda_Take53.json | Loading commit data... | |
| eda_Take54.json | Loading commit data... | |
| eda_Take55.json | Loading commit data... | |
| eda_Take58.json | Loading commit data... | |
| eda_Take59.json | Loading commit data... | |
| eda_Take61.json | Loading commit data... | |
| eda_Take62.json | Loading commit data... | |
| eda_Take63.json | Loading commit data... | |
| eda_Take64.json | Loading commit data... | |
| eda_Take65.json | Loading commit data... | |
| eda_Take66.json | Loading commit data... | |
| eda_Take67.json | Loading commit data... | |
| eda_Take68.json | Loading commit data... | |
| eda_Take70.json | Loading commit data... | |
| eda_Take71.json | Loading commit data... | |
| eda_Take72.json | Loading commit data... | |
| eda_Take73.json | Loading commit data... | |
| eda_Take74.json | Loading commit data... | |
| eda_Take75.json | Loading commit data... | |
| eda_Take76.json | Loading commit data... | |
| eda_Take77.json | Loading commit data... | |
| eda_Take79.json | Loading commit data... | |
| eda_Take8.json | Loading commit data... | |
| eda_Take80.json | Loading commit data... | |
| eda_Take82.json | Loading commit data... | |
| eda_Take83.json | Loading commit data... | |
| eda_Take84.json | Loading commit data... | |
| eda_Take85.json | Loading commit data... | |
| eda_Take86.json | Loading commit data... | |
| eda_Take87.json | Loading commit data... | |
| eda_Take88.json | Loading commit data... | |
| eda_Take89.json | Loading commit data... | |
| eda_Take90.json | Loading commit data... | |
| eda_report.json | Loading commit data... | |
| eda_status.json | Loading commit data... | |
| edl_render.py | Loading commit data... | |
| emotion_calibrate.py | Loading commit data... | |
| emotion_corpus.py | Loading commit data... | |
| emotion_corpus_gt.json | Loading commit data... | |
| emotion_corpus_merge.py | Loading commit data... | |
| emotion_drift.json | Loading commit data... | |
| emotion_drift.py | Loading commit data... | |
| emotion_ontology.py | Loading commit data... | |
| emotion_ontology_critique.json | Loading commit data... | |
| emotion_overnight.py | Loading commit data... | |
| emotion_timeline.py | Loading commit data... | |
| feature_eda.json | Loading commit data... | |
| feature_eda.py | Loading commit data... | |
| finder_eval.json | Loading commit data... | |
| finder_eval_chops.json | Loading commit data... | |
| foundry_stems.py | Loading commit data... | |
| gap-report.md | Loading commit data... | |
| index.html | Loading commit data... | |
| landing.json | Loading commit data... | |
| locate-matrix.md | Loading commit data... | |
| master_align.json | Loading commit data... | |
| master_edl_take89.json | Loading commit data... | |
| models.py | Loading commit data... | |
| pattern_ngrams.py | Loading commit data... | |
| pattern_registry.json | Loading commit data... | |
| performance_notes.md | Loading commit data... | |
| presence.authored.yaml | Loading commit data... | |
| presence.json | Loading commit data... | |
| provenance.json | Loading commit data... | |
| release_candidates.json | Loading commit data... | |
| release_priority.md | Loading commit data... | |
| resplit_montreuil.py | Loading commit data... | |
| sample_classify.py | Loading commit data... | |
| sample_families.json | Loading commit data... | |
| sample_features.json | Loading commit data... | |
| sample_features.py | Loading commit data... | |
| sample_meta.py | Loading commit data... | |
| sample_ontology.py | Loading commit data... | |
| sample_packs.json | Loading commit data... | |
| sample_packs.py | Loading commit data... | |
| sample_panns.py | Loading commit data... | |
| sample_resolve.py | Loading commit data... | |
| sample_semantics.py | Loading commit data... | |
| sample_tfidf.json | Loading commit data... | |
| seed_edl_take89.py | Loading commit data... | |
| semantics_embeds.npz | Loading commit data... | |
| stemmap_opal26.json | Loading commit data... | |
| take-compare.html | Loading commit data... | |
| take_gig_map.md | Loading commit data... | |
| tidal_score.py | Loading commit data... | |
| tide.py | Loading commit data... | |
| tide_eda.py | Loading commit data... | |
| tierlist.html | Loading commit data... | |
| tierlist.json | Loading commit data... | |
| tokens.json | Loading commit data... | |
| track_recording_map.json | Loading commit data... | |
| triage.csv | Loading commit data... | |
| triage.html | Loading commit data... | |
| triangle.html | Loading commit data... | |
| unwrapped.html | Loading commit data... | |
| unwrapped.json | Loading commit data... |