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

test(solo): cover agent tagging behind a background read-state snapshot - #2941

Merged
baxen merged 1 commit into
mainfrom
worker-bee/solo-agent-tagging-journey
Nov 8, 2026
Merged

baxen merged 1 commit into
mainfrom
worker-bee/solo-agent-tagging-journey

Conversation

@atishpatel

Copy link
Copy Markdown
Contributor

Why

A Solo chat alone with one agent addresses it from the composer's pill. #2627 lengthened the read-state snapshot's deadline, so the owner inventory read waited behind it in the reader's single background slot, timed out, and Solo showed Retry agents with no agent tagged. #2751 fixed it by reading the inventory on foreground capacity. Its Node coverage holds a fake background read and calls seedAgents directly, so nothing exercised the composed app path that actually broke.

What

One Playwright journey, tests/browser/solo-agent-tagging.spec.mjs. No production code changes.

  • Startup completes normally, then the relay connection drops (app.relay.disconnect). Read state loses its capacity basis and takes a fresh background snapshot; the route holds that request (and asserts its X-Buzz-Read-Priority is background).
  • The gap also clears the agent inventory. Inventory re-reads are answered with a relay-signed record from another author, which readRelayLibrary rejects outright (no transport error to retry, no console error), until the snapshot is in flight.
  • The viewer switches to the Solo chat, sees Retry agents, clicks it, and the pill Sending to Owned Honey. Change agents must appear while the snapshot is still held and with no alert. Releasing the snapshot changes nothing.

Browser-only justification

Representative app-composition journey across transport and the composer: the regression came from reader scheduling interacting with read-state's gap recovery and the Solo composer's seeding gate, each of which stayed green in its own Node tests. Two fixture facts drove the shape: the startup snapshot is a foreground read (holding it blocks nothing), and the startup inventory read fires before any snapshot, so only a gap-driven re-read reproduces the production ordering.

Evidence (local, macOS, main at cae3922 + this commit)

  • With the fix: playwright test tests/browser/solo-agent-tagging.spec.mjs --project chromium --project webkit --repeat-each 2 → 4 passed (about 7.5s each).
  • Fail-then-pass: with src/features/agents/relay-library.ts flipped back to priority: "background", the same journey fails at expect(pill).toBeVisible() after Retry, the reported symptom. Restored before committing.
  • biome check clean; existing src/features/agents/inventory.test.ts passes.

Deferred checks

  • Hosted CI run of both engines.
  • Human confirmation in the native app (steps below). Not marked buzz-review-completed.

Human steps: open a Solo chat with one agent; toggle network off/on (or let the relay reconnect); switch away to a team channel and back to the Solo chat. Working looks like the pill already reading "Sending to " without a Retry alert.

🤖 Generated with Claude Code

