Verification

Last updated: September 18, 2026

Every trainer claims its coaching is accurate. OptimaPoker measures it, the same way you'd audit a trading system: against ground truth, at scale, and adversarially. This page is the summary of those receipts. The numbers below are actual outputs of the audit harnesses, not marketing copy — including the ones that don't flatter us.

When these numbers were measured. Every section below carries its own measurement date, because they are not all from the same day: the solver-gap audits in section 1 are from July 2026, the mass-simulation receipt in section 3 from July 6, 2026, the latency and convergence measurements in section 2 from September 16, 2026, and the tree inventory, adversarial measurements and test counts in sections 4–6 are current as of September 18, 2026. Receipts are regenerated at release milestones, not after every commit, so a shipped build can be newer than the receipt it's described by. The permanent gates in section 6 are different: those run on every build, and the version on the download page has passed them.

1. Coach vs. solver ground truth

Measured July 5–13, 2026 · five committed runs of the same audit binary

The core question: when the coach recommends a play, how much EV does that play give up against an exact game-theory solution of the same spot? The audit deals full games, harvests the coach's real decisions, then solves each spot to equilibrium with the CFR solver and measures the gap.

Largest run (July 7, 2026). 402 postflop spots were harvested from 1,178 hands of live play; 170 were graded. Across those 170 spots: median EV lost 0.101% of pot · mean 1.968% · 90th percentile 5.589% · worst single spot 40.65% · top-action agreement 48.8%.

An earlier and much smaller run (July 5, n=32) produced a headline median of 0.000% of pot at 46.9% agreement. That figure has appeared on this page before and it should not have: it is the smallest and most flattering of five committed runs of the same binary, and the zero median does not survive any of the four later ones. The full set, oldest to newest, is: n=32 median 0.000% / mean 1.31% / agreement 46.9% · n=170 median 0.101% / mean 1.968% / 48.8% · n=137 median 0.144% / mean 2.330% / 48.9% · n=108 median 0.100% / mean 2.243% / 48.1% · n=89 median 0.298% / mean 1.983% / 43.8%. The stable reading across all five is a median of roughly a tenth of a percent of pot, a mean of about 2%, and agreement in the mid-to-high forties.

Read that honestly, because it is not "the coach plays the solver's line." Agreement is a minority in every run: in most graded spots the coach chose a different action from the solver's top one. What the small median says is that the different action usually costs close to nothing — the weaker, true claim, and what you'd expect where two actions are near-indifferent. The tail is where the real work is: the worst spot in the largest run gave up 40.65% of the pot, and every run fails the audit's own internal bar of mean ≤ 0.5% / p90 ≤ 1.0%. The findings go into the fix queue.

The excluded spots are not a random sample, and that biases the result. In the largest run, 93 harvested spots were dropped because the solver could not navigate them, and the receipt names the shape: 3-bet pots and donk lines — 35% of everything the audit tried to solve. In the smallest run it was 15 of 51 spots, 29%, for the same reason. Those are harder shapes than the ones that survived, so the graded set is skewed toward easier spots and the true average gap is very likely worse than the number above. Deep flop spots are also sub-sampled for cost (12 of 147 in the largest run).

Anywhere the live solver lands on your actual spot, you aren't relying on this statistic at all — you get that spot's own equilibrium with its own measured ε, printed on the card.

2. Solver convergence

Measured September 16, 2026 · two live runs of 120 hero postflop decisions each

The live in-app solver targets a measured exploitability of 0.5% of the pot — the convergence bar used by professional desktop solvers — and the app enforces ≤1%: a solution that measures worse than 1% of the street-start pot is discarded rather than shown, and the coach's labelled estimate stands instead. Every solved spot prints its own measured ε on the card, so you are never asked to take the convergence on faith.

The gap between target and gate is deliberate slack, and it is measured: across 138 landed cash solves (two independent live runs of 120 hero postflop decisions each, before and after the change), not one landed between 1% and 2% — in fact none exceeded 1% at all — and the worst observed was 0.80%. That is why the discard bar was tightened from 2% to 1%.

