Start here if you are reading the papers rather than maintaining them; the
maintenance protocol is AGENT_NOTES.md.
Red/Black is a bluffing game played with an ordinary 52-card deck where only color matters: bid how many cards of a color can be flipped, raise or challenge, then prove it. I built the game, then spent a summer trying to actually solve it - not "train a bot that seems strong," but pin down how far from optimal my best strategy is, with error bars I'd stake money on.
That turned out to be the hard part, and the interesting part. The game has about 2.4 x 10^33 information sets, so it can't be solved directly. Every path to an answer runs through an abstraction, and an abstraction can silently cost you exactly the thing you're trying to measure. Most of these papers are about refusing to let that happen.
The final strategy is one no best-response probe I can build knows how to beat. Across 10,000 paired games the probe actually loses to it, so the exploitability lower bound it returns is negative, -0.025 [-0.044, -0.005] on a payoff range of 2, which is a statement about the probe running out of room rather than a proof the strategy is unbeatable. The predecessor, on identical seeds, measured +0.034: the difference resolves at p = 3e-5.
It got there through a fact I find genuinely pretty: the two things a decomposed solver produces - subgame values and a playable policy - want properties no single algorithm supplies. Values need to be unique and symmetric so thousands of subgame solutions compose without selection noise; a quantal-response ladder gives that. Policies need sharpness; CFR+ gives that. So the values come from one solver, frozen, and the policies from the other, re-solved against them.
The flagship paper also documents the experiment that failed first, because it changed how I think about what a strategy file is. I removed a provably-bad action from the solved game, expecting improvement. Exploitability quadrupled. A quarter of the damage: the strategy store doubles as the bot's model of its opponent, and a model that says an action is impossible breaks the moment a real opponent plays it. Pruning your own play is defense; pruning your model of the world is blindness.
| paper | what it is |
|---|---|
| Decoupled Equilibrium Selection | The flagship: the coupling result, the measurement that motivated it, and the pruning experiment as contrast. Standalone - start here. |
| Paper I - States and Counts | The game formalized; exact enumeration of everything (the 10^33 is counted, not estimated). |
| Paper II - The Solve and the Meters | Solving the abstraction exactly, and the measurement discipline: every instrument defined before it's trusted, including the ones that turned out to be blind. |
| Paper III - Playing the Real Game | Carrying beliefs across the abstraction's seams, safe re-solving, and an honest negative: why a certified upper bound stays out of reach. |
RULES.md is the canonical rule text everything derives from.
Read the flagship's introduction and Section 7 (the pruning experiment). If you want a feel for how the sausage gets measured, Paper II's remarks - dated, never deleted - are a lab notebook of every instrument that fooled me and what replaced it. Head-to-head win rate between two bots turns out to say almost nothing about how exploitable either one is; that's measured three separate times in here.
No number without a script. Every numeral in these papers is
regenerated by code in this repo (state_counts.py,
real_game_size.py, verify_against_engine.py) or by the solver
scripts in the game repo, whose JSON artifacts are committed alongside.
If a claim can't be recomputed, it isn't in the papers.
PDFs build with tectonic:
tectonic -X compile <paper>.tex --outdir . - committed PDFs never lag
their sources.