@atishpatel
atishpatel marked this pull request as ready for review November 7, 2026 02:13
@atishpatel
atishpatel requested a review from a team as a code owner November 7, 2026 02:13
A Solo chat alone with one agent addresses it from the composer's pill.
That broke when the read-state snapshot's deadline grew (#2627): the
owner inventory read waited behind the snapshot in the reader's single
background slot and timed out, leaving "Retry agents" and no pill. The
fix (#2751) moved the read to foreground capacity, with Node coverage
that holds a fake background read and calls seedAgents directly.

This journey covers the composed contract those tests cannot: the real
reader scheduling the broker's snapshot, the inventory re-read a gap
causes, and the Solo composer seeding its pill. Startup's snapshot is a
foreground read, so the journey drops the relay connection; read state
then has no capacity basis and takes a fresh background snapshot, which
the route holds. Inventory reads are refused with a relay-signed record
from another author (rejected by the library, no transport error) until
that snapshot is in flight, so the read "Retry agents" issues is the one
scheduled against it. Fails at the pill with the inventory read back on
background priority; passes in Chromium and WebKit with the fix.

Co-authored-by: Worker Bee (Opus) <4a3bc7fd57a7b2c126e4f3d3462dd16f375242e1c176b4b3f25ca93e3edb6a84@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: Atish Patel <atishpatel2012@gmail.com>
@atishpatel
atishpatel force-pushed the worker-bee/solo-agent-tagging-journey branch from a37ed7b to b96f237 Compare November 7, 2026 02:16

@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 this PR and the Nexus review-tracker notes and approved with no comments.

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

@baxen
baxen merged commit 5d9d1ef into main Nov 8, 2026
43 checks passed
@baxen
baxen deleted the worker-bee/solo-agent-tagging-journey branch November 8, 2026 00:42
loganj added a commit that referenced this pull request Nov 8, 2026
… journey

#2948 removed the Solo composer's standing "Retry agents" notice; the
failure and its Retry now sit in the mention menu. #2941's journey still
waited for that notice, so it failed on main. Drive the same recovery
through the mention menu's "Retry suggestions" while the background
read-state snapshot is held.

Co-authored-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Logan Johnson <loganj@squareup.com>
loganj added a commit that referenced this pull request Nov 8, 2026
… journey

#2948 removed the Solo composer's standing "Retry agents" notice; the
failure and its Retry now sit in the mention menu. #2941's journey still
waited for that notice, so it failed on main. Drive the same recovery
through the mention menu's "Retry suggestions" while the background
read-state snapshot is held.

Co-authored-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Logan Johnson <loganj@squareup.com>
loganj added a commit that referenced this pull request Nov 8, 2026
… journey

#2948 removed the Solo composer's standing "Retry agents" notice; the
failure and its Retry now sit in the mention menu. #2941's journey still
waited for that notice, so it failed on main. Drive the same recovery
through the mention menu's "Retry suggestions" while the background
read-state snapshot is held.

Co-authored-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Logan Johnson <loganj@squareup.com>
baxen added a commit that referenced this pull request Nov 8, 2026
Fixes today's broken and flaky buzz-app CI in one PR: red main plus two
flakes that hit several PRs. Supersedes #3017 and #3018.

# 1. Red main: `solo-agent-tagging.spec.mjs`

Main is red: `tests/browser/solo-agent-tagging.spec.mjs` (#2941) fails
on main and on every PR CI'd since.

The test waits for a composer `alert` holding a "Retry agents" button.
#2948 removed that standing notice; a failed agent read now offers
"Retry agent list" inside the Choose agent picker. #2941 was written
before #2948 landed and merged without rerunning against it.

The test now opens the Choose agent picker and asserts and clicks "Retry
agent list" there, then checks the retry goes away once the agent is
addressed. The behaviour it covers (tag nobody without complete
inventory, address the lone agent after retry, unchanged once the
background snapshot completes) is the same.

Verified locally: `playwright test solo-agent-tagging` passes on
chromium and webkit.

## Follow-up: trigger shape

The first push failed this PR's webkit Flake check: 8 of 10 repeats
found no "Choose agent" button. The screenshot shows the composer's
"Mention a member" (@) button instead. The chat only shows the agent
pill when every member is a known agent. With the inventory missing,
that depends on whether the agent's profile has loaded, which is a
background read. Both trigger shapes are correct while the inventory is
missing, and both open the same picker with "Retry agent list".

The test now opens the picker from either trigger. To check the @ path
deterministically, I held kind-0 profile reads after the gap until
Retry. The trigger was then "Mention a member", and the updated test
passed on chromium and webkit. Without that hold, it passes
`--repeat-each=15 --workers=6` on both engines (30 passed).

# 2. `conversation.spec.mjs` page-load flake (from #3017)


## Cause

`tests/fixtures/conversation.tsx` imports `bundledPlugins`, so its first
load makes the fresh dev server transform about 1,650 modules. A failing
CI trace (run 42422209266, repeat7) shows no reload and no failed
request: the module graph just finishes transforming about 15 s in,
while the other worker runs the same test's `pnpm build`s.
`prepareFixtureDependencies` already keeps dependency bundling out of
navigation budgets. Source transforms had no equivalent.

## Change

`warmUp(server, entry)` in `vite-server.mjs` asks Vite to transform the
entry and waits for its static-import crawl: `server.warmupRequest` +
`server.waitForRequestsIdle`, which are Vite's own APIs. The
conversation spec calls it after `listen()`, before `page.goto`. The
navigation timeout, retries and assertions are unchanged.

## Evidence (local, macOS, chromium, `--repeat-each=4 --workers=2`)

| | goto → load |
|---|---|
| before | 3.6–3.9 s |
| after | 1.03–1.07 s (warm-up takes ~2.7 s, outside the budget) |

The full `conversation.spec.mjs` passes on chromium and webkit (22
passed). I didn't reproduce the CI timeout itself locally. The
before/after split is the evidence that compile work has moved out of
the budget.

No browser cases are added or removed.

# 3. `huddles.spec.mjs` roster animation flake (from #3018)

`huddles.spec.mjs` › "capsule and companion presentation share mute and
leave" fails intermittently in webkit Flake check lanes on unrelated PRs
today: `locator.evaluate: AbortError: The operation was aborted.` at the
roster settle step (jobs 128522170397 on mbot/bottom-activity and
128560887574 on mbot/community-denied, repeats 9 and 5).

## Cause

The step awaits `Promise.all(getAnimations().map((a) => a.finished))`.
When Motion replaces an animation it cancels the old one, and a
cancelled animation's `finished` promise rejects with `AbortError`. So
any interruption while the roster settles fails the test, even though
the roster ends up correct.

A standalone webkit check shows the same message: cancel a running
animation, and the old wait throws `locator.evaluate: AbortError: The
operation was aborted.` The new wait resolves.

## Change

Wait until no animation in the roster is still `running`, using
`Promise.allSettled` so a cancelled one ends the wait for that animation
rather than failing the test. The geometry assertions after this step
are unchanged.

## Evidence

- The fixed test passes `--repeat-each=10` on chromium and webkit
locally (20 passed).
- I couldn't reproduce the cancellation locally (the old code passed
30/30 on webkit), so the evidence for the fix is the matching error and
the standalone check above.

Two other sites in this file use the same `Promise.all(... finished)`
wait (around lines 698 and 2019). Neither has failed in today's runs, so
I left them alone.

---------

Signed-off-by: Bradley Axen <baxen@squareup.com>
Co-authored-by: mbot <3754f8729004d95654c46dbab3129e4ab9ef05cc2534e2a3fbfc155983bd637b@buzz.block.builderlab.xyz>
baxen added a commit that referenced this pull request Nov 8, 2026
* origin/main:
  test(browser): fix red main and two cross-PR flakes (#3015)
  feat(agent-activity): keep remote agent outcomes readable (#2913)
  test(solo): cover agent tagging behind a background read-state snapshot (#2941)
  fix(desktop): quit on SIGTERM, SIGINT and SIGHUP so agents stop with Buzz (#2905)

Signed-off-by: Bradley Axen <baxen@squareup.com>
tlongwell-block added a commit that referenced this pull request Nov 8, 2026
* origin/main: (47 commits)
  fix(relay): report a community's membership refusal once, not as raw 403s (#3012)
  test(browser): fix red main and two cross-PR flakes (#3015)
  feat(agent-activity): keep remote agent outcomes readable (#2913)
  test(solo): cover agent tagging behind a background read-state snapshot (#2941)
  fix(desktop): quit on SIGTERM, SIGINT and SIGHUP so agents stop with Buzz (#2905)
  feat(unread): opening a channel quiets its sidebar row (#2998)
  fix(goose): end the turn when a final send succeeds (#2997)
  fix(relay): report a community's refusal once, not as raw 403s (#2978)
  Give fast Builderlab models their own section and a bolt in the model picker (#2592)
  feat(dev): `just desktop me` keeps Keychain approvals across rebuilds (#3002)
  fix(relay): show one quiet reconnect toast after 30 s, above the composer (#2968)
  feat(memory): render rich markdown and navigable buzz links (#2981)
  fix(identity): never strand first run on a key another account holds (#2996)
  Let agent_create propose instructions (#2332)
  fix(unread): raise a local read floor over dropped marks, and halve save validation (#2977)
  Add Codex huddle auto-join and thinking presence (#2927)
  feat(claude): set up Claude from a button beside Harness (#2975)
  docs(plugins): document the decisions API in the authoring guide (#2994)
  fix(agent-harness): stop telling agents to use GitHub-flavored Markdown (#2639)
  feat(identity): brand federated sign-in and return to the app (#2982)
  ...

Signed-off-by: Tyler Longwell <tlongwell@squareup.com>
Co-authored-by: Eva <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@buzz.block.builderlab.xyz>

# Conflicts:
#	src/bundled/codex/voice.ts
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