Skip to content

End desktop Huddles when the creator is the last human - #3328

Merged
klopez4212 merged 2 commits into
mainfrom
terp/desktop-huddle-last-human-20261111
Nov 12, 2026
Merged

klopez4212 merged 2 commits into
mainfrom
terp/desktop-huddle-last-human-20261111

Conversation

@klopez4212

@klopez4212 klopez4212 commented Nov 11, 2026 •

Copy link
Copy Markdown
Contributor

When the creator leaves a Huddle with only agents connected to audio, desktop now publishes the ended state and archives the room. This replaces the leave path's unconditional reliance on relay teardown, which could leave the card offering Join. The existing View action and transcript membership are preserved.

The service counts attendance from raw audio admissions, using fresh relay-signed membership to classify bot roles. Departed humans keep transcript membership without counting as present. Connected legacy agents with a member role are recognized from verified kind-30177 records signed by the viewer or room owners, matching the old desktop trust policy. Known additional devices, other connected humans, unknown peers, failed classification reads, failed joins, connection errors, and retired sessions cannot trigger ending. Native signing now validates and permits the existing 48103 event. Concurrent relay archival is confirmed as successful cleanup.

This is the desktop client counterpart to mobile #9375; relay #9376 remains independent. Only the creator or relay may announce an ending. Membership and audio snapshots cannot atomically exclude a device joining during hangup; non-creators and ambiguous rosters retain relay cleanup.

Validation: typecheck and all 63 Huddle service tests pass. Restoring the old ending helper makes the new positive regressions fail. The full Vitest run at this follow-up completed with 21,049 passes and 10 failures across six files outside Huddles; all six files pass isolated reruns with BUZZ_TEST_WORKERS=2 (229 tests). All required pre-push checks pass at 6d201b6 with BUZZ_TEST_WORKERS=4: TypeScript/related tests, design guards, and workspace Clippy. Independent review found no blockers.

The native event-shape regression passed during the initial implementation; native code is unchanged in this follow-up. The broader native package run remains limited by terminal fixtures encountering this machine's interactive shell security prompt and a window-state mock SIGSEGV, including serial execution. No browser cases added or removed: service tests exercise join → connected → hangup using the real outbox, including departed humans, legacy agent trust, additional devices, membership, connection and archive-failure boundaries. Existing Huddle card/View tests pass.

Packaged desktop tryout remains pending: agent DM hangup, another device staying connected, transcript View, and mobile/desktop interoperability. No deployment or live-device validation claimed.

Co-authored-by: Terp <5856f6900e8e0a4e0ea1f4f8d2ee33e4753d2119bc122f94ecafc660b46c0511@buzz.block.builderlab.xyz>
Signed-off-by: klopez4212 <[email protected]>
@klopez4212
klopez4212 marked this pull request as ready for review November 11, 2026 23:44
@klopez4212
klopez4212 requested a review from a team as a code owner November 11, 2026 23:44
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 11, 2026 •

Copy link
Copy Markdown
Codex Review Summary: ✅ Completed

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-12T00:45:57.675379Z 6d201b6 New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

Co-authored-by: Terp <5856f6900e8e0a4e0ea1f4f8d2ee33e4753d2119bc122f94ecafc660b46c0511@buzz.block.builderlab.xyz>
Signed-off-by: klopez4212 <[email protected]>

@kazemek21 kazemek21 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Kyle reviewed the PR and the Nexus review-tracker notes. Approved with no comments.

Posted by Codex (gpt-6.1-sol) on behalf of kylez.

@klopez4212
klopez4212 merged commit 06fa05e into main Nov 12, 2026
64 checks passed
@klopez4212
klopez4212 deleted the terp/desktop-huddle-last-human-20261111 branch November 12, 2026 17:53
johnmatthewtennant added a commit that referenced this pull request Nov 12, 2026
Co-authored-by: Simone <0828be588d5c9c4d092c5b1cf01761d5aef63d6b104807fd8e8284d517dd1a99@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Opus 5.5 <[email protected]>

* origin/main: (260 commits)
  feat(markdown): share one Markdown renderer across messages and documents (#3319)
  fix(solo): reload workspaces by themselves after a relay pause (#3262)
  fix(agents): apply prompt and core memory changes at each conversation's next turn (#3170)
  Bind plugin operations to active native agent calls (#3303)
  Reopen recently closed threads without the loading mark (#3204)
  [buzz-app] Restore the last selected thread tab on Back and Forward (#3350)
  fix(notifications): keep alert sounds out of media controls (#3298)
  feat(shell): find on screen with Cmd/Ctrl+Shift+F (#2550)
  Bump block/buzz to pick up messages search --before (#3362)
  fix(media): save relay images from the native Download Image menu on macOS (#3337)
  feat(plugins): let plugins lift a message image's subject (#2470)
  feat(decisions): guide TypeSafe setup and align API key controls (#3365)
  Fix live sidebar updates after CLI moves (#3213)
  End desktop Huddles when the creator is the last human (#3328)
  Skip unchanged artifact row and index writes (#3364)
  fix(goose): propagate ACP work cancellation to plugin tools (#3351)
  Keep Solo source selection when opening a channel (#3356)
  fix(desktop): sign a channel-less deletion of one reaction (#3288)
  AIDA-2426: Set a default User-Agent for plugins (#2697)
  fix(plugins): explain Git import refs (#3314)
  ...

Signed-off-by: John Tennant <[email protected]>
johnmatthewtennant added a commit that referenced this pull request Nov 12, 2026
…o jtennant/martha/activity-step-previews

* origin/chung/feat-enriced-activity: (121 commits)
  feat(markdown): share one Markdown renderer across messages and documents (#3319)
  fix(solo): reload workspaces by themselves after a relay pause (#3262)
  fix(agents): apply prompt and core memory changes at each conversation's next turn (#3170)
  Bind plugin operations to active native agent calls (#3303)
  Reopen recently closed threads without the loading mark (#3204)
  [buzz-app] Restore the last selected thread tab on Back and Forward (#3350)
  fix(notifications): keep alert sounds out of media controls (#3298)
  feat(shell): find on screen with Cmd/Ctrl+Shift+F (#2550)
  Bump block/buzz to pick up messages search --before (#3362)
  fix(media): save relay images from the native Download Image menu on macOS (#3337)
  feat(plugins): let plugins lift a message image's subject (#2470)
  feat(decisions): guide TypeSafe setup and align API key controls (#3365)
  Fix live sidebar updates after CLI moves (#3213)
  End desktop Huddles when the creator is the last human (#3328)
  Skip unchanged artifact row and index writes (#3364)
  fix(goose): propagate ACP work cancellation to plugin tools (#3351)
  Keep Solo source selection when opening a channel (#3356)
  fix(desktop): sign a channel-less deletion of one reaction (#3288)
  AIDA-2426: Set a default User-Agent for plugins (#2697)
  fix(plugins): explain Git import refs (#3314)
  ...

Signed-off-by: John Tennant <[email protected]>

# Conflicts:
#	src/features/messages/TypingIndicator.test.tsx
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.

2 participants