2026-04-24 on prod (get-coffee.nixtech.app). Second sub-phase of NIX-OS-69.
The visible kitchen surface: a public route at
/cafe/kitchen/[shopId]?t={secret} with three columns
(New / Preparing / Ready), 5s polling, optimistic Start / Ready / Served
buttons, GET + POST API endpoints with secret + cross-shop scope guards, and a clickable
POS TopBar ChefHat pill that opens the display in a new window with the
shop's lazy-created kitchen_display_secret.
started_at stamped), Ready (preparing→ready with ready_at),
Served (ready→served and the card drops off the board). Backwards transition refused
with 409. POS TopBar /cafe/pos still 200. No 5xx during the entire flow.
cafe.tenant_config (logo, primary color, idle promo),
admin at /cafe/settings/display, Customer Display idle screen honors them.
| test-nix-os-69-2-prod.mjs — NIX-OS-69.2 Kitchen Display route + state machine (new) | 11/11 |
| test-phase1-prod.mjs — SSO smoke + route auth | 11/11 |
| test-phase2-sso-outdoor-prod.mjs — Outdoor SSO bridge | 6/6 |
| test-phase2-cafe-multishop-prod.mjs — Cafe multi-shop | 6/6 |
| test-m1-prod.mjs — Dashboard/Orders/Reports shop scoping | 10/10 |
| test-r1-1-cashiers-prod.mjs — R1.1 cashier PIN admin | 9/9 |
| test-r1-4-drafts-prod.mjs — R1.4 crash-recoverable drafts | 9/9 |
| test-r1-9-daily-report-prod.mjs — NIX-OS-72 Daily Sale Report | 11/11 |
| test-r1-10-cash-movements-prod.mjs — NIX-OS-71 Cash In/Out | 12/12 |
| test-r1-11-telegram-events-prod.mjs — NIX-OS-73 Telegram Events | 11/11 |
| test-nix-os-69-1-prod.mjs — NIX-OS-69.1 (transient flake on shift-open) | see below |
pos-kitchen-indicator to
pos-open-kitchen-btn when a secret exists; 69.1 test now accepts both).
Second run (after Worker stress) timed out on the
pos-preshift-screen wait — the same shift-open flake we hit on the
original 69.1 Gate 2 run. r1-10 retry on the same Worker passed 12/12, so
prod is healthy. Not a 69.2 regression. The 69.1 dispatcher wiring + schema assertions
all still pass.
1991e9a — auto-deployed to the
nix-cafe Worker. No backend / migration needed (69.1 already shipped
the schema).app/(public-kitchen)/layout.tsx — minimal
full-height shell, no NIX chrome. Mirrors the R1.7 Customer Display pattern.app/(public-kitchen)/kitchen/[shopId]/page.tsx
— validates the shop secret server-side, server-renders the initial list so a
cold worker shows current state in a single request.kitchen-client.tsx — three columns, per-order
card with line items + customer + note + elapsed-time chip, big touch buttons, 5s
polling, optimistic state transitions with rollback on failure./cafe/api/kitchen/[shopId]/orders?t={secret} —
active orders only (FIFO)./cafe/api/kitchen/[shopId]/advance?t={secret} —
secret + shop scope + linear-state guards. 404 / 400 / 409 / 200 surfaces./kitchen/* + /api/kitchen/*
(no web session expected on a kitchen tablet).ChefHat indicator from 69.1 is now
a clickable button (pos-open-kitchen-btn) that opens the display in a
new window with the shop's lazy-created secret.
started_at stamped in DB.
ready_at stamped.
served_at stamped. Other order untouched.