Skip to content

build: take libchat's GroupV2 fork fix, and surface what stalls a group - #67

Draft
osmaczko wants to merge 3 commits into
masterfrom
build/bump-libchat-join-fork-fix
Draft

build: take libchat's GroupV2 fork fix, and surface what stalls a group#67
osmaczko wants to merge 3 commits into
masterfrom
build/bump-libchat-join-fork-fix

Conversation

@osmaczko

@osmaczko osmaczko commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

build: take libchat's GroupV2 fork fix and its conversation-status events

A member joining a GroupV2 group after a voted steward election kept serving the pre-election steward list and rejected the elected steward's next commit, so the group split into branches that never converge again and every later add landed on one of them.

The same pin brings what a conversation now reports about running itself: the phase it moved into, how much of a commit round arrived, and a step of its own that did not go through. A group that has stopped moving says nothing else, so without those a stalled add reads the same as an idle group.

libchat renamed ConversationClass::Private to Dm over the same range, so the inbound class-to-kind mapping follows it.

feat: log the GroupV2 protocol, at debug by default

A GroupV2 group that splits or stops growing explains itself in de-mls's own lines and nowhere else, and the composed filter left that target at warn while every one of those lines is info or debug. A run that hit the problem therefore carried no account of it, and the account cannot be asked for afterwards: it is gone with the run.

Add de_mls to the targets the client's level moves, and default that level to debug while GroupV2 is being stabilised. Everything around them stays at warn, so the crates that log per network frame stay out of the way, and RUST_LOG still replaces the composition outright for a run that wants less.

feat: report a send that delivery gave up on

A send is handed off asynchronously and its outcome comes back as an event, and the module subscribed to none of them. A message the delivery node could not put on the wire therefore vanished without a line anywhere, which is exactly the shape of a group that stops growing: the invite is accepted locally, nothing carries it, and every log still reads as a healthy run.

Declare messageError in the contract subset and drain it alongside connectionStateChanged. The event names the send by request id and by nothing else, so an accepted send now logs that id against its topic; without the pair the error line says nothing about what failed.


Note for the review, not for history: the libchat pin is the head of feat/surface-group-progress-events, which sits on top of logos-messaging/libchat#216 and has no pull request of its own yet. Neither is merged. Re-pin to the squash-merges on main before this lands, and fold that into the first commit above.

@github-actions

github-actions Bot commented Aug 21, 2026

Copy link
Copy Markdown

Doc-test report

Headless chat_module instances built against this commit, driven through the 1:1 round-trip and the three-instance group conversation, rendered alongside the commands actually run and their output (updated each run, commit 0383cd6):

Pages can take a minute to update after the run finishes.

@osmaczko
osmaczko force-pushed the build/bump-libchat-join-fork-fix branch from 590306d to 3e739d8 Compare August 22, 2026 09:22
@osmaczko osmaczko changed the title build: take libchat's GroupV2 join-time fork fix build: take libchat's GroupV2 fork fix, and surface what stalls a group Aug 22, 2026
…ents

A member joining a GroupV2 group after a voted steward election kept serving the pre-election steward list and rejected the elected steward's next commit, so the group split into branches that never converge again and every later add landed on one of them.

The same pin brings what a conversation now reports about running itself: the phase it moved into, how much of a commit round arrived, and a step of its own that did not go through. A group that has stopped moving says nothing else, so without those a stalled add reads the same as an idle group.

libchat renamed ConversationClass::Private to Dm over the same range, so the inbound class-to-kind mapping follows it.
A GroupV2 group that splits or stops growing explains itself in de-mls's own lines and nowhere else, and the composed filter left that target at `warn` while every one of those lines is `info` or `debug`. A run that hit the problem therefore carried no account of it, and the account cannot be asked for afterwards: it is gone with the run.

Add `de_mls` to the targets the client's level moves, and default that level to `debug` while GroupV2 is being stabilised. Everything around them stays at `warn`, so the crates that log per network frame stay out of the way, and `RUST_LOG` still replaces the composition outright for a run that wants less.
A send is handed off asynchronously and its outcome comes back as an event, and the module subscribed to none of them. A message the delivery node could not put on the wire therefore vanished without a line anywhere, which is exactly the shape of a group that stops growing: the invite is accepted locally, nothing carries it, and every log still reads as a healthy run.

Declare `messageError` in the contract subset and drain it alongside `connectionStateChanged`. The event names the send by request id and by nothing else, so an accepted send now logs that id against its topic; without the pair the error line says nothing about what failed.
@osmaczko
osmaczko force-pushed the build/bump-libchat-join-fork-fix branch from 3e739d8 to a4b938d Compare August 24, 2026 08:39
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