TWELVE SONGS RESOLVED

The 8.28 drum kit split put the guitars in the drum lanes

Measured 2026-09-04 through 2026-09-07 on Jacks-iMac, and independently on Brandons-MacBook-Pro. Thirteen contaminated kits found, twelve songs rebuilt through a chain that is allowed to refuse. Every number below is read straight from a manifest or a verification run. Complete as of 2026-09-07, nothing still running.

What happened, short version. A computer program was asked to split a drum recording into six pieces: kick, snare, toms, hi-hat, ride, crash. The program does not know how to say "that is a guitar." It takes every sound it is handed and files it under one of the six drum names. The microphone it was handed was sitting in a room with two loud guitar amps, so the guitars went into the drum folders. The fix is to run a second program first, one that can tell a guitar from a drum, and hand the splitter only the drum part.

What is new today. The fix now has a guard in front of it that is allowed to say no. It listens to the drum part and asks three questions: is anyone hitting the drums, are they loud enough to be in the room, and does this sound like a guitar. On one song, song14, the answer was that the drummer was barely playing, so the computer stopped and said so instead of making a kit out of almost nothing. Three songs came through with real drum lanes, two are still being worked on right now, and every number on this page was copied out of the machine's own record of what it did.

Five of the six lanes per song fail a percussive-content test, and the snare and crash lanes track the guitar amp's loudness curve instead of the drummer. One missing stage caused it. The corrected chain already ran on this same tape and produces clean lanes on the same song, measured side by side below.

0. Where this landed

All twelve songs from the 8.28 practice are resolved. Seven built a drum kit, two were refused because nobody was really playing the drums, and three came through with a lane that still needs an ear on it. Every verbatim file in both deliverables was checked against the original 4.97 GB phone masters and matched sample for sample.

12
songs resolved, none left running
48/48
shipped files bit-exact against the masters
12
mics carrying an instrument name with nobody playing
9
wrong labels caught and corrected
The newest thing we found. Four microphones were running that night. Everyone assumed two of them were two guitar players. On five of the songs, one of those two microphones was just sitting there with nobody playing into it, picking up the whole room. The computer had been treating that empty microphone as a second guitarist, and on one song it even wrote "rhythm guitar" on the file. There was no rhythm guitar. There was one guitar player and an open microphone. Those songs are now labelled honestly as one-guitar songs.

Every song, read out of its own manifest

songkitperconsets/sguitar room miclanesreviewguitars
song10PASS0.908—0.058-5-A / B, no call
song11REVIEW_REQUIRED0.85—0.021-4cymbals 0.285A / B, no call
song12REVIEW_REQUIRED0.778—0.033-4cymbals 0.376A / B, no call
song13REVIEW_REQUIRED0.4773.980.116-4toms 0.401A / B, no call
song14QUIET_KIT0.4831.930.11-0-LEAD 1/mic3
song15REVIEW_REQUIRED0.5893.470.049-3hh 0.322; toms 0.285one guitar
song17PASS0.4843.20.067gtr_mic25-one guitar
song18STOPPED_AT_GATE_A0.961.40.206gtr_mic20-one guitar
song19STOPPED_AT_GATE_A0.9071.330.095gtr_mic20-one guitar
song20PASS0.5542.70.011gtr_mic25-one guitar
song21PASS0.6893.120.148-5-LEAD 2/mic2
song22REVIEW_REQUIRED0.7283.130.173-4toms 0.113A / B, no call

Blank perc/onset cells are songs 10 to 12, which ran before the onset arm existed. Their kits were still judged lane by lane against the verbatim guitar mics.

0a. The microphone nobody was playing

A guitar mic with no guitarist on it does not go quiet. It hears the loudest thing in the room, which is the drum kit. So when the gate correlated the separated drums against it to look for guitar bleed, it was really correlating drums against drums, and the song failed for sounding too much like itself. song20 was refused at a guitar score of 0.455 while the guitar that was actually being played read 0.011 against the very same audio.

Level alone cannot catch it. Across 24 guitar-mic instances the quietest mic someone was actually playing sits at −38.4 dBFS, which is quieter than song20's room mic at −38.2. Any threshold that catches the room mic throws away a real performance. The pair of conditions separates them cleanly: under −30 dBFS and above +0.30 against the drum mic. All five room mics meet both. No played mic does.

songmiclevelr vs drum micwhat it means
song15gtr2_mic2−30.5 dBFS+0.331one guitar, not two
song17gtr2_mic2−31.3 dBFS+0.426one guitar, not two
song18gtr2_mic2−32.6 dBFS+0.495one guitar, not two
song19gtr2_mic2−33.8 dBFS+0.633one guitar, not two
song20gtr2_mic2−38.2 dBFS+0.404one guitar, not two

Two pieces of code found these independently and agree to the decimal: the rebuild's own GATE A, and a separate labelling pass that scores chord density. The labeller had to be taught the same lesson the hard way. An unplayed mic hears everybody's chords at once, so it scores as high polyphony, which is exactly what a rhythm guitarist looks like. Its first pass labelled song20's empty microphone guitar-RHYTHM with a confident margin of 0.828.

0b. Three labels were wrong and are now fixed

song15 shipped a room mic under a musician's name

The file 8-28-song15-guitar-RHYTHM.wav was an open microphone at −30.5 dBFS correlating +0.331 with the kit. It is now 8-28-song15-room-mic-unplayed.wav, and song15 is a one-guitar song.

