Skip to content

Refine agent Attention cards, watch details, and status controls - #2717

Merged
johnmatthewtennant merged 15 commits into
mainfrom
am-115-attention
Nov 6, 2026
Merged

johnmatthewtennant merged 15 commits into
mainfrom
am-115-attention

Conversation

@mahanti

@mahanti mahanti commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Agent Attention mixed instructions, sources, response destinations, and controls in stacked rows that were hard to scan. Give each interest its own card with compact watch tables and expandable configuration and activity.

  • Separate Sources, Responds in, and Status; normalize gutters, hover/expanded surfaces, and right-aligned activity timestamps.
  • Use shared SettingsGroup, EmptyState, Avatar, Button, Menu, Popover, message rows, and ActivityExpansion. Preserve keyboard/touch controls, deletion focus restoration, and visible save failures.
  • Add a framed Attention header with an Active/Paused menu and compact agent-centered sonar. Pausing device Attention stops its sonar.
  • Replace empty-state message piles with a larger sonar and brief onboarding copy. Citrus signals reveal varied examples one at a time, with continuous sweep timing and reduced-motion support. Examples are display-only.
  • Update bundled help. The local playground and DialKit controls are excluded. No relay/runtime or persistence changes; interest-level pause is not added.

Validation

  • Independent review completed; fixed avatar inner sizing and re-reviewed with no remaining blockers.
  • 17 focused component tests passed; 8 browser executions passed across Chromium and WebKit. Browser coverage includes keyboard/touch management, focus restoration, profile-host framing at narrow/wide widths, theme/text sizing, avatar dimensions, and single-visible-hint animation geometry. New browser geometry assertions cover behavior jsdom cannot establish; obsolete drag/rotation assertions were removed with those features.
  • Reviewed synthetic screenshots of actual production components, including populated, paused-menu, and sonar empty states. Mandatory commit/push hooks run for this snapshot.

Remaining acceptance

Draft pending final human testing in the native agent profile and hosted checks. Native desktop launched, but identity/community loading was not visually verified; the launcher also reported an upstream bundled buzz-cli compilation failure. Browser fixture evidence does not establish native integration acceptance.

@mahanti

mahanti commented Nov 6, 2026

Copy link
Copy Markdown
Contributor Author

🤖 Screenshots of the actual updated Attention components at 4f951fa4c92d1db2ff1be1f63e3d7ddf9f38373d, rendered with isolated synthetic fixture data (not a native agent-profile capture).

  1. Interest card with distinct Sources / Responds in columns and expanded activity.
  2. Active status menu with Activate / Pause / Delete.
  3. Expanded configuration and activity, with separate Interest cards.

Interest card and expanded activity with synthetic fixture data

Active watch management menu

Expanded configuration and activity in separate Interest cards

mahanti and others added 11 commits November 5, 2026 21:36
Co-authored-by: Codex <[email protected]>
Signed-off-by: Arjun Mahanti <[email protected]>
Co-authored-by: Codex <[email protected]>
Signed-off-by: Arjun Mahanti <[email protected]>
Co-authored-by: Codex <[email protected]>
Signed-off-by: Arjun Mahanti <[email protected]>
Co-authored-by: Codex <[email protected]>
Signed-off-by: Arjun Mahanti <[email protected]>
Co-authored-by: Codex <[email protected]>
Signed-off-by: Arjun Mahanti <[email protected]>
Co-authored-by: Codex <[email protected]>
Signed-off-by: Arjun Mahanti <[email protected]>
@mahanti
mahanti marked this pull request as ready for review November 6, 2026 13:55
@mahanti
mahanti requested a review from a team as a code owner November 6, 2026 13:55
@mahanti
mahanti marked this pull request as draft November 6, 2026 13:57
@mahanti

mahanti commented Nov 6, 2026

Copy link
Copy Markdown
Contributor Author

🤖 Production Attention UI at b8d7e9f, captured with synthetic fixture data using the actual profile-host components (not the local playground).

  1. Populated cards, source/destination pills, and expanded activity.
  2. Paused Attention menu in dark theme with enlarged text.
  3. Empty state with a Citrus sonar message hint.

Chromium and WebKit checks passed; final native human acceptance remains pending.

Synthetic populated Attention cards and activity

Synthetic paused Attention menu

Synthetic Attention sonar empty state

@mahanti
mahanti marked this pull request as ready for review November 6, 2026 13:58
@mahanti
mahanti marked this pull request as draft November 6, 2026 13:59
@mahanti
mahanti marked this pull request as ready for review November 6, 2026 14:02

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

🤖 Two actionable regressions: fresh-agent Attention onboarding is blocked, and watch status labels conceal the reason activation is unavailable.

