S-B part 1 — the org picker takes the logo's corner

The side-nav header stops showing a mark and starts showing which organization you are working for.

13 Sept 2026 · branch lane/ui-s-b-scope-picker · captured against propflow-stage · at 368f1d0848+local

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 corner, expanded — no logo, an org instead

The top-left corner of the rail used to hold a wordmark linking to /dashboard. It is gone, at every width, because the spec's own what it must not do list leads with "render a logo, wordmark or mark in the side-nav header at any width — that corner is the org now". The Dashboard row in the rail below is the way home.

What to look at: the corner names an organization, the collapse control still sits to its right at its original 24px box, and the rest of the rail is untouched.

Asserted in the captured DOMDashboard. The rail still renders and the way home is the Dashboard row, not a mark.

The corner, expanded — no logo, an org instead

2 · The collapsed rail — the corner shrinks with it

The rail collapsed to its icon width. The corner has to shrink with it, which is why the slot is a render prop rather than a ready-made node: the state it must react to (collapsed, phone) lives in the rail, and a node composed upstairs cannot see it. Handed a plain element — the shape this PR shipped in at first — the corner rendered its full-width label inside a ~56px column and its whole collapsed branch was unreachable.

What to look at: the corner and the expand control both fit the narrow column, and nothing below them moved.

Asserted in the captured DOMOCCUPANCY · LEASING PIPELINE. The page is intact beside the narrowed rail — the corner shrank, the content did not move.

The collapsed rail — the corner shrinks with it

3 · Phone width — the corner and the collapse control still fit

Phone width. The rail is an off-canvas drawer here, so the corner is behind the hamburger — and that hamburger is the ONLY way into the navigation at this width. Its 44px hit area and the in-drawer close's equal negative margin are asserted arithmetically by sidenav-phone-touch-targets.test.tsx, which this PR leaves untouched and green: removing the logo from that header must not move the control beside it.

What to look at: the page renders as it did before, and nothing in the shell shifted.

Asserted in the captured DOMOCCUPANCY. The phone tier renders the page with the rail off-canvas, as it did before this PR.

Phone width — the corner and the collapse control still fit

What these pixels found that no test could

The corner reads "No organization" for the stage smoke user. The render is contract-correct — emptyGrant is the fail-closed state and the alternative is inventing a label — but it means the new grant reader (resolveGrants, which requires PersonRole rows across orgs) resolves EMPTY for a viewer whose rail, role and routes all render fine off the legacy path (which guesses the org from the first role it finds). That divergence is exactly what the parent row ui-s-a calls its second pre-merge gate, org-reader-agrees-with-seeder — and that row records the gate as unbuildable today, waiting on D-10. This capture is the first observation of which side it falls on for a real login, and it is raised for a decision rather than patched over here.

The multi-org trigger, the tri-state group headers, the never-empty refusal and the collapsed corner are held by org-scope-switcher.test.tsx (11 tests) and scope-picker-never-empty.test.tsx (9 tests) instead, because this fixture cannot reach them. Four deliberate mutations were seen RED across those two files before either was trusted. The collapsed rail tile and the phone sheet are part 3 of this row and are not in these pixels.

PropFlow Docs