song13's lead/rhythm call did not survive re-measurement

It shipped as LEAD and RHYTHM on a claimed margin of 0.54. Re-measured with a scorer that can actually be run again, the margin is 0.153, under the 0.50 floor, with the two features pointing at different microphones. It ships as guitar-A and guitar-B, which is what the measurement supports.

song14 was missing a guitar file entirely

Its second mic sits exactly on the room-mic boundary, r = 0.300 against a threshold of above 0.30. That is a coin-flip, so it ships as a guitar and is queued for an ear rather than settled by a number that close.

0c. Provenance, checked on the shipped file

The earlier check proved the T7 cuts matched the masters, then assumed the deliverable inherited that. On 2026-09-07 a rename collision destroyed three guitar files, so inheritance became exactly the wrong thing to assume. The check now reads the file in the deliverable, finds it inside the 4.97 GB master by cross-correlation, and compares sample for sample.

setfilesresult
DELIVERABLE-8-28, songs 10–151414 bit-exact, max|diff| 0.000e+00
takes-17-22-4mic, songs 17–222424 bit-exact, max|diff| 0.000e+00

The collision, stated plainly

The relabeller wanted to swap two names on songs 10, 11 and 12: guitar-B becomes guitar-A and guitar-A becomes guitar-B. It did them in order with os.rename, which overwrites its destination, so step one destroyed guitar-A and step two carried the survivor into guitar-B. One of the two guitars vanished on three songs. The repair does not rename at all: it re-derives every guitar file from the T7 cut, so the result depends on the source and the measurement rather than on the order of operations. All three are back and all three are bit-exact against the master.

0d. The same mistake on the fourth microphone

Four microphones ran that night. The fourth was labelled bass everywhere it appeared. It is a bass on five songs and an idle microphone on the other seven, and the measurement is not a close call:

groupsongsrmspeak
bass actually played14, 15, 17, 18, 19 −8.6 to −14.1 dBFS0.0, clipping
idle microphone10, 11, 12, 13, 20, 21, 22 −36.9 to −48.8 dBFSabout −24

22.8 dB separates the two groups with nothing in between, so the line goes at −25 dBFS. song20, song21 and song22 were shipping a −47 dBFS idle microphone under the name bass. They now read bass-mic-unplayed.

Note the test that does not work here. The room-mic guard asks whether a mic correlates with the drum mic, which is exactly what a bass player does on purpose. Reused on the bass it would throw away every real bass take on the tape. Level, which cannot separate a quiet guitarist from a room mic, separates this one cleanly. The right test depends on the instrument, and borrowing a threshold across instruments is how a good measurement produces a confident wrong answer.

0e. One folder, twelve songs, four microphones each

Songs 10 to 15 had been shipping without the drummer's own kick mic and, for four of them, without the fourth mic at all, while songs 17 to 22 had both. Same night, same four mics, so the folders now look the same. Every file is mono 24-bit PCM, written with no gain of any kind, and 48 of 48 verify bit-exact against the phone masters.

Why the names matter. A file called "bass" that has no bass on it is worse than no file at all, because somebody will drag it into a song and wonder why it sounds like an empty room. Every file in the folder is now named for what is actually on it. Where the computer could not tell, the name says so, with letters like A and B instead of guessing.

0f. The three marginal calls, decided

These three were queued for an ear. Brandon handed them back, so each was settled by building a test the original tie could not reach and calibrating it on cases already answered. Two of the four tests I built separated nothing and were discarded rather than read.

song14 mic2 is a room mic. song14 is a one-guitar song.

The tie was r = 0.300 against a threshold of over 0.30. What decided it was removing a circular assumption from my own gate. Its docstring argued that level cannot separate these, citing song14 mic2 at −38.4 dBFS as the quietest playing mic. That mic was never established as played. It was assumed, and the assumption was then used as the proof.

grouplevel range
guitar mics someone played−10.1 to −28.7 dBFS
room mics−30.5 to −38.4 dBFS

A 1.8 dB gap with no overlap. song14's mic sits 9.7 dB below the quietest guitar anyone played and is the quietest of all 24 instances. Its r = 0.300 also exceeds 16 of 18 played guitar mics, and all four other songs with a played bass have this same mic idle. Three lines, one answer: drums, bass, one guitar.

song21 gets no lead/rhythm call, and now no song does

Its margin of 0.549 was barely over a 0.50 floor I chose rather than measured, with brightness pointing at the other microphone. I first tested whether that mic was a bass, since it is loud, nearly monophonic and very dark. It is not: 14.7% of its energy sits above 250 Hz against 0.4 to 6.4% for every known bass on the tape.

One feature, over a floor I picked, contradicted by the second and unconfirmed by a third. That is not a call. All six two-guitar songs now ship as guitar-A and guitar-B, which is consistent, because the scorer never produced a defensible lead/rhythm split on any of them.

song17's toms lane is guitar bleed, and the floor was the bug

It passed at percussive 0.064 against a 0.06 floor. That floor came from reasoning rather than measurement, "5x the 0.012 a pure guitar reads", but a contaminated lane is a mixture and never pure guitar, so it lands far above 0.012 and the floor caught almost nothing.

