Payment, Petpooja push, coupon enforcement, reward redemption and pricing are production-grade and mirror eatnubo.com's hardened flow. Blocking go-live: a batch of UI/native defects (spec'd for Codex) and catalog data gaps. Promo codes are per-account gated (verified live). One completed real payment per outlet still owed — owner will place it.
| Surface | Status | Evidence |
|---|---|---|
| Razorpay checkout | solid | Server recomputes canonical total & charges that — client amount informational only. Signature verify server-side. Native SDK = "faster Razorpay". |
| Payment recovery | solid | verify-fail / dismiss / 409 → pollRecovery → confirm or "auto-reverses 3–5 days". Pending order never deleted. |
| Petpooja push | structural | Fires inside verify-razorpay-payment — same proven website path. |
| Reward redemption | solid | fn_redeem_reward: tier gate fail-closed, atomic balance decrement (race-safe), dedup, dual-ledger. |
| Coupon enforcement | solid | Live-probed: expiry by date ✓, account/allowlist gating ✓. Table red-flags mitigated. |
| Pricing integrity | clean | 131/131 priced+taxed, base always set, 0 low/zero anomalies. Watch: gst_type MRP-inclusive trap. |
| Macros math | clean | Where present, 4/4/9 reconciles (0 mismatches). |
| OTP login | healthy | send→verify→session works end-to-end on fresh token. |
| ID | Defect | Sev | Where / root |
|---|---|---|---|
| D1 | Menu search tab-scoped + substring-only — no fuzzy/synonym/typo | high | live 6605 catOk gates before q |
| D2 | Home search should filter items inline | med | live 6620 opens menu instead |
| D3 | Selected-ingredient ✓ not showing | high | live 1441–1455 chip active-state / CSS |
| D4 | Sign-out → move to burger; verify it clears session | high | live 8100 signOut placement |
| D5 | Tracking: missing token# + view-bill/reorder/help (track.eatnubo parity) | high | live 2532 track-data render |
| D6 | Native login page: broken links / eatnubo.com links → burger | high | native shell (web modal clean) |
| D7 | Swipe L/R = back/forward | med | native gesture nav |
| D8 | Stuck on Shreya session; can't switch | blocker | native session persistence (backend healthy) |
| D9 | Scroll-up doesn't restore header | med | native scroll container |
| D10 | OTP "couldn't send" on native | high | client rate-limit / stale endpoint (backend OK) |
validate-coupon, not visible in coupons.eligible_phones. per_user_limit confirmed (MISSYOU20 blocked at 1 use).max_discount as defense-in-depth. usage_count column is cosmetic (enforcement uses coupon_usage).app_config.delivery_enabled='0') until its own cert. Address book is delivery-gated (correctly absent now).