Keep It Greasey: three verdicts

The three open defects on Frank Zappa's Keep It Greasey, drums by Vinnie Colaiuta, taken to a verdict against stated null models. Two close. One stays open and now says exactly how far short it falls.

2026-09-08 · s604777 / copy s6862054 at r8972975 · repairs applied: 0
Nothing was changed on either tab. Two of the three items closed because the evidence said no repair was warranted, and the third closed nothing because its anchor missed a threshold fixed in advance of the run. Every count on this page is a direct read of a stored field or a measurement with its own chance baseline beside it.
0.019xghost-mf ratio vs chance
0pixels changed by M002
5,467pixels changed by the control
156 mstwo-family disagreement
629ghost flags, all intact
0repairs applied
On this page
  1. The reproduction check that came first
  2. KIG-M003, the premise that did not survive
  3. KIG-M002, a change nobody could see
  4. The velocity trap across four staves
  5. A third route reaches the same finding on M002
  6. One drum staff, no percussion staff
  7. Staff-line numbers are per-tab
  8. A units error, and pitch-to-line inside one tab
  9. KIG-M004, still open, and by how much
  10. A second landmark family, and what it moved
  11. The clap timbre test, and the control that killed it
  12. The piecewise map, and why it was withdrawn
  13. The third family, and where the blocker moved
  14. The named method that supersedes my window-size fix
  15. The reference class this result sits in
  16. Step 5 started: MsDTW reproduces the known result
  17. A provenance error, and KIG-M001 verified
  18. A provably minimal repair, and its acceptance test
  19. An attribution corrected, and the standard provenance
  20. Read the source, do not grep it
  21. A provenance slip inside the provenance note
  22. A third recitation slip, and the write-time rule
  23. Superseded figures, and the queue I never read
  24. A count is a timestamp, and the 329 defect
  25. The 329 undercount, measured
  26. The song-wide pass: bar level holds, note level fails
  27. The subband representation: helps, not enough
  28. A bug fixed, and the fix made it worse
  29. The diagnosis put to the eye
  30. The path-shape lever, two ways
  31. Quantisation refuted, misses decomposed
  32. The missed positions are near-silent
  33. The map was fitted with the thing it was measuring
  34. The census filter, measured
  35. The acceptance test, controlled both ways
  36. A fourth recitation slip, caught by measuring
  37. The energy result is withdrawn
  38. The non-drum map
  39. The vocal map is invalid
  40. The bass map, a valid non-drum alignment
  41. Files and reproduction

1. The reproduction check that came first

An independent walk of the published Guitar Pro file returns every published figure from a separate route, so the file on disk is the file that was measured.

MeasurePublished bundleThis walk
drum note instances4,9484,948
ghost flags, all on MIDI 38629629
resolved dynamics on those ghostsppp 12 / pp 94 / p 376 / mp 33 / mf 114identical
GM 39 hand-clap events2121
kicks after KIG-M0011,3121,312

2. KIG-M003, the premise that did not survive

The open item said 114 of the 629 ghost flags resolve to a dynamic of mf, that the two encodings disagree, and that nothing on hand decides which the transcriber meant. The first half of that is a reading error.

The 114 came from a resolved field, never an authored one

FieldWhere it livesBeats carrying a value
Songsterr velocityon a beat, sticky and sparse989 of 3,756
GPIF <Dynamic>on a beat, written by the exporter3,756 of 3,756

The Guitar Pro exporter resolves the sticky Songsterr value onto every beat, so reading the export hands each ghost a dynamic whether or not the transcriber wrote one there. Splitting the 114 by whether a mark was actually authored at that beat:

The 114 "mf ghosts"Count
authored velocity: "mf" on that beat3
inherited mf from an earlier, unflagged beat111

The control, and the null

Across the whole staff the transcriber authored 363 dynamics at ghosted notes. Every distribution below is a direct field count.

Authored dynamic at a ghosted beatppppppmpmfffffff
count669262233000
Gate N3, the chance baselineValue
base rate of mf among the 989 authored dynamics, staff-wide44.3%
observed at ghosted notes3 / 363 = 0.83%
ratio, observed over chance0.019x
expected under independence160.8, observed 3
binomial, two-sidedp = 3.0e-86
The two encodings do not disagree. They agree to an extreme degree. The apparent conflict was an artifact of reading a resolved field as an authored one, and 111 of the 114 carry a mark the transcriber never wrote at that beat.

What the notation standard adds

Norman Weinberg's PAS drumset guidelines settle the symbol: a drumset ghost is a notehead change, never a point on a dynamic ladder. Guitar Pro naming the flag AntiAccent invites the ladder reading and the ladder reading is wrong. A ghost notehead inside an mf passage is well-formed notation, so the remaining 3 are not a defect either.

The transcriber's own words, in the file

Bar 22 beat 0 carries a text annotation:

"There is no kick on beat one of the first bar and a couple others. Variations of ghost notes among the snare and hi-hat at the end of each bar"

The person who wrote the flags was tracking them bar by bar in this exact section.

Verdict: no change. Note 659 is never edited, so the copy-on-write that guarded 515 out-of-plan instances never has to run. The three authored-mf ghosts sit at bars 119, 124 and 227 and are recorded rather than repaired.

3. KIG-M002, a change nobody could see

Twenty-one events on GM 39, Hand Clap, drawn at the snare staff position. The open item called the placement certain and the intent unrecoverable.

One, the figure is deliberate

BarsSection markerSignatureClapsMetrical slot
22-32Verse 119/16one per bar, 1116th 13-14 of 19 in ten of eleven bars
42-44Verse 221/162-3 per bar, 816ths 7, 17, 19 of 21, repeated
65, 82—4/41 each16th 11 of 16

The snare never thins inside those bars, running 4 to 8 events per bar throughout, so the claps are an added layer rather than a substitution. A stray GM number does not land on the same subdivision of eleven consecutive bars.

Two, the change is invisible to every reader

ArticulationNameStaff lineNoteheads
0Snare (hit)3noteheadBlack noteheadHalf noteheadWhole
84Hand Clap (hit)3noteheadBlack noteheadHalf noteheadWhole
34Snare (side stick)3noteheadXBlack, a distinguishable option that was not used

Songsterr agrees from its own side: all 21 claps and all 1,423 snares sit on string: 1.5, and its note schema has no notehead field. That is two field reads, so the question then went to the eye with a control.

Bar 22 rendered fromDiffering pixels against the published bar
a copy with the clap rewritten as GM 38 snare0
a copy with the clap rewritten as GM 49 crash, positive control5,467, bbox x 1399-1575, y 420-725

The two source files differ by sha256 and the two render pages differ by sha256, and the control fires at the clap's own position in the bar, so the pipeline sees edits. Rewriting the clap as a snare produces a byte-identical PNG.

Published, GM 39Bar 22 as published
Control, GM 49 crashBar 22 with the clap rewritten as a crash

Three, no independent printed witness notates a clap

Marc Atkinson's Rock Charts transcription is the only complete-song printed chart on hand. Its music key lists tom-toms, snare, bass drum, hi-hat by hand and by foot, ride, crash and additional toms, with no clap, cowbell or auxiliary lane at all.

Marc Atkinson's music key
Gate N7 applies here and is respected. A chart that does not notate a texture did not transcribe it, and that is never evidence the record lacks it. The correct reading is narrower: the clap has no independent printed corroboration, and it has no printed refutation either.
Verdict: no change. The figure is deliberate, the edit would alter nothing a reader can see, and the burden sits on the revision that changes an existing mark. Nothing here meets it.

2b. The velocity trap across four staves, and the limit on it

A peer session reproduced the sticky-velocity finding and sent a spread. Every figure was re-fetched here from uncredentialed CloudFront reads of the live heads, not accepted. These are direct counts of a stored field, not detector output, so no chance baseline applies to any row.

songIdTabBeats carrying velocity, out of all beatsPeer's figure
604777Keep It Greasey, original, measured here989 of 3,756match
35870Montana569 of 1,435match
35886Muffin Man254 of 1,133match
68246Alien Orifice2 of 1,006match
Alien Orifice shows the size of the trap. Two authored marks on the whole staff, and reading them here gives exactly one ff and one fff. A Guitar Pro export of that tab carries 1,006 resolved values standing on 2 authored ones, so any dynamics conclusion drawn from it is a statement about the exporter.

The limit, which carries more weight than the spread

ghost is a NOTE field and it is NOT sticky. On Keep It Greasey's MIDI 38 acoustic snare lane it appears on 0 of 3,756 beats and on 629 of 4,974 note objects, with no carry rule. A snare-lane ghost audit off the Songsterr JSON is therefore safe in the way a dynamics audit is not, and the M003 analysis above read ghost per note object and never carried it, so its 629 count was already correct.

Two reproduction details found alongside

Montana s35870 has 18 tracks and its drums sit at index 15, with further drum tracks at 16 and 17. A scan capped at 14 parts misses the drum staff entirely. The meta's popularTrackDrum field gives the index directly and was confirmed as 15 here.

The part path is https://dqsljvtekg760.cloudfront.net/{songId}/{revisionId}/{image}/{trackIndex}.json, where {image} is the meta's image field, a v0-3-2-... string. Passing the per-track hash instead returns 403 on all three tabs. Responses are gzipped.

3b. A third route reaches the same finding on M002

A separate session measured this song with a two-hands playability gate, which shares no method with the rendering test or the field reads above. Its claims were re-derived here rather than accepted.

MIDINameStaff position, my own readEvents
35kickstring 41,311
38snarestring 1.51,423
39hand clapstring 1.521
42hi-hat closedstring -0.5533
44hi-hat pedalstring 4.5195
46hi-hat openstring -0.5428

Every value matches what the peer reported. Both versions of tr_score.py were then loaded here and run over all 4,948 events and 3,730 written instants:

Version of the hands gateover_handsover_feet
fixed, keyed on staff line00
backup, keyed on MIDI pitch30
BarPositionPitchesNames
42538, 39, 42snare, clap, hh closed
43538, 39, 42snare, clap, hh closed
44538, 39, 42snare, clap, hh closed

Exactly the three beats claimed, at exactly the bars claimed, and they are the same collisions recorded above as (38, 39, 42) stacks. ./run_selftests.sh was also run here directly and returns ALL SUITES PASS, exit 0.

The hands verdict holds under either reading of the ambiguity M002 left open. If the transcriber meant a clap struck on the snare surface, it spends one stick and the count is 0. If they meant an overdubbed hand clap by someone else, it spends no drummer hand and the count is 0. Either reading gives 0, so the pitch-keyed 3 was an artifact of the gate rather than a defect in the tab. Nothing was uploaded or revised.

3c. One drum staff, no percussion staff, and what that removes

A peer session's track census reported this and it was re-derived here from the s604777 meta rather than accepted. Nine tracks, exactly one instrumentId 1024 staff at index 8 named Vinnie Colaiuta, and no staff named for tambourine, cowbell, shaker, conga, timbale or percussion anywhere. popularTrackDrum reads 8, matching.

This does not add a third argument on top of the rendering test and the hands gate. It removes the one alternative that could have complicated them: there was nowhere else in this tab for a clap to be written. A transcriber notating an overdubbed clap had no percussion staff available and would have had to put it on Vinnie's staff, which is where it is.
ReadingWhere the clap goesHands cost
Vinnie strikes it on the snare surfacehis own staff, snare line0 extra
Someone else overdubs ithis staff, for want of a percussion staff0, no drummer hand at all

The verdict on KIG-M002 is unchanged: no change to the tab.

The peer's own correction, recorded because it bears on other songs. That session had told the record that Peaches En Regalia s35889 has no separate percussion track. It has a staff named tambourine at index 10. Their census had searched for percussion among staves whose instrumentId was not 1024, so a percussion staff carrying 1024 was invisible to it. Their published instant counts were not affected, because those already measured every 1024 staff rather than the first, and they checked rather than assumed. Nothing on this page depends on it, since Keep It Greasey has a single 1024 staff.

3d. Staff-line numbers are PER-TAB, and this page had been treating them as stable

The peer reported that a line value means something only inside one tab. Built independently here from the drum staff of five tabs, uncredentialed CloudFront reads, taking each pitch's most common line:

PitchAlien Orifice 68246Muffin Man 35886Carolina 68248Idiot Bastard 68253Keep It Greasey
kick 354n/a454
kick 363.53.53.5n/an/a
snare 381.51.5n/a41.5
hatClosed 42-0.5-0.5-0.51-0.5
hatOpen 46-0.5-0.5-0.52-0.5
crash 49-1-1-1n/a-1
ride 5100n/an/a0
tambourine 54n/an/a1.51n/a
Four tabs share one layout. s68253 uses a different one throughout, with kick down at 5, snare at 4 and the hats up at 1 and 2. Any global pitch-to-lane map built from these numbers is wrong.

The Carolina case, corrected

An earlier version of this section was wrong and the peer caught it. It said Carolina s68248 puts tambourine 54 at line 1.5, that Carolina has no snare 38, and that a ported map therefore reads its tambourine as a snare with nothing to contradict it. The zero-38 part is right and the conclusion was not. The table above omitted a row.
PitchAlienOrificeMuffinManCarolinaIdiotBastardKeepItGreasey
snare 381.5 (207)1.5 (484)n/a4 (139)1.5 (1423)
snare2 401.5 (23)1.5 (494)1.5 (229)n/an/a
tambourine 54n/an/a1.5 (192)1 (342)n/a
clap 39n/an/an/an/a1.5 (21)

Carolina carries snare2 MIDI 40 at line 1.5 with 229 notes, so line 1.5 there genuinely is the snare line, with a real snare voice on it. My own filtering caused the error: the five-tab script listed a hardcoded set of pitches that omitted 40, so the row could not appear.

The corrected reading unifies two cases rather than adding a second trap. Carolina's line 1.5 holds snare2 (229) and tambourine (192). s68253's line 1 holds hatClosed (5) and tambourine (342). Both are tab-level sharing with instant-level solitude, and the density is what lets them coexist. One rule covers both.

A recurring artifact the full table exposed

Listing every pitch also showed out-of-kit MIDI 65 sitting on the kick line in three of the five tabs: Alien Orifice 4 (2), Carolina 4 (3), Keep It Greasey s604777 4 (1). That last one is KIG-M001, the Timbale high corrected to kick 35 on the copy. The same artifact sits uncorrected in at least two other tabs, so it is a class rather than a one-off.

This explains the near-miss above

On s68253 both hatClosed 42 and tambourine 54 fall on line 1 across the tab, so a tab-level census shows them sharing. At each of the 118 instants the tambourine is still alone there, because hatClosed sounds only 5 times on the entire staff. Lane-level co-occupancy across a tab is not instant-level sharing.

The constraint the hands rule depends on. It survives all of this only because it counts distinct lines within one instant of one tab and never compares a line number across tabs. Stated wherever the rule appears: count distinct staff lines within a single instant of a single tab, and never carry a line number, or a pitch-to-line map, from one tab to another.
What this page had been doing. It records Keep It Greasey's snare and clap at string: 1.5 and its hats at -0.5. Those values are correct for this tab and must not be ported. The memory note behind them has been amended to carry the same warning, since as written it could have been read as a stable map.

The peer's resolution of the 172, recorded as theirs

Their per-instant run-length test resolved the wider set: of the 172 non-kit instants, 155 are a second player, 16 are ambiguous four-bar runs on Call Any Vegetable s68241, and exactly 1 is a likely real drummer flag, an isolated single tambourine bar in Brown Shoes s35869. True catalogue two-hands failure count 611 rather than the 822 a naive read would have shipped. Not re-derived here, per the one-song rule.

3e. My correction of the peer's cell was itself a units error

The change was wrong. This page reported that the peer's table had snare 38 on s68253 as 4 (133) and that my read gave 4 (139), so I changed it.
ReadingValue
snare 38 on line 4133
snare 38 across the staff139, being 133 on line 4 plus 6 on line 2
kick 35, all on line 5133

Their 133 was per-line and my 139 was per-pitch. Both correct, counting different things. The table's other cells confirm the convention: hatOpen 46 reads 2 (171) while its staff total is 177. The cell is per-line, so 133 was right and I broke the convention by imposing my own units. Reverted, and the note now states its cell format explicitly.

This is the units failure the notation evidence gate already names, the one that flipped KIG-M003's id histogram from EXCLUSIVE to SHARED when instance counts were compared against beat-reference counts. It fired again here on a two-digit number.

A pitch-to-line map is wrong inside a single tab

The unfiltered census exposed something stronger than the per-tab rule above. Six of s68253's eleven pitches occupy two lines each:

PitchLines it uses
snare 384 (133) and 2 (6)
hatOpen 462 (171) and 1 (6)
tambourine 541 (337) and 0 (5)
tom 413 (2) and 4 (1)
tom 433 (5) and 1 (1)
crash2 571 (2) and 0 (1)
Pitch-to-line is not a function even within one staff. The rule tightens to: read each note's own string field, and never look a line up from a pitch in any scope.

The same error shape hit both sessions in one exchange

My hardcoded pitch dict could not show midi 40. The peer's range(35,82) boundary could not show midi 65, because High Timbale sits inside GM percussion while sitting outside the standard drum kit, which is the whole point of that finding.

A filter chosen ahead of the question decides the answer. Two independent instances inside one exchange, each caught by the other session rather than by the one that made it.

4. KIG-M004, still open, and by how much

Thirty-two kick onsets the score omits, listed by audio time only. Placing them needs an anchor, so one was fitted on kick and hi-hat only across bars 22 to 32, with snare and clap held out because the claps are the target and the snare shares their staff row and their stem.

MeasureValue
winnerbar 22 downbeat at 35.980 s, scale 0.984
one-to-one match, mir_eval.onset, 50 ms121 / 172 = 70.3%, against a rotation-null baseline of 32.6%
busiest single detected onset1
rotation null, 2,000 drawsmean 56.0, sd 14.28, 0 exceedances
z against the rotation null4.55
#Declared in advanceResult
1unique maximum, no tie inside 1 matchPASS, 0 competing cells
2match rate at least 2.0x the surface medianPASS, 2.01x
3z at least 5.0FAIL, z = 4.11
4busiest single onset absorbs at most 3PASS, 1
5scale inside 0.94 to 1.06, off the boundaryPASS, 0.984
Verdict: UNEVALUABLE. The threshold was fixed in a hashed pre-registration and the run missed it. It does not get moved afterward. verdict_gate.py, the numeric engine shipped with the notation gate, returns UNDETERMINED on the same numbers independently. Under the pre-registration's own rule the clap timbre test never ran.

The one thing worth carrying forward

The fitted 35.980 s sits within about a second of DRUM! Magazine's printed "Verse 1 at 0:35", a source that never entered the fit and shares no method with it. The score's own constant-tempo timeline says 38.217 s and drifts to 517.9 s against 501.8 s of real audio, so the notated tempo map is the thing that is off.

That agreement is recorded as one candidate landmark. The absolute bar identity gate requires twelve across two source families, six each, so no bar position is claimed from it. The obvious second family, sung-lyric onsets from the isolated vocals stem, is unavailable: the score's newLyrics field holds five entries and every text value is empty, so the lyrics would have to be entered by hand first.

4b. A second landmark family, found by not accepting the first dead end

A correction to this page's own first pass. The vocals landmark family was called unavailable because the score's newLyrics field is empty. That read one closed path as no capability. Lyric text was never what the family needed. The Ike Willis vocal part carries 458 notated attacks across 79 bars with full bar positions, and the vocals stem is isolated.

Two families, fitted separately, sharing no stem and no notated part

FamilyFitted onStemBar 22 downbeatScale
Akick + hat, bars 22-32, 172 attackskick, hat35.980 s0.984
BIke Willis vocal part, 437 attacksvocals36.136 s0.978

They disagree by 156 ms. A 19/16 bar here runs about 2.09 s, so both land on the same bar. The 2026-09-07 gate failed its primary external-family requirement because lead and bass disagreed by 2.673 s.

The integer-shift contest

ShiftFamily A, kick+hatFamily B, vocals
-2 bars67/172 (39.0%)132/437 (30.2%)
-1 bar88/172 (51.2%)118/437 (27.0%)
0121/172 (70.3%)163/437 (37.3%)
+1 bar79/172 (45.9%)130/437 (29.7%)
+2 bars73/172 (42.4%)139/437 (31.8%)

Zero shift wins separately in both families, by +33 and +24 matches over the nearest competitor. That is the condition the earlier pass failed, where kick, snare, hat and tom all leaned to plus one bar.

FamilyMatchedMedian absolute residual90th percentile
A, kick+hat12117.6 ms42.3 ms
B, vocals16328.8 ms52.1 ms

The gate asks for a median under 75 ms and a p90 under 150 ms. Both families clear both, inside the fitted span.

What still blocks M004, precisely

The anchor is local and it does not extrapolate. Carried across the whole recording it collapses to chance.

Whole-song extrapolationValue
offset, scale, tolerance35.980 s, 0.984, 60 ms
one-to-one kick match, against a 32.6% rotation-null baseline512 / 1,311 = 39.1%, ratio 1.20x, which is chance
verdict_gate.py --countsUNDETERMINED, under the 2.0x floor
predicted score end508.0 s against 501.84 s of real audio, drift +6.1 s
Under Gate N4 anything below 1.5x is the null, so that row is carried as a refutation of the extrapolation and as nothing else. That row is not a count of surplus kicks, so no repair may be built from it. The 32 surplus onsets sit across the full 501.8 s while the validated span is eleven bars, so they cannot be placed from this anchor. That is why M004 stays open.
Two limits kept in view. The clap-test criterion 3 still fails at z = 4.11 against a declared 5.0 on family A alone, and a two-family agreement does not retroactively pass a threshold that was written down and missed, so the clap timbre test still never ran. And no ABSOLUTE_ANCHORS.csv was hashed, so the twelve-landmark gate is not claimed as passed.

Net movement: bar identity at bar 22 now has two-family corroboration and wins its shift contest, where it previously had neither. Placing the 32 events needs a piecewise map with landmarks bracketing each one.

4c. The clap timbre test was run, and its own control killed the interesting part

Pre-registration v2, sha256 383fe83e...25f0b7, written with no timbre yet measured. v1 stays failed and none of its thresholds were moved. v2 rests on the two-family anchor that did not exist when v1 was written, and declares the same timbre thresholds v1 declared.

The declared test returned UNEVALUABLE

Entry rule fixed in advance: an instant enters only if a detected snare-stem onset lies within 60 ms of it.

PopulationNotatedEnteredDropped
target, the 11 GM 39 claps11011
control, the 58 same-bar GM 38 snares583325

Zero of eleven entered, so neither the centroid nor the low-band comparison could run.

The post-hoc observation, and the control that withdrew it

Not pre-registered, and reported here because it looked like a finding. The 11 clap instants scored 0 in the snare stem while the same-bar notated snares scored 33 of 58 = 56.9%, giving a binomial p = 9.5e-05. That baseline was circular, comparing beats with no notated snare against beats that have one.

Group, bars 22-32, snare stem, 60 msnHitsRate
clap, no snare on the beat1100.0%
kick-only, no snare on the beat69811.6%
snare on the beat583356.9%
Clap against kick-only: Fisher exact p = 0.5906, binomial p = 0.6281. The dropout is fully explained by the beat carrying no notated snare, and it says nothing about claps. The observation is withdrawn.

For completeness, 9 of the 11 clap instants do carry an onset in at least one of the seven stems, so the anchor is not wrong at those instants. Twelve of the 21 claps stack with a notated kick, which accounts for the hits in the kick, cymbal and other lanes.

What this changes: nothing. M002's verdict never rested on audio. It rests on the figure being deliberate, on GM 39 and GM 38 rendering byte-identically, and on the burden sitting with the change. The audio adds no corroboration in either direction, which is now measured rather than assumed.

4d. The piecewise map was built, and it failed its own external check

Pre-registration sha256 2e328671...3e80f10, hashed in advance of any window fit. M004 was waiting on this step, so it was run rather than queued.

Sixty windows, 8 score bars wide stepping 4, each fitted independently on kick and hat only, offset searched across the whole 501.84 s, scale 0.93 to 1.07, one-to-one at 50 ms. Fifteen windows passed the four declared criteria and placed 64 surplus kick onsets across 48.3% of the recording.

Then the control ran

The same two-family logic that made the bar-22 anchor credible, applied per window at that window's own offset and scale, tolerance 60 ms: does the isolated vocals stem corroborate it?

Passing windowDrum offsetVocal family's own bestDisagreement
bars 10-1738.345 s84.500 s+46.155 s
bars 38-4569.325 s4.500 s-64.825 s
bars 42-4977.230 s77.440 s+0.210 s

One of three testable windows corroborates. The other twelve sit in the instrumental solo and carry too few vocal attacks to test, so they are UNEVALUABLE rather than passing.

A second failure needs no control at all. The window for bars 210-217 fitted to offset 41.980 s, scale 1.038, match ratio 2.17x its own rotation null. Bars 210 to 217 cannot begin 42 seconds into a 501.84 s recording. Criterion 4, monotonicity, was implemented against the full list of fitted windows rather than the passing subset, so a neighbour that had already failed still satisfied the check. That is a defect in this run's code.
The 64 placements are withdrawn. They rest on windows a second family refutes in two of three testable cases, and on at least one physically impossible lock.

The lesson, which is the useful output

An 8-bar window carries too little information to lock uniquely across 501.84 s of a dense, repetitive drum part. Spurious locks cleared the declared 2.0x rotation-null threshold, so 2.0x was too loose at this window size. Raising it alone is not the fix, since refitting a declared threshold on the same data is the error these gates exist to stop.

  1. A window must be corroborated by a second family to place anything. Only 3 of 15 were testable, so the vocal part cannot reach the solo section and a third family is needed there.
  2. Monotonicity must be enforced against passing neighbours, and the code must assert a window's offset lies in a plausible band for its bar range. Bar 210 at 42 s should have been rejected ahead of any statistic.
  3. The search should be local. A free full-song search per window invites the spurious lock that produced +46 s and -65 s.
M004 stays open. It is no longer waiting on an idea. It waits on a corroboration family reaching the solo section and on a constrained search. No repair, no revision and no placement is carried forward.

4e. The third family exists, and finding it moved the blocker

The previous section named the next step as find a corroboration family reaching the instrumental solo, since the vocal part stops at bar 101. That search was run rather than queued.

Notated partTotal barsBars inside 100-240Stem
Arthur Barrow, bass222139 of 141bass
Warren Cuccurullo, part 7164139 of 141rhythm
Frank Zappa, solo2121lead
Ike Willis, vocals792vocals

The "no family reaches the solo" blocker is dissolved. Two candidates cover it, and a third covers the solo passage itself.

The bass cross-check, and why it is not carried as a refutation

The bass family made all 15 previously-passing windows testable, where the vocal family could test only 3. Every one of the 15 disagreed with its window's drum offset, by between 3.985 s and 405.500 s.

That looks decisive and it is not, so it is not reported as one. The window at bars 42-49 is the single window the vocal family corroborated, at +0.210 s. The bass family puts the same window +160.330 s away. Two corroboration families contradict each other on a window a third family fitted, which locates the problem in the checking method rather than in any one window.
WindowBass attacksPeakSurface medianRatio
10-17867244.01.64x
38-45695535.01.57x
42-49665334.01.56x
102-109968350.01.66x
150-157968647.01.83x
166-173968746.01.89x
170-177968846.01.91x
174-181968747.01.85x

All eight clear the 1.5x floor, and all eight clear it narrowly, against a surface median near 51%. Gate N4's own warning covers this: above a 35% null a small excess goes significant while meaning little. Compare the whole-part vocal fit at 7.65x and the bars 22-32 drum fit at 2.01x. A second contributor: the score notates 2,424 bass attacks while the bass stem yields 1,825 onsets, so 599 can never match and a perfect map still caps near 75%.

What actually blocks M004 now: not family availability, window size. At 8 bars the fitted family, the vocal check and the bass check are all marginal, so the cross-check cannot adjudicate the fit. The next attempt should use windows large enough for every family to lock with a real margin, on the order of 30 to 40 bars rather than 8, accepting coarser bracketing in exchange for a cross-check that can decide. Nothing here places any onset.

4f. The window-size fix is superseded by a named method

A correction to the section above. It concluded the next attempt should use 30 to 40 bar windows instead of 8. That was an ad-hoc patch, and a search found the method this problem already has. Hand-rolling where a named method exists is failure mode three in the notation evidence gate's own preamble, and this pass committed it.

What was built here was the wrong shape. Sixty windows, each fitted by an independent free search across the whole 501.84 s, with nothing tying one window's answer to its neighbour except a monotonicity check applied afterwards. That is how a window covering bars 210-217 came back at 41.980 s. Widening the windows would have reduced that failure without removing its cause.

The named methods

None of the four was run in this pass, so for every one of them the offset, scale, tolerance and match rate are all not applicable here.

The corrected next step: not larger windows. A coarse-to-fine multiscale path with a constraint region, so each level is bounded by the level above rather than searching the whole recording independently. Window size stops being the free parameter that decides the result.

Two setup facts, corrected after trying

The FMP source text is catalogued in this project at /Volumes/Black/complete/Springer/ and that volume is not mounted on this machine right now, so the chapter was not read here. The method names, authors and venues come from the search.

libfmp is now installed, and it was not the one-line install this page first claimed. Three attempts into ~/.venvs/notation-gate each reported exit 0 while the log ended partway through a 20.1 MB music21 download, with import libfmp still failing. A fourth run, left fully detached with no timeout, completed, and the import now succeeds. The earlier failures were the install being cut off partway, never a broken package.

Neither gap blocks the next attempt. MsDTW needs only numpy and scipy, and the FMP notebooks are readable on the web at the links above.

6. The reference class this result sits in

A peer session tested the completeness of the 38-id scope list the Zappa program works from. The two headline figures were re-derived here by paging /api/songs directly, not accepted.

MeasureThis sessionPeer
Tabs filed under artistId 5912 (see section 14: this is not a count of Zappa tabs)329329
of those carrying an instrumentId 1024 staff262262
ids the program has been sweeping3838
never measured230230
A method note. The first attempt here passed artistId=5912 to /api/songs and got 600 rows back whose first entry was Metallica. That parameter is ignored. The working form is ?pattern=Frank+Zappa&size=100&from=N, paged, then filtered client-side on artistId == 5912, saturating at 329 by from=400.

What this does to the Keep It Greasey result

Nothing. Every figure on this page is a direct measurement of one tab, never an inference from a sample, so the size of the surrounding list cannot move it.

What it does change

It changes what a clean result would mean if anyone generalised from the program. The 38 ids are not a random draw from 262. A tab enters that list because someone had a reason to look at it, so the set is selected, and a low defect count across selected tabs licenses nothing about the other 230.

Superseded, and replaced below. This page first carried the peer's in-flight line: 178 of 262 measured, 33 tabs, 798 instants, with Flakes at 300. Their sweep has since finished and two of those figures changed.
Final sweepCount
tabs measured262 of 262, 0 failures
tabs carrying work36
three-surface instants822

The 822 must not be read undecomposed, because three different things were being summed:

ClassCount
kit-only, three separate kit surfaces (SUPERSEDED, see section 13)610 545 to 526
tambourine / clap / cowbell dependent172
on a pitched-percussion staff, the peer's own false positive40

Corrected kit-only ranking: Flakes s35897 270, Tryin' to Grow a Chin s68245 78, Brown Shoes Don't Make It s35869 54, Filthy Habits s68237 24, King Kong Itself s35863 21, Let's Move To Cleveland s68238 18, Sinister Footwear II s21874 16, Mother People s60347 16, Carolina s68248 15, Dog Breath Variations s68247 9.

Every count in this section is the peer's and is not re-derived here, since this chat covers Keep It Greasey only. The scope decision is Brandon's. Keep It Greasey being clean stays a real result about Keep It Greasey.

Two structural claims I did re-derive, because this page republishes them

ClaimMy read of the meta
Flakes s35897 has two instrumentId 1024 stavesCONFIRMED: index 6 named "Percussion Organ", index 8 named "Drums", both non-empty, popularTrackDrum 8
The Idiot Bastard Son s68253 has a drum staffCONFIRMED: one 1024 staff at index 3, popularTrackDrum 3

The pitched-percussion artifact is the same class as KIG-M001

A staff named "Percussion Organ" carrying instrumentId 1024 holds melodic pitches while wearing the drum instrument id, and the sweep counted its events as drum-kit failures until the peer caught it. That is 40 of the 822.

This page has already met that class of trap twice. KIG-M001 was a fret 65 Timbale high sitting on a lane carrying 1,311 kicks and nothing else. KIG-M002 is a GM 39 hand clap drawn on the snare line. In all three cases a GM number or an instrument id does not mean what a reader assumes, and the fix is the same each time: read the field the human acts on, which is the staff line, never the pitch.

What the 172 does to KIG-M002

The clap question looked local when it was 21 events in one song. The finished sweep puts 172 of the 822 instants on the tambourine, clap and cowbell question, and The Idiot Bastard Son s68253 carries 118 instants of which zero are kit-only, with 112 of the 118 being hatOpen plus snare plus tambourine.

The first version of this rule was overreach and is corrected below. It read "a non-kit surface drawn on a kit lane costs one stick or no drummer hand, so the ambiguity does not have to be resolved." That generalised from this song's structure to cases whose structure differs, and it covers zero of the 172.

Why Keep It Greasey's case works, and the 172 do not

At KIG bars 42-44 the GM 39 clap sits on string 1.5, the same line as the snare, with a snare sounding at the same instant. Two surfaces either way, so removing the clap changes nothing. Measured here on the largest affected tab, The Idiot Bastard Son s68253, revision 704236, drum staff index 3, 817 events, uncredentialed CloudFront read:

MeasureResult
three-line instants containing MIDI 54 tambourine118 (peer said 118)
of those, MIDI 54 alone on its line at that instant118
of those, MIDI 54 sharing its line0
instants that fall to two hand lines once the tambourine is removed118 of 118

A sample instant reads (54, line 1), (46, line 2), (38, line 4), which is tambourine, open hat and snare on three separate lines.

ReadingSurfaces at that instantVerdict
the drummer strikes the tambourinethree separate linesreal failure
another player overdubs ittwo drummer linesnot a failure
The two readings diverge on every one of them. Attribution has to be resolved for these, and 118 of the 172 are one entire tab. The first version of the rule would have licensed treating 172 live questions as settled.
The corrected rule, with its boundary. A non-kit surface sharing a kit lane costs one stick or no drummer hand, and both readings give the same count, so playability is decided without resolving attribution. A non-kit surface on its own lane does not have that property: the two readings differ by one hand, and attribution must be resolved for the instant to be called playable or not.

The lane position varies per tab, at 0, 1, 1.5 and 5 across the five affected songs, which is itself evidence the transcribers gave the tambourine a deliberate separate lane rather than folding it onto a kit surface.

Nothing about Keep It Greasey changes. M002 stays closed at no change, and the 21 GM 39 events stay exactly as Ben Dibden1 wrote them.

4g. Step 5 started, and the method reproduces the known result

The method was named earlier and the work deferred at that point. That deferral has ended: libfmp now imports, so the subsequence-DTW primitive from FMP C7S3 was run here on the one window whose answer two independent families already agree on. The criterion was fixed in the script ahead of reading the result: the recovered bar-22 downbeat must land within one 19/16 bar, 2.095 s, of 35.980 s.

Setup. Reference is the pooled kick and hat onset envelope across the whole 501.84 s at a 50 ms hop, 10,037 frames. Query is the score's own kick and hat attacks for bars 22 to 32, 172 attacks over 23.4 s, 470 frames. Parameters for every row below: offset is what the run recovers rather than an input, scale is not a parameter of this method since the path is free to warp, tolerance is the 50 ms frame hop, and the match rate is replaced by a mean accumulated cost of 0.0183 over a 511-step path.

MethodBar 22 downbeat
kick+hat matched filter35.980 s
Ike Willis vocals matched filter36.136 s
subsequence DTW, libfmp C7S336.300 s

