Capxul #929 — Upcoming Payroll "See all" route push

Infrastructure #1630, demand row 10.17. Production build of codex/1630-payroll-see-all on http://localhost:3000 against Railway staging, driven by apps/web/tests/e2e/payroll-see-all.spec.ts (Playwright, headed Chromium, reserved-OTP lane). Desktop 1440×900 and mobile 390×844 per state; e-mail echoes masked in every frame and in the recording. Each frame was opened and inspected; findings are under it.

ItemValue
Staging Site / APIconvex-site-production-29eb.up.railway.app / convex-backend-production-f220.up.railway.app, backend head c1b9f62b
SDK train@capxul/sdk@2.5.0, @capxul/sdk-react@2.5.0 (pinned on dev)
Organizationorg_01M1F60PTWNRQX5VKQ8MAR4TZB ("Payroll Proof 73efe4045d90"), treasury 10,000 USDX
Actororganization owner on the reserved *@e2e.capxul.test lane (masked)
Run2026-09-02 00:45Z, 1 passed (19.9 s)

1. Dashboard — the widget before the click

Dashboard, desktopDashboard, mobile, scrolled to the widget

Shows: "Upcoming Payroll · 0 Active · See all" with the empty state "No Upcoming Payroll"; total balance 10,000 USDX; the asset table with USDX; Quick Pay banner. On mobile the widget is scrolled into view below the hero; the bottom navigation stays.
No defects on the surface this PR changes. The widget rows are empty by ruling Q6 on infrastructure#1452 (data is not expected there until STREAMS). The hero's "Send Payroll" is disabled on the old hardcoded capability (ACCESS #1522, not this PR).

2. After the click — the payroll route

Payroll route, desktopPayroll route, mobile

Shows: the button pushed /dashboard/organization/payroll?organizationId=org_01M1F60PTWNRQX5VKQ8MAR4TZB (asserted by the spec); the sidebar highlights Payroll; the page renders today's "Payroll deferred · Setup Payroll" gate on desktop and mobile.
Known state, not this PR's: that refusal is the pre-refit gate on the hardcoded capability. Capxul #934 flips it to CapxulOrgMember.Can do="spend"; the route push itself is what this PR proves.

3. Recording

WebM original