Commit caac31cb by PLN (Algolia)

docs(morning): Saturday brief — the gate is GO, and #112's number was the tool's fault

Leads with 'nothing needs your hands', because the previous two mornings led
with a fader he had to raise and that framing sets the whole read. Then the two
things that shipped, then the one finding that changes something he was already
told: #112's '14 tracks do not compile' was a harness artifact, and the harness
was calling his own dominant writing style a parse error.

Deliberately does NOT quote a corpus-wide count. The clean re-run was still
going; the number lands on the task instead. Quoting an unmeasured figure is
exactly how #112 got a wrong one.
parent ee7b8b8c
# ☕ Morning, 2026-07-30 # ☕ Morning, 2026-08-01 — Saturday
Supersedes yesterday's file. Branch `claude/preload-eager-banks`, nothing pushed. Supersedes yesterday's file. Branch `master`, nothing pushed.
Ordered by urgency, not effort.
> **Small thing that affects your planning:** yesterday's file said "OPAL Day-5", You said you'd check coherence this morning. That report is unchanged and
> today you framed it "J-7". There is no OPAL 2026 entry in waiting: **`docs/2026-07-31-set-coherence.md`**. Everything below is new.
> `Web/www/content/lives/2026/` yet, so I can't resolve it and I'm not going to
> guess a countdown. Worth pinning down — and worth adding to the site content,
> since that's the canonical place for gig metadata.
--- ---
## ⚠️ 0. THIRTY SECONDS, DO THIS FIRST ## Nothing needs your hands right now
**Ardour's SAVED session has 3 orbits at -inf dB:** `Tidal 06`, `Tidal 10`, `Tidal 12`. No rig interaction overnight: no sound, no MIDI, no systemd, and **not one
`.tidal` in the setlist was written to**. Your Pulsar buffers are exactly where
you left them — Ctrl-S whenever you like, nothing of mine can be clobbered by it.
Your LIVE faders are probably fine — you've been playing. That *is* the bug: the fix The one thing worth doing when you sit down:
isn't persisted, so it dies with the process and a relaunch at the venue restores the
broken mix.
I cross-referenced those three against the orbits each setlist track declares:
``` ```
do_it_right d6 d10 d12 perfect d6 d10 d12 tools/gig-up.sh
take_5_drops d10 d12 gimme_acid d10 d12
the_revolution d10 d12 vague_de_crime d6 d10
piment_bresilien d10 you_my_sunshine d6
desire d6
``` ```
**9 of your 13 tracks would lose at least one orbit on a relaunch.** That's new. It's the whole chain in one green/red, and it was **GO** when I
stopped.
1. Ardour → check Tidal 06 / 10 / 12 faders, raise any that are down
2. **Ctrl+S** ← this is the entire fix
3. `python3 tools/check-mix.py` → expect no `-inf`
Not touched by me: the D-row faders are MIDI-learned to CC 77-84, so writing from
outside desyncs them from the physical desk; CC77 down is total silence; and mix levels
are your musical intent. Writing to a live session while you're out isn't my call. (#62)
--- ---
## 🔴 1. BEFORE YOU OPEN ANY TRACK IN PULSAR — reload from disk ## What shipped
**I changed 213 `.tidal` files on disk.** Pulsar saves the **BUFFER**, not the file. ### `tools/gig-up.sh` — one command, one exit code (#44, done)
Anything you had open now has a stale buffer, and your next Ctrl-S in that tab
**silently reverts the migration in that file**.
`Window: Reload` before evaluating anything. (This is exactly why #95 exists.) The keystone, off the board. It contains **no new checking logic at all** — it's
a running order over the checks you already have (check-boot, check-mix,
--- silent-eval, fix-mute-roles, pvlint, orphan-orbits) plus a decision about which
failures actually stop a gig.
## 2. The gM refactor is DONE — corpus-wide, not just the set Hard-fail: boot helpers, Ardour faders, setlist compiles, mute map, pvlint.
Advisory: transition ghosts (#77 is known-open — a gate that goes red for work
you've consciously deferred is a gate you start ignoring) and LCXL-present
(legitimately unplugged at a kitchen table; at the venue it means the set has no
hands).
Your map, now authored in `tools/lcxl_grid.py` with your words above it: Cold by default: makes no sound, sends no MIDI, writes no file, safe mid-set.
`--audio` adds the boot-every-track gate, and skips itself if the cold gate is
already red — booting 13 tracks to confirm what a typecheck just told you is ten
wasted minutes at a venue.
| mutes | F1 / gM1 | F2 / gM2 | F3 / gM3 | **It found two bugs on its first run**, both the same shape, and it's this rig's
|---|---|---|---| signature failure — *a thing verified once, in a context that no longer holds*:
| | **d1 alone** (the kick) | other percs (d2 d3 d8) | bass + melodics (d4–d12) |
| DJF | C1 / gF1 | C2 / gF2 | C3 / gF3 | 1. `check-boot.sh` and `check-tracks.sh` were **mode 644 — not executable**. The
|---|---|---|---| pre-gig audio gate has never once been runnable as `tools/check-tracks.sh`
| | all percs | bass only | melodies | since it was written. It only ever ran when someone typed `zsh tools/…`.
2. `pvlint --setlist` is a *modifier*, not a mode — it still needs paths. Run
bare it exits 2 on an argparse error, which from outside looks exactly like a
lint failure.
**917 lines across 213 files.** The bulk was *not* the kick — it was **505 perc lines ### `docs/GIG-CHEATSHEET.md` — the surface card (#16, the 80/20)
vacating gM1** so the kick could have it. Plus **7 orbits in the set that had no mute at
all** got one (your "no mute is oversight").
### One thing I had wrong, and you should know Generated from `tools/lcxl_grid.py` + the setlist, not hand-written, so it can't
drift from the rig. Regenerate with `python3 tools/cheat-sheet.py --md`.
#105 was written as "align gM to gF" — mirror the mute index onto the filter index. I Emergency box first, deliberately: the moment you reach for this page is the
measured 35 mismatches under that rule and was ready to ship it. **The rule was wrong.** moment something is wrong, and a card that opens with a reference table makes you
Your answer showed filters and mutes group *differently on purpose*. Under your real map read past your own panic. Then the gF/gM asymmetry, the CC grid, the set table.
it's 55 edits in the set, and `d4: gF2+gM3` — which the mirror rule called broken in 11
tracks — is **correct**. Shipping the "alignment" would have moved 11 good lines and left
the kick sharing a button with the hats.
### How it was verified (you asked me to be careful) One column on it is worth seeing even if you never print the card — **ghost
risk**, the orbits each track does *not* declare, i.e. the ones that keep playing
whatever the previous track left there:
- **Convergence** — migrator run twice; second pass proposes 0 changes ```
- **Structural proof** — all 917 changed lines diffed against HEAD: 908 provably 1 bombe_dj 6,10,11,12 unowned
mute-token-only, the other 9 individually listed and accounted for. Nothing else moved. 6 perfect declares all 12 — the only track that cannot inherit a ghost
- **`silent-eval --seeded`: 13/13 ok** — whole setlist builds cold, before and after 13 electric_hammer 6,7,8,10,12 unowned
- **222 tests pass** (was 213 passed / 1 failed when I started) ```
- **Full before/after `silent-eval` over all 213 files** — see the commit for the result
**THE HONEST LIMIT, and it's the important part:** every button CC seeds to 0 at boot and
`gMute<N>` is `midiOn "^7N" (mask "f*16")`, so all three mutes are equally inert until
pressed. **None of the above proves anything about behaviour under a press** — the only
thing this change actually alters. That needs your fingers, two minutes on any track:
> **F1 → only the kick drops. F2 → percs drop, kick keeps playing. F3 → bass + melody drop.**
If you hate it: `git revert 27c1581`, one commit, all 917 lines. That's #77's problem list, per track, at a glance.
--- ---
## 3. 🎧 you_my_sunshine — your "FIXME VOICE OFF" is fixed, confirm by ear ## The one that changes a number you were given
d5 (the voice) and d11 (`no_sunshine:4/4` chopped) were **both on `# cut 5`**. Cut groups **#112 said "14 corpus tracks do not compile." That number was wrong, and so was
are monophonic, so every d11 event killed the vocal mid-word. That was also the root cause the tool that produced it.** Three bugs in `silent-eval.py`:
of your `-- FIXME VOICE OFF` on d5 — **one bug wearing two labels.**
d11 → `# cut 11` (group N = orbit N, as d3/d6/d8/d9 already do). Found by pvlint PV004. If **1. It called your own writing style a parse error.** You write much of the
the vocal was *meant* to be monophonic across both layers, put it back to 5 — the comment corpus as
says so, and it's the only line that changed. (#70)
---
## 4. 🤔 gimme_acid `/!\ FIXME EXPLOSIF /!\` — diagnosed, NOT fixed, your call
```haskell ```haskell
# width (range 0.2 0.8 "^33") d1
$ whenmod 128 129 ()
$ s "<k k*2 <k*2 k> k>"
``` ```
`^33` is an A/B knob → BootTidal's #55 seed gives it **0** → this sits at **width 0.2 at Pulsar wraps blocks in GHCi's `:{ … :}`, which suspends the layout rule, so that
boot**. Your own preset comment two lines above says nominal is **width = 0.51**. So the column-0 `$` is a continuation and the track plays fine. The harness emits into a
synth starts at an extreme and the knob swings it *through* nominal rather than away. real *module*, where a column-0 `$` opens a new top-level declaration — a hard
parse error. It then printed, in these words: *"THE TRACK DOES NOT COMPILE — it
Same shape BootTidal already documents for piment_bresilien's `legato (range 0.05 2 "^52")`, will fail live too"*, about code that has never once failed live.
whose stated remedy is *fix the range in the track*.
Candidate: `range 0.51 0.8 "^33"` → boots at nominal, knob only adds. Costs the 0.2–0.51 Zero of your 13 setlist tracks use that style. That is exactly why it survived:
downward half. **That's a sound decision, so I wrote the analysis into the file and left the harness was green on everything it was ever pointed at.
the sound alone.**
Also removed a duplicated `# filterRange (range 0 8 "^53")` right below it — same value **2. A crashed probe was reported as silence.** Any non-zero exit was labelled
twice, harmless, clearly a paste. SILENT and stderr was discarded — which is where the self-contradicting
`FAIL — 0 orbit(s) SILENT` came from. It now reports CRASH and keeps the error.
That paid for itself immediately, in `live/chill/dub.tidal`:
--- ```
Syntax error in sequence:
"<0.75 .. 0.8 0.8 .. 0.65>"
^
```
## 5. 📋 The non-set missing-mute report A real mini-notation bug, precisely located, that **would** fail live — the
scheduler queries every cycle. It had been hiding behind a message saying zero
orbits were silent.
`docs/2026-07-30-orbits-without-a-mute.md` — you said flag, don't fix, outside the set. **3. A latent false green.** Fixing (2) exposed that the exit code was keyed to
2397 blocks, split into the cut that makes it actionable: the silence count alone, so a corpus where *every* track failed to compile would
have printed "OK — every declared orbit emits events" and exited 0. The exit code
now answers "is anything wrong".
| | files | blocks | | Seven regression tests, mutation-checked — each fix reverted individually to
|---|---|---|---| prove the test actually fails without it. Full suite **229 passed**. The setlist
| **A · partial** | 110 | 321 | uses family mutes but missed some — **the oversight you meant** | stayed **13/13 green** throughout; none of this touched the gig path.
| **B · never** | 354 | 2076 | no orbit has one; predates the convention — a style era, not a mistake |
Group A is the real list. Fix any one file with A clean corpus-wide re-run was still going when I wrote this. The real count
`python3 tools/fix-mute-roles.py --fill --apply <path>`. lands on **#112** rather than being guessed here — quoting an unmeasured number
is how #112 got a wrong one in the first place.
--- ---
## 6. New guardrails, so none of this re-drifts ## Still yours, and the clock on it
- **PV012** — flags an orbit whose mute doesn't match its **role**. Deliberately *not* The KRKs stay home. **Sunday afternoon is when "can I judge this at volume"
"gM index ≠ gF index", with a regression test asserting `d2 $ gF1 $ gM2` is clean. expires** — not Saturday the 8th. Anything needing your ears on speakers wants to
- **PV013** — flags an orbit with **no** family mute. happen in the next ~30 hours:
- `fix-mute-roles.py --check` exits 1 on drift — worth wiring into the pre-gig gate (#44).
**PV013 caught a bug in the migrator that wrote it**, minutes after existing: the migrator - **the coherence report** — 108 idle slots, three systematic patterns, and the
had its own orbit regex requiring `^dN $` and walked straight past note that your two named wants (bass `octersub`, lead `slice`) sit *outside*
`d5 -- The Voice of Love` (no `$`, gates on a commented line). It now uses pvlint's parser your own measured idiom rather than correcting drift in it
and owns none of its own. That miss had hidden 14 rewrites and 7 missing mutes. - **#33 risers**, **#13 transitions**, **#12 the running order**
--- Not ears-bound, so it keeps: #110 the safety recording (the tent, Wednesday),
#16's remaining logistics, #74 pv-at.
## 7. Waiting on you — carried over, not urgent today **And still: 271 commits exist only on this laptop.** You fly Monday. Pushing is
the only off-machine copy of the gig state.
- **#12 the BPM arc**`124, 133, 89, 124, 124, 128, 160, 120, 160, 166, 129` has two big
drops (160→120→160). Your taste call, and it blocks #13 and #14.
- **#31 desire's bass** — four alternatives in `study/desire_bass_rhythm.tidal`, measured
to genuinely differ (3.0 / 4.0 / 4.5 / 5.75 onsets per bar). A/B them.
- **#86** — the 2-minute remap rollback drill, next time Ardour is closed.
- **take-94 mix v2**`mix/take94/take94_trimmed_v2.wav`, with the clamp+fade you asked
for. 18.75 min, peak -3.36 dBFS, all 5 silence gaps handled including your +18:00 one.
- **#110 USB safety take** — you said the fallback is the point but the reference take is
valuable too, so: both from one run. The mastered one is blocked on **#91** (record bus
~16 dB hot, 8 of 12 orbits over 0 dBFS — a fallback that clips isn't a fallback).
## 8. Found but couldn't act on
- **#112 — 14 corpus tracks don't compile at all.** Pre-existing, **none in the setlist**,
found while baselining the migration. Same class as desire's `plz` typo.
- **#56 xruns** — needs a gig-log session to analyse and I found none on disk. Your next
full run-through produces one.
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