Account interests and optional guest invitation
The account owns signed-in interest choices and the one-time prompt state. The optional starter signal remains separate from the experimental semantic ranker. Guests use browser preferences and can open the picker from a dismissible glass pill after the feed enters view. No guest modal opens automatically.
Persistence contract
- An authenticated endpoint derives ownership from the session, never a submitted account ID. The existing account preferences JSON stores the twelve-interest selection, selection date, revision, and prompt date; no new database or migration is required.
- Canonical requests also carry the account the mounted picker expects. A mismatch with the authenticated session returns 409 before reading or writing, protecting an old tab when another tab changes the signed-in account. This header is a consistency check, never an authentication credential.
- The first prompt is claimed atomically, so two devices cannot each present a first-time offer. Continue, Skip, Close, and Reset do not trigger another automatic offer. Interests remain editable from Discover.
- Matching legacy browser preferences can initialize an untouched account once. Explicit guest selections can initialize a newly created account, subject to server account-creation checks. Existing account state always wins; a guest dismissal never dismisses an account's first offer.
- Account feeds use the server preference. Browser query hints cannot replace an account's saved or cleared choices. Guest hints remain optional, bounded ranking input, rather than eligibility filters. Actual activity continues to reduce the weight of starter hints.
- Updates must preserve unrelated preferences and account isolation. Failed or stale requests must not reset another account's feed or silently claim that unsaved selections were saved.
Interface contract
- Successful refresh has no visible narration. The spinner and replaced cards show its result; a concise status remains available to screen readers. Failures remain visible.
- The guest invitation shares the existing floating controls, above Refresh and Back to top. It does not capture focus, appear over first-visit account setup, or remain keyboard-focusable when the controls are hidden. Dismissal persists in that browser.
- The picker keeps its approved glass styling and interest icons. Redundant learning/storage explanations are removed; required error messages and accessible labels remain.
Verification
Regression work covers separate accounts/devices, concurrent first-prompt claims, migration precedence, guest dismissal and signup handoff, stale network results, unrelated preference updates, feed seed ownership, no-op saves, dialog focus, and pagination. Tests use isolated in-memory data and DOM rendering. No production preference is changed for testing, and no browser is opened.
The integrated client regression command covers Discover, feed telemetry, guest session startup, language selection, settings search, mobile create, and media generation. The isolated server command covers recommendation ranking, starter persistence, feed ownership, and rollout middleware. Release verification also includes the full monorepo build/typecheck and the generated open-source boundary.
- Integrated client suite: 256 passed, 0 failed.
- Isolated recommendation, feed, persistence, and rollout suite: 170 passed, 0 failed; credentialed CORS preflight: 1 passed.
- Full monorepo build and typecheck passed; client edition boundary passed.
- Export generation and hosted discovery boundary passed.
- Independent review reproduced and then verified the stale-account-cookie regression as fixed. No remaining P1/P2 findings in the persistence review.
