PLN, mid-session: "why atm i see no midi color on lcxl reacting to my touches?" The LED watcher was enabled, active, 6h uptime, re-parsing the loaded track into the journal every few minutes. `systemctl status` was green. And it had decoded exactly zero MIDI events the entire time, because its aseqdump child was bound to `20:0` while the LCXL had moved to `28:0`. WHY THE EXISTING DEFENCE DIDN'T FIRE cmd_watch already re-resolved the port by name on every respawn -- the comment on that line even says so, and it is true. It is also useless, because respawn is triggered by the child EXITING, and an aseqdump whose sequencer client has vanished does not exit. It blocks on a dead subscription indefinitely. The read loop never ends, so the re-resolution is never reached. A re-resolution that is never reached is indistinguishable from a correct one. Same shape as the two lenses that shipped with thresholds that could never fire: the code was right, the trigger was wrong. THE FIX Detect the drift from OUTSIDE the read loop. A 10s poll compares the live name resolution against what the current child is actually bound to; on a change it invalidates the send-side port cache and terminates the child, and the existing main loop respawns and re-resolves through the path it already had. No new resolution logic -- find_seq_port() was correct all along and returns 28:0 today. Only the re-check was missing. Deliberately NOT keyed on "no events for N seconds". A board nobody is touching is also silent, so that check would fire through every quiet passage and respawn the tap mid-set. Port identity changes when the binding is genuinely stale and at no other time. VALIDATION find_seq_port() -> 28:0 (resolution was never the bug) before restart: aseqdump -p 20:0 6h stale, 0 events decoded after restart: aseqdump -p 28:0 re-parsed rose_rouge -> 26 controls The restart also reaped its own orphan. Two unrelated zombie taps remain (6.4h on the dead 20:0, 7.7h with no -p at all) -- that is #129/#155, logged separately, not addressed here. NOT PROVEN: the drift watchdog itself has not fired yet, because that needs the port to actually move. Unplug and replug the LCXL and the journal should show "LCXL moved 28:0 -> NN:0; respawning the tap". Until someone sees that line, this fix is reasoned, not demonstrated.
| 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... | |
| audio-lens.py | Loading commit data... | |
| bank-check.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-metadata.py | Loading commit data... | |
| gig-up.sh | Loading commit data... | |
| gig_record.sh | Loading commit data... | |
| lcxl-init.py | Loading commit data... | |
| lcxl-leds-watch.service | Loading commit data... | |
| lcxl-leds.py | Loading commit data... | |
| lcxl_grid.json | Loading commit data... | |
| lcxl_grid.py | Loading commit data... | |
| master-out.py | 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-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... | |
| 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... | |
| 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-remote.py | Loading commit data... | |
| tools.png | Loading commit data... | |
| unmute.tidal | Loading commit data... | |
| unsolo.tidal | Loading commit data... |