The Bulk Payment Bug Was Not a Celery Bug

How a background job ran twice, why one transaction became “orphaned”, and what we changed to make the flow idempotent