Commit d80e023e by PLN (Algolia)

fix(surface): wap was un-compacted by an editor save, and re-measure the hand counts

TWO THINGS, AND THE FIRST ONE IS THE LESSON.

wap.tidal never got its d7 -> d6. The compaction wrote it, then Pulsar saved
the file from a buffer loaded before the compaction ran and put the old
declaration back. My "0 moves left" re-plan was taken BEFORE that save, so the
verification was true when it ran and false ten minutes later. Same shape as
the third-pass bug, from the other direction: a conformance check is a
measurement of a moment, and a moment with an editor open is not a state.
PLN has now closed Pulsar, so both plans report 0 moves across all 703 — and
this time nothing else is writing.

Second: the orphan-orbits HAND_MEASURED table had gone stale, which is exactly
what it is for. Five of its ten tracks moved d7 -> d6 (bombe_dj, wap,
piment_bresilien, mafia_sans_serif, the_revolution_will_be_sampled); the other
five already declared both, so compaction had nothing to close and they are
unchanged — which is a check on the tool, not a coincidence. Re-measured with
`grep -hoE '^d[0-9]+' | sort -nu`, deliberately NOT with orbits_of(), because
the block's own docstring warns that a hand measurement quoting the thing it
checks is a tautology.

And the original ear report changed orbits without changing meaning. PLN heard
crimewave survive vague_de_crime -> bombe_dj; bombe_dj now declares d6, which
COVERS the orbit he heard and exposes the one below it. vague_de_crime runs
crimewave on both d6 and d7, so the sound is the same and only the carrier
moved. The test now asserts {7} and says why — the ghost is a property of the
PAIR, which is the whole thesis of the tool.

Suites: 456 passed, 2 failed, both pre-existing and unrelated (the fold-orbits
tidal-parser ratchet, and test_gearbox's dash fallback from 6fb0f98d).
parent c6acc450
......@@ -52,9 +52,9 @@ d5 $ gF3 $ gM3 -- WAP HOES v1 science of repeat
# room 0
# sz 0
# gain 1.4
d7 $ gF1 $ gM3 --Les WAP DRUMS
$ midiOff "^59" (mask "t(4,8,1)" . chop 8)
$ midiOn "^91" (ply "2 <2 4>")
d6 $ gF1 $ gM3 --Les WAP DRUMS
$ midiOff "^58" (mask "t(4,8,1)" . chop 8)
$ midiOn "^90" (ply "2 <2 4>")
$ loopAt 2 $ chop 8
$ "wap" # n "<3!4 4!4 5!4 6!4>"
# cut 7
......
......@@ -214,24 +214,32 @@ HAND_MEASURED = {
# mafia_sans_serif and desire among them. The 07-28 fixture predates that
# commit and was missing d10 on all five; re-measured against the file as
# it stands now.
"bombe_dj": {1, 2, 3, 4, 5, 7, 8, 9, 10},
"wap": {1, 2, 3, 4, 5, 7, 8, 9, 10},
# RE-MEASURED 2026-09-22 after tools/compact-orbits.py closed the d6 gap
# corpus-wide ("no d7 when d6 is free"). Measured the way this block demands
# — `grep -hoE '^d[0-9]+' <file> | sort -nu`, which is not what orbits_of()
# does — so it is still an independent count and not the parser quoting
# itself. Five tracks here moved d7 -> d6: bombe_dj, wap, piment_bresilien,
# mafia_sans_serif, the_revolution_will_be_sampled. The other five declared
# both d6 and d7 already, so compaction had nothing to close and they are
# unchanged, which is itself a check on the tool.
"bombe_dj": {1, 2, 3, 4, 5, 6, 8, 9, 10},
"wap": {1, 2, 3, 4, 5, 6, 8, 9, 10},
# piment_bresilien is the ONE track in this set that moved its riser the
# other way: PLN asked (2026-08-02, commits 71bb9bc/5e5a37a) to move d10 to
# d9 ("eg a synmenace iirc") rather than adopt the new d10 idiom — the file
# carries a `-- Menace` comment on d9 confirming it. So this one loses d10,
# not gains it.
"piment_bresilien": {1, 2, 3, 4, 5, 7, 8, 9},
"piment_bresilien": {1, 2, 3, 4, 5, 6, 8, 9},
"perfect": {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12},
"gimme_acid": {1, 2, 3, 4, 5, 8, 9, 10, 11, 12},
"vague_de_crime": {1, 2, 3, 4, 5, 6, 7, 8, 10},
"mafia_sans_serif": {1, 2, 3, 4, 5, 7, 8, 10},
"mafia_sans_serif": {1, 2, 3, 4, 5, 6, 8, 10},
# d7 became d6 on 2026-07-30 (PLN's edit, committed in ce887b7: the Guitar
# Sunshine block moved down a slot with ^91->^90 and ^59->^58, the same
# consolidation he made in do_it_right).
"you_my_sunshine": {1, 2, 3, 4, 5, 6, 8, 9, 10, 11},
"desire": {1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
"the_revolution_will_be_sampled": {1, 2, 3, 4, 5, 7, 8, 9, 10, 11, 12},
"the_revolution_will_be_sampled": {1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12},
}
......@@ -243,12 +251,17 @@ def test_the_parser_agrees_with_the_hand_measurement(stem, want):
def test_the_ear_report_reproduces_vague_de_crime_to_bombe_dj():
"""The ORIGINAL bug report, as a test. PLN heard the crimewave synth survive
into the next track; the mechanism says d6 is the survivor.
into the next track, and the mechanism still names it — on d7 now, not d6.
d10 was a second survivor when this was first written, but commit 2376e43
(2026-08-01) gave bombe_dj its own d10 safe riser — both tracks now declare
d10, so it stopped being a ghost. Only d6 (crimewave) still orphans."""
assert oo.orphans(oo.resolve("vague_de_crime"), oo.resolve("bombe_dj")) == {6}
(2026-08-01) gave bombe_dj its own d10 safe riser, so it stopped being a
ghost. Then the 2026-09-22 orbit compaction gave bombe_dj a d6 (its d7 moved
down), which COVERS the orbit PLN originally heard and exposes the one below
it. vague_de_crime runs crimewave on BOTH d6 and d7, so the sound he
reported is unchanged; only which orbit carries it past the transition
moved. That is the point of the tool: the ghost is a property of the PAIR,
not of a track."""
assert oo.orphans(oo.resolve("vague_de_crime"), oo.resolve("bombe_dj")) == {7}
def test_d6_of_vague_de_crime_really_is_the_crimewave_sound_he_heard():
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment