# The Zappa ghost note debacle

Audited 2026-08-30. Moderation, track names and revision state re-read uncredentialed on
2026-09-07 against `api/meta/<songId>` and `api/meta/<songId>/revisions`.

## STATUS NOTICE, 2026-09-07. Read before acting on anything below.

The moderation queue emptied on 2026-09-07 between 14:36 and 17:52 UTC. Ten of the sixteen
restores are now the published revision. Six still sit on moderation, and the seventeenth song's
repair sits there with them. Keep It Greasey stays blocked.

- **The restores emptied authored track names.** Eight published with their names blank, and
  **28 authored credits are missing from live public tabs right now**, counted against each
  tab's own pre-sweep revision. Section 2.
- **Watermelon In Easter Hay is not settled.** The verdict below calls all 1,317 ride and crash
  flags genuine on placement evidence. That inference was withdrawn on 2026-09-06 after an audio
  test returned a 41% chance baseline against ghosts at 47% and plain at 55%. **1,123 ride ghosts
  are unexplained** and no deletion revision may be shipped against them. Queue
  `q-2026-09-06-1492ba`.
- **Trouble Every Day (Live) `s412170` was never safe.** Kirill restored 3 of 9 ghosts, leaving 6
  missing, and left 6 beat velocity changes governing 784 of 807 slots. A verified repair went up
  as **r8932027** on 2026-09-06 and is still on moderation.
- **The 16-song damage ledger was incomplete.** The board is **17 affected songs**.
- **The upload path changed.** Every rebuild now goes on a copy, our own damage included.
  Section 6.

The root cause analysis, the field-name failures and the accent bitfield work all still stand.
The operational board is https://7onething1.github.io/zappa-program-scope/

## 1. The moderation wave, 2026-09-07

Sixteen restores went up on 2026-09-05 and sat unread for two days. Moderators cleared them in a
single afternoon.

| Song | Song id | Our restore | State | Published now | Named tracks |
|---|---|---|---|---|---|
| Watermelon In Easter Hay | s35881 | r8908034 | published, fair by Evgeny 14:49Z | r8908034 | 0 / 9 |
| Muffin Man | s35886 | r8906880 | published 14:36Z, then superseded | r8944638 | 0 / 5 |
| Drowning Witch | s620961 | r8908109 | published 15:02Z, then superseded | r8945141 | 0 / 16 |
| Montana | s35870 | r8907028 | published 15:38Z, then superseded | r8945851 | 11 / 18 |
| The Black Page | s1105085 | r8907247 | published, fair by Kirill 15:39Z | r8907247 | 2 / 4 |
| Nanook Suite | s35878 | r8907360 | published, fair by Kirill 17:51Z | r8907360 | 8 / 11 |
| Nanook Rubs It | s35865 | r8907423 | published, fair by Kirill 17:52Z | r8907423 | 7 / 9 |
| What's New In Baltimore? | s35887 | r8908276 | published 15:55Z, then superseded | r8946169 | 6 / 7 |
| Catholic Girls | s749523 | r8907778 | published 15:45Z, then superseded | r8945977 | 4 / 9 |
| Zomby Woof (AI) | s5820647 | r8932311 | published, name repair applied | r8932311 | 5 / 5 |
| Inca Roads | s412178 | r8907511 | on moderation | r8769026 | 12 / 12 |
| Carolina Hard-Core Ecstasy | s68248 | r8908182 | on moderation | r8769058 | 6 / 9 |
| Oh No | s35884 | r8908239 | on moderation | r8769089 | 4 / 6 |
| Alien Orifice | s68246 | r8907689 | on moderation | r8769118 | 8 / 10 |
| Fembot In A Wet T-Shirt | s748459 | r8907601 | on moderation | r8769165 | 6 / 9 |
| Uncle Meat | s20690 | r8907952 | on moderation, 3 of ours queued | r8788757 | 11 / 11 |
| Trouble Every Day (Live) | s412170 | r8932027 | on moderation | r8815000 | 6 / 6 |
| Keep It Greasey | s604777 | r8768457 | blocked by Kirill527 | r8852151 | 9 / 9 |

Uncle Meat carries three of our revisions on moderation at once, `r8907892`, `r8907952` and
`r8909627`. Songsterr offers no withdraw control, so the stack stands until a moderator picks one.

## 2. The restore emptied the credits

The repair for the ghost notes introduced a different loss on the same tabs.

### The mechanism

