镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

Polish message actions, spacing, and membership notices - #2258

Merged
mahanti merged 8 commits into
mainfrom
am-1103-daily-polish
Nov 3, 2026
Merged

mahanti merged 8 commits into
mainfrom
am-1103-daily-polish

Conversation

@mahanti

@mahanti mahanti commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

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.

mahanti and others added 2 commits November 3, 2026 10:02
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>
@mahanti

mahanti commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor Author

🤖 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.

  1. Message toolbar, light: compact reaction/reply/copy-link/more capsule and active bubble highlight.
  2. Message width and spacing: long sent/received bubbles, smaller avatars and composer inset.
  3. Membership people: centered grouped additions with one name, count and scrollable people popover. Names/hash prefixes are disposable fixture identities.
  4. Message toolbar, dark: same interaction in WebKit.
  5. Reaction picker: actual shared picker in the maintained message gallery fixture; synthetic custom emoji.

Native desktop identity/community loading and final human acceptance are not verified by these captures.

Light theme message toolbar

Message width and spacing

Grouped membership and people list

Dark theme message toolbar

Reaction picker in synthetic component fixture

  1. Author/status in a narrow chat: synthetic Chat fixture at 6d52f8c. The author stays readable while the long status truncates. Human acceptance confirmed after this fix.

Author stays readable beside a truncated status

  1. Latest membership action: at 7d01678, Pinky was added and then removed, so the run now reads “Brain was added · Pinky was removed.” Synthetic fixture capture from the passing Chromium journey; the same scenario passed in WebKit.

Membership summary shows each person only under their latest action

Co-authored-by: Codex <noreply@openai.com>
Signed-off-by: Arjun Mahanti <arjun@squareup.com>
@mahanti
mahanti marked this pull request as ready for review November 3, 2026 15:46
@mahanti
mahanti requested a review from a team as a code owner November 3, 2026 15:46
@mahanti
mahanti marked this pull request as draft November 3, 2026 15:47
Co-authored-by: Codex <noreply@openai.com>
Signed-off-by: Arjun Mahanti <arjun@squareup.com>
@mahanti
mahanti marked this pull request as ready for review November 3, 2026 15:57
Co-authored-by: Codex <noreply@openai.com>
Signed-off-by: Arjun Mahanti <arjun@squareup.com>

@loganj loganj 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.

🤖 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

  1. 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).
  2. 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 only docs/buzz-help.md was 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.tsx Props.inline is now dead (the removed ReactionLabel was its only reader). Drop it from the type and the MessageRow caller.
  • 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.rs fixture 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.

Comment thread src/features/messages/MessageRow.tsx Resolved
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>
@mahanti
mahanti marked this pull request as ready for review November 3, 2026 16:25

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 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

  1. useFloatingActionBar.ts:255: the new hide() attribute removal creates a per-frame mutation loop while a revealed row is scrolled offscreen.
  2. 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) failed message-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).

Comment thread src/features/messages/MessageRow.tsx Resolved
Comment thread tests/browser/message-actions.spec.mjs Resolved
Comment thread tests/browser/message-actions.spec.mjs Resolved
Comment thread src/features/messages/MessageRow.tsx Resolved

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

🤖 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

  1. With enlarged text at narrow widths, bubbles split words mid-word (Messages.module.css:172).
  2. 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.rs ordering 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.

Comment thread src/features/messages/MessageRow.tsx Resolved
Comment thread tests/browser/message-actions.spec.mjs Resolved
mahanti and others added 2 commits November 3, 2026 11:37
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>
@mahanti
mahanti merged commit 5825200 into main Nov 3, 2026
50 checks passed
@mahanti
mahanti deleted the am-1103-daily-polish branch November 3, 2026 18:55
emgroves added a commit to emgroves/buzz-app that referenced this pull request Nov 3, 2026
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>
dr0uleau added a commit that referenced this pull request Nov 3, 2026
* 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
brow pushed a commit to block/buzz that referenced this pull request Nov 3, 2026
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>
ljknight added a commit to ljknight/buzz-app that referenced this pull request Nov 3, 2026
…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
brow added a commit to block/buzz that referenced this pull request Nov 3, 2026
…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>
arividar pushed a commit to minniai/minni-buzz-app that referenced this pull request Nov 4, 2026
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>
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.

3 participants