← All frames · Frame (b)

Parallel accounts, and what happens at the cap

Up to MAX_PARALLEL_ACCOUNTS = 5 accounts stay signed in on one browser. Each browser tab is pinned to one account, so two accounts can be used side by side. These are the states the accounts section actually has — not just the happy two-account case.

At the cap — 5 / 5

Fail-closed: the control is disabled and explains itself, rather than accepting the sign-in and silently evicting an account.

Switching — full teardown
AC

Switching to Ada (Consulting)

A switch is a full document reload, not a state update. React state, the app-registry cache, the flag cache, mounted federated remotes and any open stream all die with the document — nothing survives to be read under the wrong identity.

Sign out of one account
SB Support Bot support@northwind.example

Each row carries its own sign-out. Removing an account revokes its session server-side and erases its entire storage namespace — token, session id, cached user, and its active-organization choice.

A parked account's session expired
Selecting an expired account routes to sign-in for that email; it does not silently drop the account or borrow another account's token.

A parked account can expire while another is in use. The roster keeps the entry so the user is told what happened.

Storage namespaces — the isolation contract

KeyStoreScope
ff.accountslocalStorageRoster: id, email, display name, added-at. No tokens.
ff.activeAccountIdlocalStorageBrowser-wide default for a new tab.
ff.activeAccountIdsessionStoragePer tab. Wins over the default — this is what makes accounts parallel.
ff.acct.<id>.authTokenlocalStoragePer account.
ff.acct.<id>.sessionIdlocalStoragePer account.
ff.acct.<id>.userlocalStoragePer account.
ff.acct.<id>.activeOrganizationIdlocalStoragePer account — org choice never crosses accounts.
Test hooks: [data-case] · [data-account-count] · [data-guard='max-accounts'] · [data-action='sign-out-account'] · [data-account-state='expired'] · [data-state='switching'].
Frame (b) — parallel accounts & isolation Next: install scope →
Review · app-scopes-user-menu approve or reject each flow ↓
user-menupendingApproveReject
accountspendingApproveReject
install-scopependingApproveReject
notificationspendingApproveReject