-
fix(tide-table): stale line anchors, not the setlist soundcheck fix, dropped opal-2024 to 3 · 436d327f
Two unrelated failing tests, investigated in order. test_agreement_distribution_within_bounds asserted tracks_total == 73, a snapshot from before yesterday's catalog rebuild (73 -> 81 tracks). Bumping it to 81 would just re-freeze the same brittleness. Replaced it with test_tracks_total_matches_the_generated_catalog: assert the live view's tracks_total equals the CHECKED-IN catalog.generated.json's n_tracks. That file is a 1:1 derivation of this same view, so the two can only disagree on a real regression (corpus changed but catalog not regenerated, or the pipeline dropped/duplicated a row) — never on honest growth. Verified it still fails by corrupting n_tracks and re-running. test_real_backlog_coverage_does_not_regress: opal-festival-2024's recovered tracks fell from 13/14 to 3. The obvious suspect was e8f7066a (yesterday's tools/setlist.py soundcheck filter) — ruled out by inspection (e8f7066a touches only tools/setlist.py + its test, nothing under armada/tide-table) and by bisection: replaying backlog_setlists.py's ANCHORS against every historical backlog.md since the anchors were authored (5acf72f7, 2026-06-06) shows n_resolved holding at 14 across ten intervening commits and only breaking at 49e1b78e ("update: post cosmic", 2026-08-23). The real bug: ANCHORS keyed gigs by a raw 1-based LINE NUMBER pinned once against a single backlog.md snapshot. backlog.md is PLN's running journal, not a stable document, so every one of those ten commits that inserted lines earlier in the file silently shifted every anchor below it. Opal 2024's anchor drifted through blank lines and a lucky near-miss for months (the collected span still happened to contain the same real content), then 49e1b78e pushed the drift past the header entirely into the tail of the PREVIOUS gig's block, collecting 3 unrelated lines instead of the setlist. Fix: anchor by the header's exact TEXT, resolved fresh against the live file on every build() (resolve_anchors()), instead of a line number frozen at authoring time. Self-healing against drift elsewhere in the file; raises loudly if a heading is ever actually renamed or duplicated, rather than silently mis-anchoring. The three anchors that carried an explicit end-of-block bound (opal-2025/Latin-Heritage bleed, mephisteuf's commented block, the 38c3-toilet cross-check) now store that bound as a line-count SPAN measured from the anchor, since that span lives inside the block and doesn't move when the anchor does. tools/setlist.py's soundcheck filter (e8f7066a) is untouched and still yields 15 entries for OPAL 2026 — never the culprit here, just an unrelated same-day change that made a plausible but wrong prime suspect. Full suite: 468 passed, 2 skipped (465 baseline + 2 fixed + 1 new regression test), up from 2 failing.
PLN (Algolia) authored436d327f
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| api | Loading commit data... | |
| escales | Loading commit data... | |
| manifeste | Loading commit data... | |
| semaphore | Loading commit data... | |
| tasks | Loading commit data... | |
| tide-table | Loading commit data... | |
| ui | Loading commit data... | |
| .gitignore | Loading commit data... | |
| DESIGN.md | Loading commit data... | |
| PRODUCT.md | Loading commit data... | |
| README.md | Loading commit data... | |
| ardour_faders.json | Loading commit data... | |
| serve.py | Loading commit data... | |
| setlist_opal2026.txt | Loading commit data... |