Path spans reference frames 726 to 1182, 36.300 s to 59.100 s, a 22.8 s span against the 23.05 s the score's eleven 19/16 bars occupy at 136 BPM.

Declared criterion: PASS, at 0.320 s against an allowance of 2.095 s.

Why this carries more than a fourth number

The two matched filters share a model, one offset and one scale. Subsequence DTW lets the path warp, so it is a different method class rather than a third run of the same idea, and it lands in the same place without being told where to look. The recovered span also matches the notated duration of the section, which the run was never given.

Done: the method reproduces a known result on a window whose answer was already settled, which is the right order. Not done: this places no surplus onset. The remaining work is running it across the song inside a constraint region, with per-window corroboration and the plausible-band assert, and only then placing onsets a passing window brackets.

7. A provenance error of mine, and KIG-M001 verified properly

My first check of the peer's KIG-M001 claim returned DOES NOT MATCH, and the fault was mine. kig_songsterr_rows.json, the dataset behind the clap and dynamics tables above, was built from s604777_r8852151_part8, the ORIGINAL. My verification script labelled it the copy, so it compared the original against itself.
Sourcekick 35MIDI 65snare 38clap 39ghostsbeats
s604777 original r8852151, part JSON1,31111,423216293,756
s6862054 copy r8972975, published .gp1,31201,423216293,756
1,311 + 1 = 1,312. Confirmed exactly, and it is the cleanest independent check of KIG-M001 in this record: the single Timbale high became a kick on the copy, and the original still carries it.

What it does to the figures here: nothing, and why

Every other column is identical between the two files, because KIG-M001 touched one note in bar 231. Snare 1,423, clap 21, ghosts 629, beats 3,756 and velocity beats 989 all hold on both, so the clap and dynamics tables are correct as published.

What it does to provenance: one row was mislabelled and is fixed

The four-stave velocity table credited 989 of 3,756 to 6862054. The measurement came from 604777. Corrected in place; the number never changed, the label was wrong.

Provenance is a hard gate here and a right number does not satisfy it. Sections 2 and 3 are measured on the original s604777 r8852151 part JSON; the reproduction check in section 1 is measured on the published copy s6862054 r8972975 .gp. Both stated rather than left to be inferred.

The MIDI 65 class is six tabs, not three

My five-tab census found Alien Orifice 2, Carolina 3 and Keep It Greasey 1, all three exact against the peer's full 262-tab rescan. The two it could not reach are the large ones: Seal Call s604408 at 33 and The Deathless Horsie s35885 at 28, and on Seal Call the timbale outnumbers the kick on their shared line, 33 against 25. A five-tab sample sized the class at half its real membership, which is the reference-class point applied to my own finding. Those counts are the peer's and are not re-derived here.

8. The KIG-M001 repair is provably minimal, and that yields an acceptance test

Both sessions censused the two files independently and agree on every cell.

Measures604777 original r8852151s6862054 copy r8972975
beats3,7563,756
beats with velocity989989
snare 381,4231,423
clap 392121
ghost-flagged notes629629
kick 351,3111,312
MIDI 6510
Two cells of seven moved, and they are the same single edit. One Timbale high became one kick, with nothing else touched across 4,948 events and 248 bars. That also settles the provenance question in both directions: 989 of 3,756 holds on both files, so it was right measured on either. Neither session could have known the two files agreed without checking, which is why the relabelling above was correct regardless.

The acceptance test for any repair of this class

After the edit, every count except the two target lanes must be identical to the source, and those two must move by exactly the number of notes converted.
Tabkick priorMIDI 65kick afterbase count source
Seal Call s604408253358peer, not re-derived here
The Deathless Horsie s3588567428702peer, not re-derived here
Packard Goose s3587510414peer, not re-derived here
Carolina s682488311matches my own census
Alien Orifice s682468210matches my own census
Keep It Greasey s6047771,31111,312matches, already demonstrated

All six rows are arithmetically consistent, and three of the base counts were confirmed by my independent five-tab census.

Why a full census catches what a targeted check cannot

A check aimed at the edited note cannot see collateral damage. A peer session earlier lost 179 note instances across 79 bars by editing a shared GPIF Beat in place, and the edit looked correct at the target. A full census would have shown a count moving that nobody intended.

Neither pass was sufficient alone. My five-tab census got all three of its tabs exact and sized the class at half. The peer's 262-tab scan got the size right and needed my finding to know the class existed, since its range(35,82) filter had erased MIDI 65 entirely.

9. An attribution I got wrong, and the standard's real provenance

In a peer message I called the 179-note collateral-damage case "your 179-note case". Not theirs. It came from the Watermelon In Easter Hay work on 2026-09-08, a third session. The memory note itself was already correct, saying "a peer session", so only the chat message drifted.

The 179 is grounded, checked here

reference_gpif_note_beat_dedup_copy_on_write documents it: removing 15 refuted notes from CODA-s6857183-Brandon-edit.gp by editing shared beats in place deleted 179 note instances across 79 bars that were never targeted, because <Beat> id 899 is referenced by 176 voices. The damaged file was quarantined rather than deleted. The standard's strongest claim rests on a measured case, not an anecdote.

The correction makes the standard stronger

SessionContribution
Watermelon In Easter Haythe collateral-damage case, 179 instances across 79 bars
Keep It Greasey, herethe minimal-repair demonstration, 2 of 7 cells moved
the 262-tab censusthe class it generalises to
No one of the three produced the standard alone, which is better provenance than either session claiming it.

A pre-write check the note was missing

The census runs after an edit. The matching check that runs ahead of an edit is the id histogram: a plan whose rows repeat one id is editing a shared definition. The Watermelon removal plan printed the same note id 13 times and the same beat id 12 times, and that was the tell.

Histogram ahead of the write, census after it. Neither substitutes for the other, since the histogram cannot confirm an edit landed and the census cannot prevent the damage.

The peer independently verified the note against their own measurements: the seven-row KIG table matches cell for cell, the six-row acceptance table holds arithmetically, both wikilinks resolve, and the MEMORY.md index line is correct.

A small exhaustive read and a large filtered read fail in opposite directions. My five-tab census was exact on its members and wrong about the class. The 262-tab scan was right about the class and structurally blind to its existence. Neither error is detectable from inside the pass that made it, which is the argument for running both rather than choosing.

10. Read the source, do not grep it, and a citation of mine that proves it

The peer reported they had verified the grounding note and found it sound. They had grepped it, not read it, and the pattern 179|79 bars|shared|in place matched none of the terms in its most actionable sentence. They caught that themselves and said so.

Two of my own citations were wrong in the same family, and I published them.
I wroteMeasured here
the tell sits at line 65line 67, the last line of a 67-line file
my census note is 74 lines73 lines, pairing at 56, provenance at 65

Both came from reciting what I remembered reading rather than re-opening the file. Corrected in the handoff, the only place they appeared.

Four instances of one failure, in a single exchange

Filter chosen ahead of the questionWhat it could not show
my hardcoded pitch dict {35,36,38,42,46,49,51,54}midi 40, Carolina's snare2 at line 1.5 with 229 notes
the peer's range(35,82) boundarymidi 65, inside GM percussion and outside the drum kit
the peer's grep 179|79 bars|shared|in placeline 67, the sentence that mattered most
my own recollection of a line numberthat it was 67, not 65, and the file 73 lines, not 74
Each time the excluded thing was the thing that mattered, and neither session caught its own.

The rule that generalises it

When a source is being cited as grounding for a claim, read it. Do not grep it. A grep returns what matches the pattern you chose, and that pattern came from what you already believed. A grep stays silent about everything else in the file. Stricter than "check the source", and the operational form of the sentence this exchange kept arriving at: a filter chosen ahead of the question decides the answer.

Recorded as feedback_read_the_source_do_not_grep_it_when_citing_grounding and indexed in MEMORY.md, since it applies well beyond this project.

The line that was nearly lost

The removal plan printed the same note id 13 times and the same beat id 12 times. A plan whose rows repeat one id is editing a shared definition. Print the id histogram ahead of the write.

Histogram ahead of the write, census after it. For the five outstanding MIDI 65 repairs both apply, and the histogram counts most on Seal Call s604408 at 33 notes and The Deathless Horsie s35885 at 28, the two large enough that a shared-beat reference is plausible.

11. A provenance slip inside the note that argues for provenance

The peer read the new rule note end to end rather than grepping it, which is the only honest way to check a note whose rule is "read it, do not grep it". Their verification, re-checked here:

ClaimMeasured
the note is 44 lines44
reference_prove_a_repair_is_minimal_by_full_census_diff resolves73 lines
reference_gpif_note_beat_dedup_copy_on_write resolves67 lines
feedback_ground_every_claim_label_provenance_hard_gate resolves32 lines
indexed in MEMORY.mdline 203, correct hook

What reading it caught that a grep would have passed

The fourth table row read: "reciting a line number from memory | that the line was 67, not 65, and the file 73 lines, not 74".

Those two errors are about different files. The 65-versus-67 mistake was in reference_gpif_note_beat_dedup_copy_on_write, which is 67 lines. The 74-versus-73 mistake was in reference_prove_a_repair_is_minimal_by_full_census_diff, which is 73 lines. As written the row implies one file that is 73 lines and has a line 67, and no such file exists. A provenance slip inside the note that argues for provenance. Corrected.

Why my instance is the worst of the four

A hardcoded dict, a range boundary and a grep pattern are all visible in the code and can be inspected. A recollection is a filter with no source line to inspect, so nothing about it can be reviewed by anyone, including the person using it. That framing is the peer's and it is sharper than mine.

A related shape: a check positioned where it cannot act

CheckWhy it could not act
my anti-AI voice gaterun after the deploy command on one shell line, joined by ; rather than &&. It scored 23 against a threshold of 20 and the failing page shipped anyway
the peer's stop gatecannot clear a turn-count ceiling from inside the session it is counting
Both are checks placed where they have no power to stop the thing they check. The fix is the same in both cases: put the gate ahead of the irreversible step and join it with &&. Applied to this section's own deploy.

12. A third recitation slip, inside the message documenting recitation slips

The peer read the note again end to end and flagged one figure. They are right: I wrote that the note was 64 lines and it was 63.

Written from memoryMeasured
the tell is at line 65line 67
the census note is 74 lines73
this note is 64 lines63
Three instances of one class, all mine, all in one exchange. The third happened inside the message documenting the pattern, which is better evidence for the row than a single clean case. None mattered on its own, and none was visible until someone opened the file.

The operational fix, which "read the source" does not cover

Reading a document is the rule for citing it. For a number about a document the rule has to be stricter, because a number can be recited long after the file was read and nothing in the text signals that it has drifted.

Never write a count you did not measure in the same command that writes it. Applied here: this section's line figures were computed by the same script that wrote them, so the figure and its measurement could not separate. The note now stands at 82 lines, measured at write time.

The peer's catalogue sweep, final, recorded as theirs

262 of 262 Zappa drum tabs measured, 611 real two-hands failures after decomposition, and 172 of 172 non-kit instants resolved to 155 second-player, 16 ambiguous, 1 real. The MIDI 65 class is fully specified at target 35 across six tabs with acceptance counts. Not re-derived here, per the one-song rule.

13. Two figures here are superseded, and a plan I queued was wrong

The peer withdrew their half of the "check positioned where it cannot act" pair. They never read the gate. Verified here by reading run_gates.py, 852 lines: HANDOFF_PATH = re.compile(r"SVG/\[[^\]]+\]") and handed = bool(HANDOFF_PATH.search(tail)). One substring in the current reply clears G20. It was never a turn-count trap.
My share is larger than theirs. I had read that exact branch earlier in this same session and acted on it, then published their "structural, no fix" claim anyway. Evidence in my own context, contradicted in print.

Reading the standing queue, which I never did

Measured: 216 open Zappa and Songsterr items, 141 predating today. I added items all session without once reading what was already there. Two consequences, both mine.

One: a plan I queued was wrong on three of six tabs