Measured over 45 lanes, real lanes sit at 0.262 and above and the two bleed lanes at 0.044 and 0.064, a 4x gap. song17's toms is also loud at −58.0 dBFS, louder than four real toms lanes, so it is not an empty-lane artifact. Loud, 93.6% harmonic, correlating 0.236 with the guitar, in a lane that should be nothing but hits.

LANE_PERC_MIN is raised from 0.06 to 0.15, inside the gap. Across all 45 lanes it moves exactly those two and nothing else.

Three close calls. Three answers were too close to call, so instead of guessing I built new tests and checked each one against questions we already knew the answer to. Two of the four tests could not tell the difference between things we already knew apart, so I threw those two away instead of using them. The three answers came from the tests that passed that check.

1. The proof, one song measured both ways

Song13 exists in both versions on the T7. Same performance, same 60 to 120 s window, same tests. The left pair went through Demucs before the splitter. The right pair did not.

laneGOOD, Demucs firstBAD, mic direct
percussiveguitar corrpercussiveguitar corr
kick0.9030.0090.921-0.003
snare1.0000.0010.0440.493
toms0.175-0.0210.0080.107
hh0.865-0.0050.117-0.158
ride0.8620.0990.1160.022
crash0.4230.1920.2700.678
splitter input0.859   (Demucs drums.wav)0.606   (mic1 + presence lift)

Percussive fraction from librosa HPSS, margin 2.0. Guitar correlation is the lane's loudness envelope against the guitar reference. Demucs guitar.wav reads 0.012 on the same percussive test, which is the floor a guitar sits at.

The snare goes from 0.044 to 1.000

Adding the Demucs stage lifts the splitter's input from 0.606 percussive to 0.859, and the snare lane it produces goes from 0.044 to 1.000. Guitar correlation on that lane falls from 0.493 to 0.001. Hi-hat goes 0.117 to 0.865, ride 0.116 to 0.862, and the crash lane's guitar correlation drops from 0.678 to 0.192.

This is the same song, the same window and the same drive. The only difference is one stage.

Two machines, two methods, same verdict

Brandons-MacBook-Pro reached this independently by a different measurement: a per-bin least-squares projection of the two verbatim guitar mics onto each lane, reporting the percent of the lane explained by guitar. On song13 that reads snare 58.5% mic-direct against 1.9% Demucs-first, crash 48.2% against 4.4%, toms 27.9% against 3.8%. Across eleven paired songs the snare runs 25.6% to 76.9% mic-direct, median 56.2%, against 0.9% to 9.8% Demucs-first, median 6.8%, in the same direction on every song.

Lane shape agrees. Mic-direct snare has a 1011 Hz centroid, 4.5% above 5 kHz, 18.5 dB crest. Demucs-first snare has a 3445 Hz centroid, 27.4% above 5 kHz, 32.2 dB crest. That is the difference between a guitar and a snare drum.

Evidence page: drumkit-guitar-bleed-audit.

2. All six contaminated local kits fail the same way

Every lane split into harmonic and percussive components, 45 s window from 0:30. The guitar mics are printed as the reference floor a guitar sits at.

songkicksnaretomshhridecrashgtr mic refsplitter input
song100.8160.4210.0320.3330.0520.4970.029 / 0.0580.499
song110.7610.4720.0420.2540.0360.3260.031 / 0.0670.520
song120.8520.1120.0340.1860.1430.5260.022 / 0.0340.629
song130.9440.0190.0220.0920.1490.2790.012 / 0.0040.653
song140.8890.0530.0130.5150.0850.7630.019 / 0.0120.426
song150.7700.0130.0040.3780.3340.5380.007 / 0.0030.266

Read the tom row. Toms measure 0.004 to 0.042. Guitar mics measure 0.003 to 0.031. A tom is one of the most transient objects in a kit, and these files are less percussive than the guitar amps they were separated from.

Envelope correlation against the guitar mic puts the snare at 0.715 on song14, 0.633 on song15 and 0.490 on song12. A snare that rises and falls with the guitar amp is a guitar. Only kick holds up across all six, and it is the one lane whose envelope tracks the drum mic instead.

3. What caused it

Sept 1 to 3, the good path, do_song.sh

board tape, mono wav
↓
profile: 87.4% below 250 Hz
↓
tilt: HP 45, -9 dB @ 90, -5 dB @ 200,
+5 dB @ 2.5k, +7 dB @ 6k
↓
Demucs htdemucs_6s → drums.wav
↓
DrumSep MDX23C, 6 lanes
↓
11 songs, lanes verified clean

Sept 3, the bad path, drumkit_from_mic.sh

mic1, the drum mic composite
↓
no profile step recorded
↓
"presence lift": moved 83.7% → 81.0%
below 250 Hz, close to a no-op
↓
Demucs htdemucs_6s
↓
DrumSep MDX23C, 6 lanes
↓
13 kits, 5 of 6 lanes carrying guitar

DrumSep has no way to reject a guitar

MDX23C is a partitioner. It assigns the whole input to its output classes and has no "this is not a drum" output. Hand it a drum mic standing in a room with two guitar amps, and the guitar energy has to land in kick, snare, toms, hh, ride or crash. It landed in snare, crash, toms and ride, the classes closest in register to an electric guitar.

Demucs is the only stage in the chain that can answer "this is not a drum," and it is the stage the September 3 script skipped. jam-stem-rebuild/SKILL.md still carries the correct ordering at steps 5 and 6. The run departed from the skill rather than from a broken skill.

