Root cause found

Why the Watermelon GP is not done and not perfect

Nine days, 55 sessions, 26,339 assistant turns and 9.59 billion tokens went into one drum tab. Every stem measurement in that span ran against a clock that was wrong by as much as 4.26 seconds. Here is the measurement, the proof, and the clock that removes the blocker.

Two corrections from Brandon, 2026-09-08, applied

One. This page said bars 98 to 104 hold seven written drum notes. Its own coda.json holds eight: three in bar 98, two in 99, one each in 100, 101 and 103, none in 102 or 104. The figure now reads eight tab attacks against eighty-one stem attacks. The 81 reconciles unchanged and bar 105 stays correctly empty.

Two. This page said the flat tempo map produced the other two defects. It concealed and confused them. Defect three below now says so.

Three, and then four, on the coda count. The figure of 81 stem attacks came from a detector nobody had rendered. Reading it withdrew the snare and cymbal content and the zero-guitar control, leaving 86. A reference-class pass then withdrew 86 as well, since its threshold was cut from the coda window itself. The surviving figure, calibrated against the author's own bars 1 to 97, is 35 kick attacks and zero toms.

Subject: Songsterr s6857183 r8970744, Watermelon In Easter Hay, Vinnie Colaiuta. Measured 2026-09-08 from the shipped .gp and the Moises stem set.

1What it cost

9.59B
tokens on one tab
31,400,847 output, 144,485,079 cache write, 9,417,850,850 cache read
26,339
assistant turns
across 55 sessions, Aug 31 to Sep 8
78%
of the whole project
289.4 MB of 372.6 MB of transcript
300 : 1
cache read per output token
the budget went to re-reading its own context
103
analysis scripts
13 named build_gp, 14 named verify_gp
48
published pages
GitHub Pages routes on this one topic
3,521
turns in one session
Sep 1 to Sep 6, five days without a clear
3.8 GB
spectrogram cache
recomputed shapes of the same six stems

The duplicate filenames tell the story on their own. hat_grid.py and hat_grid2.py. lane_identify at one, two and three. tom_plan, snare_verdict, silent_passages, coda_transient and run_transfer_gate each written twice. Every time a gate came back under its floor, the response was a fresh detector. The clock those detectors all read was never repaired.

2The root cause, in one line

The tab is written at a flat 56.000 bpm for a live take that averages about 55.3.

One tempo automation covers all 105 bars. The performance moves. By the last bar the written grid runs ahead of the recording by as much as 4.26 seconds at bar 65, which is close to four beats. The divergence is not a straight line: it grows to bar 65, then partly recovers as the performance pushes past 56 through the climax. Every stem-versus-tab comparison across nine days was asking whether a drum hit landed at a place the drummer had already left.

105
bars in the tab
53 in 4/4, 52 in 5/4, one tempo marking
505.7 s
tab length at 56 bpm
the recording runs 545.3 s
4.26 s
peak bar-start error, at bar 65
measured on the metronome grid, not a straight-line fit

The offset climbs bar by bar, which is the fingerprint of a tempo error

Each window was free to choose its own offset. A tab that matched its take would return the same number every time.

bars1-56-1011-1516-2021-2526-3031-3536-4041-4566-7071-7576-8081-8586-9091-9596-100
best offset (s)38.0438.0438.1638.4438.8439.2139.4839.9340.1141.5341.7842.0942.4942.7642.9042.98

Sixteen of twenty windows passed their wrong-stem control and were accepted. The accepted offsets fit a straight line with a residual standard deviation of 0.211 s, so the drift is steady rather than jittery.

3The test that proves it

Same tab. Same stems. Same detector, frozen to the published spec of 1024-point Hann, 256 hop, 44.1 kHz, positive spectral flux in band. The only thing that changes is the clock.

laneeventsone fixed offset
what every prior pass used
with the drift mapimprovementguitar wrong-stem controldiscrimination
kick4920.1520.3962.60×0.1342.95×
snare2930.1570.3582.28×0.1133.18×
kick + snare, per-bar map7850.2740.5211.90×0.1583.30×

The promotion floor on this project is 1.5× over chance. On the flat clock, kick sat at 0.152 and the same tab notes matched the lead guitar stem better than the kick stem, giving a discrimination of 0.68×. On the corrected clock the discrimination reaches 2.95×, 3.18× and 3.30×. Every one of those clears the floor with room.

This retro-explains all four blocked verdicts

Each of these was recorded as a property of the evidence. Each was a property of the clock.

4What is still actually wrong in the shipped file

Independent census of RECONCILED-s6857183-Brandon-edit.gp: 2,770 drum notes, voice 0 at 1,889 and voice 1 at 881, on the Vinnie Colaiuta track.

Defect one: the coda kick is missing

