Conversation
The PR reconciles the Buzz watch set live against the authoritative joined roster (
Minor: the Minor: connect() now hard-requires |
Watch only the authoritative joined roster (channels list --member) and validate every row before applying it. Membership events (kinds 44100 and 44101) and the poll cadence re-read the roster, subscribing to newly joined channels and closing subscriptions for departed ones without a Gateway restart; a malformed roster keeps the previous snapshot and an explicit channels list can only narrow the joined set. A failed identity-lock acquisition no longer leaves a lock key behind for disconnect to release, and any failed connect path tears the partial transport down.
|
Thanks, all three addressed; the branch is updated in place (single commit, force-pushed).
228 tests across the Buzz adapter, websocket, membership and lifecycle files pass on the updated commit. |
9fa794c to
ffebd7b
Compare
Keeps the Buzz adapter's watched channels in step with community membership while the Gateway runs.
What changes
buzz channels list --member), validated row by row before it is applied.channels/BUZZ_CHANNELScan only narrow that set, never widen it. If neither a joined channel nor a DM exists, connect fails withconfig_missingas before.created_atcannot move the reconnect cursor past "now".disconnect()to release, and every failed connect path tears down the partial transport.Verification
scripts/run_tests.shontests/gateway/test_buzz_channel_membership.py,test_buzz_identity_lifecycle.py,test_buzz_adapter.pyandtest_buzz_websocket.py: 227 tests pass.This is the live channel reconciliation and lock-lifecycle portion of #90802, rebased on current
mainand taken from the code running in production on our Hermes fork. #90802 is closed; its handoff behaviour already lives in #77647, and its thread-root routing will follow as its own PR.