GPIF stores a track name inside a `<![CDATA[...]]>` block. Python's `ElementTree` drops the CDATA
wrapper when it writes the file back out. Songsterr's converter then finds no name and falls back
to a generic label. Files built by direct download or by `lxml` with
`XMLParser(strip_cdata=False)` keep them.

| Revision | How it was built | CDATA blocks | Names present |
|---|---|---|---|
| s35881 r8768414 | our own .gp upload | 136 | 7 of 9 |
| s35881 r8908034 | ElementTree | 0 | 0 of 9 |
| s5820647 r8906157 | ElementTree | 0 | 0 of 5 |
| s5820647 r8932311 | CDATA-carrying rebuild | present | 5 of 5 |

The same upload path served all four, so the build tool is the variable and the platform is not.

### Which restores dropped names

| Song | Before ours | Named | Our restore | Named | Verdict |
|---|---|---|---|---|---|
| Watermelon In Easter Hay | r8768414 | 7 / 9 | r8908034 | 0 / 9 | dropped 7, still live |
| Drowning Witch | r8768566 | 12 / 16 | r8908109 | 0 / 16 | dropped 12, still live |
| Montana | r8787106 | 18 / 18 | r8907028 | 0 / 18 | dropped 18, 11 put back |
| What's New In Baltimore? | r8769141 | 6 / 7 | r8908276 | 0 / 7 | dropped 6, all 6 put back |
| Catholic Girls | r8788801 | 5 / 9 | r8907778 | 0 / 9 | dropped 5, 4 put back |
| Muffin Man | r8768517 | 4 / 5 | r8906880 | 0 / 5 | dropped 4, still live |
| Zomby Woof (AI) | r8766178 | 3 / 5 | r8906157 | 0 / 5 | dropped 3, repaired to 5 of 5 |
| Zomby Woof | r8905411 | 0 / 10 | r8905491 | 0 / 10 | Nikita restored 9 |
| The Black Page | r8768613 | 2 / 4 | r8907247 | 2 / 4 | clean, names preserved |
| Nanook Suite | r8769001 | 8 / 11 | r8907360 | 8 / 11 | clean, names preserved |
| Nanook Rubs It | r8768967 | 7 / 9 | r8907423 | 7 / 9 | clean, names preserved |

The three clean rows were built from direct downloads rather than through ElementTree, which is
the same split the CDATA measurement predicts.

### What is missing from public tabs right now

| Song | Lost | Cause | What is gone |
|---|---|---|---|
| Drowning Witch | 12 | our restore r8908109 | Vocals, Clean Guitar x2, E. Piano / Synth II, Synth III / Clavinet left and right, Saxophone, Glockenspiel, Kazoo / Harmonica / Vibraphone, Chimes / Woodblocks / Timpani, Synthesizer left and right |
| Watermelon In Easter Hay | 7 | our restore r8908034 | Frank Zappa, Warren Cuccurullo x2, Arthur Barrow, Ed Mann, Wurlitzer (Peter Wolf), Vinnie Colaiuta |
| Muffin Man | 4 | our restore r8906880 | Frank Zappa, Tom Fowler, George Duke, Terry Bozio |
| Carolina Hard-Core Ecstasy | 3 | our strip r8769058 | Bass, Drums, Trombone |
| Montana | 1 | our restore r8907028, partly repaired | Ruth Underwood on track 12, plus 6 placeholder labels |
| Catholic Girls | 1 | our restore r8907778, partly repaired | Vocals |

**28 authored names are missing across six live tabs.** Six further blanks on Montana were
placeholder labels reading `AI`, `1`, `2` and `3`, counted separately because they carry no credit.

**53 more names sit behind the moderation queue.** The seven held restores were built the same
way, and the tabs under them carry 12, 6, 4, 8, 6, 11 and 6 named tracks. Approval publishes the
same defect on each. Waiting is not a neutral option here.

### The fix is proven on two songs

Export the live revision, rebuild with `lxml` using `etree.CDATA` under
`XMLParser(strip_cdata=False)`, verify zero note, dynamic and event changes, then submit.
`r8932311` did exactly that on Zomby Woof (AI) and restored 5 of 5 names, two better than the 3
the tab carried before the sweep. `RESTORED-s35881-TEXTSAFE-v2.gp` carries 137 CDATA blocks and
is the ship candidate for Watermelon.

## 3. Someone is repairing behind us

Within about an hour of each restore clearing, an Editor-built revision appeared on five songs.

