Skip to content

feat(bestie): pin the saved Bestie DM - #1935

Merged
delkc merged 27 commits into
mainfrom
clay/bestie-pinned-nav
Nov 2, 2026
Merged

delkc merged 27 commits into
mainfrom
clay/bestie-pinned-nav

Conversation

@delkc

@delkc delkc commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Why

#1546 was the first step: it gave us one account-synced Bestie choice and put the Bestie label and Make my bestie action on agent cards. That’s merged now, and it gives desktop and Kenny’s mobile work the same main-agent record to build on.

This PR is the next layer. It turns that saved choice into a useful home in the left nav without inventing another kind of chat or another place to save who your Bestie is.

What

When you’ve chosen a Bestie, the existing Bestie row takes on their name and avatar and opens your one-to-one DM with them. If that DM already exists, we reuse it. If it doesn’t, Buzz opens one through the normal DM path.

That DM keeps everything it already has—history, drafts, threads and unread state. While it’s pinned, we leave it out of the regular Messages list so the same conversation doesn’t show up twice. Change your Bestie and the old DM goes back where it was.

Search shows the saved agent’s name and avatar in Pages, with Bestie as supporting text. The result matches either Bestie or the agent’s name and opens the pinned DM. Agent results remain separate New chat actions by exact public key. Namesakes use an owner name when available and a public-key suffix when it is not.

How

The pinned destination reads the main-agent choice from #1546, then looks for a verified, unarchived DM where the only other member is that exact public key. Solo chats, group DMs, namesakes and unverified rosters don’t count.

This is presentation on top of the existing owners, not a new messaging system. The normal conversation, DM, draft, thread and unread services still do the work. The page also keeps explicit loading and recovery states, so a failed account or agent read doesn’t quietly send someone into a different setup flow. Thread visits use shared navigation history, so Back and Forward restore them while Close retires them. Failed DM retries keep the focused action mounted and announce another failure.

What’s not in this PR

Riley’s Builderlab setup is still there when the account has no saved Bestie. It still creates a hosted Bestie and its private Solo home exactly as it does today.

This PR does not make that setup write main-agent or move the hosted Bestie into the canonical DM flow. That’s the next integration step: have setup finish by saving through the same account owner, then hand off to this pinned DM. Keeping that separate lets us land and review the navigation/DM behavior without rewriting Riley’s onboarding at the same time.

Risk

Bestie is still an optional plugin. This changes its navigation and conversation presentation, but adds no new persistence, signing, membership or message path. The CI follow-up also changes one shared AlertDialog tab stop so WebKit can reach Close with Shift+Tab. Initial focus and pending dismissal rules stay unchanged.

Where this is now

Merged main at 163985b5e without rewriting branch history. The two browser conflicts use main’s current history and reaction fixtures; its row-relative disclosure check replaces the earlier local motion barrier.

Both open review findings are fixed in separate commits, and their threads are resolved:

  • 559abccdc: a rejected replacement keeps the last confirmed account Bestie, rather than restoring the initial read or an old read error. Retry in the same confirmation submits another save.
  • aa2488728: agent discovery failure no longer blocks an already-verified exact DM while its ordinary Messages row is hidden. Missing-chat creation still requires current eligibility; archive and confirmed-absence exclusions remain.

Each reported defect failed its new mounted regression before the fix and passed afterward. Independent source review found no blockers in either fix or the main integration. The browser cases added/removed in this round are 0/0; the conflict resolutions use upstream coverage rather than duplicate it.

The extra local validation on this snapshot passed: 368 focused owner/integration tests, 76 cases across Chromium and WebKit for the three upstream browser files, and seven browser-routing integration checks. Command for the browser pass: bin/pnpm exec playwright test tests/browser/history-loading.spec.mjs tests/browser/message-actions.spec.mjs tests/browser/reactions-polish.spec.mjs --config tests/browser/playwright.ci.config.mjs --project chromium --project webkit --no-deps --workers=2. This macOS pass does not establish Linux CI or native acceptance.

