Ensures a Capabilities object advertises the MLS code points a Marmot
v2 group relies on, so a LeafNode bearing these capabilities passes MLS
leaf-capability validation when added to a group that carries them.
Marmot v2 stores group state as versioned app components in the
app_data_dictionary GroupContext extension (0x0006) and mutates them with
app_data_update proposals (0x0008), both from draft-ietf-mls-extensions-09.
Every member MUST advertise support for the extension and the proposal type.
last_resort (0x000a extension) is also advertised for key-package reuse,
and the self_remove proposal (0x000a proposal type) for member departure
(protocol-core/member-departure.md).
The agent-text-stream-QUIC receive role capability (0xf2d1) is advertised
so a member can be invited into a group whose
marmot.group.agent-text-stream.quic.v1 (0x8006) policy requires it —
darkmatter's default group sets required_member_roles = receive, and its
do_send_invite rejects any KeyPackage missing a required role capability
(agent-text-stream-quic-v1.md).
Only receive is advertised. The role extensions are capability markers
(registries.md: "v1 defines no extension data for them"), and a client that
does not implement raw QUIC is explicitly conformant — it "ignores the live
preview and waits for the final MLS message" (transports/quic.md). marmot-ts
honestly satisfies receive that way: it has no QUIC data plane (and raw QUIC
is not portably available in browsers/Node/Bun), so it never advertises
send (0xf2d2) or fanout (0xf2d4), which would claim the ability to
originate or relay live QUIC streams it cannot fulfill.
Ensures a Capabilities object advertises the MLS code points a Marmot v2 group relies on, so a LeafNode bearing these capabilities passes MLS leaf-capability validation when added to a group that carries them.
Marmot v2 stores group state as versioned app components in the
app_data_dictionaryGroupContext extension (0x0006) and mutates them withapp_data_updateproposals (0x0008), both from draft-ietf-mls-extensions-09. Every member MUST advertise support for the extension and the proposal type.last_resort(0x000aextension) is also advertised for key-package reuse, and theself_removeproposal (0x000aproposal type) for member departure (protocol-core/member-departure.md).The agent-text-stream-QUIC
receiverole capability (0xf2d1) is advertised so a member can be invited into a group whosemarmot.group.agent-text-stream.quic.v1(0x8006) policy requires it — darkmatter's default group setsrequired_member_roles = receive, and itsdo_send_inviterejects any KeyPackage missing a required role capability (agent-text-stream-quic-v1.md).Only
receiveis advertised. The role extensions are capability markers (registries.md: "v1 defines no extension data for them"), and a client that does not implement raw QUIC is explicitly conformant — it "ignores the live preview and waits for the final MLS message" (transports/quic.md). marmot-ts honestly satisfiesreceivethat way: it has no QUIC data plane (and raw QUIC is not portably available in browsers/Node/Bun), so it never advertisessend(0xf2d2) orfanout(0xf2d4), which would claim the ability to originate or relay live QUIC streams it cannot fulfill.