← All tests

POS Section Rework — Slice 3 (prod)

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.

8/8 prod behavioural test PASS on get-coffee (Pro) + lumiere-coffee (Starter). 1 commit, no migration.
get-coffee — /cafe/pos: the "Point of Sale" header + 4-item rail (Dashboard active), the landing cards in the detail pane.
POS dashboard with rail
Click "Registers" — rail stays mounted, detail pane swaps to the registers admin, Registers row active.
POS registers sub-route
"Sessions" — rail stays, detail pane shows the Slice 4 placeholder.
POS sessions placeholder
"Orders" — rail stays, detail pane swaps to the Orders page.
POS orders sub-route
/cafe/pos?config=N — the register terminal renders full-bleed: no rail, no shell wrapper (the PosShell passthrough).
POS register terminal full-bleed
lumiere-coffee (Starter) — /cafe/pos renders the same shell + rail.
lumiere POS dashboard

Prod behavioural test — 8/8

✓ 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
59/59 regression green — no regressions from this push. 67/67 effective (8 Slice 3 prod + 59 regression).
test-phase1-prod.mjs — route/SSO smoke11/11
test-phase2-sso-outdoor-prod.mjs6/6
test-phase2-cafe-multishop-prod.mjs6/6
test-m1-prod.mjs — shop scoping10/10
test-r7-prod.mjs — dashboard + manager-live drawer14/14
test-r8-prod.mjs — auth/security4/4
test-r1-2-landing-prod.mjs — POS landing8/8
phase1 flaked once on the SSO hop again (URL landed on / 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.

Files touched — commit 3219301

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

Arc progress — 3 of 6 slices shipped · Slice 5 carry-overs

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.