The first push exposed two stale Attention fixtures also failing on main (41456572399). Reused the existing upstream two-line fix as e1aee1684; both full files passed (417 tests, one skipped). All push hooks then passed. Fresh Linux CI passed on e1aee1684, including the required CI and DCO checks. GitHub reports no merge conflicts or unresolved review threads.

Thread visits remain bound to their original DM: changing Bestie retires incompatible old visits and opens the current chat. No new signing, membership, storage or messaging path was added.

I tested the full flow in the desktop build before the final rebase: changed Bestie, opened the pinned DM, watched the old DM return to Messages, and checked ordinary agent search. The remaining acceptance gap is to repeat that pass on the current head, including thread Back/Forward/Close, failed-retry focus, namesake distinctions, and light/dark and narrow/wide checks.

What comes next

  1. Finish the rebased desktop acceptance pass and get this PR reviewed.
  2. Align Riley’s hosted setup with main-agent and hand it off to the canonical DM.
  3. Keep desktop and Kenny’s mobile experience on that same account-synced choice as we bring the full flow together.

Generated with Goose

@delkc
delkc marked this pull request as ready for review October 29, 2026 21:53
@delkc
delkc requested a review from a team as a code owner October 29, 2026 21:53

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

🤖 Star Lord’s automated source review via Wes’s account, integrating Rocket, Mantis and Groot coverage.

Four actionable P2 findings are attached inline: disconnected-session setup fallback, stale account-read failure/selection loss, thread navigation history, and retry focus.

Reviewed head bcf39c10467df4b13d740c0ebb2423f07885f2f1 against base/merge-base 5b2fdd6999f93fec0c06f8d9f021f05523c85951, using immutable source objects. The public PR description contains no attached images; no additional concrete publication-surface issue was found in the inspected description and patch.

Source-only: no tests, builds, PR code or app execution. CI was not assessed. Native/live-relay behavior, performance, visual/accessibility interaction checks and the rebased human acceptance pass remain unverified. This COMMENT is feedback, not approval or merge authorization.

Comment thread src/bundled/bestie/index.tsx Resolved
Comment thread src/features/solo/default-agent.ts Resolved
Comment thread src/bundled/bestie/PinnedBestie.tsx Resolved
Comment thread src/bundled/bestie/PinnedBestie.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.

🤖 Star Lord’s automated source review via Wes’s account, integrating Rocket, Mantis and Groot coverage.

Follow-up to the prior review at bcf39c10467df4b13d740c0ebb2423f07885f2f1: the disconnected-session setup fallback, stale rejection after a confirmed choice, and failed-DM-retry focus cases are repaired in source. Thread opening now uses navigation history. Two P2 defects introduced by the fixes remain, attached inline: failed first-choice saves can strand account adoption, and explicit thread Close retires only the latest visit.

Reviewed head a9ebdfaae38ed6521ec236eb79e96510275e0fef against base 5b2fdd6999f93fec0c06f8d9f021f05523c85951, focusing on the nine-file follow-up delta and affected callers. Public PR description and commit messages inspected; the description has no attached images. No new publication-surface finding.

Source-only review: no tests, builds, app launches or PR-code execution. The one-time hosted check snapshot had three browser shards still running, with Windows validation and the browser flake check skipped; completed checks shown were successful. Native behavior, rendered focus/screen-reader announcements, themes, narrow layouts, performance and current-head human acceptance remain unverified. This is a COMMENT review, not approval.

Comment thread src/features/solo/default-agent.ts Resolved
Comment thread src/bundled/bestie/PinnedBestie.tsx Resolved
@delkc
delkc requested a review from wesbillman October 30, 2026 14:37
delkc and others added 14 commits October 30, 2026 10:38
Show the saved Bestie identity in page search while preserving Bestie as a searchable detail. Carry display owner metadata through directory results so agent namesakes use readable owner qualifiers before key suffixes.

