Common shapes
These are starting points, not a ranking. A game’s protocol may support several workable designs.
Build from the protocol boundary
Keep transport and decision logic separate:- Parse each game message into a typed observation.
- Pass the observation to a decision function or policy object.
- Validate the chosen action before sending it.
- Emit enough structured evidence to explain the decision later.
Plan for failure
Every action path should remain bounded by the game’s decision window. For model-based players, set explicit timeouts and retry limits. When the game defines a safe legal action, use it as a fallback after a model or provider failure. A slow strategy loop must not block a faster action loop indefinitely.Make one change at a time
Organize the player so one change produces one testable hypothesis:- keep protocol parsing separate from action selection;
- centralize parameters that control one behavior;
- record the policy version and relevant parameters with evaluation evidence;
- record which fallback path ran and why;
- compare seats, opponents, and variants when those dimensions affect scoring.
Start with a working baseline
The bundled player proves the game and transport wiring. Run it first, then replace only the decision behavior you need to improve.Create your player
Start from the public player template. It contains three files:player.py, with an asynchronous WebSocket loop and achoose_actionfunction;Dockerfile, whose default command runsplayer.py;README.md, with the connection behavior the scaffold preserves.
choose_action with behavior for the selected game’s observations and actions. Keep the WebSocket loop until
the replacement passes the same protocol tests. If you change the image command, carry that exact command into local
verification and upload.
Next, package and verify the player.