Commit 7b74d8b3 by PLN (Algolia)

fix(bounds): a skipped seam carried PLN's best information, and the exporter threw it away

PLN: "wait you dont get the notes when i skip? DANG they have lots of info."

The exporter emitted skipped boundaries as bare integers:

    skipped: Object.entries(calls).filter(([, c]) => c.t === null).map(([k]) => Number(k))

so eight CosmicFest seams exported as `[2,4,9,10,15,16,17,18]` while the notes he
had typed into every one of them vanished. And a skip is not an absence of
judgement — it is usually a judgement that the SEAM is wrong, which is more
informative than confirming a cut time. What was lost included "theres no
blue_gold in this set, we're hearing do_it_right throughout", "there was no
gimme_acid in this performance", "theres no funk->piment transition! in this set
i playd piment once, then funk", and "it could be called Outro Dub Siren".

The notes were never actually gone: the textarea writes `{t: t ?? null, comment}`,
so a skipped call keeps its comment in state and in localStorage. Emitting
`skipped` as {id: {source, note}} therefore recovers notes ALREADY STORED, not
only future ones — PLN re-exports and gets them back verbatim. Verified the built
bundle carries it, after first mis-verifying: `grep -c` counts LINES and a
minified bundle is one line, so the honest count is 2 occurrences, not 1.

With his corrections the true set is 14 tracks, written to
judge_specs/cosmicfest-2026_setlist_ear.json as ground truth.

Scored against it, the three-lens pipeline named 12 of 14 tracks correctly and
labelled 81% of the 63 minutes, 85% of the labelled overlap correct. bombe_dj,
rose_rouge, ouais_je_funk, punkachien and livecode_parade landed at 100%.

The two failures are the same failure. `perfect` was called gimme_acid and the
improvised outro was called REVOLUTION, and both are reference-bound: crossmatch
can only choose among tracks it holds a prior render of, so audio from a track it
has never heard gets assigned to the nearest thing it has. All five "ghosts" —
blue_gold, desire, gimme_acid, quand_on_decolle, REVOLUTION — are that same
mechanism. It is a structural limit, and the fix is one render per track, not a
better threshold.

