# Poker range after an action: reproducible 27-combo fixture

This release reproduces the deterministic teaching example in the GTO Gecko article “How a Poker Range Changes After an Action.” It updates a declared river range after one observed pot-sized bet.

## Model

- Game: heads-up standard 52-card Texas Hold’em.
- Completed board: `Kd 9c 7h 4c 2s`. The turn creates a club flush draw for each listed two-club hand; the river misses it.
- Villain’s declared pre-action range: 27 exact combinations, each with reach weight 1.
- Observed action: Villain bets 100 into a 100-chip pot.
- Update: for each legal hand `h`, unnormalized posterior mass is `reach_weight(h) × P(bet | h)`. Normalize those masses across the legal range.
- Hero cases: `AhQh`, which blocks none of the listed missed-club draws, and `AcQc`, which blocks `AcJc`, `AcTc`, `QcJc`, and `QcTc`.
- Showdown simplification: Hero beats every listed missed-club draw and loses to every listed made hand. There are no ties.

All range choices and action frequencies are invented teaching inputs. They are not solver output, recommended strategy, population estimates, or evidence about a specific opponent. The model has no rake, future action, multiway correlation, payout adjustment, or real-money result.

## Reproduce and verify

Requires Node.js 20+ and Python 3.11+; the scripts use only standard libraries.

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

`generate.mjs` writes the full combo ledger, summaries, JSON, bilingual SVGs, and checksum manifest. `verify.py` is a separately implemented first-party checker: it reconstructs the legal combos and posterior from its own compact fixture, checks both the frequency-weighted and equal-count EV paths, and verifies every manifest hash. It deliberately uses explicit exceptions instead of Python `assert`, so checks remain active under optimized mode.

## Files

- `input-combos.csv`: all 27 candidate hands in both Hero cases, including blocked rows and normalized weights.
- `summary.csv`: the two case-level answers and pot-sized-call EV comparison.
- `results.json`: assumptions, full inputs, and machine-readable outputs.
- `range-update.svg`, `range-update-ja.svg`: accessible English and Japanese figures.
- `generate.mjs`: deterministic generator.
- `verify.py`: separately implemented standard-library verifier.
- `MANIFEST.sha256`: SHA-256 integrity ledger for every file above plus this README.

The fixed generation timestamp identifies the study release, not the wall-clock time of a rerun. Published source and product pages were accessed on 2026-09-14.