The presence lift also pointed the wrong way

The September 1 tilt was built to prepare a bass-heavy board mix for Demucs, and it cut 9 dB at 90 Hz before lifting the top. The September 3 lift kept the top-end boost and dropped the low cut, so mic1 went from 83.7% below 250 Hz to 81.0%, a 2.7 point move on a file that needed to lose 20 or more. It amplified 2.5 kHz and 6 kHz, which on this material is guitar presence, and then sent that straight to the splitter.

4. The bad kits, by timestamp

Every drumkit under v2-mic-lanes/ with a snare.wav mtime between 2026-09-03T14:34 and 2026-09-03T20:08 is on the bad path. That is the whole quarantine rule, no listening required.

songsnare.wav mtimeclean replacement exists
song212026-09-03T14:34:04yes
song222026-09-03T15:10:59yes
song172026-09-03T15:42:02yes
song132026-09-03T16:39:12yes
song192026-09-03T16:59:28yes
song112026-09-03T18:02:53yes
song152026-09-03T18:19:01yes
song162026-09-03T19:08:21NO, must be rebuilt
song182026-09-03T19:18:41yes
song142026-09-03T19:44:03yes
song202026-09-03T19:49:57yes
song102026-09-03T20:04:00yes
song122026-09-03T20:07:17NO, must be rebuilt

Clean kits live under 8-28/New Folder With Items/song*/drumkit/ dated 2026-09-01 through 2026-09-03T13:03. Eleven songs have one. song12 and song16 do not, and those two are the only real work outstanding.

5. What was executed, 2026-09-05

The six source cuts are bit-exact slices of the master

Every lane number on this page is built on the per-song cuts sitting on the T7, so those were checked against the master before anything else. The check takes a 10 s probe from the middle of each cut, cross-correlates it against a 6 s search band of the 4.40 PM master, reads the full cut length back out of the master at the peak offset, and compares sample for sample.

songcut lengthoffset foundnominaldriftmax|diff|verdict
song12120.5 s7952.4303 s7952.9 s-0.500 s0.000e+00BIT-EXACT
song10124.5 s7198.4303 s7198.9 s-0.500 s0.000e+00BIT-EXACT
song14164.5 s10001.4303 s10001.9 s-0.500 s0.000e+00BIT-EXACT
song15483.5 s10320.4303 s10320.9 s-0.500 s0.000e+00BIT-EXACT
song11534.5 s7339.4303 s7339.9 s-0.500 s0.000e+00BIT-EXACT
song13635.5 s8475.4303 s8475.9 s-0.500 s0.000e+00BIT-EXACT

Master: 8.28.26 - 9:1:26, 4.40 PM.wav, 18745.374 s, 44100 Hz, 2 ch, PCM_24, 4,966,484,332 bytes. The cut rule that reproduces every row is start = window_start - 0.0697 s - 0.5 s, length = window + 1.5 s. The 0.0697 s is the phone clock correction, the 0.5 s is pre-roll, and the -0.500 s drift on all six is that pre-roll and nothing else. Script: verify_cut_against_master.py, log at verify.log.

Scope limit, read it as written. Only mic1 was verified this way. The mic3 cuts (gtr1_mic3.wav, the guitar reference every correlation on this page is judged against) are unverified, because their master, 4.53 PM at 4.62 GB, sits in a different Google account and was never shared. This row is a verdict on one mic, not on all four.

The gate exists as code now

composite-stem-alignment/scripts/rebuild_kit_demucs_first.py. It runs profile, adaptive tilt, Demucs, GATE A, DrumSep, per-lane verify, manifest. GATE A refuses to run the splitter on an input that is not a drum stem, which is the one thing the September 3 script did not have.

GATE A is on its third build and now asks three physical questions plus one sanity floor, and all four must hold:

armquestionthreshold
drummer_playingis a drummer actually playingonsets/s ≥ 2.0
chair_filledis the drum chair filleddrums RMS ≥ -40.0 dBFS
guitar_cleanis this a guitar|corr| < 0.25 vs a verbatim guitar mic
percussive_sanesanity floor onlyHPSS percussive ≥ 0.45

Per-lane checks after the splitter are unchanged: percussive fraction at or above 0.06, which is five times the 0.012 a pure guitar reads, and worst guitar correlation under 0.25. A lane that misses either one is held back as REVIEW.

The gate was rebuilt twice, both times because a measurement said so

First rebuild, song12. I set the floor at a single percussive scalar of 0.80, taken from one board-tape reference. Demucs-on-mic1 for song12 landed at 0.778 and the gate refused. So I tested the stem instead of trusting the scalar:

signalpercussivevs gtr1 micvs gtr2 mic
Demucs drums.wav0.778+0.032-0.033
Demucs guitar.wav0.049+0.526+0.777
raw mic10.646+0.158+0.167
contaminated snare0.135+0.555+0.676

Demucs had pulled the guitar out and filed it correctly. Its guitar.wav correlates +0.777 with the physical guitar microphone, and the drums.wav left behind reads -0.033. The stem was clean and the threshold was wrong. The floor moved to 0.70 and a correlation arm was added, judged against a separate physical transducer so no model grades its own output. A measurement moved that number. Previous version kept as .bak-perc080-2026-09-05.