Also banks his ear-feedback in performance_notes.md, including two things no
analysis could have produced: a loud blip in the 2.9 s between two tracks (a
defect belonging to NEITHER, which the boundary tool currently has no way to
express), and why desire was dropped — "Clearly didnt play desire i was not found
of that closing at opal".
parent e5c604dc
{
"gig": "cosmicfest-2026",
"_provenance": [
"PLN's ear calls, boundary lab, 2026-08-29. THE ground truth for this gig.",
"The `decided` block came from the lab's export. The `skipped` notes did NOT:",
"the exporter emitted skipped boundaries as bare integers and dropped their",
"comments, so these were recovered from chat and re-entered by hand. That bug",
"is fixed in BoundaryLab.tsx; this file records that these eight notes came",
"the long way round."
],
"decided": {
"1": {
"start": 406.63,
"source": "playhead",
"note": "from here its clearly something about drums, might even start earlier idk"
},
"3": {
"start": 698.63,
"source": "playhead",
"note": "crossfade starts a bit earlier, this 11:38.6 is a good start point"
},
"5": {
"start": 1095.32,
"source": "playhead",
"note": "that's the exact first sound of the next track you_my_sunshine"
},
"6": {
"start": 1364.91,
"source": "playhead",
"note": "at 22:42 its end of reose_rouge, theres a loud blip noise, at 22:44.9 its the start of rose rouge, could we cut noise and blend better?"
},
"7": {
"start": 1897.76,
"source": "playhead",
"note": "at 31:37.8 we're enough in the crosfade it makes a good 5 drops start."
},
"8": {
"start": 2145.61,
"source": "playhead",
"note": "starting at 35:45.6 i hear proper only piment start sound"
},
"11": {
"start": 2525.44,
"source": "playhead",
"note": "start of ouais_je_funk for real"
},
"12": {
"start": 2735.79,
"source": "playhead",
"note": "start of perfect! there was no gimme_acid in this performance."
},
"13": {
"start": 2907.36,
"source": "playhead",
"note": "this is end of perfect -> perfect cut at 48:27.4 into PunkAChien!"
},
"14": {
"start": 3072.47,
"source": "playhead",
"note": "proper start of mafia"
}
},
"skipped": {
"2": {
"note": "00:40 is still sth about drums",
"source": "chat-recovered"
},
"4": {
"note": "seam is wrong, theres no blue_gold in this set, we're hearing do_it_right throughout.",
"source": "chat-recovered"
},
"9": {
"note": "whole section is still piment_bresilien actually",
"source": "chat-recovered"
},
"10": {
"note": "i hear ouais_je_funk already (BTW theres no funk->piment transition! in this set i playd piment once, then funk, then next",
"source": "chat-recovered"
},
"15": {
"note": "livecode parade is already playing at the begin of this segment.",
"source": "chat-recovered"
},
"16": {
"note": "i hear vague de crime from the first section of this segment.",
"source": "chat-recovered"
},
"17": {
"note": "I closed on vague de crime i think i recall now! Clearly didnt play desire i was not found of that closing at opal :')",
"source": "chat-recovered"
},
"18": {
"note": "thissegment is pure dubsiren noise and fun ahahah it could be called \"Outro Dub Siren\" ahah",
"source": "chat-recovered"
}
}
}
{
"gig": "cosmicfest-2026",
"source": "PLN ear calls, boundary lab + chat, 2026-08-29",
"_note": [
"THE ground truth. 14 tracks. Boundaries between decided calls are",
"inferred from adjacent skip notes, so mid-span edges are softer than",
"the playhead calls themselves."
],
"tracks": [
{
"n": 1,
"start": 0.0,
"end": 406.6,
"track": "bombe_dj",
"evidence": "opener; locate diams_dj cons 0.85 across 0:00-3:55"
},
{
"n": 2,
"start": 406.6,
"end": 698.6,
"track": "something_about_drums",
"evidence": "#1 'from here its clearly something about drums, might even start earlier idk'; #2 '00:40 is still sth about drums'"
},
{
"n": 3,
"start": 698.6,
"end": 1095.3,
"track": "do_it_right",
"evidence": "#3 'crossfade starts a bit earlier, this 11:38.6 is a good start point'; #4 'theres no blue_gold in this set, we're hearing do_it_right throughout'"
},
{
"n": 4,
"start": 1095.3,
"end": 1364.9,
"track": "you_my_sunshine",
"evidence": "#5 'thats the exact first sound of the next track you_my_sunshine'"
},
{
"n": 5,
"start": 1364.9,
"end": 1897.8,
"track": "rose_rouge",
"evidence": "#6 'at 22:44.9 its the start of rose rouge'; loud blip at 22:42 flagged for the mix"
},
{
"n": 6,
"start": 1897.8,
"end": 2145.6,
"track": "take_5_drops",
"evidence": "#7 'enough in the crosfade it makes a good 5 drops start'"
},
{
"n": 7,
"start": 2145.6,
"end": 2525.4,
"track": "piment_bresilien",
"evidence": "#8 'i hear proper only piment start sound'; #9 'whole section is still piment_bresilien actually'; #10 'no funk->piment transition! i playd piment once, then funk'"
},
{
"n": 8,
"start": 2525.4,
"end": 2735.8,
"track": "ouais_je_funk",
"evidence": "#11 'start of ouais_je_funk for real'; #10 'i hear ouais_je_funk already'"
},
{
"n": 9,
"start": 2735.8,
"end": 2907.4,
"track": "perfect",
"evidence": "#12 'start of perfect! there was no gimme_acid in this performance.'"
},
{
"n": 10,
"start": 2907.4,
"end": 3072.5,
"track": "punkachien",
"evidence": "#13 'end of perfect -> perfect cut at 48:27.4 into PunkAChien!'"
},
{
"n": 11,
"start": 3072.5,
"end": 3298,
"track": "mafia",
"evidence": "#14 'proper start of mafia'; #15 bounds the end"
},
{
"n": 12,
"start": 3298,
"end": 3424,
"track": "livecode_parade",
"evidence": "#15 'livecode parade is already playing at the begin of this segment'"
},
{
"n": 13,
"start": 3424,
"end": 3676,
"track": "vague_de_crime",
"evidence": "#16 'i hear vague de crime from the first section'; #17 'I closed on vague de crime... Clearly didnt play desire'"
},
{
"n": 14,
"start": 3676,
"end": 3779.3,
"track": "Outro Dub Siren",
"evidence": "#18 'pure dubsiren noise and fun ahahah it could be called \"Outro Dub Siren\"'"
}
]
}
......@@ -594,3 +594,43 @@ tail existed only as instructions until this pass.
Both were his second listen changing the answer, which is the argument for
keeping the audition loop cheap: neither correction cost more than a re-render.
## CosmicFest 2026-08-23 — ear pass over the room recording (2026-08-29)
PLN auditioned all 18 machine-proposed seams in the boundary lab, against a
handheld stage-mic capture (`ZOOM0067.MP3`, 62:59). His verdict on the recording
itself, before any of this: *"imo we have a bad rec cause the whole soundsystem
had effects and at some points ppl messed with it lol"*.
**A mix note, not a boundary note.** At the rose_rouge entry: *"at 22:42 its end
of reose_rouge, theres a loud blip noise, at 22:44.9 its the start of rose
rouge, could we cut noise and blend better?"* So a transition can carry a
**defect** that is neither of the two tracks — a blip in the 2.9 s between them.
The boundary tool asks "where does the next track start" and has no way to say
"there is garbage here"; a `noise` mark would let him flag it in place.
**A track that only exists live.** The final 103 s: *"thissegment is pure
dubsiren noise and fun ahahah it could be called 'Outro Dub Siren' ahah"*. The
machine labelled it REVOLUTION, which is the best any reference-based lens could
do — there is no prior render of an improvised outro. Worth catalog-ing under its
own name if the set is ever released.
**A closing he changed his mind about, across gigs.** *"I closed on vague de
crime i think i recall now! Clearly didnt play desire i was not found of that
closing at opal :')"* — the OPAL-26 ending was not to his taste, so he dropped it
at CosmicFest. That is a set-order preference the backlog does not record, and it
explains a machine "ghost": `desire` was proposed at 60:15 purely because a prior
render of it exists.
**Two tracks he did not play at all**, both of which the machine proposed:
`blue_gold` (*"theres no blue_gold in this set, we're hearing do_it_right
throughout"*) and `gimme_acid` (*"there was no gimme_acid in this performance"*
it was **perfect**). Both were reference-driven false positives: crossmatch can
only choose among tracks it holds a render of, so an absent track's audio gets
assigned to the nearest available one.
**And a structural correction worth remembering for set prep:** *"BTW theres no
funk->piment transition! in this set i playd piment once, then funk, then next"*.
The machine had piment_bresilien and ouais_je_funk alternating in 45-80 s slices,
which was a median-filter artifact, not a performance. A real set alternating two
tracks four times would be unusual; treat that pattern as suspicious by default.
......@@ -114,13 +114,28 @@ export function BoundaryLab({ gig }: { gig: string }) {
'Ear calls from the boundary lab. Times are absolute MASTER seconds.',
'These are PLN\'s answers — merge them into the `verified` block of',
'judge_specs/<gig>_boundaries_ear.json, which is the ground truth.',
'BOTH blocks carry notes: a skipped seam usually means the seam itself is',
'wrong, which is more informative than a confirmed cut time.',
],
decided: Object.fromEntries(
Object.entries(calls)
.filter(([, c]) => c.t !== null)
.map(([k, c]) => [k, { start: Number(c.t!.toFixed(2)), source: c.source, note: c.comment }]),
),
skipped: Object.entries(calls).filter(([, c]) => c.t === null).map(([k]) => Number(k)),
// Skipped boundaries keep their NOTE. They used to export as bare integers,
// which silently threw away the most valuable thing in the file: PLN skipped
// eight CosmicFest seams and typed a correction into every one of them —
// "theres no blue_gold in this set", "no funk->piment transition", "could be
// called Outro Dub Siren" — and the export emitted `[2,4,9,10,15,16,17,18]`.
// A skip is not an absence of judgement; it is usually a judgement that the
// SEAM is wrong rather than that the moment is unclear.
// The comment was always kept in state (the textarea writes it with t ?? null),
// so this recovers notes already in localStorage, not just future ones.
skipped: Object.fromEntries(
Object.entries(calls)
.filter(([, c]) => c.t === null)
.map(([k, c]) => [k, { source: c.source, note: c.comment }]),
),
}
const url = URL.createObjectURL(new Blob([JSON.stringify(out, null, 1)], { type: 'application/json' }))
const a = document.createElement('a')
......
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