| Song | Our restore | Named after ours | Following revision | Named after | Outcome |
|---|---|---|---|---|---|
| What's New In Baltimore? | r8908276 | 0 / 7 | r8946169 | 6 / 7 | fully repaired |
| Montana | r8907028 | 0 / 18 | r8945851 | 11 / 18 | credits back, 1 missing |
| Catholic Girls | r8907778 | 0 / 9 | r8945977 | 4 / 9 | 4 back, 1 missing |
| Muffin Man | r8906880 | 0 / 5 | r8944638 | 0 / 5 | not repaired |
| Drowning Witch | r8908109 | 0 / 16 | r8945141 | 0 / 16 | not repaired |
| Zomby Woof | r8905491 | 0 / 10 | r8918601 | 9 / 10 | Nikita reverted our frame |

Those repairs were made by hand by people who did not cause the loss. Two tabs are still waiting
for someone to notice.

## 4. Trouble Every Day, the seventeenth tab

Our strip `r8766285` removed 9 ghosts from the Chad Wakerman Percussion staff. Kirill's
`r8815000` put back 3. Six were still missing, all fret 49 crash at bar 67 beats 4 to 9, and all
six notes still existed, so only the ghost flag was needed. Six wrong beat velocities were also
still live: bar 1 beats 4, 5 and 6, bar 67 beats 4 and 6, and bar 69 beat 10. Twelve corrections
in total.

`RESTORED-s412170.gp` was verified against the live base rather than the author, so Kirill's
post-strip edits survive: 6 ghosts flipped false to true, 0 ghosts lost, 0 other note changes
anywhere, 0 changes on other tracks, effective dynamic matching the author on all 807 slots. It
went up as **r8932027** on 2026-09-06 and is on moderation.

A separate grid defect on the same tab was inherited. The tab notates 134.0s against its 141.0s
synced video, 4.96% off against a 2% tolerance, present on every revision including the author's.
The preflight gate refuses the repair on that basis, and the unmodified live base fails the
identical gate with identical numbers.

## 5. Two defects the restore itself introduced

### The ride definitions were merged

On Watermelon the post-sweep `r8768414` merged ride definition 431, the ghosted one, and
definition 432, the plain one, into a single id 418 covering all 1,724 occurrences. Writing
`<AntiAccent>` onto 418 would have ghosted all 1,724, including the 408 that were never ghosted.
The repair has to split 418 by occurrence position against the pre-sweep revision, copy-on-write.

### A chord symbol has two halves and only one came back

GPIF stores a chord in two places, an `<Item>` defining the diagram and a `<Chord>` reference on
the beat that displays it. The paren sweep dropped both halves of E7Msus2 at bar 3. The first
restore put the Item back alone, so the definition sat orphaned and no bar printed the symbol.

Three checks passed on that broken file:

- `'E7Msus2' in text`, which an orphan satisfies
- the printed list of chord Items, which never says whether a beat references one
- the lane-aware set difference, which keys on `(bar, voice, position, midi)` and cannot see a
  symbol carrying no notes

Beat id 2 is shared by seven voices covering track 0 bars 3 to 9, so the repair clones it
copy-on-write and repoints the bar 3 voice alone. Three checks agreed, and none measured the
thing that was gone.

## 6. The upload path changed

**Hard gate set by Brandon on 2026-09-07. We do not submit revisions to an original tab, and
undoing our own damage is included.** Open the original, click Create a copy to edit, rename the
copy with "Brandon edit" on the end, import the corrected file there, and submit on the copy.

For Watermelon: open `s35881`, create a copy, rename it to "Watermelon In Easter Hay Brandon
edit", import `RESTORED-s35881-TEXTSAFE-v2.gp`, submit on the copy. The original tab and
`r8908034` stay untouched.

### The preflight NAMEDROP rule is too absolute

The rule states that the uploaded file cannot prevent a name loss, on the grounds that one
upload's Tracks section was byte-identical to Songsterr's own export and the names still went.
The four measurements in section 2 refute it. A Tracks section compared after parsing is
byte-identical whether or not the source carried CDATA, because the parser has already discarded
the wrapper. The comparison could not see the variable it needed to see.

## 7. The work that is not about ghosts

### Watermelon, two repairs waiting on the queue

**The foot-pedal hi-hat is missing.** The isolated hat stem gives a periodic subsequence at
1.0800 s, equal to the GP quarter at the snare-anchored tempo of 1.0842 s, with 178 of 505 grid
slots carrying a hat onset at 35% against a 26% chance baseline. Brandon's representative chicks
at 181.93, 183.03, 184.10 and 185.19 appear in the detection at 181.92, 183.00, 184.09 and
185.17. The tab notates six Pedal Hi-Hat events, so roughly 172 are missing.

