diff --git a/e2e/USER_STORIES.md b/e2e/USER_STORIES.md
index 0b1c4051..af65240f 100644
--- a/e2e/USER_STORIES.md
+++ b/e2e/USER_STORIES.md
@@ -55,7 +55,10 @@ Acceptance:
- The dashboard shows a pending "Back Up Your Key" health check until the existing
backup flow completes successfully; leaving the modal keeps the check pending.
- Reloading preserves both the pending reminder and a completed backup.
-- Applying all recommendations opens the backup flow alongside the automatic relay fixes.
+- Applying all recommendations first lists the relay changes, and leaving that
+ review changes nothing. Confirming it opens the backup flow alongside the relay fixes.
+- The "Back Up Your Key" check opens the backup flow directly, since it has nothing
+ to review.
- Choosing the encrypted download requires a password of at least 12 characters
and produces a file containing an ncryptsec rather than a plain nsec.
- The display name entered during signup appears on the new user's own profile.
@@ -1691,8 +1694,9 @@ Acceptance:
disappears once its space is read.
- A conversation carries an unread dot, and "Mark all read" empties the inbox.
- Selecting a conversation opens it.
-- Relay health checks are listed alongside the inbox, with the recommendation
- each one applies.
+- Relay health checks are listed alongside the inbox, each naming what is wrong.
+ Applying one opens a review naming the relays it adds and removes, and
+ publishes nothing until it is confirmed.
- Hosting is offered whether or not she hosts a space: a shortcut to the hosting
panel when she has one, an invitation to start one when she doesn't.
diff --git a/e2e/specs/onboarding.spec.ts b/e2e/specs/onboarding.spec.ts
index bb8ace0f..0ff7df88 100644
--- a/e2e/specs/onboarding.spec.ts
+++ b/e2e/specs/onboarding.spec.ts
@@ -134,16 +134,23 @@ test("US-002 sign up by generating a new key", async ({seed, visit}) => {
const backupCheck = page.getByRole("group", {name: "Back Up Your Key"})
await page.getByRole("button", {name: "Apply all recommendations"}).click()
+ await expect(page.getByRole("heading", {name: "Review changes"})).toBeVisible()
+ await page.getByRole("button", {name: "Go back"}).click()
+ await expect(backupCheck).toBeVisible()
+
+ await page.getByRole("button", {name: "Apply all recommendations"}).click()
+ await page.getByRole("button", {name: "Confirm"}).click()
+ await expect(page.getByRole("heading", {name: "Review changes"})).toHaveCount(0)
await expect(page.getByRole("heading", {name: "Backup your Key"})).toBeVisible()
await page.getByRole("button", {name: "Go back"}).click()
await expect(backupCheck).toBeVisible()
- await backupCheck.getByRole("button", {name: "Back Up"}).click()
+ await backupCheck.getByRole("button", {name: "Fix"}).click()
await expect(page.getByRole("heading", {name: "Backup your Key"})).toBeVisible()
await page.getByRole("button", {name: "Go back"}).click()
await expect(page.getByText("Back Up Your Key")).toBeVisible()
- await backupCheck.getByRole("button", {name: "Back Up"}).click()
+ await backupCheck.getByRole("button", {name: "Fix"}).click()
const doneButton = page.getByRole("button", {name: "Done"})
const password = page.locator('input[type="password"]')
diff --git a/src/app/components/HealthCheckItem.svelte b/src/app/components/HealthCheckItem.svelte
index 01f3fa26..9d8d879d 100644
--- a/src/app/components/HealthCheckItem.svelte
+++ b/src/app/components/HealthCheckItem.svelte
@@ -3,7 +3,7 @@
import Icon from "@lib/components/Icon.svelte"
import Button from "@lib/components/Button.svelte"
import type {HealthCheck} from "@app/healthChecks"
- import {healthChecks} from "@app/healthChecks"
+ import {healthChecks, reviewPlans} from "@app/healthChecks"
type Props = {
healthCheck: HealthCheck
@@ -11,19 +11,19 @@
const {healthCheck}: Props = $props()
- const apply = () => $healthChecks.apply(healthCheck)
+ const start = () => reviewPlans([$healthChecks.plan(healthCheck)])