song12 then passed at perc 0.778, guitar correlation 0.033, and DrumSep ran on it.

Second rebuild, song14 and song15. The 0.70 floor then refused both of them, at 0.483 and 0.589, with guitar correlations of 0.110 and 0.049. A stem that clean is not a guitar. Onset analysis said what the scalar was missing:

songdrums.wav perconsets/sdrums RMSworst gtr corrwhat it is
song150.5893.47-31.3 dBFS0.049a drummer playing a dark kit
song140.4831.93-41.2 dBFS0.110an almost empty drum chair

The HPSS percussive scalar is biased against dark, kick-dominated material. A low kick tail spreads horizontally in the spectrogram and HPSS reads that as harmonic. song15 is a real kit at 3.47 onsets per second and -31.3 dBFS, and the 0.70 floor was about to discard it. The separation the old gate claimed, good inputs at 0.778 and 0.859 against a bad range of 0.266 to 0.653, rested on two data points. song15 is a genuine drum stem and it lands inside that bad range at 0.589.

So the scalar dropped to a 0.45 sanity floor and two physical arms took over the decision: onset density and level. Previous version kept as .bak-perconly-gateA-2026-09-05. song15 re-ran and passed GATE A at 13:56 on perc 0.589, 3.47 onsets/s, -31.3 dBFS and guitar corr 0.049.

song14 is an empty drum chair, and that is a finding about the take

Under the rebuilt gate song14 still fails, on both drum-presence arms independently: 1.93 onsets/s against a floor of 2.0, and -41.2 dBFS against a floor of -40.0. Its guitar arm is clean at 0.110 and its percussive sanity floor is met at 0.483. Verdict recorded in the manifest as EMPTY_DRUM_CHAIR, splitter never run.

The drummer is barely on that take. The chain has nothing to separate, and no threshold change would make a kit appear. This is a fact about the recording, and calling it a pipeline failure would be wrong.

Which microphone is allowed to convict a lane

The mic map on this tape: mic1 drums, mic2 guitar, mic3 second guitar, mic4 bass and silent on some takes. Only the two verbatim guitar mics decide a verdict. The bass mic is measured and printed, and it never counts toward a guitar-contamination verdict, because a kick lane legitimately tracks the bass. Kick and bass play together, so grading a kick lane against the bass mic would condemn correct lanes. Demucs' own guitar.wav is reported the same way and never judges, so no model grades its own output. A reference quieter than -45 dBFS RMS is dropped rather than correlated against its own noise floor.

song10 through song13 carry both gtr1_mic3.wav and gtr2_mic2.wav. song14 and song15 carry only gtr1_mic3.wav, so those two are judged against a single verbatim guitar reference.

The standing rule this whole page serves: "if there's guitar in the drum snare etc something is wrong." Guitar in a drum lane is a failure to be traced to its cause. It never ships as a caveat beside the audio.

Quarantine complete on this machine

All six local contaminated kits moved to <song>/delete/drumkit-CONTAMINATED-mic-direct-2026-09-03. Every one of their snare.wav mtimes fell inside the 14:34 to 20:08 window, so the timestamp rule held on all six. Nothing removed, and the verbatim source mics beside them are untouched.

The gate had the inverse of the bug it was built to stop

MDX23C writes its lanes into <outdir>/<input stem>/, so they landed in drumkit/drums/. My lane lister read only the top level, found zero lanes, and all([]) is True in Python, so the empty kit passed every per-lane check:

result: PASS
4_drumsep: {"dir": ".../song12/drumkit", "files": []}
5_verify lanes: []

A kit with no lanes at all reported PASS. That is the same class as exit zero is not verification and file presence is not signal presence. A gate that asks for nothing passes everything.

Fixed: the lister walks the tree, and zero lanes is now a hard failure (FAILED_NO_LANES, never PASS). The corrected script is in the bundle and a correction notice went to the MacBook Pro, since the first copy I sent had the bug.

6. The rebuild, song by song

Every number in this section is read out of v3/<song>/manifest.json and the matching <song>.log. This iMac has the 5-stem build, so ride and crash merge into one cymbals lane. Snapshot 2026-09-05 14:00. song13 and song15 are mid-run as this is written, and their rows say so rather than guessing an outcome.

songsource mic percGATE A input perconsets/sdrums RMSworst gtr corrguitar floorverdict
song100.5230.908n/an/a0.0580.049PASS
song110.5720.850n/an/a0.0210.111REVIEW_REQUIRED
song120.6460.778n/an/a0.0330.049REVIEW_REQUIRED
song130.371Demucs running since 13:54, GATE A not reached
song140.1810.4831.93-41.2 dBFS0.110n/aEMPTY_DRUM_CHAIR
song150.4540.5893.47-31.3 dBFS0.049n/aGATE A passed 13:56, splitter running

Source mic perc is the raw kick_mic1.wav before any processing. GATE A input perc is Demucs' drums.wav, the thing the splitter is actually handed. Guitar floor is that song's Demucs guitar.wav on the same percussive test, printed so the lane floor can be read against a local guitar rather than a remembered one. Onset density and level were added to the gate at 13:28, so song10, song11 and song12 cleared the earlier build and carry no onset reading.

song10, PASS, five lanes clean

GATE A input 0.908 percussive at 0.058 guitar correlation. Finished 12:34:58, all five lanes PASS.

