Repository navigation
Polish message actions, spacing, and membership notices - #2258
Conversation
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: Arjun Mahanti <arjun@squareup.com>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: Arjun Mahanti <arjun@squareup.com>
|
🤖 Screenshots captured by Arjun's AI agent from the actual updated browser app and maintained fixtures, using synthetic data only. Checked production commit: fb0a0f1. Final head ec4ec71 only updates a personal-chat test.
Native desktop identity/community loading and final human acceptance are not verified by these captures.
|
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: Arjun Mahanti <arjun@squareup.com>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: Arjun Mahanti <arjun@squareup.com>
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: Arjun Mahanti <arjun@squareup.com>
loganj
left a comment
There was a problem hiding this comment.
🤖 Larry and Auto: an independent adversarial review of 6d52f8c. Source review only; we ran nothing locally (hosted CI is green on this head).
Approving: the direction is right, and hiding self-joins/leaves fixes the noisy #4things case. Two items should be fixed before merge (marked must-fix inline and below). Everything else is optional.
Must-fix
- error: a mixed run that removes and then re-adds someone reads "Pinky was added · Pinky was removed", so the notice states the reverse of the final state (inline on
membership-rows.ts:118). - convention:
docs/channels.md:1293-1302("Membership activity") still says arrivals and departures group together, that messages, local-day changes and gaps over an hour break groups, and that removals by different actors stay separate. This PR reverses all three, and onlydocs/buzz-help.mdwas updated. AGENTS.md asks us to keep documented product decisions in step, so update channels.md to match.
Optional, outside the diff
- error: the message gallery's membership examples (
tests/fixtures/message-gallery/examples.ts:861-930, "Member joined", "Member left", "Grouped joins", "Grouped joins with overflow") are all self-joins or leaves, so they now render as empty membership rows. Change them to adds and removes by another member, or drop them. - advice:
MessageReactions.tsxProps.inlineis now dead (the removedReactionLabelwas its only reader). Drop it from the type and theMessageRowcaller. - preference: the PR description's "Spacing follow-up at fab8d86 … in progress" paragraph refers to a commit that is not on the branch. Push it or trim the paragraph.
- advice: the
media_stream_tests.rsfixture fix is sound: it holds the origin open until the response headers arrive, so the test exercises a mid-stream truncation instead of racing EOF into a 502. Splitting it out is fine but not required.
What we checked and found sound: self-joins and leaves are filtered before grouping, so they no longer split runs or agent-activity folds. Messages and huddles still split groups. Solo withoutStartingAgents runs first, unchanged. Unread and read-receipt paths already ignore membership rows, and linked-message targets skip them. The community-storage test edits correctly seed the legacy key that forgetQuickReactions still clears. The new tiny avatar size is in the registry, DESIGN.md and the specimens.
Port the latest-change-per-person summary from #2153 and align membership documentation with the current grouping rules. Co-authored-by: Codex <noreply@openai.com> Signed-off-by: Arjun Mahanti <arjun@squareup.com>
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Carl, an automated reviewer, commenting via Wes's GitHub account.
Court review of 7d0167829 (UI, membership logic, and challenge lanes, integrated by me). Source review only; nothing was rendered locally.
Verdict: the membership latest-action fix holds (summary, counts and hover detail agree; 602-person list probe and huddle/day boundaries checked), the legacy quick-reaction cleanup is intact, and the media fixture change keeps its truncation assertions. Two should-fix items before merge, plus a few low ones, all inline.
Should fix
useFloatingActionBar.ts:255: the newhide()attribute removal creates a per-frame mutation loop while a revealed row is scrolled offscreen.MessageRow.tsx:543: thread and nested avatars miss the stated 4px gap and bottom alignment.
Merge criteria
- Both items above resolved, or explicitly declined by the author.
- Hosted CI green on the final head. At this head
Browser journeys (chromium, 8/9)failedmessage-overlays.spec.mjs:706(grouped reaction preview never opened). That test is untouched here and passed at 6d52f8c, so it needs triage as product regression vs flake, not just a rerun. - Thread-layout avatar geometry is covered (the current geometry case measures only timeline avatars).
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Carl, an automated reviewer, commenting via Wes’s GitHub account.
Two recommended blockers at 7d0167829. I'm posting this as a comment, following the repo's agent-review rule; the author and humans decide what must be fixed. Each finding is explained in its inline thread.
Recommended blockers
- With enlarged text at narrow widths, bubbles split words mid-word (
Messages.module.css:172). - A saved reading position that points at a now-hidden self-join or self-leave doesn't restore, and read catch-up stays suppressed until the reader interacts (
membership-rows.ts:44).
Validation gaps
- Hosted CI was still pending at this head when the review ran.
- Nothing covers a text bubble at the 480px minimum width with enlarged text, or a saved position that points at a hidden membership event.
- Nobody ran the
media_stream_tests.rsordering fix for this review, so the flake fix is confirmed only by source reading. The fixture change itself looks correct and doesn't hide a production bug.
To clear the blockers: restore the bubble readability floor, and either remap or retire saved positions that point at hidden events. Add one regression check for each. The remaining threads are optional.
Checked with no issues: legacy quick-reaction storage cleanup is still wired from community leave. No callers of the removed APIs remain. History prepends keep newest-anchored membership keys stable. The fractional-edge hover path is sound. Typography tokens agree across the registry, DESIGN.md and the CSS.
Co-authored-by: Codex <noreply@openai.com> Signed-off-by: Arjun Mahanti <arjun@squareup.com>
…n actions - A saved reading anchor on a now-hidden self-join or leave resolves to the nearest rendered row instead of staying pending, which kept the reader at the bottom and suppressed read catch-up until input. - Keep the 60% bubble floor so enlarged text at narrow widths does not split words; the rem-based clearance still wins at ordinary sizes. - Write the row's revealed attribute only after the bar is placed, so a focused row scrolled offscreen no longer adds and removes it every frame. Co-authored-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz> Signed-off-by: Logan Johnson <loganj@squareup.com>
Resolve conflicts with the compact message-action capsule (block#2258): keep Copy link unconditional in More with Forward after it, list Forward in the capsule help text, and expect Reply then Forward as the forward and backward second Tab stops. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
* commit '05fba2455': feat(agents): show each session's system prompt and dividers in activity (#1855) feat(bestie): hourly check-ins from your Bestie (#2037) Authorize local apps to use Buzz MCP tools (#2211) feat(bestie): choose the private channels Bestie can read (#2036) Polish message actions, spacing, and membership notices (#2258) test(unread): prevent startup catch-up in receipt reserve journey (#2274) test(search): wait for rejected join clearance to settle (#2278) test(reactions): provide stable emoji media for icon rendering (#2279) feat(profiles): reserve profile room for an open channel's roster (#2269) Signed-off-by: Daniel Rouleau <drouleau@squareup.com> Co-authored-by: Codex <noreply@openai.com> # Conflicts: # src/bundled/codex/runtime.ts
Port block/buzz-app#2258: only additions by someone else and removals show, and each uninterrupted run of them is one row regardless of elapsed time, local day or actor. Mixed runs read "Bob and 3 others were added · Dan was removed", and several adders no longer read as joins. Hiding leaves also covers both relay leave shapes (kind 9022 actor-only and kind 9001 with a target). Signed-off-by: Tom Brow <tomb@squareup.com>
…ection * origin/main: (39 commits) Authorize local apps to use Buzz MCP tools (block#2211) feat(bestie): choose the private channels Bestie can read (block#2036) Polish message actions, spacing, and membership notices (block#2258) test(unread): prevent startup catch-up in receipt reserve journey (block#2274) test(search): wait for rejected join clearance to settle (block#2278) test(reactions): provide stable emoji media for icon rendering (block#2279) feat(profiles): reserve profile room for an open channel's roster (block#2269) feat(host): harden byte lifecycle and add protected image upload (block#2199) Updated onboarding (block#2183) perf(relay): read each signed roster once in large channels (block#2244) AIDA-2346: Keep spoilers hidden in reminder previews (block#2261) fix: AIDA-2371 Keep sidebar selection pill aligned during resize (block#2182) fix(relay): skip background rereads of profiles a read found absent (block#2147) fix: prevent startup logo selection (block#1823) fix(agents): send sign-in evidence with agent Git credentials (block#2240) perf(mentions): stop scanning every member on each mention keystroke (block#2246) fix(attachments): send image dimensions so previews don't shift (block#2262) feat(shortcuts): add Slack-style hotkeys (block#2170) perf(plugins): share host request clients across calls (block#2243) fix(identity): keep federated sessions and agent grants in one keychain item (block#2225) ... # Conflicts: # src/features/messages/ThreadPanel.tsx
…ktop (#8962) Busy channels fill the mobile timeline with page after page of small "X joined the channel along with Y and N others" and "X added Y to the channel" rows. Desktop now hides most of that ([buzz-app#2258](block/buzz-app#2258)). This brings mobile's membership notices in line with desktop's current rules (`membershipRows` / `membershipDescription` in buzz-app `src/features/messages/membership-rows.ts`). ### Behavior - **Only explicit changes show.** Self-joins and voluntary leaves are hidden. That covers both relay leave shapes: a normal Leave (kind 9022, actor only) and removing yourself (kind 9001, with a target). Additions by someone else and removals still show. - **One row per run.** Each uninterrupted run of additions and removals becomes one row, whatever the elapsed time, local day or actor. Messages and other channel events (topic, archive, huddles) still split runs. - **Each person appears once**, under their latest change in the run. - **Wording:** - One adder: "Alice added Bob, Carol and N others to the channel. See all" (unchanged) - One remover: "Alice removed Bob ... from the channel" (unchanged) - Several adders: "Bob, Carol and N others were added to the channel". It no longer says they "joined". - Additions and removals together, or several removers: "Bob and 4 others were added · Dan was removed". Each "N others" opens that list. Mobile keeps its "See all" sheet in place of desktop's hover popover. ### Validation - Added tests: - unit tests for hiding self-joins and both leave shapes - grouping across hours, days and actors - runs split by messages and other channel events - a channel page journey with a self-join, a 9022 leave, a 9001 leave, additions by two people hours apart and a removal: it renders one mixed row, and the "1 other" sheet works - a several-adders wording test - Updated tests that previously relied on visible self-joins or leaves. - Full mobile suite (`just mobile-test`) and `flutter analyze` pass. - Automated full-app run on an iPhone 17 Pro simulator, signed in to a hosted community: - The home list and a 33-member channel with membership history load. Self-joins are gone, messages flow without them, and a two-adder run reads "X and Y were added to the channel". - Scrolling back through history and opening and closing a thread work. - Captures are not attached because they show internal names. - Limitation: the internal community now rejects the simulator's websocket without hosted sign-in, so the 1,500-member channel wasn't re-checked on this head. - Human testing is waived per the owner's standing policy. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Signed-off-by: Tom Brow <tomb@squareup.com> Co-authored-by: Tom Brow <tomb@squareup.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: studio <dc2fc481343672df31a689840c09299972e704dac592e0da6f18486646a7ee3e@buzz.block.builderlab.xyz>
Message hover actions now use a compact capsule with reaction, reply, copy-link and more icons, with a persistent bubble highlight while its actions are open. Long messages have more reading room, author avatars are smaller, and membership activity takes less space. - Keep the toolbar above the bubble; put Copy message in More and remove emoji shortcuts. Place reactions to sent messages on the left. - Let bubbles expand until 32px before the opposite avatar. Reduce message-author avatars by 8px across timeline, thread and nested contexts, using the shared Avatar sizes. Add 4px horizontal composer-content padding per side. No message-width preference is introduced. - Center membership notices and show only explicit additions and removals. Collapse consecutive notices across elapsed time/date boundaries until a message or huddle; summarize large groups with one name and a count that opens the full scrollable people list. - Remove unused quick-reaction ranking/recording and obsolete join/leave formatting. Preserve legacy community-storage cleanup and document the resulting behavior. Validation: - Independent code review: no outstanding blockers after cleanup and the personal-chat assertion correction. - 56 browser tests passed across Chromium and WebKit: floating actions, message actions, membership and reactions. Covers pointer/keyboard behavior, narrow/wide layout, enlarged text, both themes and picker recovery. - 23 personal-chat viewport tests passed after updating the previous self-join/leave expectation to the new explicit-add/remove contract. - Required push hooks passed at ec4ec71: TypeScript/full Vitest suite, design-system checks, Rust gate and push safety checks. Remote head verified; working tree clean. Browser evidence is from fb0a0f1 with identical production code. - Reviewed synthetic screenshots are attached in one PR comment; captures predate the subsequent line-height and avatar-gap adjustment. Coverage changes: removed quick-reaction ranking tests with the removed feature; community/device cleanup tests still verify deletion of legacy storage. Membership helper, timeline and browser tests cover filtering/grouping and accessible people previews. Existing browser journeys were updated; no new browser test cases or production test seams were added. Human acceptance confirmed for the combined UI and the later author/status clipping fix. Agent browser checks exercise the affected product behavior; native desktop identity/community loading was not independently reverified. Those approvals apply through 6d52f8c. The subsequent spacing adjustment is draft pending validation and acceptance. CI follow-up at 6d52f8c: preserve author-name width beside long statuses; update avatar and reaction journeys for explicit additions and the icon-only toolbar; keep video readability coverage against the new available width. The approved native media-test fixture now gates premature EOF on downstream response headers, eliminating the opening-vs-midstream ordering race without changing media behavior. Independent review found no blockers. All 40 affected browser checks (both engines), 10 native media-stream tests, and required local push gates passed. Hosted CI passed on this exact head: 47 checks successful, including CI required and DCO; Windows native validation was skipped by workflow policy. Spacing follow-up at fab8d86: message leading is 22px at the default 14px type size and scales with text preferences; the visible avatar-to-bubble gap is 4px on both sides. Opposite-avatar clearance remains 32px. Shared token metadata and guidance are synchronized. Required local push gates passed at f0cca66 (full unit suite, TypeScript, design-system checks, and Rust Clippy). Both engines passed the 20-case floating-toolbar suite; nested-reply and opposite-avatar geometry checks passed. The 22px leading exposed a fractional toolbar-edge hit-test gap, fixed by extending the active hover corridor through the fractional edge pixel. Hosted CI and renewed acceptance remain pending; the PR remains draft. --------- Signed-off-by: Arjun Mahanti <arjun@squareup.com> Signed-off-by: Logan Johnson <loganj@squareup.com> Co-authored-by: Codex <noreply@openai.com> Co-authored-by: Logan Johnson <loganj@squareup.com> Co-authored-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz>







Message hover actions now use a compact capsule with reaction, reply, copy-link and more icons, with a persistent bubble highlight while its actions are open. Long messages have more reading room, author avatars are smaller, and membership activity takes less space.
Validation:
Coverage changes: removed quick-reaction ranking tests with the removed feature; community/device cleanup tests still verify deletion of legacy storage. Membership helper, timeline and browser tests cover filtering/grouping and accessible people previews. Existing browser journeys were updated; no new browser test cases or production test seams were added.
Human acceptance confirmed for the combined UI and the later author/status clipping fix. Agent browser checks exercise the affected product behavior; native desktop identity/community loading was not independently reverified. Those approvals apply through 6d52f8c. The subsequent spacing adjustment is draft pending validation and acceptance.
CI follow-up at 6d52f8c: preserve author-name width beside long statuses; update avatar and reaction journeys for explicit additions and the icon-only toolbar; keep video readability coverage against the new available width. The approved native media-test fixture now gates premature EOF on downstream response headers, eliminating the opening-vs-midstream ordering race without changing media behavior. Independent review found no blockers. All 40 affected browser checks (both engines), 10 native media-stream tests, and required local push gates passed. Hosted CI passed on this exact head: 47 checks successful, including CI required and DCO; Windows native validation was skipped by workflow policy.
Spacing follow-up at fab8d86: message leading is 22px at the default 14px type size and scales with text preferences; the visible avatar-to-bubble gap is 4px on both sides. Opposite-avatar clearance remains 32px. Shared token metadata and guidance are synchronized. Required local push gates passed at f0cca66 (full unit suite, TypeScript, design-system checks, and Rust Clippy). Both engines passed the 20-case floating-toolbar suite; nested-reply and opposite-avatar geometry checks passed. The 22px leading exposed a fractional toolbar-edge hit-test gap, fixed by extending the active hover corridor through the fractional edge pixel. Hosted CI and renewed acceptance remain pending; the PR remains draft.