2026-05-14 Gate 2 on prod. Third slice of the POS Section Rework arc (Narong spec item 9): the master-detail "Point of Sale" submenu shell SHIPPED. A new pos/layout.tsx gates the section and renders a left nav rail — Dashboard / Registers / Sessions / Orders — copying the NIX-OS-87 Settings pattern. The dark sidebar is untouched; the ?config=N register terminal still renders full-bleed. No migration.
/cafe/pos shows the "Point of Sale" header + the 4-item rail, with the Dashboard landing in the detail pane./pos/*; Sessions shows the Slice 4 placeholder.?config=N escape hatch works — loading the in-shell register terminal renders it full-bleed with NO pos-shell wrapper and NO rail, exactly as before. (The test picked a register with an already-open session so the load stayed read-only.)/cafe/pos renders the same shell + rail.3219301 — 6 new files + 4 edits, no migration.
✓ get-coffee — SSO login ✓ /cafe/pos renders the master-detail shell — header + 4-item rail + Dashboard ✓ Click Registers — rail stays mounted, detail pane swaps to the registers admin ✓ Click Sessions — rail stays, detail pane shows the Slice 4 placeholder ✓ Click Orders — rail stays, detail pane swaps to the Orders page ✓ ?config=N register terminal is full-bleed — no rail, no shell wrapper ✓ lumiere-coffee — SSO login ✓ lumiere-coffee (Starter) — /cafe/pos renders the same shell + rail
| test-phase1-prod.mjs — route/SSO smoke | 11/11 |
| test-phase2-sso-outdoor-prod.mjs | 6/6 |
| test-phase2-cafe-multishop-prod.mjs | 6/6 |
| test-m1-prod.mjs — shop scoping | 10/10 |
| test-r7-prod.mjs — dashboard + manager-live drawer | 14/14 |
| test-r8-prod.mjs — auth/security | 4/4 |
| test-r1-2-landing-prod.mjs — POS landing | 8/8 |
/ not
/cafe/dashboard) — green on solo retry; the same known cold-start flake seen in Slice 2,
and Slice 3 touched nothing under /dashboard or routing/middleware/SSO.
nix-cafe (6 new + 4 edited, no migration):
app/(authed)/pos/layout.tsx section shell + perm gate
app/(authed)/pos/_components/pos-shell.tsx client: rail+header / ?config= passthrough
app/(authed)/pos/_components/pos-nav.tsx client: the 4-item rail
app/(authed)/pos/registers/page.tsx re-exports settings/registers/page
app/(authed)/pos/orders/page.tsx re-exports orders/page
app/(authed)/pos/sessions/page.tsx placeholder (Slice 4 builds the real one)
app/(authed)/pos/pos-landing.tsx dropped its own "Point of Sale" h1
app/(authed)/pos/page.tsx dropped the h1 from the empty state
app/(authed)/pos/loading.tsx dropped the fake-h1 skeleton block
app/(authed)/settings/registers/registers-client.tsx
shop selector now path-relative
Slice 1 ✅ session-scoped summary data layer
Slice 2 ✅ landing card UI rework
Slice 3 ✅ master-detail submenu shell ← this
Slice 4 — Sessions history page (replaces the placeholder)
Slice 5 — Registers + Orders relocation cleanup
Carry-overs for Slice 5 (already scoped in the memo):
• /pos/registers re-exports the Settings page, which still
requirePermission('nix_cafe.settings.view') — combined with the
layout's nix_cafe.pos.view that's a stricter gate than the old
/cafe/settings/registers. Slice 5 settles permission gating.
• Slice 5 drops the Registers row from the Settings nav + adds a
redirect stub, and relocates Orders off the top-level sidebar.