feat(us-017): P2P gossip, NAT-traversal relay node, and TLS
- packages/p2p: identity (peer_id from sha256 of RSA pubkey), TLS cert
generation with SHA-256 fingerprint, GossipClient (WSS PubSub with
per-topic handlers, dedup by msg_id, auto-reconnect), MdnsDiscovery
(zeroconf optional dependency, graceful no-op fallback)
- packages/relay: new meshnet-relay package — RelayServer (asyncio +
websockets) with gossip fanout hub, circuit relay proxy for NAT traversal,
peer registry; meshnet-relay CLI
- packages/p2p/relay_bootstrap.json: team relay bootstrap list
- Tracker: _NodeEntry gains relay_addr, cert_fingerprint, peer_id; both
register and heartbeat handlers read and store these optional fields
- docs/adr/0010 already written (previous commit)
- conftest.py: packages/relay added to sys.path
- 18 new tests; 115 passed total, 1 skipped (no regressions)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>