Tab bars 98 to 104 land at 8:25 to 8:58 on the metronome clock. The tab writes five kick notes across all seven bars. The recording carries 35.

Two figures this section has already retired

81 stem attacks came from a spectral-flux detector nobody had rendered. 86 eye-confirmed attacks replaced it and was still wrong, because its 10 percent threshold was cut from the coda window itself. A yardstick cut from the population it filters cannot reject that population, which is the exact mechanism that put 599 toms into a Zappa ballad on 2026-09-07. The figures below are calibrated against the author's own writing in bars 1 to 97.

35
kick attacks measured
bars 98 to 104, author-calibrated
5
kick notes the tab writes
across the same seven bars
5.0
kicks per bar in the coda
the author's own median is 5.0
0
toms that survive calibration
47 were published, all withdrawn

Why the 47 toms died

The tom stem in bars 98 to 104 peaks at 20.5 percent of the peak it reaches in bars 1 to 97. The threshold that reproduces the author's own tom writing sits at 33 percent. Every coda tom event is below the line the author's own hand defines, so the coda holds tom resonance and bleed rather than struck toms. The kick tells the opposite story: it peaks at 91.4 percent of its bars 1 to 97 level, which is a drummer playing at full strength.

Kick and tom waveforms for bars 96 to 105 with a dashed author-calibrated threshold. Every kick transient rises above its line. Every coda tom sits below its line.

The six reference-class checks, on the surviving number

checkresult
R1 self-referentialthreshold calibrated against the author, fitted on 96 of his own bars, mean absolute error 0.90 notes per bar, bias −0.02
R2 magnitude35 against 5 is 7.0×, under the 10× refusal
R3 density5.0 kicks per bar, against the author's median of 5 and p90 of 7
R4 pass rate35 of 20,333 local maxima survive, 0.2 percent, so the filter bites
R5 null modelthe identical 19 percent rule returns 10 on the lead guitar stem and 0 in the silent tail at 540.5 to 545.2 s
R6 regenerablefinal_kick.py, figures in final_coda.json and refclass.json

Verdict: PASS on all six. Run through the same tool, the withdrawn tom figure returns STOP on all six.

A third null, and what it actually means

Circularly shifting the kick envelope by 137 s and re-measuring the same window returns 37 against the observed 35, a ratio of 1.05. That null asks whether this window is unusual for this song's kick track, and the answer is no. The claim never needed the coda to be exceptional. It needed the drummer to still be playing, and matching the song's own kick density is what that looks like. The two nulls that test the claim are the wrong-stem control at 10 and the silent tail at 0.

One more count came down in this pass. The figure of 39 kick attacks became 35 once the 100 ms refractory stopped resetting at every bar line, which had been double-counting strokes that straddle one.

Defect two: sixteen instants that need three hands

Twelve bars ask a drummer to strike a snare or a tom, a hi-mid tom, and the ride, all on one instant. Fifteen of the sixteen have that exact shape.

bar29414549525253545455565657578589
beat4444242242242422

These were inherited from revision r8968524. They were neither caused nor fixed by the 63-note reconcile that shipped.

Defect three: the tempo map itself

One automation at 56.000 bpm covers a performance that moves. It concealed and confused the other two defects rather than producing them. The sixteen three-surface collisions were written into revision r8968524 and arrived by inheritance. The missing coda notation is absent from the GP on its own terms, and a correct clock would have made both visible far sooner.

5Do we need metronome tracks? No, because one already wins

Moises exported a metronome stem alongside the drums, at 206 Watermelon in Easter Hay-metronome-E major-112bpm-442hz.wav. It holds 997 clicks from 0.750 s to 544.070 s, with a median interval of 0.540 s, giving 111.11 bpm or 55.56 in half time. That corroborates the 55.3 derived from the drum onsets by a completely separate route.

A verdict I published here and then withdrew

My first reading called the click a poor ruler, because its intervals are quantized to 20 ms steps and that resolves tempo only to about 2 bpm. Brandon pushed back mid-session: the metronome wins on exactly the song where the onset clock was weakest. He was right, and the reason the first verdict was wrong is that absolute click positions track the take even when the intervals are rounded. Rounding an interval does not accumulate the way I assumed.

Three clocks, one detector, 785 kick and snare events

clockmatch ratevs flat clockguitar controldiscriminationcoverage
flat 56.000 bpm, best single offset0.274baseline0.2070.68× at global scaleall 105 bars, all wrong
onset-derived per-bar map0.5211.90×0.1583.30×frozen on 50 of 105 bars
metronome-anchored map0.6842.50×0.1963.49×all 105 bars, no tab notes needed

Why the onset map went blind in the one place it mattered