**The snare rebound ghosts are missing.** The tab carries 193 snare events with zero ghost flags.
Brandon measured 202 principal snare attacks, of which 196 carry a substantially quieter
follow-up within 250 ms and 178 carry two, the first at a median near 92 ms and the second near
156 ms. An independent run agreed on the lags at 70 ms and 134 ms and over-detected principals at
411 against 202, so his counts govern. These belong on the snare lane, not on Ride (middle).

**Bar 54 is the only tuplet bar in the tab**, a 1/6 quarter-note duration inside 5/4.

### The ride question, where it stands

Settled: the 193 post-snare Ride (middle) ghosts are not misplaced snare rebounds. The tab places
them at a rigid 271 ms after the snare, one GP sixteenth, with the 10th and 90th percentiles both
at 271 ms, and the measured rebounds land at 70 to 92 ms and 134 to 156 ms.

Unsettled: the other 1,123. The cymbals stem gives a 41% chance baseline that swallows the
signal, ghosts sit at 47% and plain at 55%, and the neither-detected rate is 50.3% for ghosts
against 46.8% for plain. A second machine-readable transcription cannot arbitrate, because it
runs 230 bars of 4/4 plus 48 of 2/4 against the tab's 53 of 4/4 and 52 of 5/4.

### Carolina Hard-Core Ecstasy

**About 16.5 bars are unnotated.** The tab totals 313.45s across 102 bars, tempo automations 79
BPM from bar 0, 71 at bar 98, 66 at bar 100, 45 at bar 101, against a 360.0s record. Shortfall
46.55s, 12.93%. Filling 360s at the tab's own 79 BPM needs 118.5 bars against the 102 present.
Raising tempo to Sloots's 86.4 widens the gap by 30.12s, so this is missing material.

**The opening is written straight where a professional transcription writes triplets.** The tab
carries 23 tuplet events in the whole 102-bar file, 6 in Drums at bar 42 and 17 in Trombone at
bar 68, and bars 1 to 8 hold 505 events across nine tracks with zero tuplets.

### Keep It Greasey

Printed sources give quarter = 134. A local sixteenth-grid sweep over the 3:18 to 3:58 solo
window peaks at 143.5 with 71.1% against a 45.4% chance floor, with 135.0 at 69.7%. The grid lock
is established and the exact tempo is not, so 134 must not be quoted as confirmed by audio.

Tempo-map drift is small at 11 ms per bar, 0.55%. Where measure 102 begins is the binding limit,
anchor uncertainty 1,928 ms, 0.91 of a 19/16 bar, across three families: drums +1.176s, bass
+0.410s, keys -0.752s.

Two corrections came from a second reader. The denominator was wrong: four sources were evaluated
and three sparse parts were skipped, and counting the skipped three as failures turned missing
estimates into negative observations. The second-separator result needs a masking control,
because the comparison stem is whole-kit drums, so a genuine quiet stroke masked by a louder kit
event in the same 30 ms window is indistinguishable from an artifact.

### Nine printed charts are still unapplied

Across seven songs: Dong Work for Yuda `s768189` (Sweeney), Apostrophe' `s35873` (Bishop on Jim
Gordon), Watermelon `s35881` (Drumnet), Central Scrutinizer `s3554079` (Bishop), Don't Eat the
Yellow Snow `s35866` (Bishop), Andy `s21495` (Ryan Brown), Keep It Greasey `s604777` with three
sources for verification only. Apostrophe' holds four tracks all on instrumentId 29, so a drum
staff has to be added before a drum chart can be applied.

## 8. The seventh instance, committed while writing this update

This page documents six occasions where a check enumerated what it expected and read absence as
evidence. Building this update produced a seventh.

To measure the name loss I read `api/meta/<songId>` and counted tracks whose `title` was empty.
Every one of twenty tabs returned 100% empty, including Apostrophe', which this work has never
touched, and Keep It Greasey, whose strip was blocked before it could publish.

A result that says every tab on the platform lost every name is a result about the instrument.
The track object has no `title` key. The field is `name`. The real schema is `difficulty, hash,
instrument, instrumentId, isEmpty, isVocalTrack, name, tuning, views`.

| | Reported |
|---|---|
| wrong field `title` | 179 names lost across 20 tabs, including tabs never edited |
| right field `name` | 28 authored names lost across 6 tabs, each traced to a revision |

The tell was the control. Apostrophe' and Keep It Greasey were in the sweep as untouched
comparisons, and both scored identical to the damaged tabs. Had the query covered only the tabs
under suspicion, the number would have looked plausible and would have been published.