How often the solver actually answers, from the same two runs. Of 240 measured hero postflop decisions, 138 (57%) got a solve. Broken out by street: river 56 of 60 (93%) · turn 72 of 86 (84%) · flop 10 of 96 (10%). The flop is where it declines, and it declines on purpose: a flop-rooted tree usually cannot be solved inside the live wall-clock budget, so the solver refuses the spot rather than show you an unconverged answer. The other refusals are multiway pots (24 — the solver is heads-up only) and spots where the hero was already all-in for the street (8). When the solver declines, the coach's labelled estimate stands and the card says which one you are reading.

Convergence is also pinned by automated proofs on flop-rooted and turn overbet trees — but to be precise about when those run: they live in the solver crate and execute under an opt-in test mode, not in the default gate, and the release scripts themselves run no tests at all. What does run on the default gate is the solver's analytic suite: Kuhn poker pinned to its exact value of −1/18, the AKQ half-street bluff and defence frequencies pinned to their closed-form values from Chen & Ankenman, an all-in runout enumeration checked against the solver's chance integration, and a brute-force best-response check agreeing to better than 1e-9.

3. Realism at scale

Measured July 6, 2026 · newest committed 100M-hand receipt

The opponents are only worth training against if they behave like real players. Every archetype is calibrated against published population statistics (VPIP, PFR, 3-bet, c-bet, aggression factor, donk/probe and check-raise line shapes), and the whole field is stress-tested in mass simulation:

4. Robustness against exploit strategies — and the one line that beats us

Current as of September 18, 2026

A training field you can beat with one weird trick teaches you the trick, not poker. An adversarial harness plays eleven fixed exploit strategies — always-fold, any-two open-jamming, the pure calling station, relentless 75%-pot barrelling, pure-bluff stabbing, premium-only jamming, light 3-bet spam, float-and-stab, river overbet bluffing, a high-SPR overbet bluff, and a three-street value line — one seat down against the shipping bot field, and measures each one's win rate over tens of thousands of hands. The field also adapts: it tracks public frequencies and punishes pattern abuse, the way a live table would.

One of the eleven beats the Hard field, and we are publishing it rather than dropping the claim. The line is called three-street value: open the top ~15% of hands, re-raise to 3× the current bet every single time it can, then bet ⅔ pot on every street with top pair or better and give up with everything else. It never bluffs and it reads nothing. Measured, it earns roughly +18 to +32 bb/100 against the tough field (Easy: roughly +48 to +69). A crushing human professional earns 3–5 bb/100.

We quote a range, not a number, and the reason is worth stating: this line stacks off for value, so its result swings about 14 bb/100 between seed sets even at 32,000 hands per estimate. Three independent readings give +17.62, +19.4 and +31.89 ± 6.86 — the same defect measured three times, not three results. A single-seed-set point estimate of this statistic is not meaningful, so we do not publish one. What is reproducible is everything that matters: every run lands many standard errors above zero and far above our bar, Easy exceeds Hard every time, and even the bottom of the range is four times a winning pro. That is an outright failure of our own standard, which is +2.0 bb/100.

The useful part is where the leak is, because we measured that too, and it is not where we first guessed. 78% of the line's edge comes from hands that never see a flop — it sees a flop on only 5.7% of hands. It is an unbounded preflop re-raise train (3bb → 9bb → 27bb → 81bb) run at a field whose fold-to-3-bet is 38–84% depending on archetype, and it simply collects dead money without a board. The first diagnosis blamed the postflop call-down threshold; that was tested directly and refuted — driving the elite bots' fold rate from 57% down to 45% moved the exploit's profit not at all. So this is a preflop re-raise-defence hole, it is recorded as an open defect in our own roadmap, the test that measures it is a ratchet that only prevents it getting worse rather than a passing gate, and it is being fixed.

Why publish this at all? Because a training field you can beat with one line teaches you that line. If you grind our tough tables with a no-bluff 3-bet-everything strategy, you will win, and what you will have learned is a habit that a real tough field would punish. You are entitled to know that before you train against it.