It aligns using notes that are already in the tab. Bars 101 to 105 hold two kick or snare events between them, so there was nothing there to align against, and the offset simply froze at its bar-100 value. The coda was invisible to the instrument built to inspect the coda. The metronome carries 74 clicks after t=505 s and depends on the tab for nothing.

barseventsonset mapmetronomegap
1 - 301890.7040.8941.27×
31 - 602390.5730.7911.38×
61 - 902840.3660.4891.34×
85 - 971180.4410.5081.15×
90 - 105840.4880.5711.17×
95 - 105370.3510.5141.46×

The metronome wins every region. Its largest margin falls in bars 95 to 105, which is the coda, which is the part nine days of work could not decide.

6The fix, already built

Two map files ship beside this page. metromap.json is the one to use: it anchors tab bar 1 to click index 51 at t = 36.87 s and interpolates every bar boundary through the click grid, reaching bar 105 at t = 538.23 s. tempomap.json is the onset-derived map, kept as the independent second witness.

105
bars mapped
no frozen bars
0.684
kick + snare match
0.274 on the flat clock
3.49×
discrimination
floor is 1.5×
35
attacks now locatable
kick only, bars 98 to 104

What becomes answerable once the map is written into the file

7The process lesson

Four separate gates returned a number under the promotion floor. Alignment came back UNUSABLE and was written down as a finding. The project treated a failing gate as a fact about the music. The grid was the thing at fault.

The rule this earns: when an alignment gate fails, repair the clock first, then write detectors. A detector cannot out-measure a broken time base, and 103 of them could not.

The third rule, earned by looking. A detector count gets rendered and read first, then published. The flux pass put twelve snare marks on a flat trace and would have shipped as fact.

The second rule, earned mid-session. The winning clock was sitting in the same folder as the stems for two days. Inventory what the separation already handed you, then build only what is missing.

8Step one is done: the map is in the file

Written 2026-09-08 into a copy, never into the original. TEMPOMAP-s6857183-Brandon-edit.gp, sha256 099a59c4f2ef7ad26ca41540b46673e01127a1440ab573eccb57f95986238045, built from RECONCILED whose sha256 bc5ce3de...8548f is unchanged on disk.

105
tempo automations
the file held one, at 56.000
6.4 ms
worst bar-start error
the old file peaked at 4.26 s
0.685
kick and snare match
the gate wanted 0.684
0 / 0
notes added / removed
2,770 on both sides of the write

The acceptance test written into the queue item, run against the file itself

Each file drives the alignment from its own tempo map plus one global sync offset. No external map is supplied.

filesync offsetkick + snare matchguitar controldiscriminationgate
RECONCILED, one flat 56.00039.79 s0.2760.1771.56×fails both
TEMPOMAP, 105 automations36.89 s0.6850.1893.64×PASS on both

The gate on q-2026-09-08-cddb5a asked for a match at or above 0.684 with the guitar control at or under 0.20. The file returns 0.685 and 0.189. Its best sync offset of 36.89 s lands within 20 ms of the 36.87 s bar-one anchor the metronome grid gave, which is an independent confirmation that the map went in correctly.

The curve, rendered and read

Top panel, per-bar tempo from 53.57 to 58.37 bpm against the old flat 56 line. Bottom panel, bar-start error where the old file drifts to minus 4.26 seconds at bar 65 and the new file sits on zero.

What the eye takes from the curve

Two decimals were kept in every tempo value. Rounding them to integers costs 723 ms of worst-case bar-start error against 6.4 ms, which would reintroduce the class of fault this step exists to remove. Figures in tempo_map.json.

9Step two is done: the coda kick is in the file

CODA-s6857183-Brandon-edit.gp, sha256 97ea1b3b42c83837..., built from TEMPOMAP whose sha256 099a59c4f2ef7ad2... is unchanged on disk. 29 kick notes added, 0 removed, every one MIDI 36, every one inside bars 98 to 104.

+29
kick notes written
5 were already there and correct
16th
grid chosen
2.64× tighter than chance, z = 6.5
0.697
match after the write
it stood at 0.685 last pass
0
notes removed
2,770 to 2,799 instances

The rhythm, bar by bar

barmeterkick, on the sixteenth gridadded
984/41   2a   3   3a   4   4a5
995/41   3   3a   5   5a4
1004/41   2a   3   3a3
1015/41   1a   32
1024/41   1a   2a   3   3a   4a6
1035/41   3   4a   5   5a4
1044/41   2a   3   4e   4a5

The four 4/4 bars share a figure, 1, 2a, 3, 3a, which is an ostinato rather than a scatter of detections. That shape was never imposed. It fell out of snapping the measured onsets to the meter.

Four checks on the write