This is the same failure as grepping `<Ghost>` in GPIF, as reading a missing `fret` as a rest, as
reading a missing `dynamic` key as an absent marking, and as the hardcoded allowlist in
`noteloss_audit.py`.

---

# The record as it stood before 2026-09-07

## What happened

Songsterr draws a ghost note as a notehead inside round brackets. That is the platform's
own ghost notation and it carries real musical information, the quiet stroke a drummer
plays between the loud ones. A sweep run on 2026-08-29 and 2026-08-30 read those brackets
as a defect and removed them across twenty Zappa tabs.

## The numbers, by verified state

| State | Tabs | Ghost notes |
|---|---|---|
| Current public revision | 16 | 3,842 |
| Rejected by a moderator, blocked | 2 | 682 |
| Superseded, never public | 2 | 41 |
| Flagged, never submitted | 4 | 19 |

An earlier version called the 723 non-current flags "still at
risk". That was wrong. Keep It Greasey (rejected by Kirill527) and Zoot Allures (rejected
by Darr) are blocked and cannot publish as of those recorded decisions. Whether either was at risk
during the window before review is a separate question this page does not answer. Neither
needs further action now, and the
corrected Zoot Allures file built on 2026-09-05 should not be sent.

## Which lane each flag actually sat on

Counted by MIDI lane in each tab's pre-sweep revision, 2026-09-05. A ghost note is a quiet
snare stroke between the loud ones; a ghost flag on a ride cymbal is a different thing.

| | Count |
|---|---|
| On snare, unambiguous ghosts | 1,549 |
| On cymbals, hats, kick, toms, tambourine | 2,293 |

**The largest single entry is the weakest case for restoration.** Watermelon In Easter Hay's
1,317 are 1,316 ride and 1 crash, with no snare at all, and the stripping revision claimed
exactly that. Carolina Hard-Core Ecstasy's 144 are all tambourine. Oh No's 141 are all
closed hat. Restoration runs snare first.

**Montana already carries the wrong repair.** Ben Dibden1's r7294223 held 317 ghost flags.
My r8764165 wiped them and my r8787106, live today, converted all 317 into staccato dots,
the substitution measured wrong the same day. 174 of its 317 are on snare.

**Whose work we overwrote:** 15 of the 16 damaged tabs overwrote other people's revisions,
3,525 flags. Named: Ben Dibden1 (4 tabs), Kevin Sheppard (2), Darr (2), Khashoggi, Achille,
Kirill, Taburet, Leonard, CoolDude and one more. Montana overwrote my own earlier work.

## Root cause, three layers

1. **A house rule applied outside its scope.** The staccato-dot-at-velocity-31 rule comes
   from `stems-to-guitar-pro-drums`, which builds a tab from an isolated drum stem. The
   sweep carried it onto community tabs written by other people.
2. **The wrong element name hid the evidence.** GPIF spells a ghost
   `<AntiAccent>Normal</AntiAccent>`. A search for `<Ghost>` returns zero in every file.
3. **The audit measured note counts and missed the loss.** It compared pitch, rhythm and
   position across 120,579 beat events and found zero differences. Articulation sat
   outside what it measured.

**The rule was withdrawn on 2026-09-05, in the pipeline as well as here.** A GPIF ghost
arrives on Songsterr as its own `ghost` field and draws parenthesised; a GPIF `<Accent>`
arrives as `staccato` and draws as a dot. `sd_writegp.py` now writes the native ghost flag, and `sd_verify.py` fails any file that
writes a ghost as a dot. Exercised end to end on a 48-hit fixture: 20 passed and 0 failed
on the new encoding, then 2 failed and exit 1 after the file was reverted to the old one.

## Checked against the printed charts

Ryan Brown's DRUM Magazine page carries eight pedal hi-hat marks one full space below the
bottom staff line. A bitwise compare of a 14x17 window centred on each mark returns 0 differing pixels across
all 28 pairs, within those windows. Drumnet's bar 1 carries the same three marks at the same
height in its own dialect.

**A claim of mine was wrong.** I reported the tab holds no pedal hi-hat events. It holds
23, across bars 6, 7, 8, 9, 15, 17, 18, 41, 42, 43, 44, 99, 100 and 102. Bar 1 was the
omission, and r8905491 fills it with three strokes.

