The evdev listener's run loop did `let _ = event_tx.send(event).await` inside the trigger-key match arm. If the receiver was dropped without the explicit shutdown signal (set hotkey to None), the send returned Err and the loop kept polling — sending into a closed channel forever until something else terminated the task. Replace with explicit handling: on Err, log via log::warn! once and return Ok(()) from `run`. The shutdown-via-None path is unaffected. kon-hotkey still 4/4. https://claude.ai/code/session_0189xUb6ie6t9qHkzatGZ9Rb