Tighten the setup flow after a review of the whole diff

The done screen moves focus to its heading like every other screen; the
confirm screen's preference list holds only dt/dd pairs and the settings
link stands beside it; Back from Q1 is not offered once the flow has
been entered, because the front door would resume past the welcome and
bounce straight back; the medication task records no target on the
ledger, as the contract says, and keeps the id on the screen; and the
two success affordances go through the outcome module rather than a
hand-rolled tick. The error-code catalogue lists the answers and restart
codes and no longer the retired step ones, and the session-surface guard
learns the one new deriving helper the onboarding pages read through.
This commit is contained in:
Marc-André Bombeck committed 2026-09-10 16:09:18 +02:00
1 parent 2686da2803
commit 8c7cdcfc2b
9 files changed
+78 -89

No files matched your search

+12 -6
View File
@@ -129,11 +129,15 @@ describe("S1 — the direct session-resolution set is frozen", () => {
"RSC prefetch of the session user's mood list, skipped under a switch",
"app/page.tsx":
"RSC prefetch of the session user's dashboard snapshot, skipped under a switch",
// Onboarding routing. Reads the actor's own onboarding step to redirect;
// renders no record data.
// Onboarding routing. Reads the actor's OWN setup state through
// `loadOnboardingFlowState` (a `getSession` wrapper, listed in the regex
// below) to guard the step URL and to render the screens; the three
// writes behind them refuse under a switch, so the pages read the same
// record the routes write.
"app/onboarding/[step]/page.tsx":
"redirects on the actor's onboarding step",
"app/onboarding/page.tsx": "redirects on the actor's onboarding step",
"guards the step URL on the actor's own setup state",
"app/onboarding/page.tsx":
"resumes or welcomes on the actor's own setup state",
};
/**
@@ -147,10 +151,12 @@ describe("S1 — the direct session-resolution set is frozen", () => {
* `getUnswitchedSession` (`lib/auth/acting-carrier.ts`) is listed for the
* reason a wrapper is the easiest way to disappear from a guard: it returns
* `getSession()`'s answer or null, so a caller of it derives an identity
* exactly as much as a caller of the thing it wraps.
* exactly as much as a caller of the thing it wraps. v1.39 (C2) —
* `loadOnboardingFlowState` (`lib/onboarding/load-flow-state.ts`) is the
* same shape: `getSession()` plus the caller's own setup row.
*/
const SESSION_DERIVING_HELPERS =
/\b(getSession|getUnswitchedSession|getSessionUserLocale|validateSessionFromCookieValue|validateSessionWithCreatedAt)\s*\(/;
/\b(getSession|getUnswitchedSession|getSessionUserLocale|validateSessionFromCookieValue|validateSessionWithCreatedAt|loadOnboardingFlowState)\s*\(/;
/**
* Reaching for the cookie by name is the way around the helpers. Both the