# Poker rake-cap worksheet bundle

This bundle supports the GTO Gecko article **“Poker Rake Cap Math: Why 5% Stops Being 5%.”** It turns three date-stamped tables on one public operator page into an auditable cap-breakpoint worksheet.

## What is included

- `source-snapshot.json`: manual transcription of the current PokerStars US-dollar No Limit/Pot Limit table, with scope and exclusions preserved.
- `schedule-breakpoints.csv`: 66 normalized schedule records (22 stake/family rows × three dealt-player buckets).
- `worked-case.csv`: the article's controlled $0.25/$0.50 comparison at seven gross-pot sizes.
- `reference.json`: formulas, derived rows, fixed checks, sources, and limitations.
- `poker-rake-cap-curves.svg`: deterministic chart used by the article.
- `calculator.html`: self-contained, no-request, off-table worksheet.
- `generate.mjs`: JavaScript generator and model implementation.
- `verify.py`: independent standard-library Python verifier.
- `verification-report.json`: what the two implementations are expected to check; it is a specification, not an execution receipt.
- `poker-rake-cap-math.webp`: representative hero copied into the bundle.
- `MANIFEST.sha256`: hashes of every listed artifact except the manifest itself.

## Reproduce

From the repository root:

```text
node scripts/generate-poker-rake-cap-data.mjs
node --test tests/poker-rake-cap-data.test.mjs tests/poker-rake-cap-article.test.mjs
python public/data/poker-rake-cap/verify.py
```

The generator uses only Node.js built-ins. The verifier uses only the Python standard library and imports no JavaScript.

## Model

Choose an exact schedule family, its published stake row, and the dealt-player bucket. Unknown combinations are not inferred. Inputs then use integer cents and a rate in basis points. If the hand ended before the flop, this cited Hold’em/Omaha schedule returns zero; otherwise, for gross pot `P`, nominal rate `r`, and cap `C`:

```text
uncapped cents = half_even(P_cents × rate_bps / 10,000)
rake cents = 0 if the hand ended before the flop, else min(cap_cents, uncapped cents)
net pot cents = gross pot cents − rake cents
effective rate = rake cents / gross pot cents
ideal continuous breakpoint = cap / decimal rate
```

The source says PokerStars applies true-percentage rake with half-even rounding. The page does not separately state a precision unit, so the nearest-cent step is an explicit worksheet convention. To avoid hiding rounding behavior behind one vague “cap starts” number, the bundle reports three integer-cent thresholds: the first pot that displays the cap, the first pot whose raw percentage reaches the cap, and the first pot where the cap changes the rounded result. It also retains the exact continuous `cap ÷ rate` breakpoint.

The verifier independently recomputes all 66 schedule/player combinations, including 14 fixtures that cover both half-even parity outcomes for every published rate and every whole-cent pot from $0 through $2,000. It also runs under `python -O`, checks parser rejections, verifies the no-flop branch and cap/round equivalence, compares CSV/JSON outputs, and validates the SHA-256 manifest. Passing means the bundle is internally consistent with the frozen snapshot—not that the live page has not changed.

## Scope and limits

- The source is venue- and date-specific. Recheck the linked schedule before reuse.
- “Players” means players dealt into the cited hand, because that is what the source says.
- The input keeps standard NL/PL, micro Omaha/Omaha Hi/Lo, and micro NLHE Zoom as three explicit schedule families; the same blind label can resolve differently across them.
- The grouped `$100/$200 and above` row has no single big blind, so its cash breakpoints are retained while its big-blind fields are blank.
- The model excludes contributed-rake attribution, rewards, rakeback, promotions, jackpot drops, time collections, fixed-limit schedules, tournament fees, side/split pots, and local taxes.
- A successful verification proves internal consistency with this checked-in snapshot. It does not prove that the live schedule remains unchanged, reproduce undocumented operator precision, or establish an optimal poker action, range, exploitability, or profit.
- This is an independent educational project and is not affiliated with or endorsed by PokerStars or partypoker.

## Sources

- PokerStars, current table and mechanics: <https://www.pokerstars.com/poker/room/rake/>, accessed 2026-09-04T23:22:09.7201938+02:00; raw HTML SHA-256 `f7804b8336b2f8204a7ba2a26b6bbe6f45e192c0cf50522b88ce41fb792771ee`.
- PokerStars, rake help: <https://www.pokerstars.com/help/articles/rake-master/220397/>, accessed 2026-09-04T23:22:10.2369857+02:00; raw HTML SHA-256 `8b28005ad9ca21448c92a5ec2720955d8744b10467b7f6347d77ffb086cf7ff7`.
- partypoker, independently structured schedule: <https://www.partypoker.com/en/poker/how-to-play/software/rake-blind-structure>, accessed 2026-09-04.
