Felt Dojo: The bots
Companion to the project brief. What each tier actually does, why it does it, how it was measured, and where it's still weak.
Why this document exists
The bots are the product. Everything else (the tables, the tournaments, the replays) is scaffolding around the question of whether the opponents are worth playing against.
So I want to be specific about what's behind them, because "our AI opponents adapt to your play" is a sentence any site can write. Below is what's actually running, in poker terms, including the parts that don't work yet.
The one idea the whole thing is built on
The first version of these bots had the flaw that every homemade poker bot has: it scored its own hand on a made-up scale: a pair is worth 0.125, a flush is worth 0.6, and then compared that number to pot odds. Those are different units. It's like comparing a hand's temperature to its price. Every decision downstream of it is wrong in a way that no amount of threshold-tweaking fixes.
The rebuild replaced that with real equity against a modelled range. Before every decision, the bot asks what its opponent could actually be holding, then computes how often its own hand beats that. Preflop it's a lookup table (there are only 169 distinct starting hands in Hold'em, so every combination of hand-versus-range-versus-field-size is precomputed at startup). Postflop it's simulated at the table, a few hundred runouts per decision.
Then comes the part that makes the tiers real:
The difference between tiers is not how good their thresholds are. It's what range they think they're up against.
- Beginner never narrows. It evaluates every hand as though the opponent has two random cards.
- Intermediate narrows by bet size and action, but always about one step too wide, and only about half the time after the flop.
- Advanced builds an actual belief: every combination the opponent could hold, each with a weight, narrowed action by action and re-weighted by how that combination connects with this board.
Almost every classic leak falls out of that one design choice instead of being scripted in. A Beginner facing a 200bb shove with pocket deuces thinks it's roughly a coin flip, because against two random cards it is, so it calls. Nobody wrote "call shoves with deuces." It's just what a player who never puts anyone on a hand actually believes.
Beginner: the loose-passive station
The target is the player everyone recognises from a $1/$2 live game: plays half his hands, calls too much, never raises without the nuts, and can't put you on anything.
What he does:
- Sees monsters everywhere and hands nowhere. No range narrowing at all, ever. A pot-sized river bet and a min-bet get the same read: "he could have anything."
- Ignores the other players. Its equity is always computed heads-up, even five-way. So it over-calls multiway, which is exactly the real leak.
- Calls by feel, not by price. Its calling bar does move with bet size (a quarter-pot probe and a pot-sized overbet aren't the same decision), but in three coarse buckets, not by computing pot odds. A beginner who computes pot odds isn't a beginner.
- Chases draws with the rule of 4. Flush draw on the flop? That's "36%", so it calls. Any price. It bypasses the calling bar completely, which is the actual mistake, applying the turn-and-river number when only the turn is coming.
- Won't fold top pair. Or an ace. Three streets, no kicker, doesn't matter.
- Bluffs in the worst possible spots. It has a bluff, and it fires it more often multiway and on the river after being called twice, precisely where a thinking player shuts down. And it misses the sizing: a tiny probe that prices in the whole table, or a wild overbet.
- Gives the hand away with sizing. Opens 4bb normally, 8–12bb with aces ("protecting" them). Bets 85% of pot for value, 125% with the nuts, a quarter-pot probe when bluffing. If you pay attention, you can read this tier off the bet size alone, which is the point.
- Has one crude read. After three hands of someone betting big at it, it loosens its calling bar by a flat amount. Not a range read: "this guy keeps bullying me, I'm calling him down."
Measured: VPIP ~50%, PFR ~6%, aggression factor 0.72, went-to-showdown ~39% at a mixed table. The reference profile for a loose-passive station is VPIP 45–60, PFR 5–10, AF 0.5–1.0, WTSD 35–40. That's in band across the board.
Where it's weak: fold-to-bet sits at ~37% against a 25–35% target, and I can't fix it without breaking something else. Showdown frequency and fold frequency are the same quantity from opposite ends: a bot only avoids a showdown by folding, so every setting that pulls one into band pushes the other out. I measured three settings and none put both in range. The honest lever is preflop: this tier arrives on the flop with garbage because it plays 50% of hands, and it has to fold it somewhere. But tightening preflop would destroy the loose-passive character the whole tier exists to be. So I left it, and I'm telling you rather than quietly picking the flattering number.
Intermediate: the guy who read the book
The target is a competent, slightly passive regular. Knows position, knows pot odds, knows board texture, and misapplies about a third of it.
What he does:
- Puts you on a range from your bet size: five buckets, from premium to any-two, and then reads it one step too wide. It knows the principle and applies it late, which is the archetype made mechanical rather than described.
- Separates two questions preflop that most bots conflate. "Is this hand worth playing?" is measured against one opponent, because that's what hand quality means. "Should I pay this price?" is measured against every live opponent, because you have to beat all of them. Getting this wrong was the single biggest tuning error in the project: feeding field size into one number collapsed its opening range to almost nothing, folding kings behind limpers, because aces are only 50% against five hands and a fixed threshold on that scale means playing nothing.
- Tilts, for a real reason. Tilt only triggers on a genuine bad beat, and a bad beat is measured at the moment the money went in, not at the end of the hand. Once a hand is over, everyone's equity is 0 or 1; you can't tell a bad beat from just losing. So the bot remembers what it was when it got it in. On tilt it calls wider, bluffs more, sizes bigger, and trusts its reads less. It clears over roughly a dozen hands.
- Commits to a bluff. Earlier versions re-rolled "am I bluffing?" at every single decision, which produced incoherent lines: bet, check, bet. Now it decides once, follows through across streets, with a real chance of giving up on any street; and if the bluff turns into two pair by the river, it stops telling the story and sizes it as two pair.
- Loses focus. Roughly one hand in six, it stops noticing betting patterns entirely, not discounting them, not seeing them. Different failure mode from tilt, deliberately.
- Builds reads slowly. Needs about 15 hands on someone before it adjusts, and the adjustment is one step on the range it already read from bet size.
- Uses implied odds, and rationalises with them. Real implied odds, plus miscounted outs: backdoor outs counted as full outs, outs that pair the board counted as clean. That's what makes the bad calls feel like the ones you actually see.
- Varies its sizing. Mixes 2.5x–4x opens, leans bigger from early position, and in tournaments drops toward min-raises as stacks get short, because sizing that never changes with stack depth is a tell in itself. (That correction came directly from playing it and complaining about it.) Postflop it draws from a shared set of sizes with different weights per situation rather than one fixed fraction per strength: strong hands still bet big more often, but you can no longer read the hand off the number the way you could when 0.33 meant bluff and 1.00 meant nuts, every time.
- Defends against a preflop raise from a chart: pairs, suited connectors, suited aces and broadway, priced against how much you raised. This is new, and the reason it's new is the next section.
Measured (after the fix below): VPIP 30.4–30.9%, PFR 15.6%, 3-bet 2.4%, AF 1.47–1.50, sees a flop 19.6–19.9%, goes to showdown 36.0–36.2%. The reference profile is VPIP 20–26, PFR 14–18, 3-bet 2–8, AF 1.8–2.5, so VPIP now sits above band, which is a real deviation and is discussed below rather than smoothed over.
The biggest single defect in the project, and it survived months of tuning
Facing a raise before the flop, this tier folded 92% of the time and three-bet almost as often as it called. A call-to-raise ratio of 1.1 : 1. No real player has ever played like that.
It had no calling range at all. The tier could fold or re-raise, and nothing in between. The cause was one constant compared against the wrong scale: a "is this better than a coin flip against a random hand" threshold was being tested against equity measured against a range, and it was a conjunct of the call test, so whenever it failed, the pot-odds term was never consulted at all. One absent range produced every symptom that had been separately noticed over weeks and never connected: the 4% call rate, a limp that folded 100% of the time to any raise, a fold-by-price curve that was flat and slightly inverted, and over-bluffing that the same table's over-folding made profitable.
| facing a preflop raise | before | after |
|---|---|---|
| fold / call / raise | 92.0 / 4.2 / 3.8 | 81.7 / 16.0 / 2.4 |
| call : raise | 1.1 : 1 | 6.7 : 1 |
| continues after limping | 0.4% | 17.2% |
| sees a flop | 9.6% | 19.9% |
What found it was duplicate poker: playing the identical spot four ways, human against three bot benchmarks on the same cards in the same seats, which makes behaviour directly comparable in a way aggregate statistics don't. The aggregates had been green the whole time: this tier's VPIP/PFR/AF gates all passed, because they average over hands where nobody raised, and those are most hands. Every gate band has since been re-derived against measured post-fix reality, and four new "shape" gates were added: fold/call/raise ratios facing a raise, call-to-raise, fold-by-price must increase, limp-continue must be non-zero, precisely because the old aggregate bands structurally could not see this.
The honest costs of the fix. VPIP went to ~30%, above the 20–26 reference band, and showdown frequency went up to 36% rather than down. Both follow mechanically from the same thing: the tier now survives preflop, so more hands reach a flop (7.6% → 19.9%) and more hands therefore reach a showdown. The design predicted showdown would fall. It rose, the mechanism is understood, and the band was set against reality rather than the prediction.
Where it's still weak. Showdown frequency remains above a competent regular's, and it over-defends the flop at one price bucket (85% defend against a 73% minimum-defence baseline versus ~⅓-pot bets), traceable to an unconditional implied-odds term. That one is deliberately left alone; it's an archetype feature, not a bug.
And a prior round of the same lesson. For three separate rounds of work this tier was tuned toward an aggregate "folds to 45–55% of bets" target. That target is meaningless without a bet size attached: the correct fold frequency depends on the price. Splitting the measurement by price showed the tier had been defending about correctly on the flop and turn the whole time; the aggregate only looked low because it faces mostly small bets. But chasing it had created a real hole: the bot was folding ~76% of rivers regardless of price, which against a human is free money. That's fixed too.
Advanced: the reg
This one is a different machine, not a better-tuned version of the one above.
Preflop: charts, by seat and by stack depth. A 100bb button opening range and a 25bb button opening range are different ranges, and only this tier knows that. Positions, action contexts (open, isolate, facing a raise, facing a 3-bet, facing a 4-bet) and four stack-depth bands, 108 chart cells in all. Crucially, these are sourced from published, widely-agreed 6-max ranges, not invented: hand-authoring "what feels strong" is how you reproduce the intermediate tier's problem one level higher up.
It also mixes: 52 hand classes are played two ways at set frequencies, so it isn't fully predictable. Premiums never mix: a hand with an obvious best action always takes it. And the mixing was balanced so it doesn't accidentally play tighter overall; every hand demoted out of the raising range is paid for by one promoted in.
Postflop: an actual belief about your hand, and prices in chips. Per decision:
1. It holds a weight on every combination you could have, and narrows it with each action you take using where that specific combination ranks on this board, not on some generic scale. Bigger bets narrow harder. A raise reads stronger than a bet of the same size. 2. It keeps floors on both ends, on purpose. Without them, one bet would drive the bottom of your range to exactly zero, and you'd have a bot that believes bluffs and slowplays are literally impossible: it would never pay off a bluff and never fear a trap. 3. It then prices out its options in chips: check, bet 33/66/100/150% of pot, call, raise 2.5x or 3.5x, fold. Each bet is priced across all three of your possible answers: fold, call, raise, and if you raise, it prices its own response too. 4. It picks by frequency across the close options rather than always taking the maximum. Always taking the maximum is both exploitable and, more importantly, reads as robotic at the table.
The distinction in one line: Intermediate asks "is my equity better than the price?" Advanced asks "which of these actions makes the most money against what they'd actually do?"
Two details that matter more than they sound. When it bets, it measures its equity against the part of your range that calls, not against your whole range: betting folds out exactly the hands it already beats, and pricing against the whole range is how a bot ends up value-betting hands that only beat folders. And a call is credited with implied odds, because pricing a call as though the hand ends immediately at showdown is exact on the river and wrong everywhere else; it's why a good player calls a flop bet with 65s, and why a model without that term never does.
A test of the range model, on K♠7♦2♣ / 4♥ / 9♠, starting from "anything":
| line taken | how much of the range survives | of that, two pair or better |
|---|---|---|
| bet 66% → 75% → pot | 1176 → 81 | 54.8% |
| check, check | 442 | 3.4% |
Three barrels on a dry board leaves a range five times smaller and sixteen times stronger. That's the tier's whole edge in one table.
Deliberate imperfections. It's a strong player, not a solver, and some of that is by choice:
- It over-narrows after aggression, on purpose, because real regs do.
- No ICM. That belongs to the fourth tier, below.
- One level of lookahead, no deeper.
- It tilts and loses focus like the tier below, and tilt matters more here: a strong player who tilts falls further.
Measured: VPIP 18–20%, PFR 15–16%, 3-bet 6%. And the number that matters, from the head-to-head harness, playing each tier against an ordinary mixed field: Beginner −262, Intermediate +56, Advanced +210 bb/100. (Those magnitudes are not real-world win rates; see below.)
A lead that looked like the same defect, and wasn't (closed 2026-08-19). Facing a preflop raise, Advanced folds ~85%, calls ~8% and raises ~7%, a near-even call-to-raise ratio, which is the same shape that turned out to be a genuine defect one tier down. So it was carried as an open red flag for a while. It is not a defect, and the difference is instructive.
The shape is the same; the cause is not. Intermediate's ratio came from a threshold that made calling mechanically almost unreachable; the tier couldn't call. Advanced's comes from a chart that deliberately authors a linear 3-bet range plus suited-ace bluffs against a thin flat range, because flatting an open out of position with a capped range is dominated. 3-bet-or-fold is what the strongest tier is supposed to look like.
Read straight off the chart data through the engine's own ladder, as a percentage of all 1,326 combinations:
| position | fold / call / raise | call : raise |
|---|---|---|
| HJ | 91.9 / 4.0 / 4.1 | 0.97 : 1 |
| CO | 88.4 / 5.2 / 6.3 | 0.83 : 1 |
| BTN | 83.2 / 8.8 / 8.0 | 1.10 : 1 |
| SB | 88.4 / 4.9 / 6.6 | 0.74 : 1 |
| BB | 74.8 / 18.5 / 6.6 | 2.79 : 1 |
| UTG | no chart: the one fallback cell |
Averaged over the five charted positions the chart predicts 85.3 / 8.3 / 6.3; the shipped engine measures 85.1 / 7.9 / 7.0. Within a point on all three, so the engine executes its data faithfully and the only live question was whether the data is standard, and each position's 3-bet width lands inside the 6–9% band the chart file names as its own design target.
UTG's missing cell is deliberate, not a gap. UTG acts first preflop, so it can only face a raise having already limped, a spot no standard chart authors. There is nothing to fill in.
And the ladder is clean and monotone on this statistic:
| fold / call / raise | |
|---|---|
| Beginner | 53.9 / 45.6 / 0.5 |
| Intermediate | 80.1 / 16.7 / 3.3 |
| Advanced | 85.1 / 7.9 / 7.0 |
The call-to-raise ratio collapsing toward 1:1 as the tier rises is the ladder working, not leaking.
Pinned by ChartSanityTest, falsified three ways before being committed: widen the flat range and the fold band goes red; demote the button's 3-bet bluffs into the flat range and the ratio assertion fires at 1.81:1 with fold% unmoved; author a UTG cell and the fallback assertion goes red. That test exists because the obvious "fix" for the symptom is to widen the flat ranges until the ratio looks normal, which would make the strongest tier play worse in order to make a number look better.
Two general lessons survive the correction. A documented mechanism nobody ever verified is indistinguishable from a true one until it costs you something: the earlier belief that Advanced delegated these spots to Intermediate was false, and it hid this question for a year. And a suspicious number is a question, not a verdict: the honest close here was reading the data, not changing it.
One reported hand that changed it. An Advanced bot opened with aces, got 3-bet, and flat-called. Out of position, with the best hand in poker. I measured before touching anything: over 200 identical spots it 4-bet zero times. Not "too rarely", never. Two causes stacked: the charts only covered 3-betting, so the bot correctly declined to answer a 4-bet spot it had no range for, and fell back to the tier below, which also never 4-bets. That taught something general: falling back gracefully is only graceful if the tier you fall back to has an answer. Now there are real 4-bet and 5-bet charts, value-only, with no bluff 5-bets at all: a badly-guessed bluff frequency that deep is worse than none.
How I know the tiers are actually ordered
This is the part I'd want to see if someone else were making these claims.
Style statistics (VPIP, PFR, aggression) describe how a bot plays. They cannot tell you whether it's any good. A bot can post a textbook 24/20 with a 2.4 aggression factor and still light money on fire. So there's a second measurement: thousands of hands, tier versus tier, reported in big blinds per 100 hands with a confidence interval.
Poker is noisy enough that this is hard to do honestly. Three things keep it honest:
- Duplicate dealing. The same deals are played from both sides, the way duplicate bridge works, so card luck largely cancels. It cuts the noise by nearly 5x when both sides play the same strategy, and about 1.7x when the tiers differ, because the hands diverge at the first different decision, so less of the luck cancels. Still worth roughly three times fewer hands for the same precision. This has since grown into a full player-facing feature with its own brief, and it is what found the Intermediate defect above.
- Behavioural probes. Scripted opponents that do exactly one thing, never fold, always shove, min-raise everything, never bet, and (added 2026-08-19) a measured raiser that is aggressive on one hand in four and passive otherwise, so a tier's response to a specific pressure can be read without a normal table's noise. Each probe produces a fingerprint: a committed report of how every tier answered. A change that leaves the aggregates untouched but alters behaviour shows up as a diff. Beginner's fingerprint came back byte-identical across the Intermediate fix, which is a far stronger statement that nothing leaked sideways than any aggregate comparison could make. This now runs on every push as a strict byte-for-byte CI check, and the engine carries a version stamp that has to move in the same commit as any change to what a bot decides, so a change in behaviour can be deliberate, but it cannot be silent.
- A null control. A tier is played against itself first. If that shows an edge, the measurement is broken. It measures +0.7 bb/100 with an interval spanning zero, so it isn't.
- Re-running everything. This one was learned the hard way. A single run once showed Advanced beating Intermediate by +36 bb/100 and I recorded it as a pass; the re-run measured −1.6. The first result was noise that happened to look like success. Worse, four control runs once clustered in a way that produced a confident "the harness is broken" conclusion that was itself wrong: a 95% confidence interval doing exactly what a 95% interval does one time in twenty.
What that discipline produced is one uncomfortable result I'll state plainly: Advanced's postflop machinery (the range modelling, the EV comparison, all of it) measured only about +8 bb/100 over Intermediate across 42,000 hands, which is not distinguishable from zero. The tier is clearly stronger against a mixed field (+210 vs +56 above). But the specific claim "the postflop model beats the heuristics head-to-head" is not something the measurement supports yet, and I'm not going to pretend otherwise.
One more caveat on the numbers: those bb/100 figures are enormous by real poker standards. They're an artefact of the test environment: stacks reset every hand, nobody ever busts, 200bb deep, and the Beginner is a maximally exploitable station. They're meaningful only against each other. Don't compare them to a real win rate.
The small things that make a table feel like a table
Realism isn't only decision quality:
- Bots take 1–5 seconds to act, randomised.
- Every bot has its own personality offset, so five Beginners aren't clones. (Honestly: this is thinner than I'd like: sizing personality is real, but their thresholds still move on a single small scalar. Five Beginners are still more alike than five humans.)
- Which chair each tier sits in is randomised when the table is created, then fixed for the session. Your opponents don't change identity between hands; seat 3 is the same player with the same personality all session, and working out that he's the soft one is a read you're supposed to be able to make. What the randomisation prevents is the meta tell: without it, the strongest bot would always land in the same chair at every table you ever sat at, and you'd learn the seat instead of the player.
- On the "surprise me" difficulty setting, the table mix is computed on the server and never sent to your browser, so it's actually concealed rather than merely not displayed.
- No table is ever all-Advanced. Partly because that's a miserable game, partly because a table of identical strong bots is a population whose statistics mean nothing.
Where this doesn't work yet
Omaha. Everything above is tuned for Hold'em. PLO and PLO5 are playable, legal, and behind the Plus flag precisely because I measured them and the numbers are bad: showdown frequency roughly doubles for every tier (both Intermediate and Advanced clear 60%) and folding collapses to ~15% even against small bets.
The cause is understood. Every postflop threshold was calibrated against Hold'em's equity distribution, and PLO's is compressed toward the middle: four cards make far more running outs, so raw equity sits much higher on average, and the same number that reads "fold" in Hold'em reads "call, you've got outs" in PLO almost every time. There's also a deeper structural problem: the decision layer's inputs are one equity number and a made-hand category, and that genuinely cannot express Omaha. "Top set on a wet board with no redraw" and "second-nut flush draw with a wrap" carry similar equity and identical categories, and they're a fold and a raise. Nuttedness, redraws, blockers and nut outs aren't computed anywhere yet.
So the fix isn't retuning constants; it's a separate Omaha decision layer with its own measures of hand strength. That's designed and written down; it isn't scheduled, and I'd rather have three honest Hold'em tiers than five mediocre ones.
Other known gaps, without spin:
- Intermediate still goes to showdown more than a good regular would, and now sits above its VPIP reference band. Measured, documented, understood, unfixed.
- ~~Advanced's facing-a-raise profile is unexamined.~~ Closed 2026-08-19: it is the chart working as designed, not a defect. See its section above for the per-position numbers and the test that pins them.
- Advanced rebuilds its read on you fresh each decision rather than carrying it across streets, so flop and turn aggression compresses into "they were the aggressor" instead of narrowing barrel by barrel.
- Advanced models everyone as playing like itself, so it mis-reads Beginners badly; it doesn't detect what kind of player it's up against, it just assumes competence.
- Personality variation within a tier is real but narrow.
- ~~Advanced only plays its full postflop model at a table a human is watching, so measurements drawn from tournament or harness data are partly Intermediate's.~~ Withdrawn 2026-08-19: this was in an earlier version of this document and it was wrong. The mechanism existed in the code, but no production path ever triggered it: the field simulator, which landed four hours after that branch was written, advances every unwatched table statistically so those tables never reach a bot engine at all, and every other call site passed "watched" literally. The branch had been dormant since the day it was written, and every Advanced postflop number on record is Advanced's. The flag has since been deleted outright; a tier that quietly becomes a different tier on a flag nothing sets is worse than the throughput it was buying, and the probe fingerprint came back byte-identical across all three tiers afterwards, which is what proves the deletion changed no decision. It is recorded here rather than removed because believing a documented mechanism without running it against the code is the single most expensive recurring mistake in this project, and this is the third time it has happened.
The fourth tier, and why the plan for it changed
There's a fourth tier, designed and deliberately not built. It was going to be a solver: near- equilibrium tables computed offline once, then looked up at the table. As of August 2026 the plan is different, and more interesting. The fourth tier should learn to play.
What "learn" means here, precisely
Machine learning, in the ordinary sense of the term: a strategy that is trained rather than authored. It plays poker against itself, millions of hands, and improves from the results, the same family of methods behind every strong poker AI of the last decade (Libratus, DeepStack, Pluribus). What comes out is a data artifact, a learned strategy, and it plugs into the same seam the three existing tiers already share.
That seam is why this is a swap rather than a rewrite. The strategy layer returns a distribution over actions with frequencies, not a single action, and it was built that way from the first commit precisely so a trained tier could be new data behind an unchanged interface.
What it will never learn from: your hands
It is never trained on any player's hand history. Not opt-in, not anonymised, not ever.
That is a decision, taken on two grounds that happen to agree.
The first is that it would not work. Machine learning reproduces its training data, and this site's data is beginners learning to play: training on it would produce a worse Beginner, at enormous cost. Poker's variance compounds the problem: a supervised approach needs hundreds of thousands to millions of decisions before signal beats noise, which at this site's size is years of play. It is also why the serious poker AIs learned by self-play instead. Pluribus (the six-player result, and the one closest to this site's shape) saw no human hands in training at all.
The second is that it is the wrong thing to do with hands somebody played on a site that asked them to trust it. A training platform that quietly mines its students to build a better opponent has spent something it cannot buy back. The promise is absolute because it costs nothing to keep: the method that actually works needs no player data.
It learns offline, and never while you play
Training happens on a developer's machine, not on the server. What reaches production is a finished, versioned file. The bot you sit down against on Tuesday plays exactly as it did on Monday unless there was a deploy in between, and when there is, that is a visible version change like any other.
This is not caution for its own sake. Duplicate Poker's whole promise is that two players face identical opponents; a bot that quietly improved between two people's sessions would break that silently, and every bug report against it would be unreproducible.
Is there actually room above Advanced? Measured, August 2026
The obvious risk is that Advanced is already as strong as this engine gets, in which case a fourth tier is weeks of work for nothing. That got measured before anything was committed to.
Head-to-head, Advanced beats Intermediate by too little to resolve: +8 bb/100, give or take 11, across 42,000 hands. That number is what made the question worth asking, and it turned out to be the wrong measurement. Head-to-head strips out the weak players that skill largely consists of exploiting.
Against a common field (same two Beginners and two Intermediates, same cards, seats swapped so the luck cancels), the same comparison resolves cleanly at +71 bb/100 (±26), over two independent runs of 40,000 hands each. The shape is the useful part: Intermediate's step up from Beginner is about +37 and does not resolve, while Advanced's step up from Intermediate is about +71 and does. The ladder gets steeper at the top, not flatter, which is the best evidence available that Advanced is not sitting against a ceiling.
Those are yardsticks rather than real win rates: stacks reset every hand, nobody busts, there is no rake. They mean something against each other and nothing in absolute terms.
Where it starts, and what it falls back to
The first milestone is the cheap half of the old plan, done the new way: a solved preflop strategy, trained by self-play. Preflop is the tractable part: 169 distinct starting hands is the actual game, with no approximation needed, and it is a well-understood problem with a known method. Whether the expensive postflop half is worth building is deliberately left open until that first result can be measured, because that measurement is what should decide it.
Wherever the learned strategy does not cover a spot, it falls back to Advanced. That is not a stopgap, it is the safety property: a trained policy's worst failure is a bizarre decision in a rare situation, and the fallback means such a decision never reaches a table.
Still not scheduled
None of this is built, and it is ranked below several things that reach far more players. Advanced is a genuinely hard opponent for most people, and the honest sequencing is still to fix what is measurably wrong with three tiers before adding a fourth. What has changed is that the fourth tier now has a plan worth being interested in, and a measurement saying there is room for it.
On the AI question, since it'll come up
This was built with Claude Code, and I'm not going to be coy about it. The implementation is AI- written: the engine, the ranges, the equity code, the test suite, the measurement harness. That's what made a project this size possible for one person.
What AI did not do is decide what a poker player looks like. The corrections that changed the design came from playing it: nobody folds kings to an all-in, so that stopped being a threshold and became a floor; bet sizing has to change with stack depth in a tournament, which one hardcoded formula was ignoring for every tier and format; a good player raises and folds far more than they call, which redirected an entire tuning pass away from a target that had been invented rather than observed. And most of the worst bugs (a Beginner calling three streets with an underpair, an Advanced bot flat-calling aces) were found by sitting down and playing, not by the 1,672 tests.
The Intermediate defect above is the sharpest version of that point in both directions. It was found by an instrument the AI built and the human asked for, and it had been invisible to every aggregate gate in the suite for months, but what made it legible as a defect rather than a curiosity was a poker player looking at "folds 92%, three-bets as often as it calls" and knowing immediately that no human plays that way.
The measurement discipline is the part I'd point to as the real answer to "are these serious?" It would have been much easier to write "our advanced bot uses GTO principles" and ship. Instead there's a harness that plays tens of thousands of hands, a null control that would catch it lying, and a document like this one that says out loud where a gate failed.
One distinction is worth drawing now that the fourth tier is a machine-learning plan, because "built with AI" and "a bot that learns" are different claims and this document makes both, about different things. The three tiers you can play today learn nothing. They are hand-written strategies (charts, thresholds, an equity calculator) authored with AI assistance and tuned against measurements. Nothing in them was trained, and nothing in them changes while you play or between deploys. The fourth tier is the one that would be trained: it does not exist yet, and when it does it will have been trained against the other bots and never against anybody's hands.
What's next for the bots
In order, from priorities.md:
1. Confirm the Intermediate river fix in play. It shipped and was verified in the harness; what it has not had is somebody playing fifteen river bets at three different sizes and reporting whether the fold rate actually rises with the price. This is now the top open bot item. 2. Omaha, when it is scheduled: a separate decision layer, not retuned constants. 3. Personality breadth. Five Beginners are still more alike than five humans, and widening that is a design decision about how each axis maps onto each engine rather than a constant to turn.
Two items that used to sit on this list are gone rather than done, and how they left is worth a line. Advanced's facing-a-raise profile was closed by reading the chart data rather than changing anything. "Build a probe that doesn't saturate the opponent read" was ranked highly for weeks on a premise that turned out never to have been true: the probe harness resets bot memory before every hand, so no probe has ever accumulated a read to saturate. Measured rather than argued: after a real 40-hand run each bot ends holding exactly one hand of read on the probe; delete the reset and the same check reports forty. The widening is real where memory actually accumulates: cash games, tournaments, duplicate runs, which is why the new measured-raiser probe earns its place: it is the raising probe whose behaviour is the same in the harness and in play.
The fourth tier stays conditional, for the reason in its section above: Advanced is already a hard opponent for most players, and the honest sequencing is to fix what is measurably wrong with the three existing tiers before adding a fourth. What changed in August 2026 is the plan for it: it would now be trained by machine learning against the other bots, never on player hands, and a measurement confirming there is room above Advanced to train into.