The charge retry loop reuses one idempotency key across attempts, so a retry after a timeout cannot charge twice.
Decisions
- Generate one key before the retry loop and pass it to every attempt.observed · diff
- Reuse the key because the provider deduplicates on it.stated · note
Rejected
- A Redis lock around
charge(): it cannot help once the provider already processed the first request.stated · session
Unknowns
- What idempotency guarantees and retention period the provider enforces.