Repository navigation
fix(identity): never strand first run on a key another account holds - #2996
Merged
Merged
Conversation
Signing in to a Builderlab account with no linked key could end on "Couldn't finish setup" with only Try again, which repeated the same refused link forever: - Setup silently saved installed old Buzz's key for an account with no key. When that key was already linked to another account (as after Sign out of Buzz and signing in as someone else), Builderlab refused the link, and the key stayed on the device, so every later sign-in met the same refusal. - A key already on the device was linked the same way, with the same dead end when it belonged to another account. Old Buzz's key is now linked before it is saved: native signs the link challenge with it from one read of old Buzz's storage, only while no key is saved, and keeps that key in memory so the save uses the same key. First run saves it once the account holds it, and otherwise makes a new key. A device key Builderlab refuses as another account's (pubkey or identity already bound) goes to the replace decision, which now always asks. When that key has a confirmed backup, the dialog says so and tells the user to sign in to that account again to restore it. A setup that fails after the key exists now offers Use a different account next to Try again. It signs out of Builderlab and returns to the landing with the key kept, and the next sign-in asks the account again. 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>
…one exit A first run that linked old Buzz's key and then stopped before saving it (a failed save, or Buzz quit in between) left the account holding a key this device lacked. The next sign-in rested on Welcome back, which could only take the nsec or start over. When the linked key isn't backed up, setup now checks old Buzz's key first: native saves it only when it is the account's key, and setup then backs it up and continues as a returning account would. The setup failure page offered Back or Use a different account depending on whether this run had made the key. Back kept the Builderlab session, so the next sign-in reached the same account. After any Builderlab sign-in the page now offers Use a different account; Back stays for failures before one. Try again is no longer offered when Builderlab refuses a link because the key or the account is already bound elsewhere: asking again gets the same answer. 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
marked this pull request as ready for review
November 7, 2026 18:36
Contributor
|
🤖 Design review at The change gives people a way out of account conflicts while keeping replacement an explicit choice. The shared confirmation retains Cancel before destructive Replace; the failure page replaces an ineffective retry with an account-switch action. Not checked: native sign-in, keychain/backup/restart behavior, live keyboard or screen-reader use, dark theme, narrower windows, enlarged text or long copy. No tests run. |
First run fell back to a new key on any native refusal to sign with old Buzz's key, including a challenge that expired before native signed it. Setup then saved a new key and lost the existing identity. Native now answers null only when old Buzz's key can't be read (absent, denied or malformed), which still makes a new key. Any other failure fails setup with Try again, which links old Buzz's key again. 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>
- A busy or locked store reading old Buzz's key is now an error, so Try again reads it again. Only an absent, denied or malformed key makes a new key. The earlier app's read reports which with LegacyHumanError. - The first-run save of old Buzz's key is pinned to the key the account now holds. - Recovering a linked but unsaved old Buzz key now runs only after a first run on this device noted it was linking that key. Other sign-ins no longer bring up the OS prompt for old Buzz's storage. - Linking this device's key to an account with none no longer opens the app straight away, as before this change. - The replace dialog says the key "was" backed up: the check is a local receipt. 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>
Co-authored-by: Larry <627498bd4bd1f281a16431e3c6cce3b5c25b6692798c78672298aefbf2f8f8b5@buzz.block.builderlab.xyz> Signed-off-by: Logan Johnson <loganj@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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
First-run setup could trap people on Couldn't finish setup, with only Try again, which repeated the same failure forever. The common path: sign in to Buzz, sign out, then sign in with a different Builderlab account. Buzz then tried to link a key that belongs to the first account to the second one. Builderlab refused, and nothing on screen led anywhere else.
This PR removes the trap in three places:
No key is removed without the person choosing Replace.
Linking the old Buzz key before saving it opens one narrow gap: Buzz links the key, then quits or fails to save it. On the next sign-in, the account holds a key this computer lacks, and with no backup, Welcome back could offer only "paste your private key" or "start over". Buzz now checks old Buzz's key first. When it is the account's key, Buzz saves it, backs it up and continues. Old Buzz's own storage is never changed.
Screenshots
1. Key from an older Buzz install belongs to another account
2. Another account's key is already on this computer
Before: the same refusal, and Try again repeats it.
After: Buzz asks. The wording depends on whether that key has a confirmed backup.
3. The account is already connected to another Buzz identity
Details
docs/identity.mddescribes the new behavior.🤖 Generated with Claude Code