The other ten: nine of them are gated to stay below the +2.0 bb/100 free-money bar against the Hard field, and the blunt ones (the station, the nit, any-two jamming) are heavy outright losers. The tenth — premium-only jamming — is measured as a loser against both fields, but in fairness it carries no upper bound in the test suite at all; what is pinned there is the gap between jamming premiums and jamming any two cards, not a ceiling on its win rate.

Why we never write "unexploitable." What section 4 establishes is robustness against eleven hand-written lines, ten of which currently hold. It is not a best-response bound. "Unexploitable" is a claim about the gap to a best response, and for a nine-handed field we know of no published method to compute one — so the word is reserved for a measured exploitability gap, which is exactly what the heads-up solver in section 2 prints on every card and exactly what this section does not have.

One more correction to what this page used to say: it claimed a companion test showed the exploit gap shrinking as the skill tier rises. There is no such test, and the direction is not uniform. Pure bluffing does worse against the soft field than the tough one, because loose-passive opponents call you down — bluffing is not how you beat fish. And our own measurements found something worse: postflop defence is currently skill-inverted. Facing a ⅔-pot bet, where minimum-defence frequency permits folding 39.8%, the weak bots fold 34–46% (about right) while the elite bots fold 57–60% — the better the bot, the more it over-folds. That is also recorded as an open defect.

5. Solved preflop, shipped as data

Tree inventory current as of September 18, 2026

Preflop coaching is not a hand-typed opinion. The app ships 57 full-ring preflop trees solved in HRC Pro under licence and converted to static chart data. They break down as:

The live lookup walks your actual preflop action sequence into the tree rather than matching your hand alone, and every shipped node passes an automated certification check first.

Coverage is not exhaustive and we don't claim it is — and there are two distinct fallbacks, which this page previously described as one. A line no tree carries, or a stack shallower than every depth window, falls back to labelled heuristic charts. A stack deeper than the deepest applicable tree does something different: it is served by that deepest tree and labelled "nearest solved depth (tree Nbb, your stack Mbb) — not an exact solve for your stack." A 300bb cash spot is answered by the 200bb solution; a 120bb spot at bubble factor 2.20 is answered by the 65bb one. That is a real approximation, not a solved answer for your stack, and the card says so — but it is a clamp, not a fallback to heuristics. Either way the coach card names the source it is quoting, every time.

6. Permanent gates — and the tests that are marked failing on purpose

Counted from the source tree, September 18, 2026

The engine crate carries 582 automated tests, of which 564 run on every build gate, including three permanent validation harnesses: a coverage sweep proving every reachable decision is coached and legal (zero coaching gaps), preflop invariants (position monotonicity, no junk opens, push/fold ordering pinned to Nash), and postflop invariants (MDF, pot odds, and bluff ratios pinned to the textbook numbers).

The 18 that don't run are not all "heavyweight sweeps", and this page used to imply they were. Six are measurement instruments that assert nothing. The other twelve are failing specifications — tests written to describe behaviour we want and do not yet have, disabled so the build stays green while the work is outstanding. The file that holds five of them says so in its own header: "These tests FAIL today. They are the specification, not the behaviour." Their names are the finding: "QJo and JTo are folded 100% of the time to a button open"; "pocket eights fold 63% to a button open at 100bb"; "the coach continues 7.8% facing an open where a solved strategy continues ~25–30%". The other seven are the acceptance bar for a solver-derived big-blind defence chart that has not been built yet.

The scope of that matters and we won't shrink it or inflate it. Those tests exercise the hand-typed heuristic charts directly. In live play the solved HRC trees of section 5 override them wherever a tree covers the line, which for a 100bb button-open spot it does — so that specific hand is not what the coach plays today. But those heuristic charts are still what answers every line no tree covers, so the defect is live wherever the fallback is live, the specification stays in the repo unmuted, and it is what a real solved big-blind chart is meant to retire.

The GTO math isn't believed — it's asserted. Where the assertion currently fails, it's written down as a failing assertion rather than deleted.

Method notes

← Back to OptimaPoker