# Mixed-strategy rounding audit

This public bundle reproduces the calculations in “Can You Round Poker Solver Frequencies? An Exact River Test” and its Japanese edition. It uses a deliberately small, synthetic river game so every equilibrium frequency, rounded profile payoff, and best response can be checked exactly.

## Declared game

- The pot before betting is 100 chips.
- The bettor reaches the node with equal mass of an unbeatable value hand and a zero-showdown-value bluff candidate.
- The value hand always bets. The bluff candidate Q bets with conditional probability `f`.
- After a bet, the defender holds a bluff-catcher and calls with probability `c`.
- A fold awards the existing pot to the bettor. A called value bet returns `P + b` to the bettor; a called bluff loses `b`.
- There is no rake, tie, future street, card-removal effect, tournament payout, or population assumption.

`f` is Q's bet frequency after Q is dealt, not the bluff share among all bets. With equal starting mass and A always betting, the latter is `f / (1 + f)`. Gross node returns are constant-sum: prior contributions are sunk and the defender's return is `P - u_B` at every terminal.

For pot `P` and bet `b`, indifference gives:

```text
equilibrium Q-bet frequency  f* = b / (P + b)
equilibrium K-call frequency c* = P / (P + b)
```

Each frequency is rounded independently to the nearest requested grid point. An exact half-grid tie rounds upward. The published grids are 1, 5, 10, 25, and 50 percentage points.

For a profile `(f, c)`, the bettor's expected payoff is:

```text
u_B(f,c) = 1/2 × (P + c×b) + 1/2 × f × ((1-c)×P - c×b)
u_D(f,c) = P - u_B(f,c)
```

The verifier evaluates the bettor's exact best response to `c` and the defender's exact best response to `f`. It reports both unilateral gains, their sum (`NashConv`), and `NashConv / 2`. The last value follows the two-player constant-sum convention used by OpenSpiel. It is an average best-response loss across the two seats, not the head-to-head payoff change between the two rounded policies.

## Headline fixture

With a 75-chip bet into 100, the exact frequencies are `f*=3/7=42.857…%` for Q betting and `c*=4/7=57.143…%` for K calling. The betting range's bluff share is `3/10=30%`. A 25-point grid rounds `f` and `c` to 50%. The rounded profile moves the bettor's head-to-head payoff by only `+25/56 = +0.446429` chips, while either seat can gain `25/8 = 3.125` chips by best-responding. OpenSpiel-style exploitability is therefore 3.125 chips, or 3.125% of the initial pot.

That result is a stress test for this equal-mass toy game. It is not a universal bound for rounding a Hold'em solve, a claim that 25-point simplification is always unsafe, or output from GTO Gecko.

## Files

- `results.json`: model declaration, headline result, featured fixtures, and sweep summaries.
- `scenarios.csv`: seven named bet sizes crossed with all five rounding grids.
- `ablations.csv`: a half-pot diagnostic that rounds only Q's bet frequency, only K's call frequency, both, or neither.
- `sweep.csv`: bet sizes from 10% through 200% of pot in one-point increments, crossed with all five grids (955 rows).
- `exploitability-rounding.svg` and `exploitability-rounding-ja.svg`: accessible charts generated from the sweep.
- `explorer.html`: a self-contained Japanese calculator for the same equations, using exact `BigInt` fractions.
- `generate.mjs`: exact-rational JavaScript generator using `BigInt` fractions.
- `verify.py`: separately implemented verifier using Python's `fractions.Fraction`.
- `MANIFEST.sha256`: checksums for the fixed release allow-list.

## Reproduce and verify

From this directory, with Node.js 20+ and Python 3.11+:

```sh
node generate.mjs
python verify.py
python -O verify.py
```

The generator intentionally stamps a fixed experiment time so a clean rerun is byte-for-byte deterministic. The Python verifier does not import or execute the JavaScript implementation. It separately recalculates all 35 featured rows, four one-sided ablations, all 955 sweep rows and the sweep summaries; it also checks exact schemas, headline fractions, chart metadata and path coordinates, calculator implementation markers, and every release digest.

## Provenance and scope

Created by GTO Gecko on September 16, 2026. The A/Q-versus-K teaching fixture predates this study; the new contribution is the seven-size, five-grid rounding benchmark, one-sided controls, and reproducibility bundle. The bundle contains no proprietary solver output, private hand history, or customer data. The accompanying article cites PioSOLVER for mixed-frequency interpretation and OpenSpiel for the exploitability convention; those projects did not produce or endorse this experiment.