lanepercr vs gtr1 mic3r vs gtr2 mic2worst gtr corrcontaminated percverdict
kick0.6850.0390.0030.0390.816PASS
snare0.997-0.045-0.0790.0790.421PASS
toms0.841-0.157-0.1650.1650.032PASS
hh0.6180.1200.1110.1200.333PASS
cymbals0.445-0.126-0.1730.1730.497 / 0.052PASS

The tom lane is the one to look at. It read 0.032 on the contaminated kit, below the guitar mics themselves, and reads 0.841 now.

song11, REVIEW_REQUIRED, cymbals held back

GATE A input 0.850 percussive at 0.021 guitar correlation. Finished 13:54:45. Four lanes PASS, cymbals flagged at 0.285 against the 0.25 ceiling.

lanepercr vs gtr1 mic3r vs gtr2 mic2worst gtr corrcontaminated percverdict
kick0.490-0.016-0.0170.0170.761PASS
snare0.9980.0390.0230.0390.472PASS
toms0.9290.0120.0610.0610.042PASS
hh0.7290.1560.0560.1560.254PASS
cymbals0.608-0.285-0.1400.2850.326 / 0.036REVIEW

Toms goes from 0.042 to 0.929, snare from 0.472 to 0.998. The cymbals lane is percussive enough at 0.608 and still tracks the first guitar mic at 0.285, so it is held back for an ear.

One caution on this song: its Demucs guitar.wav reads 0.111 percussive, above the 0.06 lane floor. On song11 the percussive floor alone would not separate a guitar from a lane, and the correlation arm is carrying the verdict.

song12, REVIEW_REQUIRED, cymbals held back

GATE A input 0.778 percussive at 0.033 guitar correlation, the run that forced the first gate rebuild. Finished 09:11:35.

lanepercr vs gtr1 mic3r vs gtr2 mic2worst gtr corrcontaminated percverdict
kick0.7580.045-0.0190.0450.852PASS
snare0.998-0.002-0.0710.0710.112PASS
toms0.389-0.005-0.1420.1420.034PASS
hh0.6080.2390.0150.2390.186PASS
cymbals0.467-0.376-0.1710.3760.526 / 0.143REVIEW

Snare goes from 0.112 to 0.998 and its guitar correlation from 0.490 to 0.071. Toms goes from 0.034, which was below the guitar mics themselves, to 0.389. The cymbals lane is flagged at 0.376 and does not ship. The hi-hat lane at 0.239 clears the ceiling by 0.011 and belongs in the same listening pass.

The merged cymbals lane is the weak one on this build

Cymbals is the only lane flagged so far, on two of the three finished songs, at 0.285 and 0.376. On this 5-stem build ride and crash are one lane, and the head-to-head on song13 already showed crash as the dirtiest lane on the good path too, at 0.192 guitar correlation and 0.423 percussive. The 6-stem checkpoint on the MacBook Pro separates ride from crash, which is the direct test of whether the crash half is carrying all of it.

7. Hear it, old against new

Thirty seconds from the middle of each song, same window on both sides. OLD is the mic-direct kit that went into quarantine. NEW is the Demucs-first rebuild. The two reference players at the top of each block are the raw drum mic and the raw guitar mic, so you can hear what each lane was carved out of.

Numbers under each pair are percussive fraction and guitar correlation, old then new. The cymbals row is the one that still fails, and it is the call that needs your ear.

song10

drum mic, the source
guitar mic, the reference
laneOLD, mic directNEW, Demucs firstperc old→newguitar old→new
kick0.834 → 0.6850.069 → 0.039
snare0.423 → 0.9970.296 → 0.079
toms0.019 → 0.8410.115 → 0.165
hh0.287 → 0.6180.295 → 0.120
cymbals0.491 → 0.4450.230 → 0.173

song11

drum mic, the source
guitar mic, the reference
laneOLD, mic directNEW, Demucs firstperc old→newguitar old→new
kick0.578 → 0.4900.033 → 0.017
snare0.992 → 0.9980.009 → 0.039
toms0.108 → 0.9290.139 → 0.061
hh0.412 → 0.7290.347 → 0.156
cymbals0.340 → 0.6080.296 → 0.285

song12

drum mic, the source
guitar mic, the reference
laneOLD, mic directNEW, Demucs firstperc old→newguitar old→new
kick0.893 → 0.7580.062 → 0.045
snare0.135 → 0.9980.676 → 0.071
toms0.029 → 0.3890.229 → 0.142
hh0.187 → 0.6080.136 → 0.239
cymbals0.517 → 0.4670.272 → 0.376

song15

drum mic, the source
guitar mic, the reference
laneOLD, mic directNEW, Demucs firstperc old→newguitar old→new
kick0.770 → 0.4760.096 → 0.194
snare0.013 → 0.9980.633 → 0.181
toms0.004 → 0.4550.405 → 0.285
hh0.378 → 0.5840.254 → 0.322
cymbals0.538 → 0.5000.102 → 0.195

song15 is the take that breaks the pattern: its cymbals lane PASSES at 0.195, and the contamination moved to hh at 0.322 and toms at 0.285 instead.

song13

drum mic, the source
guitar mic, the reference
laneOLD, mic directNEW, Demucs firstperc old→newguitar old→new
kick0.944 → 0.3280.056 → 0.094
snare0.019 → 0.9720.489 → 0.140
toms0.022 → 0.3540.263 → 0.401
hh0.092 → 0.6860.073 → 0.190
cymbals0.279 → 0.9070.156 → 0.112

