Files
Arjen 82e0083e4d feat(peer): a second handshake to a live peer over a new transport becomes a path
A peer entry listing addresses on two transports dials both at startup.
The first completion made the session; the second was misread: the
responder classified its msg1 as a rekey (it came from an active peer)
and set a pending session the initiator never cut over to, while the
initiator resolved it as a cross-connection and swapped or discarded.
Two ends, two ideas of the session.

Now the inbound establish rule reads two more facts from the registry:
whether the existing peer is live, and whether it already has a path on
the transport the msg1 arrived on. A live peer's msg1 on a transport
with no path is not a rekey, which rides an existing path, but a fresh
handshake over a new transport: it runs as a net-new establish so the
initiator's handshake completes, and the promotion keeps the transport
as a path under the session both ends already share, dropping the new
session. The outbound rule mirrors it: a completion over a new
transport to a live peer is a keep, and the shell adds the path. Both
ends therefore keep the same session and gain the same path, which the
heartbeat tick proves within one interval.

Once a discovery tick, a configured address of a live peer on a
transport it has no path over is added as a path as well: an address
whose transport was down at dial time (wifi joined later, Tor came up)
was otherwise never looked at again, since an active peer is not
re-dialled.

The dual-udp-flap scenario is config-driven now: the dial owner lists
udp/main and udp/<veth>, both dial at startup, and the veth handshake
is kept as a path 55 ms after the bridge promotion. Run: 18 switches in
[4, 18], 0 errors, one promotion per node.
2026-09-13 09:38:10 -03:00
..
2026-08-30 10:42:59 +00:00
2026-08-30 10:42:59 +00:00

Reference

Information-oriented technical descriptions for lookup on demand. Reference content describes what is: wire formats, configuration keys, command-line flags, control-socket commands, default values, file paths, exit codes. It is consulted, not read end-to-end.

Reference is austere by design: minimal narrative, no opinions, no guidance on when to use a feature. The "why" lives in design/; the "how do I accomplish X" lives in how-to/.

Available Reference

Document Scope
wire-formats.md All FMP and FSP message byte layouts, encapsulation walkthrough
configuration.md Full YAML configuration reference for the daemon and gateway
security.md nftables baseline, peer ACL, cryptographic primitives, rekey defaults, threat-resistance matrix
nostr-events.md Kind 37195 advert, Kind 21059 traversal signaling, Kind 10050 inbox relays
transports.md Per-transport statistics counter inventory
control-socket.md Line-delimited JSON control protocol for the daemon and gateway
native-api.md Native datagram API: the Rust surface, addressing and ports, errno table, ceilings, line protocol, command reference
cli-fips.md fips daemon CLI: options, exit codes, environment, files
cli-fipsctl.md fipsctl control-client: subcommands, options, exit codes
cli-fipstop.md fipstop live-status TUI: tabs, keybindings
cli-fips-gateway.md fips-gateway service CLI: options, exit codes, files