// Transmissions — What We Shipped
In dependency order. Each one exists because the one before it was not enough, and that chain — not the individual definitions — is the thing worth carrying away.
Chess is a perfect information game: both players see the entire state. Poker is not — you cannot see opponents' cards, so many distinct situations look identical from where you stand. The set of states you cannot tell apart is an information set, and it is the unit a poker strategy is defined over. You do not choose an action per state; you choose one per information set, because you cannot condition on what you cannot observe.
This single fact breaks the usual game-playing toolkit. Minimax and alpha-beta assume you can evaluate a position. Here a position is not one position, and worse, its value depends on what your opponent believes you hold — which depends on your strategy. The evaluation depends on the strategy being evaluated. That circularity is why poker needed its own theory.
A Nash equilibrium is a strategy profile where no player gains by unilaterally changing. In two-player zero-sum games it has a strong guarantee: playing it means you cannot be beaten in expectation, whatever the opponent does. That is the ceiling on your losses, not on your winnings.
Equilibrium strategies in poker are necessarily mixed — probability distributions over actions, not a single choice. If you always bet your strong hands and always checked your weak ones, your bets would announce your holding. Randomness is not decoration; it is what makes a strategy unreadable. Every policy in this system therefore outputs a distribution.
The unbeatability guarantee holds for two players, zero sum. Six-max poker is multiplayer, and there it evaporates — no comparable guarantee exists, equilibria need not be unique, and two players each running "an equilibrium" can both lose to a third. Six-max CFR is therefore an empirical recipe, the same one Pluribus used successfully, rather than a theorem. Knowing this is the difference between using the method and believing it.
Rather than compute an equilibrium directly, we reach one by iterated self-improvement. The quantity that drives it is regret: having played a hand, how much better would you have done had you always taken action a instead? Positive regret means the action was underused.
Regret matching turns that into a strategy: play each action with probability proportional to its accumulated positive regret. Actions that would have helped get played more; actions that never would have get abandoned. The remarkable result is that if regret grows sub-linearly, the time-average of the strategies converges to an equilibrium.
This is the most commonly misunderstood point in all of CFR. The current strategy at any iteration is not the answer and may be terrible — early on it is nearly uniform, and it oscillates throughout. The equilibrium approximation is the average over all iterations. Taking the final iterate instead of the average is a real and silent failure mode.
Regret matching applies to a single decision. CFR extends it to a game tree by defining counterfactual value: the value of an information set, weighted by the probability that everyone except you played to reach it, with your own contribution factored out. The "counterfactual" is precisely that removal — it asks how good this spot is when you reach it, not how often your current strategy happens to reach it. Without that, rarely-visited branches would be starved of learning signal exactly because the current strategy avoids them.
One CFR iteration walks the tree, computes counterfactual regrets at every information set, accumulates them, and updates via regret matching. Repeat; average. Two refinements are effectively standard:
No-limit hold'em has more information sets than can be enumerated, so a full tree walk is out. Monte Carlo CFR samples instead. The variant used here is external sampling: traverse every one of your actions exhaustively, but sample a single outcome for chance events and for opponents' actions. You get an unbiased estimate of counterfactual regret at a fraction of the cost, and the variance is acceptable because your own branching — the part that matters for your regret — is still covered fully.
Sampling alone is not enough; the game must also be shrunk. Two independent abstractions do it, and each is a lossy compression with its own failure mode.
Group hands that play alike into buckets, and solve over buckets rather than cards. Built in three steps:
E[HS], its expected hand strength against a random opponent, and on earlier streets
E[HS²] or a full equity histogram, which captures the shape of the
distribution. A made hand with no improvement and a draw can share an average while behaving
completely differently — the second moment is what separates them, and this is what
"potential-aware" means.No-limit allows any bet from the minimum to all-in, so the action space must be discretised to a handful of pot fractions. This is the lever with the sharpest consequences in this whole system, and M6 exists because of it.
A size you play that the solver cannot represent. If the abstraction offers only
pot and all-in, a half-pot bet has probability exactly zero in the derived blueprint — not rare,
unreachable. Measured here: the blueprint's bet0.50 column was 0.0000 while
half-pot was the live bot's most common aggressive action.
A size the network cannot see. Worse, and much harder to notice. OpenSpiel's
fullgame abstraction has every raise amount as a separate action, but its information
state tensor records only that a raise happened. Measured directly: a 4-chip bet and a
200-chip bet differ in one bit of the tensor — the same bit. A net trained on it
can choose an overbet but can never observe that anyone made one. More actions with a blind tensor
is worse than fewer actions with a sighted one, and nothing errors.
A further compression: let the abstraction forget some history. The information state used here records the set of bet sizes each player used on each street, not the ordered list. Ordered encoding needs a fixed slot count, and measured over 3,000 random six-max hands, 4.3% of streets already reached twelve actions with the tail still climbing — a safe ordered encoding would need ~24 slots and a 1,665-wide tensor against 377 for the set form. What is lost is only the within-street order; who committed how much survives exactly in the contribution vector, which is what distinguishes a three-bet from a cold call. The theoretical cost: CFR's convergence guarantee is stated for perfect recall.
Even abstracted, storing a regret value for every information set is infeasible. Deep CFR replaces the table with a neural network that generalises across information sets — similar spots get similar values without ever having been enumerated. Mechanically:
A training step that "skips rather than train on a short batch" will do exactly that, forever, if the reservoir never fills. At 30 traversals per iteration every player's reservoir sat at 1,274-1,643 rows against a batch size of 4,096, so all six players skipped every iteration. The run looked healthy — the iteration counter advanced, checkpoints were written, it was 44× faster — and it was performing pure traversal with zero network updates. It would have run 3,000 iterations and learned nothing. Speed that arrives without a cause is a bug report.
Vanilla Deep CFR trains a second network to approximate the average strategy — and that second approximation is the largest error source in the method. Single Deep CFR removes it: keep every iteration's advantage network snapshot on disk, and define the average policy as the (linearly weighted) mixture over those snapshots. The snapshot history is the average. It costs disk and sampling time at query, and it removes an entire layer of approximation error, while getting Linear-CFR-style weighting essentially for free.
A mixture over hundreds of snapshots cannot be queried in a millisecond. Distillation collapses it: sample a large number of information sets, label each with the expensive mixture's action distribution, and train one supervised network to reproduce those labels. The result has Deep CFR's serving shape without its training error — one forward pass, no search, no snapshot sampling. This is what "blueprint" means in practice, and it is the object that gets exported and served.
The other track starts differently: take a corpus of decisions from a source you trust and train the net to predict them. Fast, stable, and strictly bounded by the teacher. Two teachers were used here — real hand histories, and a rule-based engine whose book is interpreted into labels — and the choice between them is instructive. Real histories carry a human's actual edge and their tilt. A rule interpreter is duller but disciplined, and crucially it folds correctly, which a corpus of one aggressive player's hands does not teach.
Self-play opponents that never fold teach a net to be a maniac. A policy trained against them is optimal against them and badly wrong against people, and every metric computed inside that self-play world agrees it is excellent. The fix was not a better algorithm but a better opponent: calibrate the training and evaluation field against 142,000 real hands. The champion that "won" self-play lost 32 bb/100 to realistic opponents; fixing fold discipline took that to −4.
Once a reasonable policy exists, reinforcement learning can push it further. Proximal Policy Optimisation is a policy-gradient method: play hands, observe returns, and shift the policy toward actions that did better than expected. Three parts matter.
Three tools, used at three scales.
Every failure in this project's measurement history had the same shape: the number was real, and it was measuring something other than what was assumed. An arena scored a policy that never actually played, because a guardrail overwrote every bet. A convergence metric reported a decline that was a champion swap fitted as a trend line. A gate reported perfect nulls because the treatment changed zero decisions. Before trusting a measurement, establish how many decisions it actually observed.
Next — the milestone ladder, M0 through M6 →
Hiss NN — the poker network, its training ladder and its serving contract. Written so the whole thing can be rebuilt from an empty machine. Figures are from the live system, not from the plan; where the two disagree the plan is annotated.