Failed tender does not add credit
Simulate failed payment (or a real Stripe failure) leaves the wallet unchanged.
Kumir never invents a successful gift purchase without a Payment row. Sandbox Simulate failed payment and Stripe payment_intent.payment_failed keep CreditPurchase failed and the wallet unchanged.
Retry creates a new intent. Double-confirm of a succeeded purchase is idempotent.