2026-05-14 Gate 2 on prod. Follow-up after the arc: per user feedback on the shipped Slice 3, the POS submenu now lives in the dark sidebar, not as an in-page rail. The flat "Register" + "Orders" OPERATIONS rows are replaced by one expandable "Point of Sale" group; the in-page rail is deleted; the page header the old shell owned is re-added. No migration. This reverses Slice 3's in-page-rail decision — the user-approved choice at scoping time, changed after seeing it live.
Register + Orders OPERATIONS rows with one group: Registers / Sessions / Orders / Settings. Collapsed off-section, expands on click; auto-expands on any /pos route; the most-specific child wins the active highlight. Same component drives the desktop rail and the mobile drawer — verified on both tenants.nix_cafe.pos.view; each child is filtered by its own gate (Sessions → reports.view, Orders → orders.view, Settings → settings.view). Owner happy path confirmed on prod; the filtering edge cases (cashier → just Registers, no pos.view → no group) were unit-tested at Gate 1.pos-nav.tsx + pos-shell.tsx deleted; pos/layout.tsx simplified to a plain requirePermission passthrough. Prod confirms no pos-nav / pos-shell renders on /cafe/pos, and the ?config= register terminal still renders.buildNav + filterNavForPermissions + the nav types moved to a new server-import-free components/layout/nav-model.ts, so the permission filtering is unit-testable directly.1542077 — 8 files (2 deleted, 1 new, 5 edited), no migration.
✓ get-coffee (Pro) — SSO login ✓ get-coffee (Pro) — sidebar shows the "Point of Sale" group; collapsed off-section, expands on click ✓ get-coffee (Pro) — old flat "Register" / "Orders" OPERATIONS rows are gone ✓ get-coffee (Pro) — children navigate (Sessions → /cafe/pos/sessions) ✓ get-coffee (Pro) — /cafe/pos: own header, group auto-expands, no in-page rail ✓ get-coffee (Pro) — ?config= register terminal still renders ✓ lumiere-coffee (Starter) — SSO login ✓ lumiere-coffee (Starter) — sidebar shows the "Point of Sale" group; collapsed off-section, expands on click ✓ lumiere-coffee (Starter) — old flat "Register" / "Orders" OPERATIONS rows are gone ✓ lumiere-coffee (Starter) — children navigate (Sessions → /cafe/pos/sessions) ✓ lumiere-coffee (Starter) — /cafe/pos: own header, group auto-expands, no in-page rail ✓ lumiere-coffee (Starter) — ?config= register terminal still renders
✓ phase1 11/11 route sweep + subscription
✓ phase2-sso-outdoor 6/6 cross-product SSO
✓ phase2-cafe-multishop 6/6 POS shop picker
✓ m1-shop-scoping 10/10 reports / shop scoping
✓ r7 14/14 dashboard + manager sidebar
✓ r8 4/4 auth/security (per-tenant scope)
✓ r1-2-landing 8/8 landing flow, no 5xx
─────
59/59 green — 71/71 effective with the 12/12 above
phase1 passed clean this sweep (no SSO-hop flake). The r7 + r1-2-landing
suites exercise the sidebar on every page they visit — the new NavGroupItem
rendered without regression across both tenants.
new:
components/layout/nav-model.ts buildNav + filterNavForPermissions + nav types
deleted:
app/(authed)/pos/_components/pos-nav.tsx the in-page rail
app/(authed)/pos/_components/pos-shell.tsx the in-page master-detail wrapper
edited:
components/layout/sidebar.tsx + expandable NavGroup support (NavGroupItem),
imports the model from nav-model.ts
app/(authed)/pos/layout.tsx PosShell/Suspense → plain requirePermission passthrough
app/(authed)/pos/pos-landing.tsx re-added the "Point of Sale" header
app/(authed)/pos/page.tsx re-added the header to the empty state
app/(authed)/pos/loading.tsx re-added the header skeleton