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 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.
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.
| song | kit | perc | onsets/s | guitar | room mic | lanes | review | guitars |
|---|---|---|---|---|---|---|---|---|
| song10 | PASS | 0.908 | — | 0.058 | - | 5 | - | A / B, no call |
| song11 | REVIEW_REQUIRED | 0.85 | — | 0.021 | - | 4 | cymbals 0.285 | A / B, no call |
| song12 | REVIEW_REQUIRED | 0.778 | — | 0.033 | - | 4 | cymbals 0.376 | A / B, no call |
| song13 | REVIEW_REQUIRED | 0.477 | 3.98 | 0.116 | - | 4 | toms 0.401 | A / B, no call |
| song14 | QUIET_KIT | 0.483 | 1.93 | 0.11 | - | 0 | - | LEAD 1/mic3 |
| song15 | REVIEW_REQUIRED | 0.589 | 3.47 | 0.049 | - | 3 | hh 0.322; toms 0.285 | one guitar |
| song17 | PASS | 0.484 | 3.2 | 0.067 | gtr_mic2 | 5 | - | one guitar |
| song18 | STOPPED_AT_GATE_A | 0.96 | 1.4 | 0.206 | gtr_mic2 | 0 | - | one guitar |
| song19 | STOPPED_AT_GATE_A | 0.907 | 1.33 | 0.095 | gtr_mic2 | 0 | - | one guitar |
| song20 | PASS | 0.554 | 2.7 | 0.011 | gtr_mic2 | 5 | - | one guitar |
| song21 | PASS | 0.689 | 3.12 | 0.148 | - | 5 | - | LEAD 2/mic2 |
| song22 | REVIEW_REQUIRED | 0.728 | 3.13 | 0.173 | - | 4 | toms 0.113 | A / 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.
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.
| song | mic | level | r vs drum mic | what it means |
|---|---|---|---|---|
| song15 | gtr2_mic2 | −30.5 dBFS | +0.331 | one guitar, not two |
| song17 | gtr2_mic2 | −31.3 dBFS | +0.426 | one guitar, not two |
| song18 | gtr2_mic2 | −32.6 dBFS | +0.495 | one guitar, not two |
| song19 | gtr2_mic2 | −33.8 dBFS | +0.633 | one guitar, not two |
| song20 | gtr2_mic2 | −38.2 dBFS | +0.404 | one 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.
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.
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.
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.
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.
| set | files | result |
|---|---|---|
| DELIVERABLE-8-28, songs 10–15 | 14 | 14 bit-exact, max|diff| 0.000e+00 |
| takes-17-22-4mic, songs 17–22 | 24 | 24 bit-exact, max|diff| 0.000e+00 |
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.
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:
| group | songs | rms | peak |
|---|---|---|---|
| bass actually played | 14, 15, 17, 18, 19 | −8.6 to −14.1 dBFS | 0.0, clipping |
| idle microphone | 10, 11, 12, 13, 20, 21, 22 | −36.9 to −48.8 dBFS | about −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.
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.
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.
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.
| group | level 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.
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.
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.
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.
| lane | GOOD, Demucs first | BAD, mic direct | ||
|---|---|---|---|---|
| percussive | guitar corr | percussive | guitar corr | |
| kick | 0.903 | 0.009 | 0.921 | -0.003 |
| snare | 1.000 | 0.001 | 0.044 | 0.493 |
| toms | 0.175 | -0.021 | 0.008 | 0.107 |
| hh | 0.865 | -0.005 | 0.117 | -0.158 |
| ride | 0.862 | 0.099 | 0.116 | 0.022 |
| crash | 0.423 | 0.192 | 0.270 | 0.678 |
| splitter input | 0.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.
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.
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.
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.
| song | kick | snare | toms | hh | ride | crash | gtr mic ref | splitter input |
|---|---|---|---|---|---|---|---|---|
| song10 | 0.816 | 0.421 | 0.032 | 0.333 | 0.052 | 0.497 | 0.029 / 0.058 | 0.499 |
| song11 | 0.761 | 0.472 | 0.042 | 0.254 | 0.036 | 0.326 | 0.031 / 0.067 | 0.520 |
| song12 | 0.852 | 0.112 | 0.034 | 0.186 | 0.143 | 0.526 | 0.022 / 0.034 | 0.629 |
| song13 | 0.944 | 0.019 | 0.022 | 0.092 | 0.149 | 0.279 | 0.012 / 0.004 | 0.653 |
| song14 | 0.889 | 0.053 | 0.013 | 0.515 | 0.085 | 0.763 | 0.019 / 0.012 | 0.426 |
| song15 | 0.770 | 0.013 | 0.004 | 0.378 | 0.334 | 0.538 | 0.007 / 0.003 | 0.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.
do_song.shdrumkit_from_mic.shMDX23C 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 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.
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.
| song | snare.wav mtime | clean replacement exists |
|---|---|---|
| song21 | 2026-09-03T14:34:04 | yes |
| song22 | 2026-09-03T15:10:59 | yes |
| song17 | 2026-09-03T15:42:02 | yes |
| song13 | 2026-09-03T16:39:12 | yes |
| song19 | 2026-09-03T16:59:28 | yes |
| song11 | 2026-09-03T18:02:53 | yes |
| song15 | 2026-09-03T18:19:01 | yes |
| song16 | 2026-09-03T19:08:21 | NO, must be rebuilt |
| song18 | 2026-09-03T19:18:41 | yes |
| song14 | 2026-09-03T19:44:03 | yes |
| song20 | 2026-09-03T19:49:57 | yes |
| song10 | 2026-09-03T20:04:00 | yes |
| song12 | 2026-09-03T20:07:17 | NO, 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.
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.
| song | cut length | offset found | nominal | drift | max|diff| | verdict |
|---|---|---|---|---|---|---|
| song12 | 120.5 s | 7952.4303 s | 7952.9 s | -0.500 s | 0.000e+00 | BIT-EXACT |
| song10 | 124.5 s | 7198.4303 s | 7198.9 s | -0.500 s | 0.000e+00 | BIT-EXACT |
| song14 | 164.5 s | 10001.4303 s | 10001.9 s | -0.500 s | 0.000e+00 | BIT-EXACT |
| song15 | 483.5 s | 10320.4303 s | 10320.9 s | -0.500 s | 0.000e+00 | BIT-EXACT |
| song11 | 534.5 s | 7339.4303 s | 7339.9 s | -0.500 s | 0.000e+00 | BIT-EXACT |
| song13 | 635.5 s | 8475.4303 s | 8475.9 s | -0.500 s | 0.000e+00 | BIT-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.
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.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:
| arm | question | threshold |
|---|---|---|
| drummer_playing | is a drummer actually playing | onsets/s ≥ 2.0 |
| chair_filled | is the drum chair filled | drums RMS ≥ -40.0 dBFS |
| guitar_clean | is this a guitar | |corr| < 0.25 vs a verbatim guitar mic |
| percussive_sane | sanity floor only | HPSS 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.
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:
| signal | percussive | vs gtr1 mic | vs gtr2 mic |
|---|---|---|---|
Demucs drums.wav | 0.778 | +0.032 | -0.033 |
Demucs guitar.wav | 0.049 | +0.526 | +0.777 |
| raw mic1 | 0.646 | +0.158 | +0.167 |
| contaminated snare | 0.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:
| song | drums.wav perc | onsets/s | drums RMS | worst gtr corr | what it is |
|---|---|---|---|---|---|
| song15 | 0.589 | 3.47 | -31.3 dBFS | 0.049 | a drummer playing a dark kit |
| song14 | 0.483 | 1.93 | -41.2 dBFS | 0.110 | an 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.
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.
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.
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.
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.
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.
| song | source mic perc | GATE A input perc | onsets/s | drums RMS | worst gtr corr | guitar floor | verdict |
|---|---|---|---|---|---|---|---|
| song10 | 0.523 | 0.908 | n/a | n/a | 0.058 | 0.049 | PASS |
| song11 | 0.572 | 0.850 | n/a | n/a | 0.021 | 0.111 | REVIEW_REQUIRED |
| song12 | 0.646 | 0.778 | n/a | n/a | 0.033 | 0.049 | REVIEW_REQUIRED |
| song13 | 0.371 | Demucs running since 13:54, GATE A not reached | |||||
| song14 | 0.181 | 0.483 | 1.93 | -41.2 dBFS | 0.110 | n/a | EMPTY_DRUM_CHAIR |
| song15 | 0.454 | 0.589 | 3.47 | -31.3 dBFS | 0.049 | n/a | GATE 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.
GATE A input 0.908 percussive at 0.058 guitar correlation. Finished 12:34:58, all five lanes PASS.
| lane | perc | r vs gtr1 mic3 | r vs gtr2 mic2 | worst gtr corr | contaminated perc | verdict |
|---|---|---|---|---|---|---|
| kick | 0.685 | 0.039 | 0.003 | 0.039 | 0.816 | PASS |
| snare | 0.997 | -0.045 | -0.079 | 0.079 | 0.421 | PASS |
| toms | 0.841 | -0.157 | -0.165 | 0.165 | 0.032 | PASS |
| hh | 0.618 | 0.120 | 0.111 | 0.120 | 0.333 | PASS |
| cymbals | 0.445 | -0.126 | -0.173 | 0.173 | 0.497 / 0.052 | PASS |
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.
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.
| lane | perc | r vs gtr1 mic3 | r vs gtr2 mic2 | worst gtr corr | contaminated perc | verdict |
|---|---|---|---|---|---|---|
| kick | 0.490 | -0.016 | -0.017 | 0.017 | 0.761 | PASS |
| snare | 0.998 | 0.039 | 0.023 | 0.039 | 0.472 | PASS |
| toms | 0.929 | 0.012 | 0.061 | 0.061 | 0.042 | PASS |
| hh | 0.729 | 0.156 | 0.056 | 0.156 | 0.254 | PASS |
| cymbals | 0.608 | -0.285 | -0.140 | 0.285 | 0.326 / 0.036 | REVIEW |
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.
GATE A input 0.778 percussive at 0.033 guitar correlation, the run that forced the first gate rebuild. Finished 09:11:35.
| lane | perc | r vs gtr1 mic3 | r vs gtr2 mic2 | worst gtr corr | contaminated perc | verdict |
|---|---|---|---|---|---|---|
| kick | 0.758 | 0.045 | -0.019 | 0.045 | 0.852 | PASS |
| snare | 0.998 | -0.002 | -0.071 | 0.071 | 0.112 | PASS |
| toms | 0.389 | -0.005 | -0.142 | 0.142 | 0.034 | PASS |
| hh | 0.608 | 0.239 | 0.015 | 0.239 | 0.186 | PASS |
| cymbals | 0.467 | -0.376 | -0.171 | 0.376 | 0.526 / 0.143 | REVIEW |
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.
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.
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.
| lane | OLD, mic direct | NEW, Demucs first | perc old→new | guitar old→new |
|---|---|---|---|---|
| kick | 0.834 → 0.685 | 0.069 → 0.039 | ||
| snare | 0.423 → 0.997 | 0.296 → 0.079 | ||
| toms | 0.019 → 0.841 | 0.115 → 0.165 | ||
| hh | 0.287 → 0.618 | 0.295 → 0.120 | ||
| cymbals | 0.491 → 0.445 | 0.230 → 0.173 |
| lane | OLD, mic direct | NEW, Demucs first | perc old→new | guitar old→new |
|---|---|---|---|---|
| kick | 0.578 → 0.490 | 0.033 → 0.017 | ||
| snare | 0.992 → 0.998 | 0.009 → 0.039 | ||
| toms | 0.108 → 0.929 | 0.139 → 0.061 | ||
| hh | 0.412 → 0.729 | 0.347 → 0.156 | ||
| cymbals | 0.340 → 0.608 | 0.296 → 0.285 |
| lane | OLD, mic direct | NEW, Demucs first | perc old→new | guitar old→new |
|---|---|---|---|---|
| kick | 0.893 → 0.758 | 0.062 → 0.045 | ||
| snare | 0.135 → 0.998 | 0.676 → 0.071 | ||
| toms | 0.029 → 0.389 | 0.229 → 0.142 | ||
| hh | 0.187 → 0.608 | 0.136 → 0.239 | ||
| cymbals | 0.517 → 0.467 | 0.272 → 0.376 |
| lane | OLD, mic direct | NEW, Demucs first | perc old→new | guitar old→new |
|---|---|---|---|---|
| kick | 0.770 → 0.476 | 0.096 → 0.194 | ||
| snare | 0.013 → 0.998 | 0.633 → 0.181 | ||
| toms | 0.004 → 0.455 | 0.405 → 0.285 | ||
| hh | 0.378 → 0.584 | 0.254 → 0.322 | ||
| cymbals | 0.538 → 0.500 | 0.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.
| lane | OLD, mic direct | NEW, Demucs first | perc old→new | guitar old→new |
|---|---|---|---|---|
| kick | 0.944 → 0.328 | 0.056 → 0.094 | ||
| snare | 0.019 → 0.972 | 0.489 → 0.140 | ||
| toms | 0.022 → 0.354 | 0.263 → 0.401 | ||
| hh | 0.092 → 0.686 | 0.073 → 0.190 | ||
| cymbals | 0.279 → 0.907 | 0.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.
Three players, instruments swapping between takes. Read straight off the mic levels, 60 s window from each song's middle:
| song | drums | gtr2 | gtr1 | bass | roster |
|---|---|---|---|---|---|
| song10 | -12.3 | -9.8 | -24.3 | -36.6 | 2 guitars + drums |
| song11 | -11.4 | -15.9 | -11.0 | -39.0 | 2 guitars + drums |
| song12 | -16.5 | -16.3 | -22.5 | -42.6 | 2 guitars + drums |
| song13 | -16.1 | -18.1 | -20.9 | -41.9 | 2 guitars + drums |
| song14 | -24.1 | -38.4 | -26.9 | -14.1 | 1 guitar + bass + drums |
| song15 | -14.0 | -30.9 | -14.6 | -9.7 | 1 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.
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.
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 percussive | 0.528 | 0.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.
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 gapSix 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 jobQuarantine 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.
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.
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.bleed_probe.py rather than accepting the label. Song13 is already confirmed here. Ten to go, one probe run each.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.
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.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.do_song.shOne 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.
drums.wav and guitar.wav. Discard vocals and piano, which on this instrumental trio are separation artifacts and between-song talk.drums.wav, else mark SKIP_DRUM_SPLIT and stop. The splitter never sees a stem that failed this.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.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.sfg/ or by carrying the T7.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.drumsep-install/model/MDX23C-DrumSep-aufr33-jarredou.ckpt, dated 2026-09-01T22:22:35. Only this iMac lacks it.8-28/drumkit_from_mic.sh for the bad path and 8-28/do_song.sh for the good one. A grep on this iMac found neither because both live on the other machine.kick_mic1.wav against the 4.40 PM master and nothing else.# 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/