Co-authored-by: Buzzsaw <a760f3ee1dc0daf403313e35766d0d983a8898aaa9ca95a034727165c63a8680@claysworld.communities.buzz.xyz>
Signed-off-by: Clay Delk <[email protected]>
Co-authored-by: Buzzsaw <a760f3ee1dc0daf403313e35766d0d983a8898aaa9ca95a034727165c63a8680@claysworld.communities.buzz.xyz>
Signed-off-by: Clay Delk <[email protected]>
Co-authored-by: Buzzsaw <a760f3ee1dc0daf403313e35766d0d983a8898aaa9ca95a034727165c63a8680@claysworld.communities.buzz.xyz>
Signed-off-by: Clay Delk <[email protected]>
@delkc
delkc force-pushed the clay/bestie-pinned-nav branch from a9ebdfa to a0f4350 Compare October 30, 2026 15:14

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

🤖 Star Lord’s automated source review via Wes’s account, integrating Rocket, Mantis and Groot coverage.

Follow-up to a9ebdfaae38ed6521ec236eb79e96510275e0fef: the initial-read/failed-first-save paths now settle, and explicit thread Close retires repeated visits. One new P2 regression in the failed-save recovery remains, attached inline: a later rejected replacement overwrites the last confirmed Bestie with the initial account-read value.

Reviewed head a0f4350294c7e0e34a24ac3e72c497c6a9ad7db8 against base bf20e085c4b093a9d393785d6d6b1cc3f07cc521, focusing on the fixes and affected callers after the rebase. Public PR description and commit messages inspected; no attached images or new concrete publication-surface finding.

Source-only: no tests, builds, app launches or PR-code execution. The one-time hosted check snapshot showed CI required successful; Windows validation and browser flake checks were skipped. Native/live behavior, rendered focus and screen-reader interaction, themes/layouts and current-head human acceptance remain unverified. This COMMENT is feedback, not approval.

Comment thread src/features/solo/default-agent.ts Resolved
@delkc
delkc marked this pull request as draft October 30, 2026 17:06
Wait for Virtua idle and deliver the programmatic drag's scroll event in the same task. Keep genuine unmount, remount and reading-position assertions.

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

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

🤖 Star Lord’s automated source follow-up via Wes’s account, integrating Rocket, Mantis and Groot coverage.

No new actionable findings in the one-file follow-up from 862dbbc133137e7b1c7db5717627f9b0d5c3528e. The history-loading test now waits on the existing Virtua idle helper and delivers the programmatic scroll event in the observer’s task. It retains actual row removal, remount/offscreen and reading-anchor assertions. The adjacent journey retains browser-delivered events after programmatic offset changes; neither is physical scrollbar-thumb acceptance.

The existing P2 save-recovery finding still applies in unchanged src/features/solo/default-agent.ts:91–113: read A → confirmed save B → rejected replacement C restores A rather than the last confirmed choice B. Preserve the confirmed choice on later failure and cover replacement-dialog retry. This review links the original finding without duplicating its inline comment.

Reviewed head 22c7f97975e8acf336f36566ba6cabda32780143, base 1e65c90662f655c37d83112076c6d8639ae0c984, using pinned source objects. Public description and 19 commit messages inspected; no attached images or new concrete publication-surface finding.

Hosted CI run 41162314499 failed on WebKit coordination-text movement in message-actions.spec.mjs, outside this follow-up; cause unresolved. Saved advisory shard 3 artifacts contain 38 passing history-loading cases per engine (two repetitions), including this case. Chromium: 175.1s wall / 325.6s summed test execution; WebKit: 215.7s / 409.7s. Counts and slowest tests/files were inspected. CI ran merge 063d63e2 with the reviewed head/base parents; its tree matches the reviewed head. No comparable before/after cost baseline or proof that flakes are eliminated.

Source-only: no local tests, builds, app launches or PR-code execution. Native/live behavior, rendered focus/accessibility, layouts/themes and current-head human acceptance remain unverified. This COMMENT is feedback, not approval or merge authorization.