onClick: () =>
return (
<div className="attention-agent">
{!empty && (

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.

🤖 [P1] Keep device enablement reachable for an empty agent

A fresh agent defaults Attention off. This empty-state guard hides the Active/Paused control, while the onboarding text tells the user to message the agent. Attention operations are rejected while off (src/buzz-mcp/session-tools.ts:209), so the agent cannot create its first Interest and the pane cannot become populated. This reproduced through the actual app/profile, production broker and Agents service in Chromium and WebKit with disposable identities and modeled upstreams; substituting the merge-base Tab restored successful enablement in both engines. Keep AttentionStatus available in the empty state and replace the onboarding test's manually injected first Interest with the real enable-first flow.

!description.spent
? "Active"
: "Paused";
const section = (label: string, content: React.ReactNode) => (

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.

🤖 [P2] Preserve the reason a watch cannot activate

An enabled watch now displays Paused when device Attention is off, its timer is spent, or its source is completed. The menu still derives availability from watch.enabled (lines 371–376), so these rows disable Activate and offer Pause despite already displaying Paused. The previous labels distinguished these states. Restore distinct device-paused/completed/used-up labels or explain the blocking reason in the menu, reserving Paused for !watch.enabled. Device-paused watches require the header control; spent timers require rearming; completed sources are done. The completed-source assertion in Tab.test.tsx:852 currently preserves this mismatch.

Co-authored-by: Codex <[email protected]>
Signed-off-by: Arjun Mahanti <[email protected]>

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

🤖 Reviewed this head. John chose to address the identified issues in a follow-up.

@johnmatthewtennant
johnmatthewtennant merged commit ab8974f into main Nov 6, 2026
62 checks passed
@johnmatthewtennant
johnmatthewtennant deleted the am-115-attention branch November 6, 2026 16:06
wpfleger96 added a commit that referenced this pull request Nov 6, 2026
…leanup

* origin/main:
  test(mentions): serve the mentions fixture as a build so cold loads fit (#2776)
  test(browser): let a late publication land after its page closed (#2565)
  test(relay): wait for the verified owner before a guest edits an agent (#2413)
  test: wait for the companion default width measurement (#2750)
  test(browser): preserve conversation scroll while revealing actions (#2715)
  test(browser): wait for link hit-testing after thread close (#2792)
  perf(messages): skip micromark for plain prose bodies (#2780)
  perf(inbox): load the emoji name table on first use (#2774)
  perf(messages): cut main-thread work while a busy channel is open (#2729)
  Refine agent Attention cards, watch details, and status controls (#2717)
  fix(bestie): remove a Bestie from its agent card on any device (#2720)
  feat(agents): preview Builderlab agent card links with Add to Buzz (#2719)
tlongwell-block added a commit that referenced this pull request Nov 6, 2026
Co-authored-by: Eva <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@buzz.block.builderlab.xyz>
Co-authored-by: Tyler Longwell <[email protected]>
Signed-off-by: Tyler Longwell <[email protected]>

* origin/main:
  test(messages): wait for the row measurement frame before thread catch-up dwell (#2837)
  Keep agent coordination history readable after work finishes (#2454)
  test(mentions): serve the mentions fixture as a build so cold loads fit (#2776)
  test(browser): let a late publication land after its page closed (#2565)
  test(relay): wait for the verified owner before a guest edits an agent (#2413)
  test: wait for the companion default width measurement (#2750)
  test(browser): preserve conversation scroll while revealing actions (#2715)
  test(browser): wait for link hit-testing after thread close (#2792)
  perf(messages): skip micromark for plain prose bodies (#2780)
  perf(inbox): load the emoji name table on first use (#2774)
  perf(messages): cut main-thread work while a busy channel is open (#2729)
  Refine agent Attention cards, watch details, and status controls (#2717)
  fix(bestie): remove a Bestie from its agent card on any device (#2720)
  feat(agents): preview Builderlab agent card links with Add to Buzz (#2719)
  Restore macOS Cmd-W window closing when no tab handles it (#2443)
  Make agent transcripts quieter and link finished replies to activity (#2424)
johnmatthewtennant added a commit that referenced this pull request Nov 6, 2026
…ve-enter

* origin/main: (21 commits)
  Make drafts and sent part of Messages (#2728)
  fix(canvas): render every Canvas within the save limit (#2839)
  test(messages): wait for the row measurement frame before thread catch-up dwell (#2837)
  Keep agent coordination history readable after work finishes (#2454)
  test(mentions): serve the mentions fixture as a build so cold loads fit (#2776)
  test(browser): let a late publication land after its page closed (#2565)
  test(relay): wait for the verified owner before a guest edits an agent (#2413)
  test: wait for the companion default width measurement (#2750)
  test(browser): preserve conversation scroll while revealing actions (#2715)
  test(browser): wait for link hit-testing after thread close (#2792)
  perf(messages): skip micromark for plain prose bodies (#2780)
  perf(inbox): load the emoji name table on first use (#2774)
  perf(messages): cut main-thread work while a busy channel is open (#2729)
  Refine agent Attention cards, watch details, and status controls (#2717)
  fix(bestie): remove a Bestie from its agent card on any device (#2720)
  feat(agents): preview Builderlab agent card links with Add to Buzz (#2719)
  Restore macOS Cmd-W window closing when no tab handles it (#2443)
  Make agent transcripts quieter and link finished replies to activity (#2424)
  fix(channels): wrap unread conversation stepping around the sidebar (#2682)
  fix(navigation): let bare buzz:// open Buzz without a broken-link notice (#2718)
  ...
ravarora2 added a commit that referenced this pull request Nov 6, 2026
Co-authored-by: BuzzPRReviewAssistant1 <a581a7e8115222acdc32ffb14bfce55d48c24478d98e155f8eba126b69b83c7b@buzz.block.builderlab.xyz>

* origin/main: (71 commits)
  test(activity): scope preview assertions to the request row (#2843)
  perf(search): fold people names once across palette keystrokes (#2570)
  fix(github): keep PR watches running when localStorage is full (#2699)
  Make drafts and sent part of Messages (#2728)
  fix(canvas): render every Canvas within the save limit (#2839)
  test(messages): wait for the row measurement frame before thread catch-up dwell (#2837)
  Keep agent coordination history readable after work finishes (#2454)
  test(mentions): serve the mentions fixture as a build so cold loads fit (#2776)
  test(browser): let a late publication land after its page closed (#2565)
  test(relay): wait for the verified owner before a guest edits an agent (#2413)
  test: wait for the companion default width measurement (#2750)
  test(browser): preserve conversation scroll while revealing actions (#2715)
  test(browser): wait for link hit-testing after thread close (#2792)
  perf(messages): skip micromark for plain prose bodies (#2780)
  perf(inbox): load the emoji name table on first use (#2774)
  perf(messages): cut main-thread work while a busy channel is open (#2729)
  Refine agent Attention cards, watch details, and status controls (#2717)
  fix(bestie): remove a Bestie from its agent card on any device (#2720)
  feat(agents): preview Builderlab agent card links with Add to Buzz (#2719)
  Restore macOS Cmd-W window closing when no tab handles it (#2443)
  ...

Signed-off-by: Ravneet Arora <[email protected]>
cheng-block added a commit to cheng-block/buzz-app that referenced this pull request Nov 6, 2026
…ime-hint

* upstream/main: (26 commits)
  Make drafts and sent part of Messages (block#2728)
  fix(canvas): render every Canvas within the save limit (block#2839)
  test(messages): wait for the row measurement frame before thread catch-up dwell (block#2837)
  Keep agent coordination history readable after work finishes (block#2454)
  test(mentions): serve the mentions fixture as a build so cold loads fit (block#2776)
  test(browser): let a late publication land after its page closed (block#2565)
  test(relay): wait for the verified owner before a guest edits an agent (block#2413)
  test: wait for the companion default width measurement (block#2750)
  test(browser): preserve conversation scroll while revealing actions (block#2715)
  test(browser): wait for link hit-testing after thread close (block#2792)
  perf(messages): skip micromark for plain prose bodies (block#2780)
  perf(inbox): load the emoji name table on first use (block#2774)
  perf(messages): cut main-thread work while a busy channel is open (block#2729)
  Refine agent Attention cards, watch details, and status controls (block#2717)
  fix(bestie): remove a Bestie from its agent card on any device (block#2720)
  feat(agents): preview Builderlab agent card links with Add to Buzz (block#2719)
  Restore macOS Cmd-W window closing when no tab handles it (block#2443)
  Make agent transcripts quieter and link finished replies to activity (block#2424)
  fix(channels): wrap unread conversation stepping around the sidebar (block#2682)
  fix(navigation): let bare buzz:// open Buzz without a broken-link notice (block#2718)
  ...

Signed-off-by: Cheng Peng <[email protected]>
Co-authored-by: Cursor <[email protected]>
johnmatthewtennant added a commit that referenced this pull request Nov 6, 2026
…ivity and pause fixes (#2860)

Follow-ups to [the Attention card
refresh](#2717) and [per-Interest
pause controls](#2847).

## Problem

- An Interest card had no real title or summary. It guessed the title
from a leading `# heading` or the slug, so you had to open the
instructions to learn what an Interest does.
- An Activity row showed spoiler text before it was revealed: `Status:
||private result||` appeared in full in the row and its accessible
label.
- A timer that had fired still said "No activity yet", because a timer
wake saved only its time.
- The Interest delete confirmation button read "Delete Interest" and
wrapped under Cancel.
- `watch_add` rejected timer budgets from MCP clients that send numbers
as digits, and `github_watch_pr` hid gh's error, so an agent could not
tell a missing repository from an expired login.
- Agents wrote Interest instructions full of raw IDs. A person linked as
`[Name](nostr:npub…)` showed as the name, but clicking it tried to open
an external app.
- Pausing an Interest did not fully protect its watches on older builds.
A watch over the watch limit is kept as is and written back, so it
stayed runnable by an older build with a higher limit, and deleting its
Interest left it behind. A paused watch's history was also saved twice,
which could push a large record over the 4 MiB storage limit and stop
the pause from saving.

## Solution

- Interests take an optional title and summary. `interest_set` accepts
both and asks agents to fill them in, and the card shows the title with
the summary under it. Existing Interests look as they do today until
their agent next updates them.
- Activity summaries use the same spoiler-aware preview as
notifications, so a spoiler reads `[Spoiler]`.
- Each timer wake is saved as an Activity entry holding the timer's
prompt, the way a watch saves its event.
- The confirmation button says "Delete".
- `watch_add` accepts numbers sent as digits, and `github_watch_pr`
includes gh's message in its error.
- A person written as `[Name](nostr:npub…)` in Interest instructions
shows as the name and opens their profile: beside the conversation in
the profile panel, or by selecting that agent on the Agents page. Plugin
agent tabs get an optional `open(target)` for this, and `interest_set`
asks agents to name people that way and to link PRs, messages and
channels instead of pasting IDs.
- A paused Interest's over-limit watches are saved in the same envelope
older builds reject, unwrapped on resume, and deleted with their
Interest on the owner's Attention tab, which confirms first. An agent's
`interest_remove` refuses while one remains, rather than orphaning it. A
paused watch's history is saved once, inside the envelope.

Compatibility: a build without this change skips an Interest saved with
a title or summary, the same fail-closed path paused Interests already
use.

## Reproduction

1. Ask an agent to create an Interest. Before: the card's title is its
slug and there is no summary. After: the agent's title, with its summary
underneath.
2. Give an agent a watch that wakes on a message containing
`||secret||`, then open its Activity. Before: the row reads `secret`.
After: `[Spoiler]`.
3. Ask an agent for a timer that fires in a minute, wait for it, then
open the timer's Activity. Before: "No activity yet". After: one event
showing the timer's prompt.
4. Ask an agent to write an Interest naming a teammate, then open its
instructions. Before: an npub, or a name that does nothing in-app.
After: the name, which opens their profile.
5. With an agent over its watch limit, pause the Interest that owns the
extra watch, then open the record in an older build. Before: the older
build runs that watch without its Interest. After: it skips it. Delete
the Interest and the extra watch is gone too.

## Testing

Red/green: the spoiler, fired-timer and timer-wake tests fail on main
and pass here, as does the overflow reproducer from the review of the
pause controls, run against the actual older reader.
`src/features/agents`, `src/bundled/watching` and `src/buzz-mcp` pass
(2,093 tests), `tsc --noEmit` and Biome are clean, and
`tests/browser/agent-attention.spec.mjs` passes in Chromium and WebKit,
including clicking a person in the instructions.

## Screenshots

### A titled Interest with its summary, below an older Interest without
them

![Attention tab with a titled Interest and
summary](https://github.com/user-attachments/assets/09f34728-405d-4ce9-ae40-5f73f800fc38)

### Titled Interests with summaries, triggers and sources in the app

![Two titled Interests with summaries, triggers, sources and
status](https://github.com/user-attachments/assets/0b895549-6c23-40cf-b221-7961c07ecf24)

### A person in the instructions, shown by name

![Interest instructions naming Sam as a
link](https://github.com/user-attachments/assets/72e5f82b-a48a-4216-87ab-3a4cfbc748c3)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Signed-off-by: Arjun Mahanti <[email protected]>
Signed-off-by: John Tennant <[email protected]>
Signed-off-by: John Tennant <[email protected]>
Co-authored-by: Arjun Mahanti <[email protected]>
Co-authored-by: Codex <[email protected]>
Co-authored-by: Poppy <ace4dfe51b23bb4244ab9117dfd5e13b8239445e333225608c352e68cb3fe2b5@buzz.block.builderlab.xyz>
Co-authored-by: Claude Opus 5.5 <[email protected]>
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