The switcher: two customers, and a click

The account popover with the org switcher added — and the state it is deliberately absent in.

14 Sept 2026 · branch p7-login-switcher · captured against propflow-stage · at dd7e71c7c4

Data note. Every name and balance below comes from propflow-stage, which is anonymized by construction (ADR-0097/0110 — phones in the impossible +1000 NPA, emails @example.test). The identical capture against prod would carry real tenants' names and balances and is not safe to attach anywhere, which is why the generator refuses to run against one.

1 · The account popover, with the switcher in it and NOT on screen

This is the popover OrgSwitcherSection was added to, opened, on the branch. The component is mounted between the account row and the theme row — and it is rendering nothing, which is the decision the PR argues for: below two customers a switcher offers you the customer you are already standing in, and an affordance you cannot use should not be on screen.

What this capture is really for is the blast radius. SideNav is on every workspace page, so the risk that matters is not "does the switcher look right" — it is "does the account menu still render for everyone". It does: the account row, the theme row and Sign out are all present and in order, with the new section between them contributing no divider, no gap and no blank label.

The state on screen, named exactly. The signed-in login here is the stage smoke account — platform_admin, no Person row, no organization memberships. A read of listPickableOrganizations against propflow-stage for this exact user id returns [], so the section takes its orgs.length < 2 branch and returns null before it renders a single element. data-pf-org-switcher is not in the DOM of the picture below.

Asserted in the captured DOMTheme · Sign out. The popover is OPEN and intact in the state shown — the account header, the Theme row and Sign out are all present. The org switcher sits between the account row and Theme, and contributes nothing here: for a login the server hands fewer than two customers there is no group, no 'Company' label and no divider.

The account popover, with the switcher in it and NOT on screen

What this artifact does NOT show, and why

It does not show the two-row list, the active-company check mark or the scroll cap, and that gap is stated rather than papered over. Rendering them needs a credentialed login holding two or more pickable organizations, and propflow-stage has none: a sweep of all 64 stage users found exactly one with two pickable orgs, and that row carries no email and therefore no way to sign in as it. The repo's own stage seeder (scripts/seed-stage-user-fixtures.ts) writes User and spine rows but no credential rows, so it cannot mint one either. The remaining route — writing memberships onto the shared smoke account — was rejected: that account's organizationId: null is what every other lane's capture and smoke run resolves its scope from tonight.

Those three claims are pinned in the DOM suite instead (OrgSwitcherSection.test.tsx, 8 cases, three positive controls), and the check mark now asserts the SVG element on the active row and its absence on the other — the previous assertion went through textContent, which an icon carries none of, and aria-current alone would have passed with nothing at all on screen.

One thing this capture did settle that no test could. A platform_admin is precisely the account type this switcher shows nothing to. The picker behind it is built from the login's own membership rows and its own Person's roles; a staff login with neither gets an empty list, not every customer. "All the companies, for staff" is a different lane's server-side authority (#8437), not this one's client.

PropFlow Docs