Commit af868ccd by PLN (Algolia)

docs(tasks): archive #70/#105/#108/#109 — the invariant that was a hypothesis

parent 91b8b958
...@@ -1153,3 +1153,116 @@ design (D minor, measured corr=0.903) held constant throughout. ...@@ -1153,3 +1153,116 @@ design (D minor, measured corr=0.903) held constant throughout.
**Deps.** Depends on nothing. Surfaced #108 as an unrelated finding (desire.tidal **Deps.** Depends on nothing. Surfaced #108 as an unrelated finding (desire.tidal
doesn't currently compile at all — a one-character typo, not a rhythm issue). doesn't currently compile at all — a one-character typo, not a rhythm issue).
## #108 — GIG BLOCKER: desire.tidal does not compile
**Description.** `live/collab/raph/desire.tidal:46` carried `# pan 0.42plz /se` — a
committed typo, not a working-tree accident. The file has no blank lines, so Pulsar
treats it as ONE do-block: that single stray word killed every orbit in a Finale-slot
setlist track, six days out from OPAL.
**Done.** Fixed by PLN in his own buffer; verified 2026-07-30 (`grep plz` → 0 matches)
and committed as part of ce887b7. `silent-eval --seeded` now reports **13/13 ok** — the
first time the entire OPAL setlist has built cold.
**Learnings.** The bug was invisible for as long as it was because silent-eval printed
every build failure as `BUILD FAILED — harness limit, NOT a track verdict`, a *constant
string*. It was right about that twice (two genuine harness bugs) and catastrophically
wrong the third time, telling the reader in reassuring words to ignore a broken setlist
track. Fixed by computing the verdict from which line GHC pointed at rather than
asserting it. **Any "don't worry, this is our fault not yours" message a tool prints
must be reached by evidence** — the dangerous side to be wrong on is the side that says
"ignore this", because that is the side nobody re-checks.
**Deps.** Found by #93's harness repair. Unblocked nothing formally; it was simply the
difference between a set that plays and one that doesn't.
## #70 — you_my_sunshine: d5 and d11 share cut group 5
**Description.** pvlint PV004 flagged, on its first real run (2026-07-28), that d5 (the
vocal) and d11 (`no_sunshine:4/4` chopped) both carried `# cut 5`. Cut groups are
monophonic, so each d11 event killed the vocal mid-word.
**Done.** 2026-07-30, commit 27c1581 — d11 → `# cut 11`, following the
group-N-equals-orbit-N convention d3/d6/d8/d9 already used in that same file. Left
reversible in one edit, with the reason in a comment, because "both vocal layers are
deliberately monophonic" was a legitimate arrangement PLN could have wanted.
**Learnings.** The find worth keeping is not the fix but the *correspondence*: d5's line
59 carried PLN's own `-- FIXME VOICE OFF`. **Same bug, two labels** — one filed by a
linter, one written by ear, months apart, neither connected to the other until both were
read side by side. They did not look like duplicates in a task list because **the ear
names the SYMPTOM and the linter names the MECHANISM.** Generalisable: when a lint
finding and a human FIXME live in the same file, check whether they are one defect before
treating them as two items.
**Deps.** Found by pvlint (#100's rule set). Closed one of #111's Group-C markers as a
side effect.
## #105 — Align the gM family: mutes by ROLE, filters by BLOC
**Description.** The corpus treated `gM<N>` as a mirror of `gF<N>` — a legacy of gM once
being `gMask . gMute<N>` before gMask was retired. PLN wanted the kick mutable on its own
button.
**Done.** 2026-07-30, commits 72943be (tooling) + 27c1581 (corpus). **917 lines across
213 files**, corpus-wide rather than setlist-only at PLN's correction (*"not only in the
set am i right?"*), plus 7 setlist orbits that had NO mute given one (*"no mute is
oversight!"*). Map authored once in `tools/lcxl_grid.py` (`_FILTER_FAMILY` /
`_MUTE_FAMILY`), migrator `tools/fix-mute-roles.py`, guarded by new pvlint PV012/PV013.
Non-set missing mutes reported, not written: `docs/2026-07-30-orbits-without-a-mute.md`.
**Learnings.** Three, and the first is the expensive one.
1. **The task's own stated invariant was wrong.** It was framed as "align gM index to gF
index". I measured 35 set mismatches against that rule, rigorously, and was ready to
migrate. PLN's actual map groups filters and mutes DIFFERENTLY on purpose — you sweep
the drums as a bloc but drop the kick alone — so the real edit count is 55, and
`d4: gF2+gM3`, which the mirror rule called broken in 11 of 13 tracks, is CORRECT.
Shipping it would have moved 11 good lines and left the kick sharing a button with the
hats: the exact complaint that reopened the task. **A stated invariant is a hypothesis
about intent, and a rigorous measurement against the wrong invariant produces a
confident number answering the wrong question.**
2. **The linter audited the migrator, immediately.** PV013 was written to prevent future
drift; its first catch was the migration in progress. `fix-mute-roles.py` had its own
orbit regex requiring `^dN $` and had walked straight past `d5 -- The Voice of Love`
(no `$`, gates on a commented continuation). It now imports pvlint's parser. The miss
had hidden 14 rewrites and 7 missing mutes — **under-application, not corruption,
while every check read green**: convergence said 0 remaining, silent-eval said 13/13,
222 tests passed. Verifying the output cannot catch a tool that can't see part of its
input; only a second independent parser can.
3. **The verification that actually answered PLN's "ensure all tracks playable".** Not
spot-checks: (a) convergence — run twice, second pass proposes 0; (b) a structural
proof diffing all 917 changed lines against HEAD and asserting both sides are
identical once mute tokens and whitespace are stripped — 908 provably token-only, the
other 9 individually enumerated and accounted for; (c) `silent-eval --seeded` over all
213 touched files on a pre-migration worktree AND the migrated tree, **verdict lists
byte-identical**. That last one is the real answer, and it cost ~10 minutes of
unattended compute.
It also surfaced #112 as a by-product: 14 corpus tracks that do not compile at all,
pre-existing, none in the setlist.
**HONEST LIMIT, recorded because a green check here misleads.** Every button CC seeds to
0 and `gMute<N>` is `midiOn "^7N" (mask "f*16")`, so all three mutes are equally inert
until pressed. None of the verification above says anything about behaviour UNDER a
press — the only thing this change alters. Left for PLN's fingers.
**Deps.** Closed #70 in the same diff. Feeds #44 (`--check` as a pre-gig gate). Related
to #54/#98, the same "the surface should be one sentence" thread.
## #109 — Stale orphan-orbits fixture (you_my_sunshine d7→d6)
**Description.** `tools/tests/test_orphan_orbits.py:201` expected d7; the parser said d6.
**Done.** 2026-07-30. Fixture corrected to `{1,2,3,4,5,6,8,9,11}`. Cause was PLN's
d7→d6 consolidation (with ^91→^90, ^59→^58), the same move he had made in do_it_right.
**Learnings.** Re-derived the set by reading the file's column-0 declarations and
checking for commented-out ones, NOT by pasting the parser's output. **A hand
measurement that quotes the thing it checks is a tautology** — the whole value of the
fixture is that it is an independent witness. Cheap to get wrong, and the wrongness is
invisible forever after.
**Deps.** Blocked nothing; it was the difference between a suite at 213/1-fail and a
clean baseline to migrate against, which is why it went first.
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