c90dcf71efa1d93d30874abceeeb81085b8e9a7c
The ticket a member sees/copies for sharing is now stamped with THEIR OWN live address + the room's topic, not the (possibly someone else's) ticket they joined with. So every member — not just the creator — hands out a working door that bootstraps newcomers off themselves; a room stays reachable as long as anyone inside can share a ticket, even after the creator leaves. Pure seam PeerSpeakTicket::restamp(ticket_str, my_addr): re-parse, swap host_addr to mine, keep topic_id; no-op for an unparseable string or when the addr is already mine. The core re-stamps only the DISPLAY copy sent in RoomJoined; the join/bootstrap ticket_str and the A8 retain logic are untouched, so this is non-breaking (same wire format, different addr). +3 unit tests (swaps addr/keeps topic, idempotent for same addr, passes through unparseable). 248 lib tests green, clippy clean, release builds. Tests-green; the end-to-end 'creator leaves, joiner's ticket still works' behaviour wants a 2-machine field test. Multi-bootstrap (Vec) + ticket encoding tightening deferred (both breaking wire changes — want daylight). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>