A subdivision was rejected on purpose. The 32nd grid scored 18.6 ms against the 16th grid's 18.7 ms, and a tenth of a millisecond does not buy a subdivision. Twenty-nine new Note elements were created rather than reused, since GPIF Note elements are shared across tracks. Figures in coda_write.json and coda_grid.json.

A defect found in passing, not caused here. Bar 105 voice 0 holds 4.0 quarters inside a 5/4 bar. That bar runs short in RECONCILED and in TEMPOMAP too, so neither edit produced it.

10Step three is done: fifteen of sixteen collisions resolved

HANDS-s6857183-Brandon-edit.gp, sha256 c7beeaeea846da44..., built from CODA whose sha256 97ea1b3b42c83837... is unchanged. 15 notes removed, 0 added: thirteen snare and two tom high floor. No ride note was touched.

16 → 1
three-hand instants
only bar 55 survives
125×
separation on the snare call
0.0000 to 0.0041 against 0.5355
0.708
match after the edit
it stood at 0.697 last pass
0
bars touched outside the plan
11 planned, 11 touched

The stems separate the lanes cleanly. At thirteen instants the snare stem reads 0.0000 to 0.0041 while the toms stem carries a full stroke. At bars 85 and 89 the reverse holds, with the snare at 0.5355 and 0.5126 and the toms at 0.0000 and 0.0025. The transcription had written both lanes at every one of them.

Five three-hand instants across the snare, toms and ride stems. At bars 29, 52 and 55 the snare trace is flat while the toms fire. At bars 85 and 89 the reverse.

Every one of the fifteen removals, read by eye

The five-panel figure above is a sample. This is the complete set: each panel shows the stem of the lane that was taken out, across 0.7 s centred on the written instant.

Fifteen panels, one per removal. Every trace is flat at the red line marking the written instant.

Fifteen of fifteen confirmed visually. Nine panels are dead flat at 0.0000. The other six carry a faint ripple or a small blip to the left of the line and nothing on it: bar 41 at 0.0007, bar 52 at 0.0016, bar 54 at 0.0041, bar 56 at 0.0007, bar 57 at 0.0003, bar 89 at 0.0025. No panel shows a struck note where the transcription wrote one.

The ride was left alone on purpose

Its threshold fits the author at a mean absolute error of 7.03 notes per bar with a 28 percent null fire rate, against 1.27 and 4 percent for the snare. The render shows it rejecting a real stroke at bar 55. A lane that unreliable does not get to delete notes, so all 1,522 ride notes stand.

A near-miss worth publishing

The first attempt removed the notes by editing the shared beats in place. GPIF deduplicates: Beat id 899 is referenced by 176 voices and carries Note id 419, so that edit deleted 179 note instances across 79 bars that were never targeted. The tell was in the plan itself, which printed one note id thirteen times and one beat id twelve times. The damaged file was quarantined rather than deleted, and the rerun cloned the beat once per voice. Recorded as F4 in FINDINGS.md.

Bar 55: which layer is closed, checked by search rather than assumed

It writes tom low, tom hi mid and ride together. The tom lane is real, since the toms stem carries a full stroke there. Only the question of which tom is unresolvable, and a web search on 2026-09-08 narrowed that to two specific layers rather than a blanket wall.

Queued as q-2026-09-08-b08085. Figures in hands_write.json and three_hand.json.

A peer warning, tested rather than adopted

The session working Keep It Greasey reported that Songsterr renumbers element ids on a round trip: its own published re-export moved Beats 1,527 to 1,556 and Notes 680 to 679 with zero content change, because the exporter re-deduplicates. Verification that diffs ids across a round trip would read phantom edits.

Checked here by breaking it on purpose. Every Beat and Note id in the head file was shifted by +5000, with every reference rewritten to match, and the census re-run on both. Result: 2,784 instances on each side, 0 added and 0 removed. Every set difference in this session keys on the tuple (bar index, voice index, position in quarters, midi number), so no element id enters any comparison. Recorded as F6 in FINDINGS.md, and it carries into the upload step.

11The finite work that remains

Brandon set the scope on 2026-09-08, and it is a closed list rather than an open research programme. Steps one, two and three are complete. No further detector gets written unless one of these five edits produces contradictory evidence.

#stepqueue id
1DONE 2026-09-08. Metronome map written into TEMPOMAP-s6857183-Brandon-edit.gp, acceptance test PASS at 0.685 and 0.189q-2026-09-08-cddb5a
2Transcribe bars 98 to 104 against that clockq-2026-09-08-577c81
3DONE 2026-09-08. 15 of 16 resolved into HANDS-s6857183-Brandon-edit.gp; bar 55 blocked under q-2026-09-08-b08085q-2026-09-08-baae9d
4Recheck the 202 disputed ride notesq-2026-09-08-c9d5f7
5One final stem-matched playability auditq-2026-09-08-85d746