song13 holds the best and worst lane of the set at once: cymbals PASSES at 0.907 percussive and 0.112 guitar, the cleanest cymbals of all six, while toms carries 0.401 guitar, the worst contaminated lane anywhere in the six songs.

The roster rotates, and it changes what a verdict means

Three players, instruments swapping between takes. Read straight off the mic levels, 60 s window from each song's middle:

songdrumsgtr2gtr1bassroster
song10-12.3-9.8-24.3-36.62 guitars + drums
song11-11.4-15.9-11.0-39.02 guitars + drums
song12-16.5-16.3-22.5-42.62 guitars + drums
song13-16.1-18.1-20.9-41.92 guitars + drums
song14-24.1-38.4-26.9-14.11 guitar + bass + drums
song15-14.0-30.9-14.6-9.71 guitar + bass + drums

The split lands between song13 and song14. On songs 10 to 13 the bass mic sits at -36.6 to -42.6, which is bleed rather than a bassist. On songs 14 and 15 it jumps 25 to 32 dB while gtr2 drops about 20 dB, a player moving from second guitar to bass.

This settles the two-voice guitar failure. That split ran on song14 and song15, the only two songs with one guitarist. There was never a second guitar to separate, which is why it correlated 0.83 and 0.835 with pitch separations of 0.18 and 0.04 semitones.

Correction: song14 is QUIET_KIT, not EMPTY_DRUM_CHAIR

I labelled song14 an empty drum chair because its Demucs stem read -41.2 dBFS at 1.93 onsets/s. Its raw drum mic reads -24.1 dBFS at 2.6 onsets/s, so a drummer is playing, quietly. The refusal was correct and the label was not.

The script now checks the source mic before claiming nobody was there, and song14's manifest reads QUIET_KIT with the source-mic evidence recorded beside it.

Guitar goes to the quietest lane, not to a drum

Measured across 20 lanes on four finished songs. Correlation between a lane's level and its guitar contamination is -0.554, and between its percussive content and contamination -0.489. Both negative, which is what the hypothesis predicts.

contaminated lanes (4)clean lanes (16)
mean level-53.1 dBFS-42.8 dBFS
mean percussive0.5280.716

Every lane at or above 0.25 guitar sits between -66.0 and -43.7 dBFS. No kick or snare is ever contaminated. On songs 11 and 12 the residue landed in cymbals, on song15 in hi-hat and toms, because those were that take's quietest lanes. There is nothing special about cymbals, it is just usually the quietest.

That also explains why bleed cancellation failed. The Demucs stem is already clean at 0.021 to 0.058 guitar, so the contamination is created by the partition rather than carried through, and there is no linear copy of the guitar mic left to subtract.

8. Handed to the MacBook Pro

That machine has the 6-stem checkpoint, the working do_song.sh, and all thirteen song folders. This iMac has six songs and only the 5-stem build, so its ride and crash would merge. Two bundles went out over the iCloud sfg/ channel and both ingested.

stem-knowledge-2026-09-05, the knowledge gap

Six skill trees, 50 portable stem memories, 13 machine-specific ones held back for hand review, and the evidence behind the gate.

The installer cannot repeat the 2026-08-10 wipe. That bundle replaced the laptop's MEMORY.md with this machine's and left 550 memories unreachable by name, with no backup, because the backup list and the write list did not match. On the laptop /Users/drwu is a symlink to /Users/brandonchavez, so wrong paths resolve silently instead of erroring. All five required fixes are enforced and were tested against a sandbox home:

MEMORY.md lines: before=4 after=50      <- append only
original index lines still present: 3/3
laptop-only memory unchanged: YES
conflicting memory kept as laptop's: "laptop version, different content"
incoming copy saved beside it: 1
backup contains projects tree: 1        <- what the old installer never saved
skills installed: 6
/Users/drwu paths left in installed skills: 0

Dry run is the default. An existing memory is never overwritten, the incoming lands beside it as .incoming-2026-09-05.md. CLAUDE.md is not in the bundle.

REMOTE-drumsep-gate-handoff-2026-09-05.md, the job

Quarantine the remaining seven kits by the mtime rule, rebuild song12 with the 6-stem checkpoint, let GATE A decide song16, re-verify the eleven clean kits with bleed_probe.py rather than trusting the label, and fold the gate into jam-stem-rebuild. Do not kill com.drwu.chain-8-14-missing6.

The mic3 master is in a different Google account

Three 8.28 masters at 4,966,484,332 bytes each are reachable: 4.40 PM (mic1, the drum composite), 4.44 PM II (mic4, bass) and 4.48 PM 3 (mic2, guitar 2). The fourth named in the four-channel write-up, 4.53 PM (mic3, guitar 1) at 4.62 GB, sits in a different Google account and was never shared.

That is why the bit-exactness table above stops at mic1. gtr1_mic3.wav is the reference most correlations on this page are judged against, and its cut cannot be proved verbatim until that account shares the file or the MacBook Pro turns out to hold a local copy. Every mic3 correlation here should be read as measured against an unverified cut.

9. The plan

PHASE 1

