01The only card you cannot see is your own
Your card is taped to your forehead. You can see theirs; they can see yours. Every bet the other side makes is therefore a statement about your hand, and every bet you make is a statement about theirs. Twenty-seven rounds off one 54-card deck, three fixed-limit betting streets per round, and a blind phase from round 23 where the antes climb.
Two systems sit on top of the betting. Three givers answer the question "is my card higher?" — they are truthful 80%, 50% and 20% of the time, and which is which is never revealed. Two purchases spend real chips on information: Monty Hall narrows the card on your own forehead to two candidates without telling you which is real, and Lookback reveals your own already-burned cards, which you never saw at the time.
The record panel tracks net chips and net margin separately, and the gap between them is the point of the whole design: chips spent on information are burned, not transferred. You can finish a game having read your opponent perfectly and still be down.
02What is shipped, and what this page is
The opponent you play against is not the solver described in sections 05 to 08. The four shipped tiers — ROOKIE, PLAYER, SHARPER, LAPLACE'S DEMON — are heuristic engines, measured monotone and transitive over 600 games each (±2.0 %p). The top tier shrinks a population prior toward a model of you that keeps updating, which makes it a good reader.
The exact equilibrium below is research that has not been deployed. Compressing it into a web asset and rebalancing the bots against it are open items. Saying "this game runs CFR" would be false, so the card in the Playhouse does not say it.
The shipped ladder is not a throwaway either, and it is built on one measured idea. Across thousands of simulated games, when your opponent opens the first street your own card averages 17 on a 0–53 scale; when they check, it averages 40. A single check carries twenty-two points of information about a card you cannot see. ROOKIE ignores this, PLAYER counts cards and tracks givers by Bayesian inference but discards your betting as noise, and SHARPER reads your bets as evidence about its own card — which beats PLAYER 84% of the time on that one idea alone. LAPLACE'S DEMON adds the part that only works over time: every showdown reveals its own card, which retroactively fixes what you were looking at when you bet, so its calibration error against a fixed opponent falls from 0.169 to 0.097 over a thousand games. It does not win by pushing harder; it wins by being right more often.
What follows is therefore two things: a rule that failed in front of a real player and had to be replaced, and a solution to the betting round that tells me what the game actually is. Only the first of the two is live.
03A comeback mechanic that measured well and died in play
A simulation study found that whoever led on chips at round 23 won 81% of games, and 98.6% of games where the lead was 1,000 or more. The last five rounds were decoration. So I added an all-in: in the blind phase only, once per game, the trailing player — if behind by 500 or more — could shove the full effective stack, and the opponent could only call or fold.
It measured well. It shipped. Then it met a player, who said:
"From the opponent's side there's no risk in just not accepting the all-in at the end. I'm ahead — why would I take on risk?"
That sentence invalidated the tuning, because the tuning had a bot on the other side of it, and the bot called on pot odds. Chips are not the leader's objective; winning is. For a leader the marginal value of a chip has collapsed — a measured 3.2 %p of win probability per 100 chips at level, down to 0.9 %p at a 2,000 lead — and the all-in stakes everything precisely inside that collapsed region.
Writing the leader's actual indifference point against a win-probability curve rather than a chip count gives a completely different threshold:
| Leader's lead | Threshold on pot odds | Threshold on winning the match |
|---|---|---|
| 300 | 48.4% | 54.7% |
| 500 | 48.3% | 60.2% |
| 700 | 48.2% | 65.3% |
| 1,000 | 48.1% | 72.0% |
| 1,400 | 47.8% | 78.2% |
| 2,000 | 47.2% | 81.2% |
The further ahead the leader gets, the less willing he is to accept the instrument designed to stop him running away with it. Replacing the pot-odds bot with a leader who thinks this way moved the 1,200+ conversion rate from 82.5% to 95.2%. The number that had justified the rule was resting entirely on the bot's mistake.
Everything else I tried failed for the same reason
- Open the window wider — lower the gate to 250 and allow unlimited shoves. The call rate moved from 31.1% to 32.0%. More chances to shove is more free folds, and bankruptcy endings exploded from 16.3% to 38.2%.
- Offer a smaller gamble. In the relevant range the win-probability curve is nearly linear, so a fair partial gamble barely moves anyone: a player 1,000 behind sits at about 25%, and betting half the stack on a coin flip takes that to 26.5%. The only gamble worth taking when you are behind is all-or-nothing, which is precisely the one the leader always refuses.
- Penalise refusal. A 300-chip penalty for folding to a shove does raise the call rate to 49.9% — but then the rule deciding the game is the penalty, not the all-in.
Any comeback instrument that the leader is allowed to decline is worthless, because the leader's threshold for accepting it rises exactly as fast as the need for it. The fix cannot be a better-tuned option. It has to be non-consensual.
04The fix was to delete the feature
If the leader cannot be given a choice, the pressure has to come from the structure of the game. The declared all-in is gone. In its place the ante climbs through the last five rounds:
Nobody consents to an ante. A leader who wants to sit on a lead now pays for the privilege every round, and pays more each time.
| Leader's conversion rate by round-23 lead | <300 | 300–699 | 700–1199 | 1200+ | Bankrupt endings |
|---|---|---|---|---|---|
| Flat ante of 60 (old) | 61.7% | 71.9% | 93.2% | 99.5% | 0.6% |
| Rising ante (shipped) | 54.5% | 58.6% | 68.8% | 81.2% | 9.2% |
A 1,200-chip lead used to be worth 99.5%. It is now worth 81.2%, and the improvement reaches every bucket rather than only rescuing the hopeless cases. During tuning I also checked whether the all-in was contributing anything alongside the rising ante: keeping both gave 80.3% against 81.1% for the ante alone, while pushing bankruptcy endings from 7.4% to 25%. It was not carrying weight; it was adding variance.
Shipping it required writing almost nothing
Deleting the all-in removed a phase block, two functions, six strings, three UI branches and two state fields. Nothing replaced them, because standard poker already had the answer: a call is capped at min(toCall, stack) and the round refunds any uncalled excess, so a short stack goes all-in as a state rather than as a declaration. If a player cannot cover the ante, he posts what he has; if that empties the stack, the game ends there. No side pots, no new machinery.
An all-in you declare gives the opponent a decision. An all-in you simply arrive at does not. That is the entire difference, and it is why one version worked.
05Measuring the leaf before writing the solver
Solving one betting round in isolation requires knowing what a round is worth when it ends, and what it ends in is a chip difference. If chips are not linear in win probability, the solver optimises the wrong quantity, so I measured before building anything.
The naive approach is to observe win rate against chip lead across rounds. That curve says the game changes character at round 23: a 500–699 lead is worth 62–66% flat through rounds 5 to 22, then 74.1% at round 23 and 89.0% at round 26.
That curve is not trustworthy, because a game where someone is far ahead is also a game where someone has been reading well — the lead and the information advantage are entangled. So I measured the causal slope instead, pairing games on common random numbers: identical deck, identical bot randomness, chips moved in one copy and not the other.
| Starting lead | Round 10, per 100 chips | Round 23, per 100 chips |
|---|---|---|
| 0 | 3.17% | 3.94% |
| 400 | 2.28% | 2.78% |
| 1,000 | 2.25% | 1.03% |
| 2,000 | 1.25% | 0.92% |
So the win probability is close to σ(lead / 1000) and has almost no round dependence. The dramatic steepening in the observed curve was information, not chips. Since one round moves 60 to 500 chips and that curve is straight across such a span, the leaf can be linear in chips and the round can be solved once instead of on a grid of leads and round numbers.
One loose end remained: a showdown gives you more than chips, since it confirms your own card. Measured by gifting free information without moving any chips, a showdown is worth 10 to 12 chips — real, but it cancels in a zero-sum objective, because both players learn their own card at a showdown and neither learns anything at a fold. The asymmetry that survives is a couple of chips, and I ignored it.
06The game turned out to be small
The previous game I solved needed 148 million iterations of Monte-Carlo CFR and a distillation pipeline to fit in a browser. I expected worse here. The opposite happened, because of a structural accident of Indian Poker:
Each card is known by exactly one player — you know theirs, they know yours. That makes the reach probability factorise into one term per player, which is the condition for plain two-player vector CFR. There is no card abstraction, no bucketing, and no sampling. The whole peculiarity of the game reduces to a single sign convention at the showdown: p0 wins ⇔ the opponent index is larger.
Vector CFR+ over the full 54-card deck, exactly. The blind round converges in four minutes on a laptop:
| Iterations | Exploitability (chips/hand) | Game value |
|---|---|---|
| 300 | 0.4612 | +27.9855 |
| 1,500 | 0.0878 | +27.9895 |
| 3,000 | 0.0519 | +27.9918 |
The game value is a design finding in itself. With an ante of 60 paid by one side only, pure ante-splitting would make the round worth +60 to the other player. It is worth +27.99. The missing 32 chips are the value of acting second. Re-solving the early rounds, where the ante is 20, gives +9.05 — a position value of 10.9 chips. Position is worth about 53% of the pot in both, so it is not a constant of the game but roughly half of whatever is at stake.
07What the solution says: bet the extremes, check the middle
Here is the opening frequency of the first actor, arranged by the card they can see on your forehead.
This shape is the game. Work through why it has to be there:
- Their card is low → you are probably ahead → you want to bet for value. But that bet tells them their card is low, and they fold. A value bet in this game destroys its own value.
- Their card is an Ace → you are probably behind → and yet the equilibrium bets 40% of the time. The bet says "your card must be bad," and a hand that is beating you folds. This is the bluff, and it is a strange one: you are deceiving your opponent about their own card, not about yours.
- Their card is a 7 → a bet manipulates nothing. They cannot read anything decisive from it, they call, and you have paid to see a showdown you were already going to see. So the equilibrium checks: 5 through 10 sit between 0% and 2%.
The receiving side mirrors it exactly. With a 2 on the bettor's forehead they call 100% of the time; with an Ace they fold 84% of the time.
Shrinking the pot shrinks the shape with it. In the early rounds, where the ante is 20 instead of 60, the same U survives but the left wing retreats from 2–4 to 2–3 and total opening frequency falls from 24.1% to 13.7%. A smaller pot means a smaller prize for making someone fold, so you bluff less. Nobody told the solver that; it is simply what the arithmetic says.
08The givers are worth exactly zero
Three givers, truthful 80%, 50% and 20% of the time, assigned at random and never identified. Buying answers from two of them feels like the core of the information game. Solved, it is worth nothing at all — the game value with the giver layer switched on is +9.0537 against +9.0536 without it.
I re-derived this while writing this page rather than taking it on trust, because it is the most surprising claim here. The likelihood of every answer pattern, averaged over the six equally likely identity assignments:
| Answer pattern | If you are actually ahead | If you are actually behind | Difference |
|---|---|---|---|
| No, No | 0.2200 | 0.2200 | 0 |
| Yes, No | 0.2800 | 0.2800 | 0 |
| No, Yes | 0.2800 | 0.2800 | 0 |
| Yes, Yes | 0.2200 | 0.2200 | 0 |
The reason is a symmetry I did not design deliberately. The set {0.8, 0.5, 0.2} is closed under q → 1−q: a liar who is right 20% of the time is a truth-teller who is right 80% of the time wearing a different hat. With a uniform posterior over who is who, every "yes" is exactly as likely whether you are ahead or behind. Choosing {0.9, 0.6, 0.3} instead breaks it immediately — I get a 0.20 gap between the two columns, and even the barely-asymmetric {0.9, 0.5, 0.2} opens a 0.067 gap.
The questions are not the information system. Identity tracking is. An answer is worthless until you have worked out across rounds which giver you are talking to, and every chip the layer is worth is a chip paid for that deduction rather than for the answer.
Once identities are known the value appears, and it is lopsided: if both players know who is who the layer is worth only 0.70 chips per round, but if only one does it is worth 3.2 chips — 16% of a 20-chip ante, about a third of a showdown. Information here is not valuable; asymmetric information is.
With identities pinned, the solver's opening splits cleanly by what it heard. When the 80% giver and the 20% giver agree in truth terms the signal is real and it plays the U-shape hard; when they conflict, the two patterns cancel at 0.157 apiece and it reverts to baseline. Told it is losing, it stops bluffing almost entirely — which is correct, and worth stating plainly: better information should reduce bluffing, not increase it.
My favourite line in the whole solve is a consistency check nobody wrote. When the visible card is the coloured joker — the highest card in the deck — the opening frequency is 1% under every answer pattern, including the ones screaming that you are ahead. You cannot be ahead of the best card in the deck, so the solver ignores the giver entirely. It worked that out from the payoff matrix.
The modelling mistake underneath this section
My first plan for the giver layer was to inject the answers as a mixture over the input distribution — shift the prior according to what you were told. That is wrong, and wrong in a way worth naming: the answer is private and correlated with the hidden card, so perturbing a shared prior quietly assumes your opponent knows what you were told. The correct treatment is an extension of the private index, one per player, with the chance distribution refusing to factorise across the two. Splitting the terminal into the two orderings and taking one cumulative sum per side handles it. The rewritten solver reproduces the original game value to four decimal places, which is how I know the generalisation did not change the game.
09Why the solver is not the opponent you play
The betting round is solved. The game is not, and the distance between those two sentences is the honest content of this page.
A round-subgame solution assumes the rest of the match is captured by a chip count. Section 05 justifies that for ordinary rounds, and explicitly does not justify it where the leaf goes non-linear: all-in rounds, short stacks, and the large pots of the blind phase — which, after section 04, is precisely where the game is now decided. The Monty Hall purchase is not in the tree yet either; it belongs between streets as its own decision node.
So four things stand between this and a shipped bot: putting the purchase in the tree, handling the non-linear leaf regions, compressing the solution into a web asset, and rebalancing the four tiers against an opponent that no longer makes mistakes. Until those are done, the strongest tier remains a reader — a Bayesian model of you, shrunk toward a population prior — and it is beatable in a way an equilibrium would not be.
That order was deliberate. A bot that plays equilibrium is unexploitable and, against a beginner, dull: it declines to punish the habits that make a card game fun to learn. The reader punishes them. Solving the round tells me what the ceiling looks like; it does not follow that the ceiling is what should be sitting across the table.
Play it. Twenty-seven rounds, four opponents, three givers who will not tell you which of them is lying.
Open Indian Poker →