- 05 Sep, 2026 40 commits
-
-
Refreshes the resume state. The R1-R5 block from the first pre-compact is now partly stale — R2 closed (PLN raised the faders and saved; check-mix reports all 12 orbits reaching master), both R5 test items fixed, and the suffix question answered by evidence rather than taste. Three things landed after those resume points that a cold reader needs: pytest tools/tests/ had been running ZERO tests because one file's module-level sys.exit aborts collection, and behind that invisibility the OPAL setlist's first track was a soundcheck, so every tool reading it believed the set had 16 tracks opening on Quand on décolle. Both fixed; suite is 274 green in one command. Separated what is genuinely PLN's from what is merely undone, because that distinction is the whole value of this block. Four decisions block everything (--go on the 14, /desire specifically, CosmicFest tone, gig page as-performed vs as-released) plus one ears question about nine faders moving where four were broken. Four next moves need nobody, and the first is a 15-minute audit of whether anything consumed the phantom setlist positionally.
PLN (Algolia) authored -
Two bugs that were hiding each other, which is why both survived a month. test_setlist.py ended in a module-level sys.exit(), pytest raises that during collection, so 'pytest tools/tests/' aborted the whole directory and ran NOTHING while 273 tests passed file-by-file. And what that invisibility concealed was test_setlist's own failure, on a check whose name states the bug: OPAL's backlog opens with '## SOUNDCHECK / -- Quand on decolle', entries() took every item under the gig heading, and so every tool reading the setlist believed the set had 16 tracks opening on Quand on décolle. The recording has 15, opening on Ceci n'est pas Une Bombe. A test nobody can see failing is worse than a test that does not exist, because its name is a correct bug report that everyone reads as reassurance. Whole suite now runs in one command: 274 passed, 0 failed.
PLN (Algolia) authored -
Two bugs that were hiding each other, which is why both survived a month. THE SUITE RAN ZERO TESTS. test_setlist.py was a plain script ending in a bare module-level sys.exit(), and pytest raises that during COLLECTION — so 'pytest tools/tests/' aborted the whole directory with an INTERNALERROR and ran nothing, while 273 tests passed when invoked file-by-file. Every test in this repo was invisible to the obvious command. Guarded the exit under __main__ (the script still works run directly) and added one assertion so pytest actually sees the checks. Whole suite in one command now: 274 passed, 2 skipped, 0 failed. AND THE THING IT WAS HIDING: test_setlist had been failing all along, on a check whose name says exactly what is wrong — 'a deliberation note is not a track (the quand_on_decolle phantom)'. OPAL 2026's backlog section opens with ## SOUNDCHECK -- Quand on decolle and entries() takes every list item under the gig heading, so every one of the tools reading this setlist believed the set had 16 tracks opening on Quand on décolle. The recorded set has 15 and opens on Ceci n'est pas Une Bombe (segments_v3/v4 track 1). The parser now yields 15, in the right order. The fix is deliberately NOT the section whitelist entries() refuses to build — that one tried to enumerate which of PLN's prose headings are part of the set and died on '## Livecoding Techno DNB Nu-jazz'. This is the inverse and far narrower: naming the one phase that is definitionally not a performance. Three patterns, and skips print to stderr, because a dropped track and a skipped soundcheck must never look alike. Fixed the parser, never backlog.md — the backlog is PLN's own file and it was right. A soundcheck IS in his set list; it just isn't in his set. Verified by breaking it: neutered _NOT_THE_SET_RE, watched test_backlog_setlist_checks_all_pass fail naming the quand_on_decolle phantom, restored, 274 green. the first track was never the first track. sixteen tools agreed with each other and none of them agreed with the recording.PLN (Algolia) authored -
Both were pre-existing, unrelated to today's check-mix.py/gig-log.py work (spotted while running the suite for that change). test_orphan_orbits.py: 9 of 41 tests failed (16-row setlist vs a frozen "13", and 6 HAND_MEASURED orbit sets vs the parser). Root cause confirmed by git log + grep, not a parser bug: the setlist grew from 13 to 16 tracks since the fixture was written, and commit 2376e431 (2026-08-01, "d10 is the riser") added a d10 safe-riser idiom to 5 of the hand-measured tracks (bombe_dj, wap, you_my_sunshine, mafia_sans_serif, desire) after the 2026-07-28 hand measurement date; piment_bresilien went the other way (d10->d9, PLN's own request, commit 71bb9bc2/5e5a37ad). Fix: the setlist-length assertions are now derived from an independent sed-based row count of the setlist file (same pipeline check-tracks.sh uses) instead of a literal that rots every time PLN adds a track; the HAND_MEASURED dict and the vague_de_crime->bombe_dj orphan assertion are re-measured by hand (grep on each file's dN lines, not by copying the parser's own output) against the corpus as it stands today. No assertion loosened — 41/41 pass, same invariants, current facts. test_lcxl3_display.py: pytest collected 0 items. Cause: this was written as a plain script (module-level `check()` calls, run via `python3 tools/tests/test_lcxl3_display.py`), like test_setlist.py, with no `test_*` function pytest could find — a file that cannot fail under pytest, i.e. silent coverage loss. Converted to 30 ordinary pytest test_* functions (one assert group per logical check), same assertions, nothing dropped or loosened. Verified live: broke rec_line's hour rollover (divmod 3600->3601) and watched test_rec_line_formats_hmmss_past_an_hour fail with the exact wrong value (REC 1:02:02 vs 1:02:03), then reverted. Suite: 234 passed/9 failed/2 skipped -> 273 passed/2 skipped (ignoring test_setlist.py, a separate plain-script file, out of scope here — it already breaks whole-directory pytest collection via a module-level sys.exit and predates this fix). test_gig_log.py untouched: 169 passed before and after.
PLN (Algolia) authored -
Ran the new generation lens proactively against Cosmic26_master, before that release goes anywhere: 12 OK, zero stale, zero strays. The exact opposite of OPAL, for two reasons that are lessons rather than luck — only one render generation exists on disk, and every permalink is gig-scoped via --permalink-suffix, so no CosmicFest upload could collide with the OPAL cut of the same score. Four of these titles exist at both gigs. That answers an open board decision with evidence instead of taste. It asked whether to keep OPAL unsuffixed for consistency; the suffixed release has 0 permalink pathologies and the unsuffixed one has 14. Consistency with a broken scheme is not a virtue, so new OPAL uploads get suffixed. The 6 correct unsuffixed tracks stay — they are right, and renaming spends a permalink for nothing. Found in passing: CosmicFest is missing exactly 2 tracks, and they are almost certainly the two already-known vanishers that logged '✓ live at', passed an API check, then 404'd. A plain idempotent re-run converges. Which is the standing lesson landing on its feet: verify the shelf AFTER a run, not only during it — 'N uploaded, 0 failed' was never evidence that N tracks exist, and it took a lens three weeks later to notice two were gone.
PLN (Algolia) authored -
check-mix reports OK, all 12 orbits reach master. Third recurrence of the saved--inf bug, closed by PLN's hands. Two things fell out of verifying it. check-mix resolves the saved session with Ardour CLOSED — it reads the file, not the process, so the fader check can run in a pre-gig script before anything is launched. And the diff is bigger than the fix: orbits 02-06 were in a coherent -8 to -10 dB trim set and are now all near unity, so nine faders moved where four were broken. Master is still -0.2 so nothing clips, but the balance between orbits shifted ~9 dB on five of them. Recorded as a QUESTION, not a finding. The LCXL3's faders are absolute-position controls and touching one snaps the DAW value to the pot — which also means the board's 'v3 retires pot-pickup' claim covers the endless ENCODERS only; the eight faders are still absolute and that whole class survives the upgrade. But PLN may simply have dragged them on purpose, and a cause nobody asked about is not a cause.
PLN (Algolia) authored -
TASKS_DUMP has accreted amendments since 2026-08-16 and the oldest sections are now the least true — but a reader arrives at the top, where A3 still says /take-five-drops uploaded '24s short', that every other track 'matched to the second', that 8 of 15 are up, and that no artwork exists. All four are wrong, and the first two are the exact reasoning that let six stale uploads pass a duration check in August. So: a READ THIS FIRST banner naming what is superseded and sending the reader to the resume points at the end, plus an inline stop sign at A3's 'TWO DEFECTS' where someone reading that epic top-down actually hits it. The wrong diagnosis is kept rather than deleted, because the reasoning being auditable is the point — it just no longer gets to be the first thing anyone reads. A board whose front page is a year of stale confidence is worse than no board. Nobody rewrites 1700 lines; they act on line 90.
PLN (Algolia) authored -
Structured archive entry for the session, written as standalone learning rather than a board line. Fourteen findings, of which the four that will outlive the task: SoundCloud accumulates generations and never replaces (so a stale upload is permanent until deleted); the wrong cut wore the cover art, which is why PLN's ear beat every tool to it; the 'matches to the second' tolerance was the bug, because full_duration is millisecond-exact and a loose window made two different cuts identical; and roll call cannot find a stray, because a check that only looks where it expects a thing never discovers it elsewhere. Written for a reader months out with no memory of any of it.
PLN (Algolia) authored -
Captain's log 040 and the pre-compact resume state. The log's finding, in one line: OPAL-26 sounded broken on SoundCloud while every rendered file was correct to the millisecond, because SoundCloud will not replace audio behind a permalink and our uploader is idempotent — so every re-upload under a fresh slug ADDED a copy. The whole Aug-12 first cut was still up beside the six correct v4 ones. And the tell PLN was actually reacting to: eight of the fourteen stale uploads wear cover art and not one of the correct six does. The superseded audio looked finished. His ear was reading the artwork. Two lens lessons in it, both recurring. 'Matches to the second' was a tolerance, not a verdict — SoundCloud reproduces full_duration to the MILLISECOND, so at the ±1.5s a transcode seems to deserve, the Aug-12 and v4 cuts of /wap are the same track, which is how six stale uploads passed a duration check in August. And roll call cannot find a stray, because a check that only looks where it expects a thing can never find that thing somewhere else. Plus the git one, which cost four commits: this is a shared checkout, another session moved HEAD between two of my commits, and 'git push origin master' from a non-master HEAD is a silent no-op that exits 0. The PUSHED in my own log was something I wrote myself. The board now carries R1-R5 written for a reader with zero context: exact commands with paths, the artifacts already on disk so nothing is regenerated, the three decisions that are PLN's and not a machine's, and the shared-checkout hazard spelled out before anyone commits into it again.
PLN (Algolia) authored -
The argv-only bug is fixed by extracting the 3-rung ladder into tools/ardour_session.py, imported by both gig-log and check-mix. gig-log's 'keep check-mix in sync' comment is gone because there is nothing left to keep in sync — one parser per concept satisfied by construction rather than by somebody remembering. 169 gig-log tests pass unchanged. Then it ran for real and reported Tidal 07, 08, 10 and 12 at -inf dB in the saved session. Third recurrence of that bug (04-08+12, then 02+10, now these four). PLN's parked two-minute check went from unrunnable straight to failing, which is the whole argument for wiring a check into a caller: it gets run under conditions the unit test never sees. Also logged: two pre-existing test failures the suite run made visible (test_orphan_orbits 16 rows vs 13 expected; test_lcxl3_display collects zero tests, and a test file that cannot fail is not a passing test), and the uncommitted duplicates left sitting on claude/rig-streamline so whoever rebases it does not double-apply them. the fader was down in the file, not in the room. nobody could hear the difference because a closed fader and a silent instrument look identical on a post-fader meter.PLN (Algolia) authored -
check-mix.py resolved the live session from argv only, so any Ardour launched from the GUI's recent-sessions list (bare argv) went unresolved and check-mix silently fell back to a guessed path. gig-log.py's FilesLens already solved this with a 3-rung evidence ladder (argv > cwd > open fds, commit abad7515) and had a sync comment flagging check-mix as needing it. Extracted the ladder into tools/ardour_session.py — one resolver instead of two, per feedback_one_parser_per_concept — and made both gig-log.py and check-mix.py import it. gig-log's FilesLens keeps its instance-level caching/logging but delegates all evidence-gathering to the shared module; the now-unnecessary "keep in sync" comment is gone. Verified: gig-log's 169 pytest tests still pass unchanged (they exercise all 3 rungs against synthetic /proc fixtures). Live: Ardour was running ("Tidal Live" session, launched with argv), so check-mix.py resolved it for real and reported per-orbit gains — surfacing the same recurring bug this fix was meant to catch: Tidal 07/08/10/12 sit at -inf dB in the currently SAVED session. Rungs 2 (cwd) and 3 (open-fds) were proven against synthetic fixtures matching the live-rig gap, since the running process's argv already carried the session path.
PLN (Algolia) authored -
master sc delete --manifest exists: dry-run by default, identity verified in BOTH directions (a permalink that now resolves to a different sc_id is a refusal, not a warning), public tracks refused, a reason required per entry because a deletion without provenance is not allowed, batch capped before any API call, and a receipt that keeps every field plus the on-disk paths of the archived artwork and the source FLAC. The old test-namespace gate was not widened — a second gate was added beside it, and a test proves the old one is unreachable from the new path. Dry run: 14 deletable, 0 refused. All private, all uploaded in the same minute on 2026-08-12, and every one still has its FLAC in Opal26_master/tracks/, so deleting them loses a URL and not a recording. --go is NOT approved yet. Two caveats recorded loudly rather than buried. The delete TRANSPORT is unproven: no DELETE has ever been issued from this codebase against api-v2, and a clean dry run is not evidence the deletes will land. And the generator's first version lined stale uploads against the newest cut BY TRACK NUMBER — dropping Desire renumbered REVOLUTION from 15 to 14, so the manifest confidently compared Desire against REVOLUTION's duration. An unnamed reference, again. Also logged: four of my own commits landed on a concurrent session's branch because the shared checkout moved under me, and 'git push origin master' from a non-master HEAD is a silent no-op that exits 0. Recovered via worktree cherry-pick without touching their branch or the live tree. The worktree rule in CLAUDE.md has no orchestrator exemption, which is what I had assumed. two sessions, one working tree, and a push that said yes to a question it had never actually been asked.PLN (Algolia) authored -
The regen moved timecodes by up to 21s (Piment +21.0, REVOLUTION +19.0, Gimme Acid +16.7). That file is not just website furniture — Slopmotion cuts visuals to it, so the release videos were pointed a third of a minute off the music on a third of the record. The more interesting finding is a parser conflict the regen walked into. build_gig_tracksjson.py drafts NEW gig pages and never computes the styleDistribution that LiveEvent.js renders; gig-metadata.py regenerates existing ones and does. They also disagree outright on REVOLUTION's style (jazz vs nujazz). Two parsers, one concept — so the board's line that build_gig_tracksjson 'is now the way to make any gig page' is too strong and is corrected here rather than left to bite the next regen. Left explicitly to PLN: whether the OPAL page documents the set as PERFORMED (15 tracks, Desire included) or as RELEASED (14). Desire has no v4 boundary because it was cut, so its v3 timecode rides through unverified. A page can honestly be either thing; only he knows which one he wants a visitor to get.
PLN (Algolia) authored -
The first version of this amendment said one OPAL track on SoundCloud was stale. Then I read the account instead of reasoning about it, and it is fourteen: the entire Aug-12 first cut is up, thirteen of it under junk permalinks (/opal26-wap, /12-mafia-12, /ceci-nest-pas-une-bombe) that roll call could never have found, because roll call only looks where it expects a track to be. Same error the board made before me, one size smaller. The finding that explains PLN's ear exactly: eight of the fourteen stale uploads carry cover art and not one of the six correct v4 tracks does. The wrong cut is the one that looks finished. Also corrected: 'every other track matches to the second' was never a verdict, it was a tolerance. SoundCloud reproduces full_duration to the MILLISECOND, so at the ±1.5s a transcode seems to deserve, the Aug-12 and v4 cuts of /wap (361.0 vs 361.6) and /perfect (315.0 vs 314.6) are the same track. That is how six stale uploads passed a duration check in August. And two coincidences caught before they could become deletions: /saria-demo (2025) and /au-revoir-lord-toyota (2020) match OPAL to 50ms by chance on a 132-track account. Duration is a strong discriminator and still not provenance. the ones with the cover art were the wrong ones. six months of a set played once, and the tell was never in the sound -- it was in which of the twenty ghosts looked ready.PLN (Algolia) authored -
CLAUDE.md pointed at ../../Web/www/next/content/lives/, which has not existed since www hoisted the app out of next/ in 6e51fff. The correct path is ../../Web/www/content/lives/{year}/{slug}.md. This is a worse bug than a typo in docs. The instruction it sits inside is 'Mastering != metadata. Never invent gig metadata... Verify there and cite the path — if a fact isn't in the canonical source, ask.' A reader who follows the documented path gets a false 'not found' from the one source they were told to trust, and the honest next step from there — asking, or worse, filling the gap from an intermediate script — is exactly the failure the rule was written to prevent. A stale read is how a Write becomes a delete. The tide-table scripts already had it right (build_catalog_view.py's LIVES carries a comment naming the hoist commit); only the instruction was behind.PLN (Algolia) authored -
- process-palette.json wires the editor's command palette to the rig's own entrypoints (Init MIDI Channels -> init_midi.sh, and the rest). The whole 'one entrypoint, fewer files' goal is only real if the editor knows where the entrypoints are, so this is rig config, not editor preference. - sketch.properties points the Processing sketch at its main .pde. - Logo.xcf is the editable source of the ParVagues mark, from 2025-05. The armada design system is documented down to its type stack and its reserved brand magenta, and the one file you cannot regenerate from any of that is the layered original. 1.2 MB to never have to redraw it. Deliberately still untracked: TODO.md. It is a paused 2026-06-22 perf/thermal board, and TASKS_DUMP.md has been the board since 2026-08-16. Committing it would put a second answer to 'what is next' in the tree, which is the shape that keeps biting us. PLN's call: fold its two live items into TASKS_DUMP and delete it, or keep it as a scratch file outside git.
PLN (Algolia) authored -
`sc_generation_lens` already knows which OPAL-26 uploads are the Aug-12 first cut; nothing turned that verdict into something the new `sc delete --manifest` could execute. This does, and it is the last checkpoint before a destructive call, so it refuses rather than warns. In: verdicts starting STALE/ORPHAN (right permalink, wrong cut) plus every stray (an older cut under another slug). Out, and asserted out: verdict OK (that IS the ear-verified cut), NOT UPLOADED (nothing to delete), anything without an sc_id, and everything in `coincidences_discarded` — the lens finds strays by duration and on a 132-track account two unrelated tracks will share a length to 50 ms, which is how /au-revoir-lord-toyota (2020, and PUBLIC) and /saria-demo (2025) both matched an OPAL render. The date floor is re-applied here instead of trusting the file's own bucket names: two chances to catch a mistake whose cost is permanent. Every entry carries a reason citing the evidence, the artwork the pull saved, and the local render the upload came from — all fourteen resolve to a FLAC in Opal26_master/tracks/, so deleting these loses a URL and not a recording. One bug found while writing it, and it is the reason the reason strings matter: the first version lined a stale upload up against the newest cut BY TRACK NUMBER, and the Aug-12 cut had fifteen tracks where v4 has fourteen. Dropping Desire renumbered REVOLUTION from 15 to 14, so the manifest claimed "#14 Desire, 388.1s vs v4 205.6s" — 205.6s is REVOLUTION's length. A measurement is a comparison; an unnamed reference cites the wrong track. The lookup is keyed on the title slug now, and a track absent from the newest cut says so instead of borrowing a neighbour's duration. Dry-run against the live account: 14/14 resolved, both directions, all private, nothing refused. Nothing deleted — that is PLN's call.
PLN (Algolia) authored -
Written earlier today by the gear-repair session and left uncommitted, which for this particular file is the one failure mode that matters: performance_notes IS the archive, so an uncommitted entry is not a note, it is a memory. Two signals, both about the rig rather than the audio: - *"ok just played rose_rouge works great!"* — first confirmation that the CLASSIC LCXL (mk1, 1235:0061) is a fully viable performing surface once lcxl-leds-watch owns the paint. Worth recording precisely because the rig had drifted into treating the mk3 as the only real board; the classic is a fallback, not a downgrade. - *"and the midi mon is beautiful!"* — on first sight of tools/bridge/midiviz.py. A taste signal about the rig's own UI, and the follow-up ask (always-open, always-on-top, every desktop) says it plainly: midiviz is an instrument of the rig, not a debug tool. CLAUDE.md asks for every reaction captured durably because this corpus feeds sampling, effect choices and the auto-mastering heuristics. Durably means committed.
PLN (Algolia) authored -
Four kinds of orphan, all real source, none of it generated: - tools/sweep_state.py — 'the surface needs a sweep', as a fact the rig can act on. Companion to the LCXL3 driver thread. - armada/tide-table/kick_bass.py — the deterministic kick-vs-bass tiebreaker, the one split CLAP cannot do reliably because both live low. Exactly the 'validate by analysis, never infer role from the name' rule in code. - armada/tide-table/calibration.stem.json — joins calibration.json and calibration.whole-mix.json, which were already tracked. A calibration set missing one of its three members is a trap for whoever reads the other two. - install_superdirt.sclang — pins SuperDirt v1.7.2 and recompiles. The boot path is exactly where 'simple, non-brittle, one entrypoint' matters. - live/collab/benoit/tous_ensemble.tidal and live/midi/nova/nujazz/ nouvelle_couleur.tidal — two scores. nouvelle_couleur carries a '-- url:' header naming its backdrop source, per the scene standard. - visuals/{maze,nightly_repairs,there,there0}.js — four hydra sketches. Python entrypoints staged 100755 via --chmod, not left to the working tree. the drawer is empty now. everything in it was something, which is why it took three weeks to look.PLN (Algolia) authored -
Ten shell tools plus FORMAT.md and MIX.md, written 2026-07-29 and untracked since: stem-stats, energy-profile, onset-detect, silence-detect, transition-detect, mix-meta, mix-render, mix-normalize, mix-master, lufs-check, and lib/progress.sh. FORMAT.md defines a <project>.mix.json metadata contract whose tools 'read existing metadata and augment (don't overwrite unless told)'. Committed with the exec bit set IN THE INDEX, which is the part that bites: 3fdf5b97 had to restore it on 63 scripts, and MIX.md invokes every one of these as ./stem-stats. A file that is executable in the working tree and 100644 in git is executable exactly until someone else clones it. Note also that 'git commit -- path' silently drops a staged mode flip (the trap 1667bb02 documented), so this went in without a pathspec after proving nothing else was staged. mix/take94's 833 MB stayed out (a5a5b37). The scripts are the artifact; the take is the input.
⚠ ️ Flagged, not resolved: this overlaps ../tidal-ears' mastering CLI, which is the canonical recipe per MASTERING.md. Two toolboxes that both master a set is the shape feedback_one_parser_per_concept warns about. I am not merging them blind — committing first so the overlap is visible in one tree instead of half-invisible in an untracked directory. PLN's call which one is the spine. ten small knives in a drawer nobody opened, sharp the whole time.PLN (Algolia) authored -
Written 2026-08-14, uncommitted for three weeks: the -inf fader forensics on Tidal Live.ardour, the corpus triage that found '51 broken tracks are actually 22 — the harness was the biggest bug', and the 192 kHz master-format audit ('probe, never assume'). All three are marked shareable: true, which is the whole point — these logs are the source material for the posts and videos, and they were sitting one bad rm away from not existing. The rule in armada/tasks/README.md is 'write the entry when the task lands, while it's fresh'. It worked: the writing happened same-day. It was the committing that didn't, because git status had become unreadable (see a5a5b37). Documentation discipline is not one habit, it is two, and the second one is the one that survives a hard drive. Left for PLN, one line: all three carry 'log: 025' in their frontmatter, which 025-fifteen-intros-are-not-a-set.md already owns. They also use dated filenames like 2026-08-03-j5-audio-dropout.md rather than the README's NNN-slug.md. Renumbering is a call about his own archive's spine, not mine — and the dates are 2026-08-14, which lands them BEFORE 039, so the next free numbers would read out of order. the log was kept. the log was not carried. a ship's record that never leaves the desk is a memory, not a record.PLN (Algolia) authored -
Three weeks of untracked working tree, and the reason nothing was committed is that 'untracked' had stopped meaning anything: 957 MB of take audio and scene mp4s sat in the same status output as three finished captain's logs, so the whole list read as noise and got skipped as one. Sorted by what each thing actually is, against the precedent already in this file and in the index: mix/'s ten scripts are source and go in, mix/take94's 833 MB does not. The .js scene sketches are source, the 124 MB of rendered mp4 is not. calibration.json and calibration.whole-mix.json are tracked, so calibration.stem.json belongs with them; bounds_*.json is generated output whose builder is already tracked, so it does not. No new policy here — just applying the one written at the top of this file to a pile that had grown too mixed to read. the tide went out three weeks ago and left everything on the sand together: charts, driftwood, a gigabyte of water. sorting is not cleaning. sorting is deciding what was ever yours.PLN (Algolia) authored -
PLN opened the day hearing it: 'our private cuts of OPAL are badly cut begin/end unaligned'. The board had one theory (a 24s truncation) and it was wrong. This lens found the real shape: the ENTIRE Aug-12 first cut is still on SoundCloud — all 15 tracks — living beside the 6 correct v4 ones under a litter of ad-hoc permalinks (/opal26-wap, /12-mafia-12, /ceci-nest-pas-une- bombe), and eight of the stale ones are the ones wearing artwork. So the wrong cut is the one that looks finished. Of course he heard it. Duration is the discriminator, and it is far sharper than assumed: measured on this account, SoundCloud's full_duration reproduces the source to the millisecond (477.600 uploaded, 477.600 reported). Tolerance is 50ms, not the seconds you would allow for a transcode — a loose tolerance here buys no safety, it only invents ambiguity between cuts that differ plainly. Three things I got wrong first, each left in as a guard: - filenames are not authoritative. 'Perfect <3' uploads to /perfect-3, so a filename-derived slug reported two live tracks as NOT UPLOADED. Titles come from the plan now, which is what the uploader actually used. - streaming and club masters share every duration, so offering both as rival candidates marked all 14 AMBIGUOUS. Identical generations collapse. - a duration collision is not provenance. /au-revoir-lord-toyota (2020) and /saria-demo (2025) both matched OPAL to 50ms. Anything uploaded before the oldest render on disk cannot be a cut of it, and a coincidence must never reach a delete manifest — so the date floor is a hard gate and the discards are printed, not silently dropped. The second pass is the one that earned its keep. Roll call only looks where it expects a track to be, so it can never see a stale cut hiding under a different slug. Strays scans the whole account. Absence needs proof. fifteen ghosts of a set played once, each wearing the cover art of the real thing -- the lens does not listen, it only counts seconds, and seconds were enough.PLN (Algolia) authored -
catalog.generated.json was stale since 2026-06-23 (73 tracks / 23 gigs) and missing opal-festival-2026 + cosmicfest-2026 entirely — it never got rebuilt after catalog_view.json picked those gigs up on 2026-09-02. Re-ran the pipeline (build_catalog_view.py then build_catalog.py): catalog_view.json: 81 tracks / 25 gigs / 63 takes (unchanged — was already current, only as_of + minor EDA-coverage deltas moved) catalog.generated.json: 73→81 tracks, 23→25 gigs, now carries both missing 2026 gigs, both validate clean against models.Catalog, and track-id sets match view↔ generated exactly (no silent drops either direction) Root cause of the as_of staleness: build_catalog_view.py hardcoded `AS_OF = "2026-06-06"` as a literal instead of stamping the actual build date, so every regeneration since kept reporting the same frozen date no matter when it ran. Now computed as `date.today().isoformat()`. Checked the other suspected bug (a next/content/lives hardcoded path) — not present; LIVES already points at .../www/content/lives without next/ since 6e51fff.PLN (Algolia) authored -
PLN opened the session hearing badly-cut begin/end on the private OPAL uploads. Measured all three render generations against what the board recorded on the account: /take-five-drops sits at 6:57 = 417 s, which is exactly the Aug-12 first cut — four days and two boundary revisions before the ear-verified v4. The complaint had a mechanical cause. Ruled out before believing anything: tracks_v4_streaming matches segments_v4.json to the millisecond on all 14 (CRIME's 2s rest and REVOLUTION's reverb tail included), the upload plan's titles/files/durations are aligned and exact, and the ear file's 19:33 mtime is the signoff record being written, not a later boundary edit. Nothing needs re-cutting; the approved audio is already on disk. This is a re-upload problem. Two things stand in the way and one of them is PLN's call: SCW.delete() is hard-gated to the test namespace so we cannot remove our own stale uploads, and SoundCloud skips rather than replaces an existing permalink. Also: no sc_state.json was ever written, so the account is the only record of what landed — sc pull --artwork recovers ids, permalinks, durations AND the covers PLN asked to save, read-only, in one pass. Plus the catalog answer he asked for (generated.json is 2 gigs stale behind the view, 14 gigs uncatalogued), www's OPAL tracks.json still on segments_v3 where Slopmotion reads it, the CLAUDE.md next/ path that no longer exists, and two stale-opens git says already shipped.
PLN (Algolia) authored -
PLN (Algolia) authored
-
PLN (Algolia) authored
-
veridis_quo (PLN, first jam): hats ply gate moved to ^43 (E3, its own column), bass line up an octave. rose_rouge: comments from the night it re-validated the rebuilt rig — a sample-kit idea and the bassline's new name.
PLN (Algolia) authored -
The footer froze at '?REC 00:10' on the glass during the first real take. No code-level freeze reproduced; what WAS wrong: the ghost mirror recomputed state instead of mirroring device writes (so diagnosis lied), and the 2s tick wrote unconditionally with no dedup. Now: _home_cache records the string actually sent, the tick writes only on change (repaint ≤2s, revert ≤2s after stale), and the 20s label-reassert forces a full repaint so dedup can never mask a device- side reset. Hardware verdict awaits the next recorded take.
PLN (Algolia) authored -
Bug 1: Ardour flushes stems in ~12MB bursts every ~3s — a 2s stop-grace read every gap as stop/start and reset the clock eleven times in one 20s take. Grace is now 6s, with the measured cadence in the comment. Bug 2: transport-button feedback IS bit-gated — /set_surface feedback 8→9 (button-status + heartbeat); the 'not bit-gated' reading died on the live rig. Bug 3: a mute lens is not a dissenting lens — combine_rec only counts OSC when arm AND roll are concrete, so 'connected but silent' can no longer stamp conflict:true on ground truth. src labeling now names actual contributors. Regression tests drive RecPass through the real flush cadence; 169 green.
PLN (Algolia) authored -
Third line of the home screen: 'ParVagues' at rest; 'REC mm:ss' while the gig-log k:'rec' stream says audio is landing on disk (tail-read of the newest gig jsonl, same style as last_eval); '?REC' when the files and OSC lenses disagree — a timer the performer must not trust blindly is marked, not hidden. Stale or absent signal degrades to the plain footer, never crashes a redraw. Pure decision function rec_line() + tests.
PLN (Algolia) authored -
A GUI-launched Ardour has a BARE argv (only gig-up passes the session as an argument), so argv-matching alone left the files lens blind on the real rig. Resolution now climbs: argv → /proc/<pid>/cwd holding a *.ardour → open-fd symlink targets (most-fds wins on ambiguity, logged once). Injectable proc_root makes each rung testable against a fake /proc; 9 new tests reproduce the exact live gap (163 green). check-mix.py shares the latent argv-only bug — flagged in the sync comment, not fixed this pass.
PLN (Algolia) authored -
'Recording X had track Y playing at time Z' becomes answerable. Files lens = ground truth (stems growing in interchange/, stat-only, 2s grace, RecPass state machine); OSC lens = Ardour's own word (/set_surface feedback=8 handshake to :3819, listens :3820, /rec_enable_toggle + transport — the manual's real name for master arm, not /rec_enabled). Records on transitions + every tick while recording; lens disagreement ships as conflict:true, never smoothed over. 44 new tests (155 total green), stdlib-only, --no-rec escape hatch.
PLN (Algolia) authored -
The straggler from 3fdf5b97's sweep: with core.fileMode=false a PATHSPEC commit reads modes from the working tree (where they're invisible) and skips a staged mode-only flip — index-only commits are how mode fixes land here.
PLN (Algolia) authored -
lcxl-leds-watch (manual policy) leaves the target; lcxl3-driver and perf-tray join it. Generated by rig_units.py --target — the ~/.config copy is a symlink into the repo, so the regen IS this diff.
PLN (Algolia) authored -
perf-tray + gig-up: default-on 'Cut GPU at gig launch' (kill TuParles, verify dGPU RTD3, name holders if it won't sleep)
PLN (Algolia) authored -
The OLED's track clock resets 'a new track is a new lap' — but skipped the FIRST load, so lap 1 inherited the constructor's zero. Invisible while the driver restarted with every session; under the persistent unit (log 039) it counted the idle hours before the first load: 24:27 on a fresh rose_rouge.
PLN (Algolia) authored -
PLN (Algolia) authored
-
The night's lesson, converged: the driver only ran when a session remembered to start it, then the session's background task got OOM-reaped and the surface sat untranslated with every check green. - tools/lcxl3-driver.service: repo-owned unit like its siblings; retry-forever hotplug posture; Conflicts=lcxl-leds-watch so exactly one painter owns the board; follow-mode (no --track) so paint tracks the loaded file. - rig_units.py: lcxl3-driver + perf-tray rows (THE list is complete again), new 'manual' boot policy so --ensure can never start the v2 painter into a Conflicts= kill; --list --boot filter for shell consumers. - parvagues-gear: moved into the repo; derives its sets from rig_units --list instead of being the fourth hardcoded copy; autostart-on now defers to --ensure (it used to enable parvagues-sc at login against policy). - gig-up.sh leds(): detects the plugged surface generation and hands the LCXL3 to the driver unit; v2 path invoked via python3 (exec-bit-proof).
PLN (Algolia) authored -
core.fileMode=false means chmod fixes your tree and nothing else — the 203/EXEC class (log 032) recurs on every fresh checkout because the index said 644. git update-index --chmod=+x is the repo-level fix; every shebang'd script under tools/ + gig-up.sh + perf.sh now ships executable.
PLN (Algolia) authored
-