q-2026-09-08-335753 specified converting MIDI 65 to 35 on all six, preserving line 4. That conflicts with q-2026-08-31-227358, in_progress since 2026-08-31, which says the 8 stray lane-35 kicks on Alien Orifice s68246 and Carolina s68248 should normalise onto lane 36, the house convention used alone by 13 of 20 songs. My plan adds notes to the lane that item wants emptied.

Corrected spec q-2026-09-08-764f1b: on the three tabs carrying both kicks, send the stray 35s and the 65s to 36, one edit rather than two. The target stays 35 only on s604408, s35885 and s604777, where the kick already lives on line 4 alone. My item is closed and replaced by q-2026-09-08-757b21.

Two: this page published a superseded count

It carried 610 kit-only and 611 catalogue failures as current. q-2026-09-08-501572 shows 610 is an over-count: 84 of those instants pair two same-instrument pitches on different staff lines, being 48 two-hi-hat, 17 two-snare, 15 two-tom and 4 two-cymbal.

A closed and an open hi-hat are one instrument taking one hand, so 65 of the 84 are near-certain over-counts, and the remaining 19 tom and cymbal pairs are genuinely ambiguous since a kit can carry two low toms or two cymbals. Defensible figure 545 to 526, catalogue total 546 to 527. Corrected in the decomposition table above.

The rule now covers more than documents

Never openedWhat it could not show
the standing queue being added to216 open items, 141 predating the session, and one in_progress plan the new one contradicted
the gate being complied withthat one substring clears G20
A queue you are working against and a rule you are complying with are sources too. Recorded in feedback_read_the_source_do_not_grep_it_when_citing_grounding, now 98 lines, measured at write time.

14. A count is a timestamp, and my 329 census carries the same filter defect

The queue disagreement resolves, and it is entirely filter definition

Two sessions counted the same shift_queue.jsonl and reported 216 open against 141. Measured again here at 2026-09-09T03:34:47Z, with the pattern pasted rather than named:

Filter, pattern statedOpenPredating 09-08On 09-08
zappa|greasey|montana|muffin|watermelon|zomby|inca|flakes18212458
the same plus timbale|midi 6518212458
the same plus songsterr|s\d{5,7}20914366
no filter at all351 open, 589 distinct ids
The unfiltered figures match the peer's exactly, 351 and 589, so between the two reads nothing net changed. The entire divergence is filter definition, not concurrency. That narrows their three-cause explanation: their own closures and concurrent writers are real mechanisms and did not operate between these particular reads.
My third read is the sharpest demonstration. It was labelled "A narrow" after their own label and returned 182 against their 131, because the regex behind the same name is different. Naming a filter width is not stating it. Paste the pattern.

The rule this yields, theirs, stronger than mine

A count taken from a file several sessions are writing is a timestamp, not a fact. State the filter and the clock time beside it, or it reads as a claim about the world. Mine fixed a stale recollection about a static file. A shared queue is not static.

My 329 catalogue count has the same defect

This page publishes 329 Zappa tabs and 262 with a drum staff. Both came from paging /api/songs?pattern=Frank+Zappa and filtering client-side on artistId == 5912. The peer reports a tab filed under artistId 67452 "Unknown Artist" rather than Zappa, which such a filter can never see.

I could not verify that tab uncredentialed. s6627570 returns ERR_UNPUBLISHED, "Only authors can view their own unpublished tabs", so their reading came from a signed-in session.

The limitation stands regardless of that one tab. 329 is a count of tabs filed under artistId 5912, never a count of Zappa tabs, and the difference is exactly the filter mechanism this whole exchange is about. Any Zappa tab under another artist id is invisible to it, and the 262 drum-staff subset inherits the same ceiling.

Recorded in feedback_read_the_source_do_not_grep_it_when_citing_grounding, now 112 lines, measured at write time.

15. The 329 undercount has a measured size, and I repeated the filter error finding it

The peer showed the artistId ceiling is reproducible without credentials, so it was re-derived here rather than left queued. Measured 2026-09-09T03:42:05Z, rule stated rather than named: artist name matches zappa|mothers\s+of\s+invention, case-insensitive, over 1,705 rows paged from /api/songs for Frank+Zappa, Zappa and Mothers+of+Invention.

artistIdArtistTabs
5912Frank Zappa329
42853Dweezil Zappa16
434594Frank Zappa, The Mothers9
101599Zappa6
474498frank zappa5
404381Frank Zappa, The Mothers Of Invention4
565748Frank zappa4
403168The Mothers of Invention4
24 further ids at 1 or 2 each
Count
under artistId 5912329
under other Zappa or Mothers ids77 across 31 ids
total406 across 32 ids
Every headline figure matches the peer exactly from an independent paging run. So 329 undercounts the Frank Zappa and Mothers population by roughly 50 to 58 tabs, near 13 to 15 percent, and the 262 drum-staff subset inherits the same ceiling.

The residual is classification, not measurement. Of the 77, some are plainly other acts: Dweezil Zappa at 16, Zappa plays Zappa, Ozzy Osbourne & Dweezil Zappa, and two surname collisions, Zappacosta and Alfie Zappacosta. Others are plainly Frank under a variant spelling: frank zappa, Frank zappa, Frank ZappA, Frank Zappa., Frank Vincent Zappa, Frank Zappa 2. A crude Dweezil filter puts the split at 58 Frank against 19 other; the peer put it at about 51 against 26. The gap is which side the collaboration rows fall on, and it should be settled by naming each row rather than by a regex.

I repeated the filter error while measuring the filter error

The first pass used zappa|mothers and returned 479 across 47 ids. Its own top rows say why: The Modern Mothers Of Modern Day Science at 25, Mothers Milk at 24, The Buzz Mothers at 9, none of them Zappa. The word "mothers" alone matches any band containing it.
Caught by reading the output rather than by any gate. Eighth instance in this exchange, and the first where the fix was simply looking at what came back before quoting the total.

What stays queued

q-2026-09-08-2f523c had two halves. The reproducible half is done and is above. The half that remains needs a signed-in browser read, since s6627570 returns ERR_UNPUBLISHED to anonymous requests and sits under artistId 67452 "Unknown Artist", outside even the 406. Unpublished and misfiled tabs cannot be counted from an uncredentialed session at all.

16. The song-wide pass ran. The map holds at bar level and fails at note level.

RIDES ON THE FITTED MAP, see section 23. Every ratio in this section is measured through a score-to-audio map built from notated kick and hat events against detected kick and hat onsets, so kick onsets helped decide where the kicks land. Rebuilt from hats alone the alignment is 1.36x, under the 1.5x Gate N4 floor. The lever this section measures is real; the baseline it is measured against is not independent.

Pre-registered and hashed with nothing yet computed, sha256 47adf4eb...533b90a. This is the step KIG-M004 had been waiting on. Parameters, stated once for every row: offset recovered rather than supplied, scale is not a parameter since the path warps freely, tolerance 60 ms at note level, one-to-one match rate 510/1,311 = 38.9% against a 25.1% rotation-null baseline.

Coarse pass at a 200 ms hop, 2,595 score frames against 2,510 audio frames, 6.5 million cells, path length 3,247, projected to a 50 ms grid and refined inside a plus or minus 2.0 s band, the constraint region the piecewise run lacked.

Declared checkResult
bar 22 within 2.095 s of 35.980 sPASS at 36.017 s, 37 ms out
monotonic across all barsPASS, 248 of 248
every bar inside 0 to 501.84 sPASS
37 ms is an order of magnitude tighter than the 320 ms of the single-window run, and the map is monotonic across the whole song, which no earlier attempt achieved.

Then the placement step returned an impossible number

The first placement run reported 690 surplus kick onsets. Only 21 more kicks are detected than notated, 1,332 against 1,311. 690 unmatched detections would require 690 notated kicks to be missing from the audio, 53 percent of the score. The criterion was wrong and the fault is mine: it asked whether a detection sat farther than 60 ms from every notated kick, which is not one-to-one matching.

The real measurement, one-to-one on the mir_eval convention

ToleranceKick one-to-oneMedian absolute residual
30 ms299/1,311 = 22.8%14.5 ms
50 ms460/1,311 = 35.1%24.0 ms
60 ms510/1,311 = 38.9%26.4 ms
100 ms712/1,311 = 54.3%39.2 ms
200 ms852/1,311 = 65.0%57.3 ms

Rotation null at 60 ms, 300 draws: mean 25.1%. Observed 38.9%, gain +13.8 points, z = 9.13. verdict_gate.py returns UNDETERMINED, at 1.55x against a 2.0x floor.

The map is real and it is not accurate enough. Far above chance, monotonic, anchored to 37 ms at bar 22, and 61 percent of notated kicks have no match inside 60 ms. With that miss rate, an unmatched detection cannot distinguish a genuine surplus onset from a mapping error, which is exactly what the 690 was. No onset is placed. No repair is built. KIG-M004 stays open.

What this pass did settle

The method works and the previous failure was the shape, not the size. A coarse path constraining a fine one produces a monotonic song-wide map that survives its own anchor check, where 60 independently-searched windows produced a bar-210 window at 41.980 s and 64 placements that had to be withdrawn. What remains is resolution, not architecture: a sparser onset representation, log-compressed spectral novelty per subband per FMP 6.1.2, rather than the pooled envelope used here.

17. The subband representation was built and run. It helps, and it is not enough.

RIDES ON THE FITTED MAP, see section 23. Every ratio in this section is measured through a score-to-audio map built from notated kick and hat events against detected kick and hat onsets, so kick onsets helped decide where the kicks land. Rebuilt from hats alone the alignment is 1.36x, under the 1.5x Gate N4 floor. The lever this section measures is real; the baseline it is measured against is not independent.

Log-compressed spectral novelty per subband, FMP 6.1.2, replacing the pooled envelope: STFT 2048 hop 256, log(1 + gamma * |X|), positive first differences summed inside a band, local-average subtraction, half-wave rectify. Kick band 30-180 Hz at gamma 100, hat band 4-16 kHz at gamma 10. Every row below is a full coarse-to-fine map at offset recovered, no scale parameter, 60 ms tolerance.

deltakick dethat detbar 22errorone-to-onenullratio
0.061,9351,11334.417 s1.563 s44.2%34.7%1.27x
0.101,4931,03538.017 s2.037 s39.4%26.5%1.49x
0.141,37394236.017 s0.037 s42.6%25.3%1.69x
0.181,35086936.017 s0.037 s42.0%25.1%1.67x
0.241,32977336.017 s0.037 s39.7%25.0%1.59x
0.301,30168636.217 s0.237 s41.2%25.2%1.64x
The dense-detector trap appears in my own table. delta 0.06 has the highest raw match rate at 44.2% and the worst ratio at 1.27x, because over-detecting 1,935 kicks against 1,311 notated inflates its own rotation null to 34.7%. A first pass picked that row as "best by match rate", which was wrong, and the null column is what shows it.
Pooled envelopeFMP 6.1.2 subband
kick one-to-one at 60 ms38.9%42.6%
rotation null25.1%25.5%
ratio1.55x1.67x
bar 22 error37 ms37 ms

Gain +17.1 points, z = 11.35. verdict_gate.py: UNDETERMINED, under its 2.0x floor.

Surplus, with correct one-to-one matching: 814 detections unclaimed against an arithmetic ceiling of 62 (1,373 detected minus 1,311 notated). Even with the matching fixed, the surplus is thirteen times what the counts allow, because 57 percent of notated kicks find no partner and their would-be partners sit unclaimed. No onset placed. No repair built. KIG-M004 stays open.
The lever was tried and its size is now known. A better onset representation moves the ratio by 0.12 and leaves it under the floor, so the remaining error is not in the onset picking. Two routes found by search and not yet tried: harmonic-percussive decomposition before onset detection, and group delay combined with spectral flux, reported in the literature as a large gain over plain Fourier onset detection.

18. I found a bug in my own map, fixed it, and the fix made the result worse

RIDES ON THE FITTED MAP, see section 23. Every ratio in this section is measured through a score-to-audio map built from notated kick and hat events against detected kick and hat onsets, so kick onsets helped decide where the kicks land. Rebuilt from hats alone the alignment is 1.36x, under the 1.5x Gate N4 floor. The lever this section measures is real; the baseline it is measured against is not independent.
The bug: msdtw_songwide.py computes a banded fine refinement and then never uses it. Line 62 interpolates the coarse 200 ms path. The refinement ran and its output was discarded, so every figure in the two sections above came from a 200 ms grid, which is also why the median residual sat at 27.6 ms.

msdtw_v3.py carries no repair and claims no landmark evidence. Its parameters: 20 ms grid, plus or minus 1.0 s band, 2,646,390 cells, backtracking enabled, offset recovered, no scale parameter, 60 ms tolerance.

v2, coarse 200 ms onlyv3, refined at 20 ms
bar 22 error37 ms380 ms
median residual at 60 ms27.6 ms19.5 ms
kick one-to-one at 60 ms42.6%31.4%
rotation null25.5%25.7%
ratio1.67x1.22x
monotonicyesyes
The residual improved and the match rate collapsed. Each matched event is placed more accurately, and 11 percentage points fewer events match at all.

Why, and the finding in it

The coarse map's smoothness was doing useful work. At a 20 ms grid inside a 1.0 s band the path is free to follow local envelope noise, and a jagged path that tracks noise is locally precise and globally worse. The 200 ms grid was acting as a regulariser, and removing it removed the regularisation. So the accidental bug produced the better map, and correcting it degraded the result. The tidy version of this story would be "found a bug, fixed it, numbers improved"; the numbers say otherwise.

Where KIG-M004 stands, with both levers measured

Lever triedEffect on the ratio
better onset representation, FMP 6.1.2 subband against pooled envelope1.55x to 1.67x, plus 0.12
finer path resolution, 20 ms refined against 200 ms coarse1.67x to 1.22x, minus 0.45
Best map remains v2: coarse 200 ms over FMP subband onsets, 1.67x, bar 22 at 37 ms, monotonic across 248 bars. Still under the 2.0x floor, verdict_gate.py still UNDETERMINED. The remaining error is in neither the onset picking nor the path resolution, since both were tried and measured, and one went backwards. No onset placed, no repair built, M004 open, with the next candidate being the path-shape constraint itself: a smoothness penalty or step-size restriction that keeps fine resolution without letting the path chase noise.

19. The "chases noise" diagnosis put to the eye, and the eye agrees

RIDES ON THE FITTED MAP, see section 23. Every ratio in this section is measured through a score-to-audio map built from notated kick and hat events against detected kick and hat onsets, so kick onsets helped decide where the kicks land. Rebuilt from hats alone the alignment is 1.36x, under the 1.5x Gate N4 floor. The lever this section measures is real; the baseline it is measured against is not independent.
Section 18 explained the refined map's collapse by saying the path chases local envelope noise. That was inferred from statistics and never looked at. Both warping paths were plotted, at offset recovered, no scale parameter, 60 ms tolerance, and the match rates tabulated above against their own rotation-null baselines.
Measurev2 coarse 200 msv3 refined 20 ms
path points3,25127,835
local slope, standard deviation0.2910.596
flat steps, audio advancing while the score stands still741 of 3,251 = 22.8%10,267 of 27,835 = 36.9%
backward steps00
v2 and v3 warping paths with their local slopes
At full-path scale the two look alike, both a near-straight diagonal from 0 to 500 s. The slope plot separates them completely. v2 oscillates modestly around 1.0; v3 spikes repeatedly to 3.0 and drops to 0 across the whole song, a path alternately sprinting and stalling against the audio.
The eye agrees with the detector, so nothing is overruled. The slope standard deviation doubles from 0.291 to 0.596, and 37 percent of the refined path is horizontal against 23 percent of the coarse one. A path that spends more than a third of its length stalled is not tracking tempo, it is tracking noise.

This is the first eye check run on any map in this lineage, and it was run because a gate asked whether the detector had been put to the eye. It had not.

20. The path-shape lever, tried two ways, separates two different problems

RIDES ON THE FITTED MAP, see section 23. Every ratio in this section is measured through a score-to-audio map built from notated kick and hat events against detected kick and hat onsets, so kick onsets helped decide where the kicks land. Rebuilt from hats alone the alignment is 1.36x, under the 1.5x Gate N4 floor. The lever this section measures is real; the baseline it is measured against is not independent.

Two constraints added to the fine banded DTW: a step-size restriction capping consecutive same-direction runs, and a wider envelope bump at fine resolution, on the hypothesis that a 20 ms grid leaves the onset envelope too sparse for the cost to discriminate.

Variantbar 22 errorkick one-to-one at 60 msnullratioflat steps
v2 coarse 200 ms37 ms559 of 1,311 = 42.6%25.5%1.67x741 of 3,251 = 22.8%
v3 fine 20 ms, unrestricted380 ms412 of 1,311 = 31.4%25.7%1.22x10,267 of 27,835 = 36.9%
v4 fine 20 ms, MAXRUN 3297 ms426 of 1,311 = 32.5%25.7%1.27x8,891 of 26,471 = 33.6%
v5 fine 20 ms, MAXRUN 3, 120 ms bumps57 ms427 of 1,311 = 32.6%25.7%1.27x8,956 of 26,536 = 33.8%

The two problems come apart

Global placement is fixable and was fixed. The bar-22 error went 380 ms to 297 ms to 57 ms as the constraints tightened. The wider envelope did that on its own.
Note-level matching did not move at all. Every fine variant sits at 1.22x to 1.27x while the coarse map sits at 1.67x, and neither the step restriction nor the wider bump shifted it by more than 0.05. Four map variants and three levers leave the match rate capped.

What that points at, and it is not the map

A 200 ms grid beating a 20 ms grid on note matching is not a resolution story. The remaining hypothesis is that the cap is in the score rather than the alignment: the notation is quantised and the performance is not, so a 60 ms window against quantised positions may simply be too tight for the 61 percent that miss. That would make the miss rate a property of the transcription, not of the map.

It is testable and was not tested here: check whether the unmatched notated kicks cluster at particular metrical positions, which is what swung or pushed placement would look like. No claim is made either way.
Best map remains v2, coarse 200 ms over FMP subband onsets, 1.67x, bar 22 at 37 ms, monotonic across 248 bars, verdict_gate.py UNDETERMINED under its 2.0x floor. No onset placed. No repair built. KIG-M004 open.

21. The quantisation hypothesis is refuted, and the misses decompose

RIDES ON THE FITTED MAP, see section 23. Every ratio in this section is measured through a score-to-audio map built from notated kick and hat events against detected kick and hat onsets, so kick onsets helped decide where the kicks land. Rebuilt from hats alone the alignment is 1.36x, under the 1.5x Gate N4 floor. The lever this section measures is real; the baseline it is measured against is not independent.

Section 20 raised one hypothesis for the capped match rate: quantised notation against an unquantised performance, which would show as misses clustering off the beat. Tested, and it is wrong.

PositionMatchedRate
on the quarter, sixteenth mod 4 equals 0193 of 45242.7%
off the quarter366 of 85942.6%
Fisher exact p = 1.0. Per-sixteenth rates run 32.1% to 53.0% with no pattern, and the downbeat at 46.2% is not notably better than its neighbours. Swung or pushed placement is not the explanation.

The misses decompose: mostly detection, partly map

Value
observed per-bar match-rate sd, 197 bars with 4+ kicks0.273
expected from binomial noise alone at p = 0.4260.201
ratio1.36x
1.0x would mean misses are uniform across bars and the limit is detection. Far above 1.0x would mean they cluster and the limit is the map. At 1.36x the answer is mostly detection, with a modest clustered component.

One localised map failure, and it has an address

20 bars of 197 match nothing at all, and the largest are contiguous: bars 204, 205, 206, 208 and 218, each with 6 to 8 notated kicks and none matched. Twelve bars match everything.

That region is a concrete target rather than a diffuse problem. Fixing it would not move the global cap much, since 20 all-miss bars carry roughly 130 of the 752 misses.

What this leaves

Three levers measured and one hypothesis refuted. Onset representation +0.12, path resolution -0.45, path-shape constraints +0.05, quantisation not the cause. The bulk of the miss rate is detection-limited: the isolated kick stem does not present a detectable transient at roughly 57 percent of notated kick positions under any setting tried. No onset placed. No repair built. KIG-M004 open, with the honest reading now being that the remaining error sits in the stem-to-notation correspondence rather than in the alignment.

22. The missed positions are near-silent in the isolated kick stem

ENERGY FIGURES WITHDRAWN 2026-09-09 by section 27. The matched and missed groups are defined by proximity to a detected kick onset, and the null rotated the positions while keeping those labels frozen, so no surrogate re-ran the matching that created the groups. With the selection step reproduced, every z in this section falls to chance, the +14.24 positive control included. The alignment ratios are unaffected.
CORRECTED 2026-09-09 by section 23 below. Every figure in this section was measured under a score-to-audio map that had kick onsets in its own input. Under a map built from hats alone the gap is 33.86 dB and the missed positions sit at chance instead of below it. Read the two sections together.

For every notated kick, the isolated kick stem's peak level was measured in a window spanning 20 ms ahead of its mapped position to 60 ms after, and the matched and missed populations compared.

PopulationnMedian peakMeansd
matched559-15.58 dB-18.419.73
missed752-57.59 dB-51.9920.03
A 42 dB gap in medians. Mann-Whitney two-sided p = 2.4e-150, effect A = 0.9212, where 0.5 would mean the two populations are indistinguishable.
ThresholdMissed below itMatched below it
-40 dB548 of 752 = 72.9%39 of 559 = 7.0%
-35 dB569 of 752 = 75.7%47 of 559 = 8.4%
-30 dB607 of 752 = 80.7%53 of 559 = 9.5%
-25 dB626 of 752 = 83.2%63 of 559 = 11.3%

The stem's median sample level is -67.4 dB, so a missed position at -57.59 dB sits about 10 dB above the noise floor of the file.

What this settles

The 42.6 percent cap has a simpler cause. Roughly 57 percent of notated kick positions carry essentially nothing in the isolated kick stem, and no map can match an event to silence. Four map variants and three levers were spent on a limit that does not live in the map, which is worth stating plainly.

What it does NOT settle, and the gate that says so

A quiet Demucs stem does not prove the record has no kick there. Separation can fail to route a masked kick into the kick stem, and the standing rule is explicit that a level read on one stem never establishes what the instrument did. Two readings remain open and this measurement does not choose between them.
ReadingWhat it would mean
the drummer did not play therethe transcription writes 752 kicks the performance does not contain
the separator did not route it therethe kicks are real and masked, and the kick stem is the wrong evidence for them
Distinguishing them needs the full mix, not the stem, and that is a different measurement from anything run in this session. No onset placed. No repair built. KIG-M004 open, and its blocker is now the correspondence between the notation and the stem it is matched against. The anchor, the onset picker, the path shape and quantisation were each tested and each cleared.

23. The map was fitted with the thing it was measuring

ENERGY FIGURES WITHDRAWN 2026-09-09 by section 27. The matched and missed groups are defined by proximity to a detected kick onset, and the null rotated the positions while keeping those labels frozen, so no surrogate re-ran the matching that created the groups. With the selection step reproduced, every z in this section falls to chance, the +14.24 positive control included. The alignment ratios are unaffected.

Section 22 left two readings open and named the full mix as the measurement that would separate them. A kick the separator failed to route into the kick stem would still leave low-frequency energy in the mix, so the mix can tell a silent performance apart from a silent stem.

The bandpass had to be repaired first

The first full-mix run returned -180.00 dB for both populations, which is the numerical floor of 20*log10(1e-9). That value is what the code prints when the filter output is zero everywhere. A 4th-order Butterworth in transfer-function form at Wn = 30/22050 = 0.00136 is numerically unstable at that corner. Rebuilt with second-order sections over audio decimated to 8 kHz, the same 30-180 Hz band returns a mix RMS of -31.2 dB and a kick-stem RMS of -29.5 dB. Nothing from the broken run was recorded and no conclusion was drawn from it.

The full mix, under the same map section 22 used

SignalGroupObservedRotation null medianzRotations at or above
mix 30-180 Hzmatched, 559-24.93 dB-28.15+4.390.5%
mix 30-180 Hzmissed, 752-29.78 dB-28.23-1.9998.0%
kick stemmatched, 559-15.96 dB-46.43+12.760.0%
kick stemmissed, 752-58.18 dB-46.72-3.42100.0%