**What was tested.** One import path: a Guitar Pro 7 `.gp` pushed through the editor's
`importRevisionInput` on tab s412162, read back as revision r8905411, part 9. On that path
a GPIF `<Accent>` arrived as `staccato` and the note schema held `fret`, `string`,
`staccato`, `rest`, `ghost` and `tie`, with no accent field. Whether another format, kit or
Songsterr's own editor can express a drum accent is unconfirmed and was not tested. Revision r8905411 moved the bar 5 marks to Brown's positions and doubled them; the
rendered bar showed ten round dots and no wedges, so r8905491 put bars 5 and 16 back.

**The barring source count was wrong.** Kasper Sloots' 10/16 sits at 1:39 to 2:10, framed
by 7/8 and 5/4. Brown's page is headed at 0:00, so Zappa Analysis never voted on the
opening bar. Both the split and the single bar are structural readings, which makes the
rebar a source based editorial adjudication rather than an objective correction.

## Status, in three separate kinds

| Kind | Zomby Woof s412162 |
|---|---|
| Locally verified build | `r8905491-Zomby-Woof-PEDAL-rev4.gp`, every gate green |
| Submitted revision | r8905491, `isOnModeration=true`, part JSON reads back correct |
| Confirmed public revision | still r8814965 by Kirill, eight ghosts still missing |

Zomby Woof is not repaired in public. Six revisions from this work sit in that tab's
queue. Songsterr offers no withdraw control, so the description asks the moderator to take
the newest.

## What is left

- Sixteen live tabs need a restoring revision, one per pass, verified against the pre-sweep
  revision rather than the stripped one.
- Restore every attribute the sweep touched. It wrote a staccato dot and set velocity to 31
  as it cleared each ghost, so a restoring pass returns the ghost flag, removes the dot and
  returns the velocity, measured against the pre-sweep baseline.
- Rebase onto the current public revision so other people's later edits survive.
- Watermelon In Easter Hay is the largest single loss at 1,317 flags, and its revision
  claimed they were ride and crash, so that reading needs checking against the audio first.
- Verify the revision that actually becomes public, per tab, after moderation.
- Keep It Greasey and Zoot Allures need nothing. Both stripping revisions are blocked.

## Sources

- `~/Library/Mobile Documents/com~apple~CloudDocs/sfg/zappa-drum-repair-2026-08-31/`
- `~/Projects/_outputs/songsterr-zappa-paren-fix/`
- `~/Projects/_outputs/zappa-drum-sources/` (one folder per publisher, each with SOURCE.md)
- `songsterr.com/api/meta/<songId>/revisions` read 2026-09-05

---

## Update, 2026-09-05 18:20 UTC

Re-queried every tab. Two findings change the work list.

### Zoot Allures and Keep It Greasey need no fix

A moderator **blocked** both stripping revisions. `isBlocked=true` on `r8769199`
(Zoot Allures) and `r8768457` (Keep It Greasey), and false on every other revision
tested, including other authors' revisions on the same songs. A blocked revision cannot
be promoted. Zoot Allures keeps all 53 ghosts live, Keep It Greasey keeps all 629.

### Corrected counts

| State | Tabs | Ghost flags |
|---|---|---|
| Still damaged and live | 15 | 3,832 |
| No action needed (2 blocked, 2 superseded) | 4 | 723 |
| Repaired and live | 1 | 10 |

### Watermelon In Easter Hay, verdict

Its stripping revision claimed the 1,317 marks were "all on ride and crash at forte, so
they are not ghost notes." The lane half is right: 1,316 on ride (MIDI 51), 1 on crash
(MIDI 49). The forte half fails too. The staff holds 1,785 beats and **exactly one written
dynamic**: bar 1, on the single ghosted crash, a tremolo swell marked `velocity f` with
`gradualVelocity crescendo`. The other 1,784 beats carry none, so the 1,316 ride ghosts
stand on no dynamic at all.

**Correction, my second field-name error here.** I first wrote that every note carries
`dynamic: null`. Songsterr names that field **`velocity`**, not `dynamic`; the key
`dynamic` appears zero times in the schema, so I mistook an absent key for an absent
marking. Caught by a parallel session. The verdict stands, since one forte in 1,785 beats
cannot support "they are all at forte". Velocity is identical across both revisions, so
the sweep changed no dynamic, which its description got right.

Both my errors share a root: I searched for an assumed field name and read its absence as
evidence, the same as grepping `<Ghost>` in GPIF and concluding a file has no ghosts.

The placement settles it. The ride runs a continuous sixteenth ostinato:

| 16th slot in bar | Plain | Ghost |
|---|---|---|
| 0, 4, 8, 12 (quarter pulse) | 407 | 2 |
| every other sixteenth | 1 | 1,314 |

