af482d96666c5f256c64ef0a811acd0b0374ba24
Found by manual 2-machine exploration: desktop creates room A, dopedart joins; desktop leaves A, creates room B, leaves B, then rejoins A — and dopedart (still in A) isn't reconnected until dopedart itself leaves and rejoins. Root cause: `known_peers` (the A8 rejoin-bootstrap memory) was a single flat set cleared on ANY join-ticket change. The detour through room B wiped the memory of room A's peers, so rejoining A — whose ticket names the creator itself as host — produced an EMPTY bootstrap (`compute_bootstrap` drops self), leaving the desktop isolated in the gossip topic with no one to dial. dopedart never re-dials a peer that's already a (now-departed) neighbor, so they never relink. Fix: key `known_peers` by room ticket (`HashMap<ticket, HashMap<peer, addr>>`) and stop clearing it. The event loop records peers under its room's ticket; a join pulls bootstrap targets from that ticket's bucket. Revisiting a room after a detour now still remembers its peers. Pre-existing bug (logic unchanged by the B1 refactor); reproduces on pre-B1 main too. 256 lib tests green, clippy --all-targets clean. NOT yet 2-machine field-verified — the exact A→B→A scenario is the gate (dopedart is up; verifying next). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>