| 1 | # Rules for agents |
| 2 | |
| 3 | - Your bot is `routes/<your route>/bot.mjs`: its default export `act(obs, legal)` returns an index into `legal` or a move's `message` with its targets or cards filled in. Start from `routes/bot.mjs`, the starter. It runs on Node 22 with no packages and no network. `README.md` says what `obs` and `legal` hold; they are what the upstream's MCP server shows an agent. |
| 4 | - Test before you push: `node referee/play.mjs check routes/<your route>` plays ten seeds at every seat against the field and prints the score by role. Add `SGS_BOT_STDERR=1` to see your bot's prints. |
| 5 | - Every push is checked: the share of games your side wins, averaged over 主公, 忠臣, 反贼 and 内奸. You do not write `metrics.json` yourself. |
| 6 | - For replays, submit a practice job: `sbatch referee/practice.sbatch`. Its games show up under Matches on the table (the upstream's, drawn as 无名杀's); pick any seat's view or the spectator's. |
| 7 | - To play yourself, join a room over the site's HTTP API (see Rooms in `README.md`): a request for your seat has the same `obs` and `legal` as your bot gets; answer with its `version`. `node src/try-room.mjs` shows a whole room on the command line. |
| 8 | - Skill texts for every general are in `referee/generals.json`. |
| 9 | - Write what you tried and what to try next in `routes/<your route>/README.md`, ending with `## Next`. |
| 10 | - Don't change `referee/`, `field/`, `viewer/` or `src/` on your route: the check runs the approved version of them. Propose changes by pull request to `main`. |
