Repository navigation
Conversation
Step 7b of the shared network plan (ADR 0037): the inbound gate. One predicate, admitted, now decides both what the application is told and what this node answers. A peer is admitted when it is visible, in the named set, holds a 1:1 session with this node, or is on the roster of a group this node holds; with no publisher key every peer is. - The named set: the addresses the application itself sent to, paired with, requested a session or connection with, or invited. Written only by those calls, never by anything a frame carries; persisted as a new sealed protocol-state category (`named_peers`, a contact list); at most 4096, the least recently named address with no session goes first; backfilled on every launch from every session, so turning membership on cuts off no contact. - The inbound gate: a frame addressed to this node from a sender that is not admitted is treated exactly as a blocked sender's, with no processing, no answer of any kind and no event, so the sender sees what it sees for an address nobody holds. Passed whatever the sender: `__MEMBER__`, relay server answers, custody receipts, the group data plane (it opens only under a held group) and discovery gossip (its own rules come next). Acknowledgements are refused at both ACK send points too. - The end-to-end proof: every key package, 1:1 Welcome and group Welcome a node with a certificate sends carries one, attached at signing, so two members several hops apart converge with no naming. It travels in the frame metadata (`__member_proof`) rather than in the payload, so the bound body is the content exactly as it travels and nothing is re-serialised to hash it; the proof signs recipient, kind and body itself, so the metadata being outside the control signature costs nothing. Tests: a stranger's key package gets nothing back; the same stranger, once named, is answered; an unconfigured node answers as before; two members who never met converge on the proof; a proof made for one member does not admit its sender at another; a node with the key and no certificate proves nothing; the named set survives a restore and an explicit call writes it. Disabling the gate fails two of them.
This was referenced Nov 4, 2026
Closed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Step 7b of the shared network plan (ADR 0037). Stacked on #688.
One predicate: admitted
admitted(peer)is true when the peer is any one of:With no publisher key, every peer is admitted.
app_sees_peer(the emission gate from #688) now asks this same predicate, as the ADR says.The named set
send_message,forward_message,send_media, connection requests and their answers, presence, typing and read receipts,establish_secure_session,manual_mls_create_sessionandinvite_to_group.named_peers, because it is a contact list. The value is the Unix second the address was last named.The inbound gate
A frame addressed to this node from a sender that is not admitted goes down the blocked-sender path:
The sender sees what it would see for an address nobody holds. ACKs are also refused at both ACK send points (
send_ack_with_statusandsend_undecryptable_ack).These pass whatever the sender:
__MEMBER__;Key packages, 1:1 Welcomes and group Welcomes pass if they carry a valid proof.
The end-to-end proof
sign_control_message, so every send path gets it.__member_proof, defined once inoffline-protocol-sealed), not in a payload field.Tests
offline-protocollib 2211 pass,offline-protocol-uniffi318 pass,offline-protocol-sealed102 pass.Deliberately not in this PR
admitted.