bc1a0a2b23207e42444e674a2ebcd12c73cfbc24
A second sustained outage after a reconnect never evicted the peer: the 45s RECONNECT_GRACE timer was armed only by the gossip PeerConnectionLost path, but a transport-only retained-addr reconnect leaves gossip's neighbor state stale, so the second drop produced no new PeerConnectionLost and no timer. Arm the grace timer from the transport ConnEvent::Connecting too (the supervisor reliably re-emits it on every outage), gated on a new seen_connected set so a first-ever dial isn't given an eviction clock. Route both arming sites through a shared arm_grace_timer helper that is a no-op if a timer is already pending (earliest drop notice sets one hard deadline; a flapping link can't reset it), and scrub seen_connected on eviction/leave so a later rejoin starts clean. Compiles, clippy-clean, all tests green incl. transport reconnect suite. NOT yet field-verified — pending the two-outage laptop test. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>