Repository navigation
Conversation
d5a5ef2 to
c1e4548
Compare
4823851 to
787e2b9
Compare
c1e4548 to
954be58
Compare
787e2b9 to
141b42b
Compare
First run leaves the automatic backup choice on after a failed backup, so a
later Builderlab sign-in may finish the backup in the background; this row
makes that visible. `BackupRow` (`src/app/IdentitySettings.tsx`) reads
`identity.backup` through `useSyncExternalStore`, as Settings reads its
other stores, and sits in the existing rows `SettingsGroup` above "Sign out
of Buzz" as a `PreferenceRow` with no trailing control; the sentence is
wrapped in `role="status"`.
One sentence per status — idle: "Buzz hasn’t checked your key’s backup
since it opened." (what a launch or reload reports, not "no backup");
running: "Backing up your key…"; complete: "Your key is backed up to
Builderlab."; waiting{no_consent}: "Automatic backup is off for this key.";
waiting{no_session}: "Sign in to Builderlab to back up your key.";
waiting{not_linked} and every failed kind: the entry from `BACKUP_FAILURES`
(`backup-failure.ts`), so it is the same copy as first run's failed page,
with the Settings tail "Buzz tries again when you next sign in to
Builderlab." for the causes a new sign-in clears (busy, unreachable,
unconfirmed, storage, signed_out). There is no second table. Read-only: no
consent toggle, no retry.
Hidden unless backup is offered, by the same rule first run uses:
`backupOfferedFor(backup)` (`builderlab-account.ts`) answers false unless a
Builderlab sign-in would be at the build's own portal — Settings passes no
origin because its sign-in always is — and then returns the status's
`builderlab`; any error answers false. Known differences, documented: the
row appears after the first status read, so "Sign out of Buzz" moves down
one row once the IPC answers; retryable messages end in "Try again." though
the row has no button; under the `BUZZ_DEV_FIRST_RUN_ACCOUNT` seed first run
offers backup while the row follows the real rule.
Tests: `IdentitySettings.test.tsx` drives the real `createBackupStatus`
store over a scripted native side with a mocked Tauri `Channel`: the
sentence for complete, running, waiting{no_session}, waiting{not_linked},
failed{unreachable} and the signed_out tail; hidden when the status says
`builderlab: false` and when the build has no Builderlab portal; following
pushes at seq 2, 3 and 4 with a late seq-2 push changing nothing; no button
or switch in the row. `Settings.test.tsx`'s identity case gains an inert
`backup` store. docs/identity.md describes the row.
Stack: PR 08 of the onboarding stack, on 07 to keep the stack linear, but
it depends only on 03 (`backup.ts`, `backup-failure.ts`, `identity.backup`)
and 05 (`backupOfferedFor`) — it can be reviewed before 06/07.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: Matt Toohey <contact@matttoohey.com>
954be58 to
b4e66e5
Compare
141b42b to
e2f928f
Compare
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Star Lord’s automated source review via Wes’s account, integrating Rocket, Mantis and Groot: no production defects found; one low-priority documentation correction is inline. Optional: remove the PR description’s stale claim that retryable Settings messages end in “Try again”; they now describe retrying on the next Builderlab sign-in.
Head b4e66e5944b1b16ba0e1b28baa12eb996a65fa02, base e2f928f8b8d89f9506ba1b1e703d22fd0eba9da2. Source-only: tests, CI, native backup behavior and rendered accessibility were not validated.
| that a failure first run's Try again could clear, and a lapsed sign-in, say | ||
| instead that Buzz tries again the next time the user signs in to Builderlab, | ||
| since a new sign-in hands the uploader a session and starts another pass. Idle is what a fresh launch or | ||
| a window reload reports, not evidence that no backup exists. The row has no |
There was a problem hiding this comment.
🤖 [P3] Qualify when a window reload reports idle
NsecBackupHost::document_load in src-tauri/src/nsec_backup.rs:302–312 changes the status to Idle only when it interrupts a Running pass. Settled statuses such as Complete or Failed are retained and returned by the next status read, so reloading Settings does not generally produce the idle sentence described here. Please say that a fresh launch reports idle and a reload does so when it interrupts an active pass, while preserving the explanation that idle does not prove absence of a backup.
Onboarding stack (merge in order, top to bottom):
Depends on: PR 03 (
backup.tstypes,backup-failure.ts,identity.backup) and PR 05 (backupOfferedFor) only. It is based on 07 to keep the stack linear; it does not use 06/07 and can be reviewed first.Diff: production +72/−14; tests +141/−3; docs +10/−0
What this layer is
BackupRowreadsidentity.backupviauseSyncExternalStore, one sentence per status (first run'sBACKUP_FAILUREScopy, with a "Buzz tries again when you next sign in to Builderlab." tail for causes a new sign-in clears), hidden unlessbackupOfferedFor(backup)holds. No consent or retry control.Review focus
backup-failure.ts, the same entries first run shows; only the Settings tail differs. This layer adds the table'scausefield (the sentence without first run's instruction) thatBackupRowreads, since it is the first caller.backupOfferedFor): Settings passes no origin because its sign-in is always at the build portal; any error hides the row.Checks run on this branch's tree
--no-verify; the hosted checks on this PR are the verification. The plan's checks for this layer were:vitest run src/app,tsc --noEmit,biome check,pnpm design:check, then the whole-suitevitest runat the top of the stack.git rev-parse onboarding/08-settings-key-backup-row^{tree}equals the tree ofmerge --squash 19df106d5onto45601246awith the DO-NOT-MERGE commit8791f32c3reverted (7ca73468b…).Native evidence
None on this tree. The native first-run recordings and the hands-on checks on the branch were made on the full tree, which only the DO-NOT-MERGE PR 09 reproduces (it adds the isolated debug Keychain slot). Treat every layer below 09 as unit/integration-tested only.
🤖 Generated with Claude Code