delkc and others added 2 commits October 30, 2026 23:18
Capture coordination disclosure alignment after its ancestor motion finishes, not just after vertical geometry settles. Keep the animated first-line checks unchanged.

Co-authored-by: Goose <[email protected]>
Signed-off-by: Clay Delk <[email protected]>
Use an explicit tab stop after entry so WebKit reverse navigation reaches Close. Preserve the default initial focus and pending dismissal guards.

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

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

🤖 Star Lord’s automated source follow-up via Wes’s account, integrating Rocket, Mantis and Groot coverage.

No new actionable findings in the two-file delta from 22c7f97975e8acf336f36566ba6cabda32780143. AlertDialog now explicitly puts Close in the Tab order after initial focus enters while retaining initial-focus overrides and pending dismissal guards. The coordination test waits for ancestor entrance animations before measuring horizontal alignment; its disclosure assertions, case count and fixture volume are unchanged. Component focus coverage is RTL/jsdom, not native browser proof.

The existing P2 save-recovery finding still applies in unchanged src/features/solo/default-agent.ts:91–113: initial read A → confirmed save B → rejected replacement C restores A instead of B, which can also invalidate the replacement dialog’s retry guard. Preserve the last confirmed choice on later save failure and cover dialog retry. This review links the existing finding without duplicating the inline comment.

Reviewed head 17b23190dd3431c06be40b43eacf0fb141a1b9ef, base 1e65c90662f655c37d83112076c6d8639ae0c984, using immutable source objects and affected callers. Public description and commit messages inspected; no attached images or new concrete publication-surface finding.

Hosted CI 41165447774 failed: Chromium journeys 8/9 has a reaction-tooltip visibility failure; Chromium flake 1/4 times out waiting for a history row to unmount. Causes remain unresolved. CI merge 72b696ef has the reviewed parents and the same tree as the reviewed head. Inspected counts/wall/summed execution: journeys Chromium 8, 111 passed/1 failed, 334.0s/632.7s; flake Chromium 1, 58/1, 298.8s/424.9s; flake WebKit 1, 59/0, 588.7s/893.8s. Slowest-test/file evidence was checked. These artifacts contain two passing repetitions of the changed coordination case per engine; they do not establish all repetitions, a before/after cost improvement, or elimination of flakes.

Source-only: no local tests, builds, app launches or PR-code execution. Native/live behavior, rendered focus/accessibility, themes/layouts and current-head human acceptance remain unverified. This COMMENT is feedback, not approval or merge authorization.

delkc and others added 2 commits October 31, 2026 00:15
Start near the newest rows so the upward drag cannot clamp at the loaded top. Assert available travel before preserving the existing unmount, remount, growth, and reading-position checks.

Co-authored-by: Goose <[email protected]>
Signed-off-by: Clay Delk <[email protected]>
Keep failed-image recovery from changing layout during the popup geometry check. Use a local valid-media response like the neighboring reaction test, preserving every positioning assertion.

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

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

🤖 Star Lord’s automated source follow-up via Wes’s account, integrating Rocket, Mantis and Groot coverage.

No new actionable findings in the two test-only commits since reviewed head 17b2319. The existing P2 Bestie save-recovery finding remains applicable; this follow-up does not resolve it or duplicate its inline comment.

The history test now starts with more upward travel and explicitly checks the no-clamp prerequisite while retaining actual unmount, remount, late-growth and anchor assertions. The reaction geometry test supplies valid local artwork before navigation and preserves centering, above-anchor and dismissal checks. Browser cases added/removed: 0/0; both contracts require real layout/virtualization. Production source is unchanged from the prior reviewed head. The public description and commit text were inspected; no attached images or new disclosure finding.

Reviewed head: 05b1b62
Base: 1e65c90

