# CosmicFest 2026-08-23 — recovered set (ZOOM0067.MP3, 62:59)

Three independent lenses, fused. **Not a verified tracklist** — PLN's ears remain
the authority. The gig-log that would have settled this in one line never ran;
that is now fixed (`gig-log` is in `rig_units.py` and gated hard by `gig-up.sh`).

## The lenses

| lens | what it measures | independent of |
|---|---|---|
| **crossmatch** | window embeddings (MFCC+chroma+contrast) vs 30 prior renders from OPAL-26 and Montreuil-26 | the others |
| **locate** | Shazam-style landmark fingerprints of rare (df<=6) sample banks, offset-consistency filtered | different features, different references |
| **tempo** | autocorrelation of the 40-120 Hz kick-band envelope vs each track's declared `setcps` | pure DSP, no reference audio at all |

## The set

| start | end | len | verdict | conf | evidence |
|---|---|---|---|---|---|
| 0:00 | 1:24 | 84s | **bombe_dj** | *** | crossmatch=bombe_dj (margin 0.67); locate CONFIRMS; tempo OK 124.1~124= |
| 1:39 | 5:04 | 204s | **bombe_dj** | *** | crossmatch=bombe_dj (margin 0.56); locate CONFIRMS; tempo OK 124.1~124= |
| 11:33 | 16:58 | 324s | **do_it_right** | ** | crossmatch=do_it_right (margin 0.87); tempo OK 178.3~89/2 |
| 18:13 | 22:32 | 259s | **—** | unresolved | crossmatch=you_my_sunshine (margin 0.82); tempo CLASH 82.6 vs 144; -> UNRESOLVED; tempo allows 4 candidates |
| 22:32 | 23:57 | 84s | **quand_on_decolle** | * | crossmatch=quand_on_decolle (margin 0.87) |
| 25:12 | 26:42 | 89s | **—** | unresolved | crossmatch=blue_gold (margin 0.11); tempo CLASH 118.1 vs 124; -> UNRESOLVED; tempo allows 7 candidates |
| 29:57 | 31:17 | 79s | **rose_rouge** | ** | crossmatch=blue_gold (margin 0.44); tempo CLASH 118.1 vs 124; -> OVERRIDE to rose_rouge: locate + tempo agree |
| 31:27 | 35:46 | 259s | **take_5_drops** | ** | crossmatch=take_5_drops (margin 0.58); tempo OK 124.1~124= |
| 35:36 | 37:21 | 104s | **—** | unresolved | crossmatch=piment_bresilien (margin 0.83); tempo CLASH 192.3 vs 124; -> UNRESOLVED; tempo allows 0 candidates |
| 38:31 | 39:51 | 79s | **piment_bresilien** | ** | crossmatch=piment_bresilien (margin 1.19); tempo OK 62.0~124x2 |
| 40:36 | 41:41 | 64s | **piment_bresilien** | ** | crossmatch=piment_bresilien (margin 0.40); tempo OK 124.1~124= |
| 42:06 | 44:35 | 149s | **ouais_je_funk** | ** | crossmatch=ouais_je_funk (margin 0.41); tempo OK 120.1~120= |
| 45:45 | 48:25 | 159s | **—** | unresolved | crossmatch=gimme_acid (margin 0.48); tempo CLASH 128.2 vs 80; -> UNRESOLVED; tempo allows 9 candidates |
| 48:25 | 51:20 | 174s | **punkachien** | ** | crossmatch=punkachien (margin 1.06); tempo OK 170.1~170= |
| 51:30 | 54:10 | 159s | **mafia** | * | crossmatch=mafia (margin 0.69) |
| 54:59 | 56:24 | 84s | **livecode_parade** | ** | crossmatch=gimme_acid (margin 0.46); tempo CLASH 130.0 vs 80; -> OVERRIDE to livecode_parade: locate + tempo agree |
| 57:29 | 60:29 | 179s | **vague_de_crime** | ** | crossmatch=vague_de_crime (margin 0.82); tempo OK 119.8~120= |
| 61:39 | 62:59 | 79s | **the_revolution_will_be_sampled** | * | crossmatch=the_revolution_will_be_sampled (margin 0.48) |

`***` all three lenses agree · `**` two · `*` crossmatch alone · `unresolved` = the
lenses contradict and nothing breaks the tie. Unresolved is a real answer here; a
confident wrong row costs more than a blank one.

## The two rows the system corrected by itself

PLN confirmed independently that he played **rose_rouge** and **livecode_parade**,
and did NOT play blue_gold. The fusion reaches both without being told:

* `29:57` crossmatch said blue_gold (margin 0.44, weak). Tempo clashed: 118.1
  measured vs 124 declared. rose_rouge is declared **118**. locate had `rose` at
  0.602 offset consistency. Two lenses override one.
* `54:59` crossmatch said gimme_acid (declared 80). Tempo measured **130.0**;
  livecode_parade is declared **130**; locate had `love_parade` at 0.399.

Both were reachable because crossmatch *cannot* name them — rose_rouge played
neither reference gig, and livecode_parade's `.tidal` was CREATED in the CosmicFest
prep commit itself, so no prior render can exist. That is a structural blind spot,
not a tuning failure, and the fix is one render per new track.

## Three attempts at the tempo lens, because the first two measured nothing

1. `librosa.feature.tempo`: every segment of an 80-170 BPM set returned 107-130.
   That is the estimator's log-normal prior centred on 120, not the music.
2. Mode of inter-onset intervals on the full mix: 233-648 BPM — it locks onto the
   fastest subdivision, the hats. Its 'matches' were hollow too: five octave
   multiples at 5% tolerance passes about a quarter of *random* values.
3. Autocorrelation of the **kick band** (40-120 Hz): validated on six cases picked
   because their tempos are known and well separated, so the test could fail.
   bombe 123.9/124, punkachien 170.1/170, vague_de_crime 120.1/120,
   do_it_right 178.3/2 = 89.15/89. Four exact to 0.1%, three multiples, 4% tol.

An instrument that agrees where it should is one whose disagreements carry
information. That is the only reason the two overrides above are trustworthy.

## Still unresolved

* `18:13` (259s) — crossmatch says you_my_sunshine at margin 0.82, but tempo says
  82.6 (x2=165) against a declared 144. Strong embedding, clashing tempo.
* `25:12`, `35:36`, `45:45` — tempo clashes with crossmatch and no second lens
  breaks the tie.
* `5:04-8:54` and `26:42-29:57` carry no confident label at all.

## What would have made this a one-liner

`gig-log` records a `track` event per evaluation, and its MIDI CC stream
fingerprints which controls a loaded track touches. It was installed 2026-07-29,
never enabled, and absent from the authored inventory. Fixed 2026-08-29.
The HUD's `eval-events.jsonl` also missed the set: 21 events from 18:31-18:59
(prep at home), then a 3h15m hole, then four `pluie` evals at 22:14 with zero
orbits. Likely `reference_pulsar_lazy_activation`, but that is a hypothesis.
