A poker solver can play two equal-rank combinations differently because a hand-class label hides physical-card relationships. Suits themselves are interchangeable labels, but which suit a hand shares with the board and each range is part of the game state. On one fixed flop, changing A♥5♥ to A♠5♠ can change future flush paths, exact card removal, legal matchups, and each combination's role inside the range. That is not the same test as renaming hearts to spades everywhere. In our synthetic audit, a complete suit relabel—hearts↔spades everywhere—reproduced every mapped strategy, value, matchup-mass, and exploitability field at the retained precision, while a fixed-board comparison produced a 22.09-percentage-point betting split. The actions were still almost tied in EV, so the frequencies are evidence to investigate—not numbers to copy.
This article publishes the full experiment: a deliberately small game, exact physical-card ranges, three convergence checkpoints, raw solver output, a deterministic chart, the source harness, and a separately written verifier. The result answers a diagnostic question. It does not prescribe how often to bet ace-five in a real game or certify every solver implementation.
Disclosure: GTO Solutions AS publishes GTO Gecko and this article. The experiment was run separately with a pinned open-source solver on synthetic ranges; it is not a GTO Gecko production solution or a product benchmark.
The Short Answer: Suit Labels Are Not Suit Relationships
Spades are not stronger than hearts. Rename every heart as a spade and every spade as a heart—consistently across the board, both players' weighted ranges, the focal hand, and all future cards—and the renamed game has the same strategic structure. This is a global suit isomorphism. Kevin Waugh's original hand-isomorphism paper formalizes how suit permutations can map strategically equivalent poker states to one canonical representation.
Now keep the board fixed and change only one hole-card combination. That is usually not a relabel. A heart in the hand may share a suit with a heart on the board, remove a heart from an opponent's range, or unlock a runner-runner heart flush. The corresponding spade may do none of those things. The ranks match, but the complete states do not.
The distinction in one line
Global relabel: every heart and spade changes together. Within-node comparison: the board and ranges stay fixed while A♥5♥ is compared with A♠5♠. Only the first operation proves suit equivalence.
The Controlled Node: What We Froze
The audit uses heads-up, no-limit Hold'em chip EV on the flop. The pot starts at 100 chips and both players have 100 chips behind. There is no later-street betting, and there is no rake, ante, or ICM. Out of position checks; in position may check or bet 75 chips; facing that bet, out of position may fold or call. Every legal turn and river is still evaluated exactly to showdown.
The focal board is Q♣7♥2♦. The out-of-position range is exactly A♥J♥ and A♠J♠, each with weight 1. The in-position range is exactly K♥Q♥, K♠Q♠, A♥5♥, and A♠5♠, each with weight 1. These tiny ranges make every relevant card relationship inspectable. They do not resemble a recommended real-game range.
Narrow screen? Scroll horizontally to read all four checks.
Test 1: Freeze the State and Enumerate Future Cards
On Q♣7♥2♦, both ace-five combinations are ace-high. Their future-card trees differ. A♥5♥ already shares hearts with the flop, so two more hearts can complete a flush. A♠5♠ sees no spade on the flop; two further spades would leave only four spades among its seven cards.
The independent enumerator lists all 1,081 unordered, legal turn-river pairs for each hand. Exactly 45 complete an ace-five heart flush, or 4.1628%. None complete an ace-five spade flush. That count establishes one real difference in the runout trees. It does not establish that the entire betting-frequency gap is “worth 45 runouts”: straight paths, board pairing, card removal, both ranges, and the full payoff tree are evaluated together.
Narrow screen? Scroll horizontally to compare the runout, frequency, and EV columns.
| IP combination | Runner-runner flush runouts | Bet 75 frequency | Bet EV | Check EV | Mixed EV |
|---|---|---|---|---|---|
| A♥5♥ | 45 / 1,081 (4.1628%) | 71.9585% | 21.568436 chips | 21.565655 chips | 21.567654 chips |
| A♠5♠ | 0 / 1,081 | 49.8732% | 16.110989 chips | 16.111110 chips | 16.111050 chips |
The two hands' same-node mixed EVs differ by 5.456604 chips at the tight checkpoint. That cross-hand value contrast shows that the physical combinations are not equivalent in this toy node; it is neither the margin between betting and checking nor the isolated value of the backdoor-flush path. The within-hand action margins are much smaller: bet minus check is +0.002781 chips for A♥5♥ and −0.000121 chips for A♠5♠. In this constructed tree, both betting decisions are near indifferent even though the displayed frequencies look far apart.
Test 2: Relabel the Whole Game
A fair control applies one bijection everywhere. We swapped hearts and spades, left clubs and diamonds fixed, mapped Q♣7♥2♦ to Q♣7♠2♦, moved both ranges and their weights, and mapped every future card and output label. We did the same for the separate range-weight experiment.
For this audit, a claimed global mapping has to pass all five checks:
- Every public card maps under the same one-to-one suit permutation.
- The focal physical combination maps under that permutation.
- Every physical combination in both ranges maps with its weight preserved.
- Every legal chance branch maps to a branch with the same probability and payoff rules.
- Outputs are compared only after their combination labels are mapped too.
Ranks, action tree, pot, stacks, and rules stay fixed. This test changes names without changing relationships. Recoloring selected cards independently is not a suit permutation and cannot establish strategic equivalence.
The verifier performs nine mapping checks: three hearts↔spades self-map checks inside the symmetric scenario, plus three checkpoints for each of the two original/relabelled scenario pairs. Across solver-reported exploitability, strategy frequency, action EV, mixed EV, and weighted legal-matchup mass, the maximum residual was 0.000000 in retained numeric precision. Iteration counts also happened to match inside each relabelled pair. Environment-specific runtimes were excluded and did differ. That is the behavior the global relabel predicts without pretending every raw receipt field is invariant.
The check matters because comparing A♥5♥ with A♠5♠ while leaving Q♣7♥2♦ unchanged is not a failed isomorphism test. It is a deliberately non-isomorphic comparison. One heart on the board stays a heart, so the mapping was never applied to the complete state.
Test 3: Break Isomorphism on Purpose
A useful diagnostic needs a positive control: an input change that should create a suit difference. We used the hearts/spades-symmetric board Q♣7♥7♠, then reduced only A♠5♠'s in-position range weight from 1.0 to 0.2. All other physical combinations retained weight 1. The public relabel control moves that 0.2 weight with the hand, as a true mapping requires.
After IP bets at the tight checkpoint, A♥J♥ blocks the common A♥5♥ bluff candidate, while A♠J♠ blocks the downweighted A♠5♠. The compatible betting-range composition is therefore different. A♥J♥ folds 100%; its call EV is −21.659782 chips. A♠J♠ calls 72.3803%; its call EV is −0.000565 chips, essentially tied with the engine's node-relative fold value of zero.
Narrow screen? Scroll horizontally to compare both blocked-candidate rows.
| OOP combination | Blocked IP candidate | Call frequency | Call EV | Weighted legal-matchup mass |
|---|---|---|---|---|
| A♥J♥ | A♥5♥ at weight 1.0 | 0.0000% | −21.659782 chips | 2.2000000 |
| A♠J♠ | A♠5♠ at weight 0.2 | 72.3803% | −0.000565 chips | 2.7148538 |
“Weighted legal-matchup mass” is the focal hand's reach weight multiplied by the sum of compatible opponent reach after card collisions. At this response node, A♥J♥ can face the two weight-1 queen pairs plus the weight-0.2 spade ace-five that bets, so its mass is 1 + 1 + 0.2 = 2.2. A♠J♠ can face those queen pairs plus A♥5♥, whose solved bet frequency is 0.7148538, giving 1 + 1 + 0.7148538 = 2.7148538. These are unnormalized post-action masses, not probabilities. The call-EV split follows the solved betting-range composition produced by weights and card removal together; it is not a linear standalone effect of changing one weight. The 72.3803% mixture is not a transferable defense frequency.
This control illustrates a point from PioSOLVER's official explanations of range weight, real frequency, and matchups: a displayed strategy belongs to a physical combination inside two weighted ranges. Exact card removal changes which opposing combinations remain compatible.
Test 4: Tighten the Solve and Read Action EV
The solver was stopped at three declared whole-game exploitability targets: 0.1, 0.01, and 0.001 chips. In a 100-chip starting pot, those labels are also 0.1%, 0.01%, and 0.001% of that starting pot. Exploitability is a strategy-level best-response measure; it is not a guaranteed error bar for one hand's frequency or EV.
Narrow screen? Scroll horizontally to compare all convergence columns.
| Target | Achieved | Iterations | A♥5♥ bet | A♠5♠ bet | Gap | A♥5♥ bet − check EV | A♠5♠ bet − check EV |
|---|---|---|---|---|---|---|---|
| 0.1 chips | 0.08032417 | 150 | 71.5319% | 49.6767% | 21.8553 points | −0.015822 | −0.945258 |
| 0.01 chips | 0.00879097 | 820 | 72.0058% | 49.9847% | 22.0211 points | −0.022700 | −0.003299 |
| 0.001 chips | 0.00095939636 | 10,090 | 71.9585% | 49.8732% | 22.0853 points | +0.002781 | −0.000121 |
The global relabel remains exact at every checkpoint, while the intentional fixed-board split persists. But the action-EV column changes the interpretation: the spade hand's −0.945258-chip gap at the loosest checkpoint contracts to −0.000121 chips at the tightest. Reading only the first frequency table would hide that convergence story.
The foundational counterfactual regret minimization paper proves an approximation result for average strategies in finite, two-player, zero-sum extensive games with perfect recall. It does not make every finite printed frequency exact. PioSOLVER's current concept documentation likewise explains that current-solution EVs come from an approximate opponent strategy and that actions mixed at perfect equilibrium have equal EV. No primary source we reviewed provides a universal “frequency differences below X% are noise” rule.
What the Range-Weight Control Adds
The board control changes future-card relationships; the range-weight control changes reach composition. Together they show why “same ranks” is an incomplete unit of solver analysis. A physical combo's value depends on the public cards, the betting tree, its own reach, the other player's reachable combinations, and the legal runouts. Its frequency also serves the whole strategy rather than the isolated hand.
This is why a 13×13 hand-class grid is excellent for orientation but insufficient for debugging suit splits. It merges combinations whose suits may block different value or bluff regions. Export combo-level ranges and weights at the actual node. PioSOLVER's official UPI documentation makes the same mapping boundary concrete: its display-suit swap acts on the original board and affects range inputs and outputs, rather than recoloring one selected hand.
Also resist a tempting reverse inference: equal action EV does not guarantee one unique frequency table. Some zero-sum games admit multiple equilibrium strategies with the same value; Geoff Gordon's author-maintained one-card poker example gives a concrete poker case. That is a possible explanation for a persistent mapped frequency difference, not a diagnosis of this Hold'em node. First verify the map, input ranges, runouts, labels, precision, and convergence.
Use the Four Tests on Your Own Output
- Freeze the entire node. Record game, positions, action history, board, pot, effective stack, rake or ICM treatment, legal sizes, exact combo-level ranges, and weights. A screenshot of one hand is not enough.
- Enumerate the relationships. Check legal opponent matchups and future-card branches. Name the actual card removed or runout gained instead of saying one suit is “better.”
- Write and verify one global permutation. Apply it to the board, both weighted ranges, focal combo, every chance card, and output labels. If any item lacks a counterpart, you have not established isomorphism.
- Tighten and compare values. Keep at least three checkpoints. Record whole-game exploitability in units, each action's EV, mixed EV, frequency, and range composition. Look for stability and repeatability rather than inventing a universal percentage tolerance.
How to classify the result
- The inputs do not map: the states are not established as isomorphic. Locate the unmatched board card, range weight, legal matchup, or runout before reading output parity.
- The inputs map and the mapped outputs agree: the relabel control passes at that checkpoint and retained precision.
- The inputs map and output gaps shrink as the solve tightens: incomplete convergence is the leading explanation.
- Mapped EVs agree but frequencies differ: rerun and inspect tie-breaking or equilibrium selection; do not declare a bug from frequency alone.
- The inputs map but mapped values remain materially different: recheck output labels, convergence, precision, export, and implementation. Treat it as a bug candidate until isolated.
For the study skill behind this workflow, see our guides to reading solver output without memorizing every mix, blockers and unblockers, and board-texture relationships.
What This Experiment Cannot Prove
This is one constructed heads-up chip-EV game with six total weighted physical combinations and a restricted bet tree. There are no raises, later-street bets, rake, antes, ICM, multiway players, or population tendencies. The narrow design makes the audit transparent; it also prevents the resulting frequencies from transferring to an ordinary cash or tournament hand.
The experiment uses one pinned open-source implementation, b-inary/postflop-solver commit 9d1509f, with sequential execution and mostly f32 internal numeric storage plus selected f64 summations. Its repository says open-source development has been suspended since 2023. We pin it for reproducibility, not current support. A clean rebuild reproduced all non-runtime output fields, and an independent verifier checked the retained results, but neither check establishes how another engine behaves.
The 45 heart-flush runouts are not a causal decomposition of the 22.09-point split. The 71.9585% and 49.8732% strategies are not advice. The tight solve remains finite, the actions are nearly indifferent, and whole-game exploitability does not bound error for a single combination. Finally, exact agreement in this harness does not certify any proprietary solution library.
Where GTO Gecko Fits
GTO Gecko is off-table educational poker study software for reviewing available precomputed preflop and postflop scenarios. Its current US store listings describe range views, available actions, mixed frequencies, EV estimates, range composition and hand-combination views, simulated practice, explanations, reports, and progress tracking. See the current official listings on the US App Store and Google Play.
The practical connection is the reading habit: treat a displayed mix as the start of a question. Compare exact combinations, action EVs, range composition, board relationships, and the solution's stated configuration. GTO Gecko does not run this public harness in the app, and this article does not promise an arbitrary custom node or live solve. Our separate explanation of how available GTO Gecko solutions are organized and checked covers the product's own data workflow.
Method, Downloads, and Independent Check
The retained harness used Rust 1.85.0 and version 0.1.0 of the pinned engine. The engine and linked harness are published here under AGPL-3.0-or-later with source and license. Fifteen runs cover five scenarios at three targets. Total retained solve-and-finalize time was 30.958 seconds, excluding the initial compilation. A clean locked rebuild reproduced every non-runtime field, and a separately written verifier checked the retained mapping and outputs.
The public Node.js generator parses the frozen result, independently enumerates runouts, checks all mapped pairs, and derives the CSV and accessible SVG. The Python standard-library verifier does not import the JavaScript or Rust. It rechecks card legality, range weights, three convergence levels, complete hearts↔spades mappings, all 1,081 runouts per focal hand, CSV values, SVG safety and accessibility, and every manifest hash. Passing proves the published files agree with this retained experiment; it does not prove that the model describes a reader's game.
- Method, exact configuration, reproduction commands, and limitations
- Complete retained configuration and combo-level outputs for all 15 runs
- Article-facing result table and deterministic four-test diagram
- Node.js transformer and mapping checker and independent Python verifier
- Pinned harness manifest, lockfile, source, and engine license
- SHA-256 integrity manifest
Sources
- Kevin Waugh, A Fast and Optimal Hand Isomorphism Algorithm (2013). Primary source for strategically equivalent poker states under suit permutations.
- Martin Zinkevich, Michael Johanson, Michael Bowling, and Carmelo Piccione, Regret Minimization in Games with Incomplete Information (2007). Primary source for CFR reach probabilities, counterfactual value, and the scoped approximation guarantee.
- PioSOLVER, UPI commands, calculation and strategy concepts, and viewer numbers. Current official documentation used for display-suit mapping, current-solution EV, reach ranges, real frequency, and matchup definitions; accessed September 5, 2026.
- Geoff Gordon, one-card poker equilibrium example. Author-maintained primary material used only to support the general possibility of non-unique poker equilibrium strategy tables.
b-inary/postflop-solver, pinned commit9d1509fe5077d019825f833eed04b16d342dfda1. Engine source, license, algorithm description, numeric-precision disclosure, and chance-isomorphism implementation used for the experiment.- GTO Gecko, public experiment method and limitation statement, retained output, and independent verifier; generated and checked September 5, 2026.
- GTO Gecko, current official US App Store listing and Google Play listing. Used only for the bounded product description; accessed September 5, 2026.

