The scheduled staging → main promote of the loyalty stack that was parked on staging, plus
the admin shop-user branch-assign fix. All slices were Gate-2’d on *.staging.nixtech.app
before this promote (see the matching STAGING cards). Deployed 2026-07-08 (00:00 KR).
staging→main (cb86124 +
ece1508 + da640dd + f8cd4e7 + 1efb1df), nix-loyalty-backend
Fly deploy (P5 + 1255c89 + 12ac8a1) with migrations 0004 + 0005
applied schema-first via Fly release_command, and nix-outdoor-sales-backend
staging→main (admin fix 0ccbfc1) on Render. Real Claude-vision OCR key set on
prod Fly.
Points-redemption catalog CRUD (3rd tab under Reward Settings), mapping reward types → point prices.
Reward Shop + reward types show for points-only (non-spin) tenants; only the spin Reward Pool stays gated.
Delivery-orders list (status filter all/ingested/claimed/voided) + Void, wired to the loyalty backend
/admin/delivery-orders. Migration 0004 delivery_order.
Register|Settings toggle; Settings = NIX:101–999 → product map. Ingest resolves each
line’s NIX:xxx tag → product and honors per-product spin eligibility
(disabled item earns 0 delivery spins). Migration 0005 delivery_menu_map.
Cpanel shop-user assign wrote an admin INTEGER id into the uuid assigned_by FK → 500.
Fixed (write null). Code-only, no migration. First fix through the new dev→staging→main pipeline.
Gate 2 (prod) & regression
release_command applied 0004 + 0005 schema-first · /health ok · delivery tables serve (menu-map + orders 200)main deploy landed (CF Worker 53532d25, today) · new loyalty UI live (menu-map editor present)main deploy (Render) · 0ccbfc1 · api.nixtech.app/health ok

Staging evidence: test-loyalty-delivery-settings-staging.mjs 11/11 ·
test-loyalty-delivery-menumap-select-staging.mjs 11/11 (real-product dropdown + eligibility) ·
staging smoke 5/5. Promote runbook: promote-runbook-2026-07-07.md.