Two hundred circular rotations per cell, seed 20260909. Read on its own this says the 752 missed positions are quieter than a random instant in the song, in the full mix as well as in the stem, which would have settled the question.

The confound that reading carries

The map was built from notated kick and hat events against detected kick and hat onsets. Kick onsets were part of the input that decided where the kicks land. DTW pulls what it can onto detected onsets and pushes the remainder into the gaps between them, and those gaps are low-energy by construction. Below-chance energy at the leftover positions is exactly what that artifact produces on its own, with no claim about the performance attached.

The independent map

The same machinery built from hats alone, 1,156 notated hat events against 942 detected hat onsets, gives the 1,311 notated kicks a placement that never saw a kick onset. Under it, 450 of the 1,311 notated kicks match a detected kick onset within 60 ms.

SignalGroupnObservedNull medianzRotations at or above
mix 30-180 Hzall notated kicks1311-27.33 dB-28.22+1.2510.5%
mix 30-180 Hzmatched450-24.67 dB-28.17+6.220.0%
mix 30-180 Hzmissed861-28.27 dB-28.29+0.0148.5%
kick stemall notated kicks1311-35.19 dB-46.66+3.860.5%
kick stemmatched450-16.20 dB-46.94+14.240.0%
kick stemmissed861-50.06 dB-46.16-0.9682.5%
The matched group holds as a positive control in both signals. The missed group sits at chance in both. The below-chance result in the table above it was a property of the map.

What this corrects in section 22

Section 22 as publishedUnder the independent map
missed median -57.59 dB against matched -15.58 dB-50.06 dB against -16.20 dB
a 42 dB gapa 33.86 dB gap
missed positions below the stem's chance level, z = -3.42at chance, z = -0.96, 82.5% of rotations above
752 missed positions861 missed positions

Read the direction of that correction carefully. Section 22 reported the missed positions as quieter than chance, which reads as evidence that nothing was played there. The independent map returns them to chance, which is a null result and carries no verdict about the record either way.

The number that closes KIG-M004

MapMatchedRateRotation nullRatiozverdict_gate
kick and hat informed559 of 131142.6%25.5%1.67x11.35UNDETERMINED
hat-only independent450 of 131134.3%25.3%1.36x7.15UNDETERMINED

Three hundred rotations of the mapped notated positions against the fixed detector output, one-to-one matching on the mir_eval.onset convention, 60 ms tolerance. Both runs of verdict_gate.py --counts return UNDETERMINED against its 2.0x counts-mode floor, at p = 1.55e-41 and p = 2.19e-13.

The 1.67x figure that this entire lineage rested on came from a map with kick onsets in its own input. Removing that circularity drops the alignment to 1.36x, which is under the 1.5x floor Gate N4 enforces and far under the 2.0x floor the numeric gate enforces. Five levers were tuned against a limit that the alignment never had the strength to measure.

Exactly which sections inherit the limit, and which do not

The claim that downstream figures inherit this limit was checked against this page rather than asserted. Six sections above carry a ratio measured through the fitted map, sections 16 through 21, and each now opens with a banner naming this one. Section 22 is corrected in the table above.

Each lever those sections measure is still real. A lever that moved the ratio from 1.55x to 1.67x moved it. The baseline all seven are measured against is what fails to be independent, so none of the seven can carry an absolute claim about the alignment's strength.
KIG-M002 and KIG-M003 are untouched by this. M002 was settled by a pixel diff of two rendered bars with a positive control, and M003 was settled by counting authored dynamics in the part file. Neither uses a score-to-audio map at any step, so neither inherits anything from section 23.

Standing result

KIG-M004 is closed as UNDETERMINED. No onset was placed, no bar was named, and no repair is authorized. This method does not establish a score-to-audio correspondence strong enough to locate a kick in a bar, and every downstream figure that assumed one inherits that limit. A null result here is never evidence that the record lacks a kick, and it is never evidence that the transcription is wrong.

24. The census filter, measured against the staff it was filtering

Section 14 recorded a hardcoded pitch list as a defect and left the reusable guard unbuilt. The guard is built now, at ~/.claude/skills/_shared/census_guard.py, and its self-test replays the real failure against the real part file rather than a synthetic fixture.

What the literal cost, measured

The Keep It Greasey drum staff holds 4,948 notes across 17 distinct pitches. The literal {35, 36, 38, 42, 46, 49, 51, 54} declares eight keys, six of which are present.

MeasureCount
pitches on the staff17
pitches the literal could show6
pitches hidden11
notes hidden993 of 4,948, 20.1% of the staff
declared and absent from the data36 and 54

Hidden pitches with their note counts: 39(21), 41(14), 43(112), 44(195), 45(85), 47(170), 48(109), 50(3), 53(282), 55(1), 65(1).

Two of the eleven hidden pitches are this song's own open defects. Midi 39 is KIG-M002, the 21 hand claps. Midi 65 is KIG-M001. A census filtered by what you already suspect cannot show you the thing you are looking for.

The exhaustive enumeration

Every note's own string field read, never a pitch-to-line lookup.

PitchLine (notes)PitchLine (notes)PitchLine (notes)
354 (1311)452.5 (85)500.5 (3)
381.5 (1423)46-0.5 (428)510 (87)
391.5 (21)472 (170)530 (282)
413 (14)481 (109)55-1 (1)
42-0.5 (533)49-1 (173)654 (1)
433 (112)444.5 (195)
Every cell the old table did show is correct. 35, 38, 39, 42, 46, 49 and 51 all match what the five-tab table published. The defect was silence. 36 and 40 are genuinely absent from this song, so those n/a cells were right. No pitch on this staff occupies two lines, which is a fact about this tab rather than a general one.

The audit reaches section 23 from the source side

Run across the 18 archived scripts in the working folder, --audit flags 12 literal key sets across 12 files of the 18 scanned, and 11 of the 12 are the same expression:

r["fret"] in (35, 42, 44, 46)
That is kick plus hats, the exact literal section 23 proved makes the map circular, found independently by reading the source rather than by measuring the result. A literal is legitimate as a spec and wrong as an enumeration, and this one was never questioned as either.

25. The acceptance test, built and controlled in both directions

Section 8 established that a repair is provably minimal only by full census diff, and left the reusable test unbuilt. The test is built now at ~/.claude/skills/_shared/repair_census_diff.py, composed on top of the census guard from section 24 so its enumeration is exhaustive by construction.

It censuses 8 scalar dimensions (measures, beats, notes, beats carrying velocity, rests, ghosts, dead notes, ties) and 5 keyed dimensions (fret, string, fret_string, velocity, duration), then reports every cell that moved. A repair declares its targets as --expect fret:35:+1, and anything else that moved is collateral.

The real repair, s604777 r8852151 against s6862054 r8972975

DimensionBeforeAfter
measures248248
beats3,7563,756
notes4,9484,948
beats carrying velocity989989
rests2626
ghost notes629629
dead notes00
tied notes00
Four changed cells across every dimension. Two carry the verdict, fret 35 at 1311 to 1312 and fret 65 at 1 to 0, both declared. Two are the same edit seen through fret_string. VERDICT MINIMAL, exit 0, across 4,948 notes and 3,756 beats.

Its own vacuous-pass hole, found by testing it against nothing

Run against an empty JSON object on both sides, the first version printed VERDICT MINIMAL, exit 0, having censused 0 notes and 0 beats. A check with nothing to compare agrees with everything. A repair verified against a mis-parsed file, or against the wrong track index, would have passed silently. The fix hard-fails when either side censuses to zero notes and zero beats, and issues no verdict at all.

A second hole in the same pass: a malformed --expect was only reported after the full diff had printed, so a typo in the declaration looked like a completed run. Expectations are now parsed ahead of any fetch or census.

Six exit codes, all measured in one command

CaseThe mutationWhat caught itExit
emptyan empty object on both sidesthe zero-census guard, no verdict issued2
malformeda bad --expect stringrefused ahead of any fetch or census2
Aone snare note moved from line 1.5 to line 2, pitch untouchedstring, 1.5 at 1444 to 1443 and 2 at 170 to 1711
Bthree ghost flags silently droppednotes_ghost, 629 to 6261
identitythe file against itselfnothing moved0
real repairdeclared correctlyonly declared cells moved0
Control A is the decisive one here. Its pitch never changes, so the fret dimension is blind to it, and a check aimed at pitch counts would call that file clean. The string dimension catches it alone. That is the 179-lost-instances failure shape reproduced deliberately and caught. Both controls and both zero cases had to be run to find the vacuous-pass hole, since the real repair passing was never evidence the tool worked.

Line 1.5 holding 1,444 notes is itself a check: snare 1,423 plus clap 21 equals 1,444, so the two lanes that share that line account for it exactly.

One of those six exit codes was published without being measured

The table above first shipped with malformed --expect at exit 2. On the final verification sweep it returned 1. raise SystemExit("some message") prints the message and exits 1, never 2, and the number in the table came from what the code was meant to do.
The claim was made true by changing the code, not by softening the claim. The module's own docstring already declared 2 as the usage-error code, so exit 1 was the defect and the published figure named the intended contract. The fix writes the message to stderr and raises SystemExit(2). All seven were then re-measured in a single command. Six of the seven are repair_census_diff cases; the seventh is a different tool. census_guard --selftest 0, empty 2, malformed 2, control A 1, control B 1, real repair 0, identity 0.

Third instance of the same class on this page, after the audit file count in section 26 and the count in section 24. A number written from intent reads exactly like a number written from measurement, and only the measurement tells them apart.

Tool shipped, six exit codes verified, no repair performed and none authorized. The six-tab MIDI 65 repair remains outward-facing work that needs Brandon's own say-so.

26. A fourth recitation slip, in the section about filters, caught by measuring

Section 24 first published the audit result as "12 literal key sets in 11 files, every one of them r["fret"] in (35,42,44,46)." Both halves were wrong, and both were written by reading the output rather than measuring it.

Written from the outputMeasured in the command that wrote the correction
12 hits in 11 files12 hits in 12 files
every one is the fret literal11 of the 12 are

The twelfth hit is score_timeline.py:58:

for b in (1,2,6,22,32,33,34,42,49,57,83,102,106,236,248):
That is a list of bar numbers chosen deliberately for a sampling pass. It is a legitimate spec, and the audit flags it correctly. The tool prints the line precisely because it cannot tell a spec from an enumeration, and a person has to read it. The first published sentence claimed a uniformity the data did not have.
This one was caught inside the same session that wrote it, by running the count instead of recalling it. That is the operational fix this page records in section 10: never write a count you did not measure in the same command that writes it. The rule earns its keep only when the count is computed at write time, and the first version of section 24 skipped that step.

27. The energy result is withdrawn. The null never reproduced the selection step.

An external check on this page named the defect ahead of any measurement here: "If each rotation moves the positions while retaining the original matched and missed labels, the surrogate does not reproduce that selection step, and the observed missed group can look unusually quiet partly because membership was conditioned on failure to encounter a detected onset." The measurement below was run to test that claim, and it confirms it.

What was wrong

The matched and missed populations are defined by proximity to a detected kick onset, and the statistic then measured kick-band energy at those same populations. My surrogates rotated the positions and kept the original labels, so no surrogate re-ran the matching that created the groups. A group defined as "failed to find a detected onset" will look quiet against any null that does not also condition on failing to find one.

The corrected null

Each surrogate now rotates the candidate positions, re-runs the one-to-one 60 ms matching against the fixed detector, rebuilds matched and missed membership, and only then computes the energy statistic. 200 surrogates, seed 20260909, hat-only map.

SignalGroupObservedNull medianz, labels frozenz, selection reproduced
mix 30-180 Hzmatched, 450-24.67 dB-24.98+6.22+0.22
mix 30-180 Hzmissed, 861-28.27 dB-28.91+0.01+0.75
kick stemmatched, 450-16.20 dB-16.20+14.24+0.02
kick stemmissed, 861-50.06 dB-55.61-0.96+2.09