Validation: source-only; no local tests, builds or app execution. CI run 41168028107 was still in progress at the snapshot. Saved Chromium 8/9 and WebKit 13/14 reports show 112 and 71 passes, including the changed reaction case (4.337s/7.233s). Their timing reports show 239.7s/314.9s wall time and 450.0s/571.8s summed test execution; slowest files were profiles.spec.mjs (79.7s/163.1s). These ran integration merge cfd6991, combining this head with newer base 662e918; its tree differs from the reviewed head. This is sampled hosted evidence, not a complete CI pass or a before/after cost comparison. History repetitions, native acceptance, assistive technology and elimination of all flakes remain unverified by this review.

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

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

Comment thread src/app/shell/BestieNavigation.tsx Resolved
delkc and others added 4 commits November 2, 2026 09:14
Resolve the history and reaction fixture conflicts with their current main versions. Drop the superseded thread-entrance barrier in favor of main’s row-relative disclosure assertions.

Co-authored-by: Goose <[email protected]>
Signed-off-by: Clay Delk <[email protected]>
Restrict initial-read recovery to unsettled adoption. A rejected replacement must retain the latest confirmed Bestie and leave its dialog retry able to save again.

Co-authored-by: Goose <[email protected]>
Signed-off-by: Clay Delk <[email protected]>
Render an existing exact DM under the same promotion policy as navigation. Keep missing-chat creation behind current agent eligibility and preserve archive and confirmed-absence exclusions.

Co-authored-by: Goose <[email protected]>
Signed-off-by: Clay Delk <[email protected]>
provide the watch presenter in the recent-event fixture and expect the custody protection revision in the source-output test.

Co-authored-by: am <6e30cd56c30e030cd31bb0939b94a7c257c9a09d5ba2d92cf2735da45629f248@buzz.block.builderlab.xyz>
Signed-off-by: Kalvin Chau <[email protected]>
Signed-off-by: Clay Delk <[email protected]>
@delkc
delkc requested review from kazemek21 and wesbillman November 2, 2026 14:51

@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 the PR and the Nexus review-tracker notes. Approved with the non-blocking sidebar-preference comment below.

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