A ghosted ride is alone in its beat 99.4% of the time. A plain ride shares its beat with
kick or snare 60.8% of the time. This is a standard accented ride ostinato, quiet between
the pulses. **All 1,317 are genuine and must be restored.**

### Correction to my own part-0 figure

I first reported the Frank Zappa staff going 1,056 notes to 1,061 across that edit. That
was a measuring artifact. `songsterr_live_read.py` called any entry without a `fret` key
a rest, and a dead-string note also has no fret. Five dead notes on that staff carry no
fret in the pre-sweep revision and `fret 0` in the live one, so the tool scored them as
rests in one and notes in the other.

Measured on the `rest` field the data carries: **1,061 sounding notes before and after,
delta zero.** The staff gained 4 quarter rests at bars 3, 5, 7, 9. Tool patched, backup
at `songsterr_live_read.py.bak-pre-restfix-2026-09-05`.

A parallel session found what the round trip actually cost: **one chord symbol, E7Msus2
at bar 3.** The rest is encoding (91 bend points gaining `precisePosition`, 136 vibrato
flags re-encoded, 21 apparent fret diffs that are the same notes reordered in the array).

### Independent verification of the Watermelon restore file

`RESTORED-s35881-v2.gp`, built by a parallel session on the current live export, checked
at render level rather than by element count (GPIF Notes are shared, so a raw count hides
position errors):

| Check | Result |
|---|---|
| Drum-staff note slots, pre-sweep vs restored | 2,091 vs 2,091, sets identical |
| Ghost positions, pre-sweep vs restored | identical set, 0 missing, 0 extra |
| Lanes restored | 1,316 ride (51), 1 crash (49) |
| Other eight staves | note and ghost counts unchanged |
| letRing on the drum staff | 0 (the 25 in the file sit on two guitar staves) |
| Bars and tracks | 105 and 9, unchanged |

The file is correct and ready to submit. Its 1,332 `AntiAccent` elements are 15
pre-existing plus 1,317 written copy-on-write.


## All sixteen restores submitted

Watermelon went up as `r8908034`, reading back from CloudFront with 1,317 ghosts, 1,316
on ride and 1 on crash, matching the pre-sweep revision.

| Tab | Revision | Ghosts |
|---|---|---|
| Watermelon In Easter Hay | r8908034 | 1,317 |
| Muffin Man | r8906880 | 578 |
| Drowning Witch | r8908109 | 419 |
| Montana | r8907028 | 317 |
| The Black Page | r8907247 | 173 |
| Nanook Suite | r8907360 | 168 |
| Nanook Rubs It | r8907423 | 168 |
| Inca Roads | r8907511 | 165 |
| Carolina Hard-Core Ecstasy | r8908182 | 144 |
| Oh No | r8908239 | 141 |
| Alien Orifice | r8907689 | 86 |
| What's New In Baltimore? | r8908276 | 59 |
| Fembot In A Wet T-Shirt | r8907601 | 57 |
| Uncle Meat | r8907952 | 24 |
| Catholic Girls | r8907778 | 16 |
| Zomby Woof (AI) | r8906157 (live) | 10 |

Keep It Greasey `r8768457` was rejected by Kirill527 and Zoot Allures `r8769199` by Darr,
both on 2026-09-01. Montana counts 317 across two drum staves, 212 on track 15 and 105 on
track 17, so a single-part read undercounts it.

## A challenge to these numbers, resolved

Another session reported that this page's counts disagree with the local `ORIGINAL` files,
totalling 5,322 rendered ghosts across 22 files. Measured by staff type, every number here
holds; the gap is scope.

| Song | This page | File, all staves | Drum staves | Other staves |
|---|---|---|---|---|
| Watermelon In Easter Hay | 1,317 | 1,333 | 1,317 | 16 |
| Muffin Man | 578 | 613 | 578 | 35 |
| Drowning Witch | 419 | 496 | 419 | 77 |
| Montana | 317 | 574 | 317 | 257 |
| Zoot Allures | 53 | 53 | 53 | 0 |

The drum column matches this page on every row. The larger totals count ghosts on vocal,
guitar, keyboard and mallet staves that the sweep never touched. Montana's 257 non-drum
ghosts are Vocal 1/2/3 102, Frank Zappa Lead 112, George Duke 23, Ruth Underwood Bridge 14,
Tom Fowler 6, matching the 2026-08-30 audit record.

Zoot Allures looked like the only agreeing row because it carries zero non-drum ghosts, so
its two totals coincide.

## Why the sweep passed its own audit

