# Poker-stat sample-size evidence bundle

Generated 2026-09-04. This bundle supports GTO Gecko's article “When Can You Trust a Poker Stat? Count Opportunities, Not Hands.” Release-time verification commands and a frozen record of the cross-check are included.

## What is here

- `reference.json`: formulas, assumptions, sources, limitations, the NIST benchmark, and every published row.
- `same-rate-wilson.csv`: the same observed 25% action rate across six opportunity counts.
- `zero-event-wilson.csv`: upper bounds after zero observed actions.
- `context-split.csv`: a plainly labeled simulated example in which 40% and 10% segments pool to 25%.
- `decision-threshold.csv`: two synthetic 25% examples compared with an arbitrary predeclared 30% study threshold.
- `opportunity-planning.csv`: expected total hands needed under four assumed eligibility rates.
- `wald-comparison.csv`: Wilson and unadjusted Wald intervals side by side.
- `calculator.html`: dependency-free, keyboard-friendly calculator for offline use.
- `generate.mjs`: the downloadable JavaScript generator used to create this bundle.
- `verify.py`: independent Python standard-library recomputation.
- `verification-report.json`: frozen generator metadata recording the release check's implementations, tolerances, check counts, status, and timestamp. Rerun `verify.py` to validate the files you have.
- `MANIFEST.sha256`: SHA-256 hashes for every generated bundle artifact and the chart.
- `../../images/blog_images/poker-stat-sample-size-wilson.svg`: accessible static chart of the same-rate table.

## Reproduce and verify

From the repository root:

```text
node public/data/poker-stat-sample-size/generate.mjs
python public/data/poker-stat-sample-size/verify.py
node --test tests/poker-stat-sample-size-data.test.mjs
```

The downloadable JavaScript generator writes every table, the structured reference, the calculator, the verifier, the chart, and the manifest. The repository wrapper at `scripts/generate-poker-stat-sample-size-data.mjs` calls that same public generator. The Python verifier does not import, execute, or call the JavaScript implementation. It reconstructs the Wilson, exact zero-event, and Wald results with Python's standard library, checks the NIST 8/30 reference, reconciles each CSV with the JSON, verifies the pooled-context arithmetic, threshold illustration, and opportunity-plan matrix, and validates every SHA-256 hash. Agreement is an implementation cross-check, not proof that the model assumptions fit a real player.

## Model and interpretation boundaries

A poker frequency is `actions / eligible opportunities`, not `actions / all hands`, unless every hand is genuinely an opportunity for that action. The published intervals use the Wilson score formula without continuity correction at the 95% two-sided confidence level.

The zero-event file deliberately separates three columns: the upper endpoint of a <strong>two-sided 95% Wilson interval</strong>; the <strong>exact binomial 95% one-sided upper limit</strong>, `1 - 0.05^(1/n)`; and the rough `3/n` approximation, shown only for `n > 30`. These are not interchangeable procedures. The 30% threshold in the synthetic comparison is an arbitrary cutoff declared for the illustration, not poker truth, advice, or a player-type boundary.

These are binomial teaching examples. They assume independent eligible opportunities and one stable underlying action rate. Real poker observations can be filtered, dependent, selected after inspection, or generated while a player changes strategy. A 95% confidence interval describes the long-run coverage of the procedure; it is not a 95% posterior probability statement about the fixed interval after the data are seen. Narrow uncertainty does not by itself make a read strategically important or profitable.

The context split is simulated, not player or product telemetry. Opportunity-plan totals are expectations under assumed eligibility rates, not promises about how quickly a situation will occur.
