Concurrent credit requests can overspend balance and create multiple outputs
We reproduced a concurrency issue while benchmarking OpenSaaS with Kronowave Factory.
With an authenticated account set to 1 credit, we dispatched 2 generation requests concurrently while holding the provider response.
Observed result: HTTP responses: 200, 200 Provider requests: 2 Final credit balance: -1 New owned outputs: 2
The expected behavior was one successful request, one provider invocation, no negative balance, and one output.
We also tested the 2-credit case, which behaved correctly: two requests completed and the balance reached zero.
We repaired the flow by reserving credits atomically before provider work, ran a fresh F0–F3 baseline, and the concurrency checks passed afterward.
We have exact source identity, reproduction traces, database observations, and the repair diff if useful.
Source: wasp-lang/open-saas