← All tests

Phase 4 — Pay/Close polish bundle PROD

Five-task bundle (NIX-OS-78/79/80 + post-order popup + searchable category dropdown) shipped end-to-end on get-coffee in cafe_starter mode (flipped + restored on exit). Real cash sale, real Close Shift, real cafe.payment_diff_reasons insert verified against Supabase prod.

10/10 prod checks green. Tested end-to-end against get-coffee (flipped to cafe_starter for the run; restored to cafe_pro on exit). One real cash sale rung + one Close Shift with an inline-created Other reason; all DB rows verified post-action.

All prod checks (10)

Walkthrough screenshots

Regression sweep

SuiteScoreStatus
test-phase4-prod (this bundle)10/10PASS
test-phase1-prod11/11PASS
test-phase2-sso-outdoor-prod6/6PASS
test-phase2-cafe-multishop-prod5/6PRE-EXISTING (Phase 3)
test-m1-prod9/10PRE-EXISTING (Phase 3)
Total Phase 4 + non-stale regression27/27PASS

The 2 stale failures are both "ShopSelector hidden when tenant has ≤1 shops". Phase 3 (2026-05-07) intentionally changed that behavior per feedback_tier_gating_grey_not_hide.md — Pro-only features now render visibly disabled even when there's nothing to switch between, to drive upsell. Test assertions need updating to match the new rule; tech-debt task, not a Phase 4 regression. Phase 4 commit (bfccef8) does not touch any ShopSelector code.

Code surface

nix-cafe (no backend changes, no DB migrations):
  app/(authed)/pos/_components/pay-dialog.tsx                          — NIX-OS-78
  app/(authed)/pos/_components/success-modal.tsx                       — summary block
  app/(authed)/pos/_components/starter-register-mount.tsx              — successUx → "modal"
  app/(authed)/pos/_components/starter-close-shift-dialog.tsx          — NIX-OS-79 (Starter)
  app/(authed)/pos/_components/starter-lockable-shell.tsx              — diffReasons pass-through
  app/(authed)/pos/_components/product-grid.tsx                        — CategoryPicker
  app/(pos-fullscreen)/pos/register/[configId]/page.tsx                — load cashSalesTotal + diffReasons
  app/(pos-fullscreen)/pos/register/[configId]/lockable-shell.tsx     — NIX-OS-79 + 80
  lib/actions/payment_diff_reasons.ts                                  — new cashier-callable action
  lib/actions/register.ts                                              — drop endingBank, fix Telegram cash math

Commit: bfccef8

Operator follow-ups (manual QA)

Narong / get-coffee Pro:
  1. PIN-unlock the lockable register
  2. Ring 1 cash + 1 card sale
  3. Open Close Shift dialog
  4. Confirm: "Cash sales this shift" line shows ONLY the cash sale ($X)
     not the card sale → Expected = beginning + $X (NOT inflated by card)
  5. Confirm: "Bank count" input is gone