- New docs/09-limits-and-performance.md: principles, all protection
layers, what players see, configuration reference, measurements,
tuning guide, monitoring and how to test
- Server chapter summarises the limits and links to chapter 9; circuit
breaker description and AI_MAX_INFLIGHT default corrected
- Architecture: new files in the layout, design decisions for load
handling; docs index lists chapter 9
- Protocol, AI and operations chapters link to chapter 9; test counts
- Root and component READMEs describe the limits and settings
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Running games always continue; new work is refused when there is no
capacity; abuse is rejected immediately.
- Docker: CPU/memory/pids caps per container (overridable in .env);
uvicorn message size, queue and concurrency limits
- Server abuse limits: connections total/per IP (close 1013), message
rate per connection (token bucket, close 1008 on floods), lobby
creation rate per IP
- Load monitor: event loop lag, CPU of the own cgroup quota and
throttling, with hysteresis (normal/busy/overloaded, severe lag
overloads immediately)
- Admission control: create_lobby and start_game refused while
overloaded or MAX_ACTIVE_GAMES are running; server_status message
broadcast on changes; /health reports load but stays ok
- AI bridge: timeout sent with requests, in-flight cap, circuit breaker
- AI service: bounded workers and queue ("overloaded"), drops expired
requests, degrades to the heuristic agent when busy or too slow
- Website: busy notices, Create/Start disabled when not accepting
games, slow retry when the server is full
- Tests for limiters, load levels, admission control and AI service
limits; docs updated
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Deal the hands from the shuffled stack and draw the trump card from it,
so the trump card is in nobody's hand and cannot be played
- A wizard or jester as trump card means no trump suit (previously a
wizard let the dealer choose); remove the trump selection phase, the
ChooseTrump action, the trump picker UI and the AI trump actions
- Completed tricks carry their round's trump card, so the table keeps
showing the matching trump card while the last trick of a round is
displayed
- Card corners are no longer rotated, so 6 and 9 cannot be confused
- Trump label explains why there is no trump (wizard, jester, last round)
- Tests: trump card never dealt, special cards give no trump, tricks keep
their trump card
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The sum of all bids may never equal the number of cards each player
holds in the round; the last bidder has to adjust their bid. This was an
optional "not equal" lobby setting and is now a fixed rule of the game
engine, so it applies to humans, AI players and training alike.
- Remove GameOptions.not_equal, the set_options field, the lobby toggle
and the --not-equal training flag
- Explain the rule in the lobby and show the blocked bid while bidding
- Drop the option from the AI observation encoding
- Tests check that no round ends with bids summing to the cards in hand
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>