846150659adc25a08373874acb1bc65609aa7380
Pull the PeerConnecting/PeerConnected chime logic out of update()'s match arms into two pure functions — reconnect_attempt_chime and reconnected_chime — that own the connecting/ever_connected set transitions and return the Option<Sound> to play, leaving the notify::play side effect in update. Behavior-preserving; the full suite still passes. Adds 4 #[cfg(test)] tests pinning the edge-trigger contract: a first dial is silent, a reconnect attempt chimes exactly once and stays silent across the supervisor's repeated redials, "reconnected" only fires after a prior link, and a two-outage cycle chimes attempt->reconnected each time (per-outage, not once-ever). Closes the last catalogued Tier B test gap. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>