Skip to content

feat: tell which members a GroupV2 run left on which branch - #223

Draft
osmaczko wants to merge 2 commits into
feat/surface-group-progress-eventsfrom
feat/groupv2-fork-report
Draft

feat: tell which members a GroupV2 run left on which branch#223
osmaczko wants to merge 2 commits into
feat/surface-group-progress-eventsfrom
feat/groupv2-fork-report

Conversation

@osmaczko

@osmaczko osmaczko commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

A GroupV2 group can divide into branches that never converge again, and no member can tell from its own view that it happened: both halves keep a roster and an epoch number, each simply stops being able to read what the other sends, and a fresh split leaves both carrying the same members. A member that has merely fallen behind produces the same endless run of undecryptable frames, from a different cause needing a different fix, and nothing separates the two.

MLS derives a value for exactly this comparison, meant to be compared out of band: at one epoch number, different epoch authenticators are a fork and identical ones are real convergence. Write it once per epoch a conversation reaches, so a run leaves behind the one thing that partitions its members.

The value answers the question one member at a time, and the question is about the group: how many branches a run ended in, when each split off, and who is on it. Answering it means putting every member's log side by side, which stops being something to do by hand as soon as a group is more than a handful. tools/forks.py reads the epoch lines out of a run, groups members by the authenticator they held at each epoch, and renders the result as a lineage tree and one lane per member, distinguishing a member that forked from one that only fell behind. It takes either one log per member or a single log split on its user_id spans, so the same report runs on the in-process group tests as on a farm of real peers.


Note for the review, not for history: this is based on feat/surface-group-progress-events (#219), which is not merged. Retarget once that lands.

@osmaczko
osmaczko force-pushed the feat/groupv2-fork-report branch from 1125c79 to 23feb28 Compare August 24, 2026 15:57
A GroupV2 group can divide into branches that never converge again, and no member can tell from its own view that it happened: both halves keep a roster and an epoch number, each simply stops being able to read what the other sends, and a fresh split leaves both carrying the same members. A member that has merely fallen behind produces the same endless run of undecryptable frames, from a different cause needing a different fix, and nothing separates the two.

MLS derives a value for exactly this comparison, meant to be compared out of band: at one epoch number, different epoch authenticators are a fork and identical ones are real convergence.

Write it once per epoch a conversation reaches, so a run leaves behind the one thing that partitions its members.
The epoch authenticator answers the question one member at a time, and the question is about the group: how many branches a run ended in, when each split off, and who is on it. Answering it means putting every member's log side by side, which stops being something to do by hand as soon as a group is more than a handful.

Read the epoch lines out of a run, group members by the authenticator they held at each epoch, and render the result as a lineage tree and one lane per member. Distinguish a member that forked from one that only fell behind, since both drop every frame the group sends and the drop count cannot tell them apart.

Take either one log per member or a single log split on its user_id spans, so the same report runs on the in-process group tests as on a farm of real peers.
@osmaczko
osmaczko force-pushed the feat/groupv2-fork-report branch from 23feb28 to e9463be Compare August 24, 2026 16:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant