Skip to content

Introduce opt-in first-agent setup - #2804

Merged
delkc merged 11 commits into
mainfrom
clay/bestie-onboarding-refresh
Nov 10, 2026
Merged

delkc merged 11 commits into
mainfrom
clay/bestie-onboarding-refresh

Conversation

@delkc

@delkc delkc commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Why

People with no agents need a clear place to start without being sent into setup at launch. The pinned Bestie destination should introduce agents first, then explain Bestie after creation.

What

  • Show a rotating Create an agent shortcut and a Create your first agent landing page. Keep setup opt-in.
  • After first-agent creation, show a local welcome with that agent’s avatar and the normal incoming-message bubble. Explain the sidebar shortcut and Buzz help.
  • Keep agents from another account or community out of the shared inventory choices. Filter saved rows before deduplication in both host readers.
  • Center rotating and assigned Bestie avatars in the sidebar row.
  • Enable Bestie by default only on fresh local installs. Preserve existing explicit On/Off and legacy implicit Off in both browser and native storage.

How

Reuse the shared agent creation form, saved Bestie choice and canonical DM. A device-local receipt binds the welcome to the first verified DM for that account, community and agent. A measured timeline intro holds the welcome outside real message rows. It publishes no message, starts no model turn and adds no unread state or message actions. Existing-agent choices and replacements do not create a welcome.

Reuse the plugin settings stores and existing local-install detection. Save resolved Bestie choices through those owners; native default snapshots remain best effort. A deliberate settings reset uses the current On default. A new device, profile, or cleared browser storage counts as fresh, even for an older account.

Risk

The inventory correction affects all consumers of the shared saved-agent library on native and development-broker hosts. It changes no stored identities, membership or credentials and adds no relay reads. The welcome adds a presentation slot to the shared timeline; ordinary history, drafts, sending and threads keep their existing owners.

Main integration: merge commit f06f8d8e brings in main at 345d938c9 without rewriting feature commits. It preserves the local welcome alongside main’s shared Bestie DM launchers, Huddle, actions menu, settings and member controls. Both file conflicts are resolved, and GitHub reports the pushed head as mergeable. Human acceptance of this integrated/defaults build remains pending.

Testing

  • Before the latest main integration and default change, the human exercised the real native feature build: first-agent setup, community-scoped choices, sidebar appearance and the local welcome. They accepted the result and requested the final wording refinement.
  • Agent re-showed the local welcome in the same native build and verified its visible heading and closing text. No message or agent turn was triggered. Temporary replay code was removed.
  • Independent feature, host-scoping, presentation, combined-main and fresh-defaults and follow-up fixture reviews completed with no remaining blockers (9/10 or better).
  • One browser case was added and none removed. It controls an avatar rotation between native pointer-down and pointer-up to prove dock activation survives artwork replacement. That native targeting contract cannot be proved in jsdom. The new case failed in both engines before the six-line CSS fix; the full sidenav file then passed 20/20 in Chromium and WebKit with two workers and no retries. The existing colocated test still owns rotation, visibility and reduced-motion policy. The existing cold-start journey now proves fresh Bestie activation and opt-in setup; the upgrade journey proves implicit Off is preserved. The saved-settings journey covers enabling and disabling across reload. State permutations remain in the storage owners, with fail-before evidence for fresh On and legacy Off. Existing Chromium/WebKit journeys exercised the integrated dock, opt-in setup, retained drafts, thread/profile history and close behavior. Existing fixtures/selectors were updated for the creation invitation and Personal space fallback. No screenshot sweeps were run.
  • Historical browser baseline before this integration: the unchanged Alt+ArrowUp from a message link preserves native scroll ownership case fails in Chromium and WebKit. The same failure reproduces on the exact incoming main d3d69aaa2 in an isolated worktree. Main now binds that chord to Previous conversation; this PR does not change either contract. Across the initial five-file run and a full rerun of the two corrected files, 82 of 84 distinct cases pass. This was not one fully green 84-case run. No test retries or exclusions were added.
  • Focused local checks for the current defaults snapshot passed: bin/pnpm exec vitest run src/plugins/storage.test.ts src/plugins/storage.desktop.test.ts src/plugins/storage-imports.test.ts src/plugins/manager.test.ts (50 tests); bin/cargo test -p buzzodz-plugins (133 tests); bin/pnpm typecheck; and bin/pnpm test:browser tests/browser/plugin-defaults.spec.mjs --project chromium --project webkit --no-deps (10 cases). This is focused macOS evidence, not Linux CI parity.
  • Normal pre-push hooks passed on b16c75099: TypeScript, all selected unit tests, design checks and whole-workspace Clippy. DCO passed; hosted CI for this head remains pending.
  • Follow-up b16c75099 keeps rotating decorative artwork out of pointer hit testing, so its stable dock tab receives the press. Independent review found no blockers. Focused command: bin/pnpm exec playwright test --config tests/browser/playwright.ci.config.mjs tests/browser/sidenav-polish.spec.mjs --project chromium --project webkit --no-deps --workers=2 (20/20, macOS; not Linux CI parity). No navigation assertions, retries or timeout limits were weakened.
  • CI run 42690878853 on f06f8d8e tested synthetic merge 6988d0f against incoming main ac8d5fe1. The Bestie lost-click failure is addressed above. Both Chromium composer-growth React Add complete reaction toggles to the message menu #185 errors also reproduce on a clean exact-base ac8d5fe1 and on 6988d0f, using the unchanged two cases in both engines: Chromium fails both; WebKit passes both. This is focused macOS baseline evidence, not Linux parity or a fix. The separate composer defect remains outside this PR; current-head hosted CI is pending.
  • The latest conflict resolution passed an independent review with no blockers and 258 focused tests across 17 files: bin/pnpm exec vitest run src/bundled/bestie src/features/messages/ChannelTimeline.viewport.test.tsx src/app/shell/BestieNavigation.test.tsx src/app/entity-navigation.test.tsx src/plugins/storage.test.ts src/bundled/readmes.test.ts --maxWorkers=2. This covers both parents’ welcome/history and DM-control behavior; it is not browser/native acceptance.
  • Follow-up 60abd17c0 makes Bestie explicitly On in active-navigation fixtures and updates the declared-default expectation. All 51 tests passed with bin/pnpm exec vitest run src/app/entity-navigation.test.tsx src/app/pages.integration.test.mjs src/bundled/readmes.test.ts src/plugins/storage.test.ts. A stale Vitest file-module cache caused the separate README failure; documented --clearCache restored the unchanged contract. No assertions or hook checks were bypassed.
  • Before the default change, the integrated snapshot passed the native scoped identity-library and isolated IPC tests, plus 678 tests in 16 focused frontend/broker files. A controlled older-history gate now proves the welcome stays hidden until verified history reaches its start; a deliberate mutation demonstrated the timeline regression test fails when the intro is removed.
  • Deferred: human acceptance of the integrated build, welcome-specific geometry in both themes at narrow/enlarged-text sizes, protected custom-avatar rendering, and packaged/cross-platform acceptance. The existing Bestie workspace journey exercised both themes, narrow widths and enlarged text, without first-agent welcome provenance. Required CI on the pushed head, DCO and code-owner approval remain merge gates. No current native launch or live-data test was performed.

Generated with Goose

delkc and others added 2 commits November 6, 2026 08:39
Show a rotating creation shortcut and keep the first-agent welcome
local to its verified pinned DM. Scope saved agent inventory to the
current owner and community before projecting choices.

Co-authored-by: goose <[email protected]>
Signed-off-by: Clay Delk <[email protected]>
Keep the sidebar lifecycle case aligned with the approved unassigned label.

Co-authored-by: goose <[email protected]>
Signed-off-by: Clay Delk <[email protected]>
@delkc
delkc marked this pull request as ready for review November 6, 2026 15:01
@delkc
delkc requested a review from a team as a code owner November 6, 2026 15:01
@delkc
delkc requested a review from baxen November 6, 2026 19:53
Retain main's Bestie conversation workspace and dock while forwarding the local first-agent welcome. Reconcile navigation fixtures with the creation invitation and preserve Personal space fallback labels.

Co-authored-by: goose <[email protected]>
Signed-off-by: Clay Delk <[email protected]>
delkc and others added 4 commits November 9, 2026 10:33
Preserve main's timeline recovery and viewport filling alongside the
local first-agent welcome. Enable Bestie only for fresh local installs;
retain saved choices and implicit Off for existing profiles.

Co-authored-by: goose <[email protected]>
Signed-off-by: Clay Delk <[email protected]>
Keep navigation fixtures opted in while established installs retain\nBestie's former default. Match app composition's declaration check\nto the fresh-install default.

Co-authored-by: goose <[email protected]>
Signed-off-by: Clay Delk <[email protected]>
Preserve the first-agent welcome alongside the shared Bestie DM
launchers, actions menu, settings and member controls.

Co-authored-by: goose <[email protected]>
Signed-off-by: Clay Delk <[email protected]>
Keep native pointer activation on the stable dock control when its
decorative avatar changes during a press. Cover the pointer boundary
with a controlled rotation in both browser engines.

Co-authored-by: goose <[email protected]>
Signed-off-by: Clay Delk <[email protected]>

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

🤖 Princess Donut, approving on behalf of tho at their explicit request. Adversarial source review of b16c750 found no actionable blockers, including comparison against #2291 plugin-default preservation and an independent welcome/navigation pass. No new runtime tests were performed; integrated native acceptance, welcome layout, and protected custom-avatar validation remain deferred as documented.

delkc and others added 3 commits November 9, 2026 14:06
Combine the approved Bestie invitation with the current Activity sidebar
and Workflows dock expectations. No additional feature changes.

Co-authored-by: goose <[email protected]>
Signed-off-by: Clay Delk <[email protected]>
Use the existing Activity startup barrier rather than an optional Bestie
tab in the community-scoped navigation fixture. Preserve legacy Off.

Co-authored-by: goose <[email protected]>
Signed-off-by: Clay Delk <[email protected]>
Keep the incoming pinned-plugin update guidance alongside the approved
fresh-install Bestie defaults. No additional product edits.

Co-authored-by: goose <[email protected]>
Signed-off-by: Clay Delk <[email protected]>
@delkc
delkc removed the request for review from baxen November 9, 2026 22:59
matt2e added a commit that referenced this pull request Nov 10, 2026
## Summary

On the Bestie page, ⌘F (Ctrl+F) opened nothing and ⌘K (Ctrl+K) had no
"Search conversation with <name>" row. `PageSearch` only recognised a
`conversation` navigation target as the current conversation, and the
Bestie page is a `page` target that presents the promoted Bestie DM.

`PageSearch` now derives the current channel from the conversation
target's channel, or, on the Bestie page, from the shell's Bestie
projection via `useBestieConversation` (provided by `AppShell` above
it). That channel drives the ⌘F guard, the scoped search and ⌘K's "This
conversation" row. Other `page` targets still open nothing with ⌘F. The
header menu is out of scope.

## Before / after

Left is `main` (58116b8), right is this branch. The fixture runs on
Linux, so the shortcuts show as Ctrl+F and Ctrl+K. Both sides start on
an ordinary DM with Ada, where Ctrl+F already works, then switch to the
Bestie page ("Bestie · Pollen").


https://github.com/user-attachments/assets/c4871a39-f5d1-4c28-bca7-ce4b87db5e2e

![Ctrl+F on the Bestie page: main opens nothing (left); the fix opens a
search scoped to Pollen that finds "gym"
(right)](https://github.com/user-attachments/assets/331488a6-7be9-4c7c-a5b6-216d1c1d4ce1)

Ctrl+F on the Bestie page: main opens nothing (left); the fix opens a
search scoped to Pollen that finds "gym" (right).

![Ctrl+K on the Bestie page: main shows only Recent activity (left); the
fix adds "Search conversation with Pollen" under This conversation
(right)](https://github.com/user-attachments/assets/6792ab2d-fdfb-400a-ae32-80ccdcbe5a1a)

Ctrl+K on the Bestie page: main shows only Recent activity (left); the
fix adds a "Search conversation with Pollen" row under This conversation
(right).

## Commits

- b5135e9 `fix(search): make Command F search the Bestie
conversation` — `PageSearch` takes the current conversation from the
conversation target or, on the Bestie page, from
`useBestieConversation`; tests for ⌘F and the ⌘K row scoped to the
Bestie DM, and for ⌘F opening nothing on another page; Bestie README and
Buzz help updated.
- 2ea0ff5 `refactor(search): name the Bestie page check and cover
other conversations` — adds `isBestiePage(target)` next to `BESTIE_PAGE`
in `bestie-context.ts`, makes `useBestieConversation` require a session
explicitly, and tests that ⌘F on another DM with a Bestie DM present
scopes to that DM.
- 86f4ffc `docs(bestie): mention Command K's conversation row on the
Bestie page` — Buzz help mentions the ⌘K "Search conversation with" row.

## Testing

- Typecheck and lint pass.
- PageSearch, BestieNavigation and ChannelInventory suites: 119/119.
- Full `vitest run`: 20,060 passed, 27 skipped, 0 failed.
- Still to do: the native-app run that `AGENTS.md` requires (agent, then
human). The reproduction and recording used a browser fixture with a
device-local Bestie choice.

## Related PRs

Open PRs #2775 and #2804 touch `bestie-context.ts` only cosmetically and
do not conflict with this change.

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

---------

Signed-off-by: mtoohey <[email protected]>
Signed-off-by: Matt Toohey <[email protected]>
Co-authored-by: Claude Opus 5.5 <[email protected]>
@delkc
delkc merged commit d5288ac into main Nov 10, 2026
218 of 222 checks passed
@delkc
delkc deleted the clay/bestie-onboarding-refresh branch November 10, 2026 13:29
damienrj added a commit that referenced this pull request Nov 10, 2026
…rminal-font-picker

* 'main' of https://github.com/block/buzz-app: (168 commits)
  Unify Membership sharing and live roster updates (#3147)
  fix(activity): show one working cue per agent request (#3166)
  Introduce opt-in first-agent setup (#2804)
  fix(codex): drop the security-review sign-in prompt from harness defaults (#3188)
  feat(releases): publish desktop download manifest (#3154)
  fix(mcp): preserve current attachments across edits (#2937)
  fix(agents): call the Claude and Codex first-run download "the integration" (#3165)
  chore(goose): bump bundled goose-acp to v1.58.1 (#3161)
  Revert "ci: use larger GitHub runners for Rust and browser journeys (#3090)" (#3180)
  Show Goose's unset thinking level as Default, not Off (#3124)
  ci(release): publish stable and beta desktop releases from v tags (#3150)
  fix(messages): end the New messages hold when no repair can sample (#3169)
  fix(search): make Command F search the Bestie conversation (#3084)
  fix(plugins): keep failed update checks on the plugin's Settings row instead of a toast (#3088)
  Show single-agent Stop on the activity bubble (#3140)
  fix: support explicit hosted browser origins (#3149)
  fix: keep Codex tool namespace descriptions bounded (#3128)
  fix(messages): show "New messages" in channels longer than one page (#3071)
  Keep shared agent guidance generic (#3134)
  fix(typing): a thread reply also ends the agent's channel-level typing (#3148)
  ...

Signed-off-by: damienrj <[email protected]>

# Conflicts:
#	src-tauri/Cargo.toml
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