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. ...@@ -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 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. 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 }) { ...@@ -114,13 +114,28 @@ export function BoundaryLab({ gig }: { gig: string }) {
'Ear calls from the boundary lab. Times are absolute MASTER seconds.', 'Ear calls from the boundary lab. Times are absolute MASTER seconds.',
'These are PLN\'s answers — merge them into the `verified` block of', 'These are PLN\'s answers — merge them into the `verified` block of',
'judge_specs/<gig>_boundaries_ear.json, which is the ground truth.', '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( decided: Object.fromEntries(
Object.entries(calls) Object.entries(calls)
.filter(([, c]) => c.t !== null) .filter(([, c]) => c.t !== null)
.map(([k, c]) => [k, { start: Number(c.t!.toFixed(2)), source: c.source, note: c.comment }]), .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 url = URL.createObjectURL(new Blob([JSON.stringify(out, null, 1)], { type: 'application/json' }))
const a = document.createElement('a') 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