// releasing this destination restores the ordinary DM row.
const showDm = hiddenDms.show;
useEffect(() => {
if (promotedDm) showDm([promotedDm]);

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 prior sidebar removal during promotion

This clears the persisted hidden-dms entry whenever the sidebar mounts, even if the user never opens Bestie. A previously removed DM therefore reappears after changing Bestie or disabling the plugin. Could we keep promotion presentation-only and preserve that preference until an explicit open/unhide action?

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

@delkc
delkc merged commit baeefef into main Nov 2, 2026
41 checks passed
@delkc
delkc deleted the clay/bestie-pinned-nav branch November 2, 2026 17:26
kalvinnchau added a commit that referenced this pull request Nov 2, 2026
## Problem

`main` CI is red: all four `JavaScript (n/4)` jobs fail at `tsc
--noEmit` (e.g. run 41491229758 on `baeefef1e`):

```
src/bundled/bestie/PinnedBestie.test.tsx(560,11): error TS2739: ... is missing the following properties from type 'PageNavigation': position, savePosition
```

## Cause

Semantic merge conflict between two PRs that were each green on their
own:

- #1960 (`dd898a7c6`) made `position(key)` and `savePosition(key,
value)` required members of `PageNavigation`
(`src/features/navigation/service.ts`) so pages can restore the reader's
place on Back.
- #1935 (`baeefef1e`, pin the saved Bestie DM) added a hand-built
`PageNavigation` stub in `PinnedBestie.test.tsx` that was written
against the older shape.

## Fix

Add `position: () => undefined` and `savePosition() {}` to the stub.
This is the same no-op stub used by the other page tests (e.g.
`src/bundled/agents/AgentsPage.test.tsx:678`). Test-only change, no
production code touched. Pinned Bestie doesn't use saved positions, so a
no-op stub keeps the test's behavior as-is.

## Validation

- `bin/pnpm exec tsc --noEmit`: clean
- `bin/pnpm exec vitest run src/bundled/bestie/PinnedBestie.test.tsx`:
14/14 pass
- Pre-commit hooks (biome, icons, literal-names, sadscan) pass

Not run locally: the full Vitest shards and browser suites. This PR's CI
covers those.

Signed-off-by: Kalvin Chau <[email protected]>
Co-authored-by: hax <[email protected]>
rileycrane added a commit that referenced this pull request Nov 2, 2026
Ports Clay's Choose your bestie from #1935's pre-revert head f789630: with
no saved Bestie, the Bestie page offers the viewer's eligible agents and the
shared New agent dialog in place of Builderlab's hosted setup. The plugin
keeps registering the stack's Bestie tabs, check-in cleanup and
onBestieMade alongside the page.

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

Co-authored-by: eggboy <3986e5374b8c11a274f4a53fa9a68e1e18b53e712f8aa5218add2485bf5a2b09@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: Riley Crane <[email protected]>
rileycrane added a commit that referenced this pull request Nov 2, 2026
Ports Clay's Choose your bestie from #1935's pre-revert head f789630: with
no saved Bestie, the Bestie page offers the viewer's eligible agents and the
shared New agent dialog in place of Builderlab's hosted setup. The plugin
keeps registering the stack's Bestie tabs, check-in cleanup and
onBestieMade alongside the page.

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

Co-authored-by: eggboy <3986e5374b8c11a274f4a53fa9a68e1e18b53e712f8aa5218add2485bf5a2b09@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: Riley Crane <[email protected]>
rileycrane added a commit that referenced this pull request Nov 2, 2026
Ports Clay's Choose your bestie from #1935's pre-revert head f789630: with
no saved Bestie, the Bestie page offers the viewer's eligible agents and the
shared New agent dialog in place of Builderlab's hosted setup. The plugin
keeps registering the stack's Bestie tabs, check-in cleanup and
onBestieMade alongside the page.

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

Co-authored-by: eggboy <3986e5374b8c11a274f4a53fa9a68e1e18b53e712f8aa5218add2485bf5a2b09@buzz.block.builderlab.xyz>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Signed-off-by: Riley Crane <[email protected]>
@klopez4212

Copy link
Copy Markdown
Contributor

🤖 Kenny asked me to align mobile with the current pinned desktop Bestie: for now, Bestie should use the normal one-to-one DM experience on both platforms, including the usual threads/replies, while preserving the existing DM and history.

Desktop #1935 already describes that contract. Mobile block/buzz#8890 went the other way by flattening replies and disabling thread actions, based on the earlier desktop popup. The mobile follow-up should remove that special presentation and reuse the normal DM view.

@delkc @brow Please flag any conflicting work or interaction detail we should preserve. This is a change of direction for the mobile presentation, not a request to migrate messages or create a new Solo chat.

delkc added a commit that referenced this pull request Nov 3, 2026
## Why

The pinned Bestie DM from #1935 needs a clear starting point when no
Bestie is saved. The old page instead launches a separate Builderlab
setup flow. This replaces that path with one chooser for existing agents
and new agents.

## What

- Explain what a bestie means, then offer a searchable picker with
avatars, names, and distinct identity labels.
- Open the picker below its field, capped at roughly four avatar rows,
with search above scrollable results.
- Reuse **Create agent**, save the choice to the account, and open the
canonical DM.
- Keep remote agents eligible, but ask before saving: “Some bestie
features aren’t available with remote agents.” Cancel leaves the choice
unchanged and keeps any newly created agent.
- Show the chooser in place when the saved agent is gone, and clear the
account choice after completed deletion.

## How

The chooser uses `session.agentChoices`, the shared creation dialog, the
existing `main-agent` record, and the pinned DM from #1935. It adds no
messaging path or remote capability setup. The shared Combobox gains an
opt-in compact popup; other callers keep their current behavior.

Deletion checks the current account record before writing `agent: null`.
Native signing now admits that cleared value. Existing browser journeys
retain their plugin/default and navigation contracts with the new
heading; browser cases added/removed: **0/0**. The retired hosted-setup
UI assertions are replaced by mounted chooser/save/recovery coverage.

## Risk

This removes the separate Builderlab-specific Bestie onboarding, not
Builderlab agent creation. The remote warning does not turn on memory or
check-ins. Account cleanup is a read/replace, not an atomic
compare-and-swap: another device's choice in that gap can be
overwritten. A cleanup error reports that deletion completed but the
Bestie choice could not be cleared.

## Testing

Clay tried the running native app and iterated on the empty-state copy,
searchable picker, and popup size/placement. The remote confirmation was
opened through the production chooser in an isolated Chromium fixture
with a sample hosted agent; no real agent was created or account choice
saved.

Still deferred: live Builderlab creation → confirmation → account save →
DM; deletion and reload persistence on the rebased head; native
remote-warning focus behavior; and the full light/dark, viewport, and
enlarged-text acceptance pass. These checks remain outstanding; this PR
does not claim completed acceptance.

## Bigger picture

#1935, Riley’s Bestie tab (#2034), and its memory switch (#2035) are
merged. This branch includes main through `23338bc84`, preserving both
alongside the empty-state chooser.

**Overlap with Riley's #2047:** both replace the empty Bestie page and
clear a deleted choice. This PR contains the chooser UI Clay tested
today. Riley's PR sits above the Bestie settings/memory/check-in stack,
restricts Bestie to local agents, and wires selection into that setup.
This PR deliberately allows remote agents with a warning. The tab and
memory switch have landed independently. This chooser remains compatible
with both; later check-in and setup work must preserve the remote-agent
policy. That follow-up must reconcile the duplicate chooser/deletion
work and handle nonlocal capabilities without silently restoring a
local-only restriction. No changes to Riley's branches are included
here.

Generated with Goose

---------

Signed-off-by: Clay Delk <[email protected]>
Co-authored-by: Buzzsaw <a760f3ee1dc0daf403313e35766d0d983a8898aaa9ca95a034727165c63a8680@claysworld.communities.buzz.xyz>
Co-authored-by: Codex <[email protected]>
Co-authored-by: Goose <[email protected]>
klopez4212 added a commit to block/buzz that referenced this pull request Nov 3, 2026
Mobile Bestie used a special flat timeline that hid reply threads. It
now opens the normal DM screen, matching desktop’s pinned Bestie
(block/buzz-app#1935), with existing threads, reply actions, and
top-level sending in the same conversation.

Thread-scoped agent typing in DMs stays beneath its originating message.
Working avatars and mobile’s bouncing dots share a compact neutral
container, matching desktop’s subtle activity control. The elbow is
visible from the start, with the working container already at the final
thread-footer position. For a single-agent reply, the same avatar stays
mounted while the container and dots fade out over 200 ms, the avatar
slides into its summary position, and the reply count fades/scales in
from 95%. The elbow stays fixed. Reduced motion switches immediately.
The avatar-to-dots gap is 4 points. Reply text uses its natural line
height so its glyphs center on the avatar and elbow rather than drawing
at the top of the footer. Multi-participant summaries retain their
grouped layout. The accessible View thread action, reaction placement,
and final reply-footer position are preserved.

Validation:
- The final commit (`c6fef5d80`) passed full analysis, 4,220 Flutter
tests (40 skipped), 4 push-configuration tests, and 27 crypto tests.
- Container alignment checks pass in both directions, including avatar
continuity, intermediate fade and final geometry, reduced motion, and
thread actions. Glyph-box alignment is checked against the avatar
center. An additional regression covers a reply arriving before typing
stops and work restarting mid-transition.
- Updated DM journeys cover opening Bestie, existing threads, threaded
and top-level sending, swipe-to-reply, and absence of duplicate main-row
thread typing.
- Installed the final product source (`c6fef5d80`) in place on Pixel 10
and iPhone Air previews. The iPhone uses a release-mode preview so it
launches from the home screen; saved Kenny Lopez / Starry Night
conversation verified after install. Pixel retains Testing Agent
Sessions. The pending/midpoint/completed handoff was rendered in widget
checks, and the corrected reply-label alignment was verified on the
Pixel against the same messages before and after; human acceptance of
this final animation remains pending.
- Mandatory push hooks passed, including file-size and branch checks. A
rendered widget preview verifies the container and elbow; live
acceptance remains pending.

Self-review found no blockers in the changed paths. Review status is
preserved.

---------

Signed-off-by: kenny lopez <[email protected]>
Co-authored-by: Terp <5856f6900e8e0a4e0ea1f4f8d2ee33e4753d2119bc122f94ecafc660b46c0511@buzz.block.builderlab.xyz>
arividar pushed a commit to minniai/minni-buzz-app that referenced this pull request Nov 4, 2026
## Why

The pinned Bestie DM from block#1935 needs a clear starting point when no
Bestie is saved. The old page instead launches a separate Builderlab
setup flow. This replaces that path with one chooser for existing agents
and new agents.

## What

- Explain what a bestie means, then offer a searchable picker with
avatars, names, and distinct identity labels.
- Open the picker below its field, capped at roughly four avatar rows,
with search above scrollable results.
- Reuse **Create agent**, save the choice to the account, and open the
canonical DM.
- Keep remote agents eligible, but ask before saving: “Some bestie
features aren’t available with remote agents.” Cancel leaves the choice
unchanged and keeps any newly created agent.
- Show the chooser in place when the saved agent is gone, and clear the
account choice after completed deletion.

## How

The chooser uses `session.agentChoices`, the shared creation dialog, the
existing `main-agent` record, and the pinned DM from block#1935. It adds no
messaging path or remote capability setup. The shared Combobox gains an
opt-in compact popup; other callers keep their current behavior.

Deletion checks the current account record before writing `agent: null`.
Native signing now admits that cleared value. Existing browser journeys
retain their plugin/default and navigation contracts with the new
heading; browser cases added/removed: **0/0**. The retired hosted-setup
UI assertions are replaced by mounted chooser/save/recovery coverage.

## Risk

This removes the separate Builderlab-specific Bestie onboarding, not
Builderlab agent creation. The remote warning does not turn on memory or
check-ins. Account cleanup is a read/replace, not an atomic
compare-and-swap: another device's choice in that gap can be
overwritten. A cleanup error reports that deletion completed but the
Bestie choice could not be cleared.

## Testing

Clay tried the running native app and iterated on the empty-state copy,
searchable picker, and popup size/placement. The remote confirmation was
opened through the production chooser in an isolated Chromium fixture
with a sample hosted agent; no real agent was created or account choice
saved.

Still deferred: live Builderlab creation → confirmation → account save →
DM; deletion and reload persistence on the rebased head; native
remote-warning focus behavior; and the full light/dark, viewport, and
enlarged-text acceptance pass. These checks remain outstanding; this PR
does not claim completed acceptance.

## Bigger picture

block#1935, Riley’s Bestie tab (block#2034), and its memory switch (block#2035) are
merged. This branch includes main through `23338bc84`, preserving both
alongside the empty-state chooser.

**Overlap with Riley's block#2047:** both replace the empty Bestie page and
clear a deleted choice. This PR contains the chooser UI Clay tested
today. Riley's PR sits above the Bestie settings/memory/check-in stack,
restricts Bestie to local agents, and wires selection into that setup.
This PR deliberately allows remote agents with a warning. The tab and
memory switch have landed independently. This chooser remains compatible
with both; later check-in and setup work must preserve the remote-agent
policy. That follow-up must reconcile the duplicate chooser/deletion
work and handle nonlocal capabilities without silently restoring a
local-only restriction. No changes to Riley's branches are included
here.

Generated with Goose

---------

Signed-off-by: Clay Delk <[email protected]>
Co-authored-by: Buzzsaw <a760f3ee1dc0daf403313e35766d0d983a8898aaa9ca95a034727165c63a8680@claysworld.communities.buzz.xyz>
Co-authored-by: Codex <[email protected]>
Co-authored-by: Goose <[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.

5 participants