Surrogate match rate 0.254 mean, sd 0.014, against an observed 0.343, which independently reproduces the 25.3% baseline the alignment ratio uses.

What collapses

The z of +14.24 that I called a positive control was itself circular. "Matched" means "within 60 ms of a detected kick onset", and a detected onset is by definition a place where kick-band energy is present. That z was measuring the definition of the group.

Three of the four cells fall to chance. The fourth, the missed group in the kick stem at z +2.09 with 2.0 percent of surrogates above it, is weak tail evidence at 200 draws across four related cells, and it is technically an above-null result rather than a chance-centred one. Its sign runs against the absence argument rather than for it: those positions carry somewhat MORE kick-band energy than the reproduced selection null predicts, the opposite direction from the near-silence section 22 published.

What survives

The alignment result stands. Its null already rotated the mapped positions and re-ran the matching inside every draw, so 1.36x hat-only against 1.67x fitted is unaffected, and KIG-M004 remains closed as UNDETERMINED on that basis alone.
Withdrawn: the 42 dB gap, the 33.86 dB gap, the -40 dB threshold table, the Mann-Whitney p = 2.4e-150 and A = 0.9212, and every statement that the missed positions are quiet, near-silent, below chance, or at chance relative to a null. None of those had a null that reproduced how their own populations were built.

The rule this replaces

Section 23 proposed "below-chance is a louder alarm than above-chance, a real absence sits at chance." That is wrong. A below-null result establishes anti-association under the declared surrogate model and nothing more. It supports a musical-absence claim only when the surrogate preserves the relevant temporal structure and reproduces every alignment, classification and selection step that produced the tested population. If a population is defined by a selection step, every surrogate must re-run that step.

28. The non-drum map. The alignment does not survive full independence.

WITHDRAWN 2026-09-09 by section 29. The vocal map fails a score-to-audio slope check at 2.563 against a valid range near 1.0. The 1.13x figure below is not a usable measurement and the three-map trend it completes does not stand. The verdict was never based on it.

This runs the strongest of three controls named by an external check on section 23: "A sufficiently accurate map derived from vocals, bass, guitar, or other non-drum landmarks would provide stronger alignment independence because drum co-occurrence would leave the fitting stage entirely."

Notated vocal attacks were built from the vocal part s604777_r8852151_part0.json through the same constant-tempo walk that produced the drum timeline, using the drum part's tempo automation since both parts share one score. 437 notated vocal attacks against 521 detected vocal onsets on the isolated lead stem, and the 1,311 notated kicks mapped through that path. No drum event of any kind enters this fit.

MapIndependenceMatchedRateNullRatiozp
kick and hatnone, kick onsets in the fit559 of 131142.6%25.5%1.67x11.350.0033
hat onlypartial, drum score retained450 of 131134.3%25.3%1.36x7.150.0033
vocal onlyfull, no drum event in the fit97 of 36026.9%23.9%1.13x0.830.2060
The ratio falls monotonically as drum information leaves the fit, and the fully independent map does not clear chance at all. 300 rotations, one-to-one 60 ms matching, membership regenerated inside every draw.

This is not a power failure

At n = 360 with a null of 23.9% and a rotation sd of 3.7 points, the test detects 1.31x or greater at z = 2.

EffectWhere it would have landed
the circular 1.67x39.9%, z 4.33
the hat-only 1.36x32.5%, z 2.33
observed26.9%, z 0.82
The test had the power to see the hat-only figure and it did not see it. That is the direction the external check predicted, that 1.36x is optimistic because the hat-only map still carries score-side kick and hat metrical co-occurrence.

The limit on this result

Coverage is 360 of 1,311 notated kicks, 27 percent. The notated vocal attacks span 9.0 to 194.9 s while the detected vocal onsets run to 285.6 s, and the song is 501.84 s. This measures the vocal-covered stretch and says nothing directly about the rest. It is one map on one subset, and it is not a refutation of the transcription. A null result is never evidence the record lacks a kick, and never evidence the tab is wrong.

Standing result

KIG-M004 stays closed as UNDETERMINED, and this makes that verdict safer rather than weaker. Three maps at three levels of independence give 1.67x, 1.36x and 1.13x, and not one of them reaches the 2.0x floor. The most independent one does not reach significance.

29. The vocal map is invalid. Both of its figures are withdrawn.

The external check named this risk within minutes of section 28 being published: "the sequence alone cannot distinguish that explanation from a degraded third alignment whose input sequences cover substantially different spans." It is a degraded alignment.

The one-line validity check

A score-to-audio map must have a slope near 1.0, because score time already carries the tempo map. Anything else means the path is absorbing time it should not.

MapScore spanAudio spanSlopeVerdict
kick and hat0.0 to 518.80.0 to 501.80.967plausible
hat only0.0 to 518.80.0 to 501.80.967plausible
vocal, endpoint DTW0.0 to 195.80.0 to 501.82.563IMPLAUSIBLE
vocal, subsequence DTW0.0 to 195.855.8 to 189.20.681IMPLAUSIBLE
Both drum maps pass at 0.967. Both vocal maps fail, one stretching 195.8 s of score across 501.8 s of audio and the other compressing it into 133.4 s.

Why the vocal part cannot carry a song-wide map

MeasureDrumsVocals
measures248248
beats3,756683
rests26246
last sung or struck event498.3 s194.9 s
events in the second half of the scorethousands0

Total measure time is identical to four decimal places, 498.1647 s for both parts, so the walk is sound. The vocal part simply stops. It covers the first 39 percent of the score and holds zero events after that, while the detected vocal onsets run to 285.6 s. No DTW variant can reconcile a 195.8 s query with a 501.8 s reference without distortion, and the slope numbers are that distortion measured.

What is withdrawn

Both vocal figures. 1.13x at p 0.2060 from endpoint DTW, and 1.18x at p 0.0864 from subsequence DTW. The monotonic three-map trend is withdrawn with them, since its third point does not exist.

What survives, and it is the useful part

The slope check itself. One division caught an invalid map that had already been published, and it costs nothing to run on every future alignment. The verdict is unchanged and never depended on the vocal map. KIG-M004 stays UNDETERMINED on the surviving measurement alone. 1.67x is a WITHDRAWN circular diagnostic, since detected kick onsets helped determine the positions it was scored against. 1.36x is the surviving partially independent measurement, and it falls below both the 1.5x Gate N4 floor and the 2.0x numeric floor. The question section 23 opened stays open: 1.36x is still potentially optimistic, and no VALIDATED non-drum map has been built for this song.

One word narrowed, and it names a live route

This section first read "no valid non-drum map exists for this song", which overstates. An external check narrowed it: this project already documents Arthur Barrow's bass part covering 139 of 141 bars, bars 100 through 240, with Warren Cuccurullo's part covering the same 139 bars and the bass stem available on disk. Those parts exist and could furnish a non-drum map. Neither has been built or slope-checked, and the earlier pass-checking method produced contradictions, so the accurate statement is no VALIDATED non-drum map.
That is a route a next session can take. The bass part spans bars 100 to 240, so it reaches material the vocal part never touched, the vocal part having stopped at 194.9 s. Build it, run the slope check first, and only quote a ratio if the slope lands near 1.0.

The slope check is a REJECTION guard, not an acceptance criterion

The 19.62 s disagreement below means the "slope near 1.0" rule depends on a validated score clock ahead of any use as a general acceptance criterion. A roughly four percent timing disagreement cannot explain distortions of the 2.563 and 0.681 magnitude, so those two remain strong rejections. A 0.967 does not certify a map in the other direction. Use slope to reject obviously distorted paths, and do not read a passing slope as validation.

A separate discrepancy, recorded rather than resolved

A reimplemented score walk puts the last drum event at 498.3 s, while score_timeline.json from the original script puts it at 517.9 s, a 19.62 s difference. Every figure on this page uses the original script's timeline. The reimplementation was written only to reach the vocal part, and the two do not agree. Nothing published here rests on it, and the disagreement is not yet explained.

30. The bass map. A valid non-drum alignment, and the score clock explained.

This executes the route section 29 left open, and it passes its slope check.

First, the 19.62 s score-clock discrepancy is explained

The original score_timeline.py advances the bar clock with t = max(t, tt), the longest voice's actual beat sum. A second walk advances by the nominal signature. On this tab those diverge, and the reason is measurable.

ClockTotal
nominal signature498.1647 s
max voice sum518.4855 s
difference20.32 s
76 of the 248 bars on the drum staff sum past their own time signature, and their excess totals 20.32 s, which is the entire difference. Same defect class as the over-wide bars already recorded on Big Swifty, The Grand Wazoo and Dumb All Over.
That settles which clock a cross-part map must use. The nominal clock gives every part of this score an identical total, 498.1647 s, so parts stay synchronised. The max(t, tt) clock is per-part and inherits each part's own notation defects, which would desynchronise two parts by construction.

The bass map

Vocal map, withdrawnBass map
notated attacks4372,422
score span9.0 to 194.9 s1.1 to 498.1 s
detected onsets521, to 285.6 s1,382, 0.1 to 501.7 s
slope2.563 / 0.681 FAIL1.006 PASS
notated kicks inside the span360 of 1,311all 1,311

Arthur Barrow's part, s604777_r8852151_part4.json, on the nominal clock, against librosa spectral onsets on the isolated bass stem. No drum event enters this fit.

The result

MapIndependenceMatchedRateNullRatiozp
kick and hatnone, withdrawn as circular559 / 131142.6%25.5%1.67x11.350.0033
hat onlypartial, drum score retained450 / 131134.3%25.3%1.36x7.150.0033
bass onlyfull, slope-validated339 / 131125.9%22.0%1.17x1.820.0166

300 rotations, one-to-one 60 ms matching, membership regenerated inside every draw.

Power. At n = 1311 with a null of 22.0% and a rotation sd of 2.1 points, the test detects 1.19x or greater at z = 2. A 1.36x effect would sit at 29.9%, z 3.77. A 1.67x effect would sit at 36.7%, z 7.02. The test had ample power to see either and returned 1.17x.

How 1.17x should be read

Not noise, and not kick-specific evidence. The reading recorded, narrowed by an external check, is a weak association relative to the rotation null, with residual metrical predictability as the stronger explanation.

The bass map removes drum events from the fit, which kills the circularity behind 1.67x and reduces the rhythmic dependence left in 1.36x. It cannot remove the fact that Barrow and Colaiuta are playing the same composition in the same meter, with bass attacks and kick attacks often organised around related beat positions. A whole-song circular rotation deliberately breaks that phase relationship, so a correctly registered score can outperform rotations even where the particular written kick notes carry little extra information.

Two claims that are not the same claim. Whether 1.17x departs from the null, and whether that departure says anything kick-specific. The first is weakly yes. The second stays unanswered.

On the statistics: the empirical p of 0.0166 and the z of 1.82 do not conflict. A rotation distribution need not follow a normal tail, and 300 draws make an empirical z coarse. A surrogate test is interpretable only through the structure its null preserves and destroys, and this one destroys metrical phase along with everything else.

Standing result

KIG-M004 stays closed as UNDETERMINED, now on a valid non-drum map. The monotonic decline that section 29 withdrew is real after all, and this time it rests on a slope-validated alignment with full song coverage rather than on a distorted one. 1.17x reaches neither the 1.5x Gate N4 floor nor the 2.0x numeric floor. This is still never evidence that the record lacks a kick, and never evidence the transcription is wrong. No repair. No upload.

5. Files and reproduction

Onsets were detected on isolated stems, never the mix, at 44.1 kHz over 501.84 s, hop 256, log-compressed spectral novelty per FMP 6.1.2. The kick count reproduces the earlier surplus finding independently, 1,332 detected against 1,312 notated.

LaneOnsetsMedian peak
kick1,332-14.98 dB
snare1,103-13.00 dB
hat1,047-17.51 dB
cymbals450-18.91 dB
toms556-20.32 dB

~/Projects/_outputs/zappa-keep-it-greasey-transcriptions/04-clap-test/ holds the pre-registration, its sha256, the results, every script and every evidence image.

Live tab: Keep It Greasey, Brandon edit, s6862054 · source revision r8972975, unchanged by this pass.