Quarantine the bad, confirm the good, do not touch the running chain

  1. Move all 13 bad kits into a sibling delete/ under v2-mic-lanes/, keyed on the mtime window above. Never remove them. The verbatim source mics beside them (kick_mic1.wav and the guitar and bass lanes) are untouched and stay where they are.
  2. Spot-measure the 11 clean kits with bleed_probe.py rather than accepting the label. Song13 is already confirmed here. Ten to go, one probe run each.
  3. Leave com.drwu.chain-8-14-missing6 alone (pid 75478, started 2026-09-04T14:39 on the MacBook Pro). It runs Demucs, measures the drum stem, then DrumSep only past a level gate, so it is on the correct path.
    Open question: that chain's label reads 8-14, not 8-28. Confirm whether it covers song12 and song16 of the 8.28 tape before starting a second run on them, so two jobs do not collide on the same output.
  4. Decide which machine owns the rebuild. The 6-stem checkpoint MDX23C-DrumSep-aufr33-jarredou.ckpt and the working do_song.sh are on the MacBook Pro. This iMac holds only the 5-stem jarredou build at 437,648,758 bytes, whose config lists kick, snare, toms, hh, cymbals, so ride and crash would merge here.
Phase 1 gate: 13 kits quarantined, 11 replacements measured, the chain's scope answered in writing.
PHASE 2

Rebuild song12, then song16, through do_song.sh

One song per pass. song12 already has a 5-lane rebuild on this iMac at REVIEW_REQUIRED, so what is left for the laptop is the 6-stem version that splits ride from crash. song16 has no local source here at all.

  1. Profile the source and set the tilt from the measurement. The September 3 curve is the one that failed, so it is not reused.
  2. Demucs htdemucs_6s, keep drums.wav and guitar.wav. Discard vocals and piano, which on this instrumental trio are separation artifacts and between-song talk.
  3. Eligibility gate. Require real drum activity across at least 50% of the song in drums.wav, else mark SKIP_DRUM_SPLIT and stop. The splitter never sees a stem that failed this.
  4. DrumSep MDX23C. Leave num_overlap: 4 alone. Editing that config without updating the sha256 in metadata.json makes the engine exit 1 in about five seconds while Demucs keeps succeeding, which is how fourteen songs were silently lost in July.
  5. Assemble. 60 s blocks, 10 ms joint ramps, per-lane gain reduction recorded rather than silent.
Phase 2 gate, per song: the four GATE A arms as built on 2026-09-05, onsets/s at or above 2.0, drums RMS at or above -40 dBFS, guitar correlation under 0.25 against a verbatim guitar mic, percussive at or above 0.45. Then per lane, percussive at or above 0.06 and guitar correlation under 0.25. Song13's clean kit is the reference: snare 1.000 at 0.001, hh 0.865, ride 0.862.
PHASE 3

Hear it, consolidate it, write it down

  1. Listening page, bad lane against clean lane at the same timestamp, via composite-stem-alignment/scripts/build_listening_page.py. Every number on this page is an analytical proxy. The lanes are usable after they are heard.
  2. Watch the tom lane. Even on the good path song13's toms read 0.175, well under the snare's 1.000. Toms is the weakest lane in the clean kits and needs an ear verdict of its own rather than a pass by association.
  3. Consolidate onto one machine. Eleven clean kits are on the MacBook Pro, one clean kit and six bad ones are on the T7. Pick the owner, then move the rest by iCloud sfg/ or by carrying the T7.
  4. Fold the ordering into the skill as an executable gate. The rule already exists in prose at jam-stem-rebuild/SKILL.md steps 5 and 6, and prose did not stop drumkit_from_mic.sh from being written. The four-arm GATE A now in rebuild_kit_demucs_first.py would have, and it belongs in the skill rather than in one script.
  5. Finish song13 and song15, then re-read this page. Both are mid-run at the 14:00 snapshot. song15 is past GATE A with the splitter working, song13 is still in Demucs, and neither has lane numbers yet.
Phase 3 gate: an ear verdict per lane, the gate committed to the skill, the page live at 200.

10. Corrections to earlier readings

11. Commands

# the contaminated-lane evidence, section 2
python3 ~/Projects/_outputs/band-practice-8-28-drumsep-redo/bleed_probe.py \
  "/Volumes/T7 Shield/untitled folder/song12"

# the gated rebuild, one song, writes its own manifest
python3 ~/.claude/skills/composite-stem-alignment/scripts/rebuild_kit_demucs_first.py \
  "/Volumes/T7 Shield/untitled folder/song12" \
  ~/Projects/_outputs/band-practice-8-28-drumsep-redo/v3

# the bit-exactness check, section 5
python3 ~/Projects/_outputs/band-practice-8-28-drumsep-redo/verify_cut_against_master.py \
  ~/Projects/_outputs/band-practice-8-28-drumsep-redo/masters/"8.28.26 - 9:1:26, 4.40 PM.wav" \
  "/Volumes/T7 Shield/untitled folder/song1"{0,1,2,3,4,5}

# Phase 2, on the machine that holds the 6-stem checkpoint
bash 8-28/do_song.sh song12
bash 8-28/do_song.sh song16

# the stage that was skipped
~/venvs/demucs/bin/demucs -n htdemucs_6s -o out/ tilted.wav

# the splitter, config untouched
~/venvs/mss_training/bin/python /Users/Shared/_run_engine/drumsep/separator.py \
  drums.wav out/