The 2026-08-31 handoff records no notes lost across 20 folders and 120,579 beat events,
zero pitch, rhythm or position differences. True, and produced by an instrument blind to
the thing being destroyed.

`noteloss_audit.py` built its per-note fingerprint from a hardcoded list:

    for tag in ("Tie", "Accent", "Vibrato", "LetRing", "Trill"):

`AntiAccent` is not on it, and `AntiAccent` is how GPIF spells a ghost note.

| Note | Fingerprint under the old rule |
|---|---|
| plain ride | `art=0;Midi=51` |
| **ghosted ride** | **`art=0;Midi=51`** (identical) |
| accented ride | `art=0;Midi=51;Accent=1` (visible) |

Both versions against the real Watermelon pair:

| Tool | Differing events | AntiAccent mentions |
|---|---|---|
| as it ran during the sweep | 15 | 0 |
| enumerating effects structurally | **1,332** | 75 |

1,332 accounts exactly: 1,317 ghost losses plus the 15 encoding differences the old
version already found. On the one question that mattered it returned clean with full
confidence.

Fixed to enumerate every child element except the two structural ones. Ghost, accent,
letRing and tie now each fingerprint distinctly. Backup at
`noteloss_audit.py.bak-pre-antiaccent-blindness-2026-09-05`.

This is the fourth instance of one root cause in this audit and the most costly: grepping
`<Ghost>`, searching the articulation table, reading a missing `fret` as a rest, reading a
missing `dynamic` key as an absent marking, and a hardcoded allowlist hiding a real loss.
Every one enumerated what was expected and treated absence as evidence.

## The sixth instance, caught by Brandon

Two sessions agreed the drum note schema has no accent field, so accents could not be
notated. Brandon opened the editor, saw the accent option, and was right.

The field is **`accentuated`**. The wrong claim came from a key inventory of one part of
one tab that contained no accents. Scanning 106 parts across 11 tabs gives the real
schema: `string, fret, rest, tie, staccato, dead, hp, slide, ghost, bend,
leftHandVibrato, accentuated, harmonic, harmonicFret, trill, tremolo`.

`accentuated: 1` is an accent, `accentuated: 2` a marcato, and both appear on drum staves.
Keep It Greasey s604777 carries 60 marcatos on the Vinnie Colaiuta staff; Drowning Witch
s620961 carries 7 accents and 2 marcatos on drums.

**GPIF `<Accent>` is a bitfield, not an enum.** The first version of this note published
the bit meanings from an assumed spec and had 4 and 8 SWAPPED. Corrected from measurement:

| GPIF value | Served as | Marking | How known |
|---|---|---|---|
| 1 | staccato | staccato dot | measured, bars 300/302/304 |
| 4 | accentuated 2 | marcato ^ | **measured, glyph seen at bar 3** |
| 8 | accentuated 1 | accent > | closed 2026-09-06, alphaTab GpifParser/GpifWriter/AccentuationGlyph |

**Bar-128 render closed visually, 2026-09-07.** The Songsterr viewer is virtualised and never
painted at that scroll depth, so the file on disk was rendered directly with alphaTab 1.6.0 in
headless Chrome, one bar per page, drums track 15 only, and cropped at native resolution.
Bar 128 draws a horizontal wedge with its apex to the right, `ArticAccentAbove`. Bar 101 draws an
inverted V with a clean apex, `ArticMarcatoAbove`, a second marcato sighting independent of bar 3.
Figure: accent-glyph-proof.png . The mapping now holds on four routes: reader, writer, glyph enum,
and a picture of the real file.
| 9 | accentuated 1 + staccato | accent plus dot | 8\|1 |

Correspondence measured both ways on Drowning Witch's drum staff: `Accent=4` renders twice
at bars 3 and 101 and the JSON holds exactly two `accentuated: 2` at bars 3 and 101;
`Accent=8` renders seven times at bars 128 and 173 and the JSON holds exactly seven
`accentuated: 1` at those bars.

Rendering bar 3 at 6x shows a caret above the accented tom, so `Accent=4` is the marcato.
The other end is inference: Guitar Pro carries exactly two accent flags
(`accentuatedNote`, `heavyAccentuatedNote`) and `accentuated` carries exactly two values,
so with 4 pinned, 8 is the plain accent. The glyph at bar 128 would close it outright;
Songsterr's notation is virtualised and would not render at that depth here.

**Write `<Accent>8</Accent>` for an accent, `4` for a marcato.** Acting on the swapped
version would have printed marcatos where accents belong.

This is the sixth instance of the same root cause, committed inside the work documenting
it. Absence in a sample is not absence from a schema.
