feat: refund abandoned rounds; full-journey and capacity tests
Fixes the money bug flagged earlier. When an instance died mid-round its players had already been debited, so their stakes sat with the house: balanced books, quietly robbed players. Every instance now sweeps for unresolved rounds and refunds them. Such a round is marked void, not settled. The schema caught this: the reveal_is_complete constraint requires a settled round to publish its seed, and an abandoned round has no outcome to reveal. Void is a distinct state with its own column and a check that the two are exclusive. Claiming happens before money moves, so concurrent reconcilers on different instances refund exactly once. Adds TestFullPlayerJourney: sign-in with no account, fund, scratch, bet with an auto target, settle, verify the round independently, check the ledger history is continuous, transfer to a friend, and confirm the books still sum to zero. It asserts against the ledger rather than the API's own summary. Adds cmd/loadtest. One instance on 4 cores held 25,000 concurrent websocket connections with zero failures at 586MB RSS, about 26KB per connection, with the load generator competing for the same CPU. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -118,6 +118,10 @@ make cover # coverage per package
|
||||
make db-reset # wipe the ledger; it is append-only and accumulates
|
||||
```
|
||||
|
||||
Measured capacity: **25,000 concurrent connections on one 4-core instance**,
|
||||
zero failures, 586MB RSS. Bet throughput is the real ceiling at ~230/sec —
|
||||
see [docs/SCALING.md](docs/SCALING.md).
|
||||
|
||||
Coverage sits around 85%, and the tests found and pinned three real money
|
||||
bugs: a posting set that minted 18 quintillion millisatoshis by wrapping the
|
||||
zero-sum check, a crash point that overflowed negative at the rarest seed, and
|
||||
@@ -155,6 +159,7 @@ Not yet built:
|
||||
exist; the node integration does not. The dev faucet stands in for now.
|
||||
- Tournaments and scheduled events
|
||||
- Operator dashboard
|
||||
- In-memory bet reservation, which is what would lift the ~230 bets/sec ceiling
|
||||
|
||||
## Scope
|
||||
|
||||
|
||||
Reference in New Issue
Block a user