Visit-pack balance invariant: reviewer evidence pack
PR 2008 fixes issue #1915 by requiring every saleable visit pack to carry a finite, positive numeric(10,2) visit count. API validation rejects invalid writes before provider catalog mutation, migration 0194 refuses ambiguous legacy data before adding a database constraint, and one shared issuance guard snapshots the balance across checkout, staff membership creation, POS, and payment webhooks. Stripe and Square webhooks compensate already-captured legacy sessions instead of retrying forever with no entitlement or refund.