I wrote a THIRD .tidal parser this session -- an ad-hoc regex census of which synths the set calls -- while tools/setlist_samples.py already answered exactly that. It produced garbage twice: a substring grep matched the synth `gfunk` against the `gfunk_*` SAMPLE banks, then the regex version read `s "k"` (58 files) as a missing sample and I reported it as a possible bug. PLN caught both in seconds. `#` is `|>` -- structure from the left, values from the RIGHT -- so `s "k" # s "jazz"` plays jazz and `k` is a rhythm skeleton that must never resolve. Nothing was broken. His diagnosis is the one worth keeping: a CLAUDE.md line alone would be a bandage, because the cause is not ignorance but COST ASYMMETRY. tools/ holds ~40 scripts with no index and the canonical resolvers are human-facing CLIs, not importable functions, so writing a regex cost 30 seconds and finding the parser cost a search. The cheap path wins under pressure. What black teaches Python devs is not taste, it is that the decision is gone. So: a rule in CLAUDE.md that states the trap concretely (with the `s "k" # s "jazz"` example, since the rule is useless if you don't believe it), plus structural enforcement in tools/tests/test_one_tidal_parser.py. The test matches the SHAPE of a Tidal call-site regex, not a blocklist of filenames, so a new file is covered the day it is written. It is a RATCHET, not an amnesty: KNOWN_DEBT may only shrink. A file not on the list that starts parsing fails immediately; an entry that stops offending ALSO fails, so paying one off must be recorded. Mutation-verified in both directions -- a planted regex turns it red, and a fictitious paid-off entry turns it red -- because a green test is not evidence that it can fail. Enforcement immediately found FIVE pre-existing hand-rolled parsers I did not know about, plus a sixth once the markers were tightened. They are not the same mistake, so they are listed individually rather than waved through by directory: tidal_score.py, sample_tfidf.py and pattern_ngrams.py genuinely duplicate bank extraction and are what #23 should absorb; at/lens.py reads `mask "..."`, pvlint/rules.py reads `# n "..."` and deshadow-helpers.py rewrites whole source lines -- different concepts, and forcing those through a bank resolver would be the wrong API. Precision here is load-bearing: a looser first draft flagged tools/setlist.py's "^(sound\s*check|line\s*check|balance)$", which is about a stage soundcheck and has nothing to do with Tidal. A rule that cries wolf gets switched off. Also fixes a fake test inside the hollow-suite guard itself: test_suite_hygiene's `test_files` was a HELPER, collected by pytest as a test that passed by returning a list without asserting anything -- the exact shape that file exists to catch. Renamed to _gather_test_files. That was the suite's only PytestReturnNotNone warning. 903 passed, 0 failed, 28 warnings.
| Name |
Last commit
|
Last update |
|---|---|---|
| .. | ||
| at | Loading commit data... | |
| bridge | Loading commit data... | |
| foundry | Loading commit data... | |
| pulsar-parvagues-hud | Loading commit data... | |
| pvlint | Loading commit data... | |
| tests | Loading commit data... | |
| README.md | Loading commit data... | |
| analyze_samples.py | Loading commit data... | |
| ardour-drop-missing-sources.py | Loading commit data... | |
| ardour-tidal-live.desktop | Loading commit data... | |
| ardour_session.py | Loading commit data... | |
| audio-lens.py | Loading commit data... | |
| bank-check.py | Loading commit data... | |
| button-column-audit.py | Loading commit data... | |
| button_roles.py | Loading commit data... | |
| cheat-sheet.py | Loading commit data... | |
| check-audio-graph.sh | Loading commit data... | |
| check-boot-blocks.py | Loading commit data... | |
| check-boot.sh | Loading commit data... | |
| check-drift.sh | Loading commit data... | |
| check-mix.py | Loading commit data... | |
| check-preload.sh | Loading commit data... | |
| check-tracks.sh | Loading commit data... | |
| control-lens.py | Loading commit data... | |
| deshadow-helpers.py | Loading commit data... | |
| fader-baseline.py | Loading commit data... | |
| fan_check.sh | Loading commit data... | |
| fix-button-roles.py | Loading commit data... | |
| fix-mute-roles.py | Loading commit data... | |
| gen_tokens.py | Loading commit data... | |
| gen_ts_types.py | Loading commit data... | |
| gig-log.py | Loading commit data... | |
| gig-log.service | Loading commit data... | |
| gig-metadata.py | Loading commit data... | |
| gig-preflight.py | Loading commit data... | |
| gig-up.sh | Loading commit data... | |
| gig_record.sh | Loading commit data... | |
| install-protect.sh | Loading commit data... | |
| lcxl-init.py | Loading commit data... | |
| lcxl-leds-watch.service | Loading commit data... | |
| lcxl-leds.py | Loading commit data... | |
| lcxl-path.py | Loading commit data... | |
| lcxl3-driver.py | Loading commit data... | |
| lcxl3-driver.service | Loading commit data... | |
| lcxl3-probe-display.py | Loading commit data... | |
| lcxl3.py | Loading commit data... | |
| lcxl3_language.py | Loading commit data... | |
| lcxl_grid.json | Loading commit data... | |
| lcxl_grid.py | Loading commit data... | |
| master-out.py | Loading commit data... | |
| midi-autoconnect.service | Loading commit data... | |
| midi-autoconnect.sh | Loading commit data... | |
| midiviz.desktop | Loading commit data... | |
| midiviz.service | Loading commit data... | |
| migrate-columns.py | Loading commit data... | |
| mock-lcxl.py | Loading commit data... | |
| mute.tidal | Loading commit data... | |
| orphan-orbits.py | Loading commit data... | |
| parvagues-gear | Loading commit data... | |
| parvagues-protect.service | Loading commit data... | |
| parvagues-protect.sh | Loading commit data... | |
| parvagues-rig.target | Loading commit data... | |
| parvagues-samples.service | Loading commit data... | |
| parvagues-sc-watchdog.service | Loading commit data... | |
| probe-chain.py | Loading commit data... | |
| pvbanks.py | Loading commit data... | |
| rig-pulse.py | Loading commit data... | |
| rig_units.py | Loading commit data... | |
| sample-pack.py | Loading commit data... | |
| sample-watcher.py | Loading commit data... | |
| sample_tfidf.py | Loading commit data... | |
| sc-watchdog.sh | Loading commit data... | |
| set-coherence.py | Loading commit data... | |
| setlist.py | Loading commit data... | |
| setlist_samples.py | Loading commit data... | |
| shipowiz.py | Loading commit data... | |
| silent-eval.py | Loading commit data... | |
| solo.tidal | Loading commit data... | |
| surface-columns.py | Loading commit data... | |
| sweep_state.py | Loading commit data... | |
| take-lens.py | Loading commit data... | |
| take-master.py | Loading commit data... | |
| take-segments.py | Loading commit data... | |
| tempo-lens.py | Loading commit data... | |
| tidal-ardour-autoroute.service | Loading commit data... | |
| tidal-ardour-autoroute.sh | Loading commit data... | |
| tidal-remote.py | Loading commit data... | |
| tools.png | Loading commit data... | |
| unmute.tidal | Loading commit data... | |
| unsolo.tidal | Loading commit data... |