> # ⛔ RETIRED — 2026-09-23
>
> **Do not quote any figure in this document.** It is kept as a
> change-management record, not as a reference.
>
> The current PAR sheet is
> **`aggregator/par_sheets_v13/par_sheet_shared_core_v13.md` (v13.1)**, with
> per-game sheets beside it.
>
> This file is dated 2026-09-15 and describes the game as it was before the
> 2026-09-21 progressive tier overhaul and the pool-seed accounting fix. Its
> headline numbers are wrong by a wide margin: it quotes a 96 scale of 0.9427
> (now 0.842), a tier ladder with Mini and Major fixed (now Mini and Minor), a
> random progressive trigger of 1 in 50,000 (now 1 in 20,000), and a
> Cash-on-Reels ladder of 13 values averaging 5.32× per cell (now 3 values
> averaging 1.4928×). The RTP figures it reports were produced by a simulator
> that did not count pool seed refills, so they understate true cost by roughly
> 25 points.
>
> **What was salvaged from it before retirement**, re-verified against the code
> rather than copied across:
> - Cash-on-Reels, including the player-facing guarantee that printed values
>   are the values awarded → v13.1 §5a.1, with the current distribution
> - Pool-tier proportional payout, the reference bet, Must-Hit-By, and award
>   atomicity → v13.1 §6.5
>
> Its §2 RNG description was already correct — it named the production CSPRNG
> where the v12c sheet had described the simulator's Mersenne Twister — and
> that correction is carried in v13.1 §2.1–2.5.

---

# Refund Rush — PAR Sheet (Math Compliance Document)

**Game:** Refund Rush
**Version:** 3.0.0 (v3 math overhaul — cull + ways + volatility pivot)
**Document date:** 2026-05-08
**Math design:** Oki Studios
**Format:** This sheet is intended for submission to GLI (Gaming Laboratories International), iTech Labs, or equivalent test houses.

---

> **Current math note (2026-05-08).** This sheet reflects the current family
> math: 243-ways scoring, Direct Deposit hold-and-respin, Bonus Season free
> spins, four jackpot tiers, and two readable random
> events. Earlier prototype features were retired before this submission pack.
>
> **1B-spin validation receipts are pinned** in `docs/sim_receipts/`:
>
> | Target | PAYTABLE_SCALE | 1B measured RTP | Receipt |
> |--------|----------------|------------------|---------|
> | 88     | 0.8423         | 88.0347%         | `sim_88_1B_final.txt` |
> | 92     | 0.8920         | 91.9985%         | `sim_92_1B_final.txt` |
> | 96     | 0.9427         | 95.9966%         | `sim_96_1B_final.txt` |

---

## 1. Game summary

| Property                  | Value                                  |
| ------------------------- | -------------------------------------- |
| Reels                     | 5                                      |
| Rows visible              | 3 (5×3 grid)                           |
| Scoring                   | **All-ways (3^5 = 243 ways)** — v3; lines retired |
| Bet range (minor units)   | 100 – 2,500,000 ($1 – $25,000)         |
| Default bet (UI)          | 100 ($1.00 total bet — no per-line div in ways) |
| Maximum win               | 10,000× non-progressive cap; Minor/Grand pools uncapped until hit |
| RTP — default             | 95.9966% measured at the 96 target |
| RTP — configurable        | 88.0347 / 91.9985 / 95.9966 measured |
| Volatility                | High (std dev/spin ≈ 9.2 — was 6.1 in v2) |
| Hit frequency             | **33.27%** |
| Theme                     | Tax refund / personal-finance Americana |
| Features                  | Direct Deposit + Bonus Season + 4 jackpot tiers + 2 random events (DD Alert, Rush Hour) |

---

## 2. RNG & integrity

- **RNG:** `secrets.randbelow` (Python stdlib) — wraps the OS CSPRNG (`/dev/urandom` on Linux, `BCryptGenRandom` on Windows).
- **Audit log:** every `randrange`, `randint`, `choice`, and `shuffle` call is recorded per round, keyed by `round_id`. Logs are persisted with the round record (`game_rounds.rng_data`).
- **Reel-strip generation:** deterministic (`seed=42`) — strips are public artifacts of the math model; per-spin randomness comes from CSPRNG-selected stop position. `_build_strip` enforces no 3-in-a-row and no special-symbol clustering, and **raises** rather than silently shipping a constraint-violating strip.
- **Concurrency:** every mutating endpoint takes `SELECT … FOR UPDATE` on the session row; progressive awards take it on the jackpot row. Two concurrent spins on the same session serialize.

---

## 3. Symbols

| ID | Symbol           | Tier        | Reel weight (R0/R1/R2/R3/R4) |
| -- | ---------------- | ----------- | ---------------------------- |
| 0  | Coffee           | Low         | 6 / 6 / 5 / 6 / 6            |
| 1  | Grocery          | Low         | 6 / 5 / 5 / 5 / 6            |
| 2  | Gas Pump         | Low         | 5 / 6 / 5 / 6 / 5            |
| 3  | Shopping Cart    | Low         | 5 / 6 / 5 / 6 / 5            |
| 4  | Coin Jar         | Mid         | 3 / 5 / 4 / 5 / 3            |
| 5  | Bills            | Mid         | 3 / 4 / 4 / 4 / 3            |
| 6  | Credit Card      | Mid         | 3 / 3 / 3 / 3 / 3            |
| 7  | Wallet           | High        | 2 / 1 / 2 / 1 / 2            |
| 8  | Gold Safe        | High        | 1 / 1 / 2 / 1 / 1            |
| 9  | Big Check        | Premium     | 1 / 1 / 1 / 1 / 1            |
| 10 | Wild (Refund)    | Special     | 0 / 6 / 6 / 6 / 0            |
| 11 | Scatter (Env.)   | Special     | 2 / 1 / 1 / 1 / 2            |
| 12 | Dollar           | Special     | 3 / 3 / 3 / 3 / 3            |
| 13 | Receipt          | Special     | 2 / 2 / 2 / 2 / 2            |
| 14 | Reserved         | Retired     | 0 / 0 / 0 / 0 / 0            |

(Full reel-strip arrays in `app/core/game_config.py:_REEL_*_COUNTS`. Reel strip lengths: 45, 50, 50, 50, 45.)

The retired symbol id remains reserved in code for backward-compatible round
history parsing, but it is not part of the active feature contract or theme
manifests.

---

## 4. Paytable (96 target, scale 0.9427)

Payouts are evaluated with all-ways scoring. The engine awards the highest
left-to-right ways result per regular symbol, with wild substitution.

The shipping lookup table uses `PAYTABLE_SCALE=0.9427` at the default 96 target.
Dollar credit values, jackpot contributions, fixed jackpot tiers, and meter
point accumulation are scale-invariant; the paytable, scatter, meter prizes,
and feature bonus values scale.

| Symbol           | 3-of-a-kind | 4-of-a-kind | 5-of-a-kind |
| ---------------- | ----------- | ----------- | ----------- |
| 0 Coffee         | 5           | 11          | 40          |
| 1 Grocery        | 5           | 11          | 40          |
| 2 Gas Pump       | 8           | 20          | 60          |
| 3 Shopping Cart  | 8           | 20          | 60          |
| 4 Coin Jar       | 11          | 34          | 100         |
| 5 Bills          | 11          | 34          | 100         |
| 6 Credit Card    | 20          | 60          | 199         |
| 7 Wallet         | 25          | 100         | 398         |
| 8 Gold Safe      | 35          | 150         | 597         |
| 9 Big Check      | 60          | 249         | 996         |

Scatter pays (multipliers of total bet, anywhere): `3 → 2x`, `4 → 5x`, `5+ → 19x`.

Wilds substitute for any regular symbol. Payouts are computed left-to-right.

---

## 5. Features

### 5.1 Free Spins ("Bonus Season")
- **Trigger:** 3+ scatters anywhere.
- **Award:** 3→10, 4→15, 5+→20 free spins.
- **Multiplier ladder:** ×1 → ×2 → ×5 → ×10 every 3 spins.
- **Retrigger:** 3+ scatters during the bonus award additional spins, capped at 50 total.
- **Nested DD:** none — Direct Deposit triggers only on natural 6+ DOLLARs in the base game.
- **Bonus Form wilds (W-2):** every 3rd free spin spawns 1–3 wilds on the inner reels; wilds are sticky (accumulate across remaining spins, capped at 2 total).
- **Contribution to RTP:** 26.43% (12M-spin verification 2026-09-15)

### 5.2 Direct Deposit (Hold & Respin)
- **Trigger:** 6+ DOLLAR symbols on the trigger spin ONLY. Receipt meter removed 2026-09-15.
- **Initial state:** 6 dollar positions locked (filled to 6 from RNG if fewer landed).
- **Respin loop:** 3 respins; each respin can land a new dollar (resets respins to 3), an Audit (×2 all locked), an Overtime (+3 respins, max 2 per feature), a Bonus check, or a Deposit (progressive tier).
  - v2 change: per-cell DEPOSIT probability raised from 0.5% → 1.4% to push Mini-frequency to genre parity.
- **End:** 3 consecutive empty respins OR grid fully filled (15 cells → see DD Grid Fill below).
- **DD Grid Fill:** awards a progressive tier weighted (Minor 95%, Major 3%, Mini 2%, Grand 0%). Grand never comes from this path.
- **Contribution to RTP:** 13.05% (12M-spin verification 2026-09-15; includes cash awards and fixed progressive tiers)
- **Trigger frequency:** 1 in 130.7 spins (natural 6+ DOLLARs; 12M-spin verification)
- **Average cash award:** 17.05× bet
- **Heart-stopper balls:** 250× (weight 5) and 500× (weight 6) over 1× filler (weight 8,591). Visible on grid 1 in 404 spins; collected 1 in 16,194 spins.
- **Grand:** ~1 in 129M spins (unchanged; no hit in 12M verification spins)

### 5.3 Receipt Meter — REMOVED (2026-09-15)
- The receipt meter (jar visual, point accumulation, threshold prizes, meter-forced Direct Deposit) has been entirely removed from the game.
- **Contribution to RTP:** 0.00%
- Direct Deposit now triggers ONLY on natural 6+ DOLLAR symbols.
- All five themes (Refund Rush, Burger Bob, Dealer Dan, Trucker Tom, Space Wins) share the single math core and inherit this change.

### 5.3 Cash-on-Reels (DOLLAR symbol value imprint)

Every DOLLAR symbol (id 12) that lands in the visible 5×3 grid is pre-assigned a credit value at spin time. The frontend renders the value as "$N" stamped on the symbol face (or "MINI" / "MAJOR" / "MINOR" / "GRAND" for the 4 progressive tier overlays — those substitute for the integer value when the DEPOSIT path triggers).

**Player-facing guarantee:** the values the player *sees* on the dollar symbols are the values they *get* if Direct Deposit triggers and locks them. There is no re-roll between display and award — pre-assignment + immutable lock.

**Distribution (raw integer multipliers of total bet):**

| Value (× bet) | Weight | P (single dollar) | Notes                 |
| ------------- | ------ | ----------------- | --------------------- |
| 1×            | 220    | 19.6%             | Most common           |
| 2×            | 260    | 23.2%             | Modal                 |
| 3×            | 220    | 19.6%             |                       |
| 5×            | 200    | 17.9%             |                       |
| 8×            | 90     | 8.0%              |                       |
| 10×           | 60     | 5.4%              |                       |
| 15×           | 30     | 2.7%              |                       |
| 20×           | 18     | 1.6%              |                       |
| 25×           | 12     | 1.1%              |                       |
| 50×           | 6      | 0.54%             |                       |
| 100×          | 3      | 0.27%             | "Holy moment" tier    |
| 200×          | 1      | 0.09%             | Lifetime memory       |
| 250×          | 1      | 0.09%             | Hard cap on per-cell  |

**Total weight:** 1,121. Expected value per cell ≈ **5.32× bet**. At $1 bet, expected $ printed per cell ≈ $5.32; at $25 bet ≈ $133. Random events do not modify DOLLAR values.

**Progressive tier overlays:** when the DD DEPOSIT path lands inside the feature, the cell's value is replaced atomically with the awarded progressive amount and the cell is rendered with the Mini/Minor/Major/Grand tier badge (textures `jp_mini_full` etc.). The PROG_NAMES used in UI are `COIN JAR`, `SIDE HUSTLE`, `YEAR-END`, `JACKPOT`.

**Persistence across DD respins:** locked-cell values (and tier badges where applicable) survive the entire respin loop — the frontend pulls from a tier-metadata cache keyed by (row, col) so the badge does not revert to "$" or render as a generic "Progressive" between respins.

**RTP impact:** included inside the Direct Deposit RTP component (16.27%) — Cash-on-Reels is the value-distribution mechanic for DD; it does not contribute RTP independently of DD trigger frequency.

### 5.4 Random events
| Event           | Probability per spin | Effect                                                  |
| --------------- | -------------------- | ------------------------------------------------------- |
| Rush Hour       | 1 / 402              | Next 5 spins pay ×2                                     |
| DD Alert        | 1 / 205              | 1–3 inner reels turn fully wild for that spin           |

---

## 6. Receipt Meter

- Symbols add points: `DOLLAR` → 0.10–0.18, `RECEIPT` → 0.05–0.09 (per landed symbol).
- Thresholds: 30 (Standard Deduction prize), 65 (Itemized Deduction prize), 100 (Maximum Refund — auto-triggers Direct Deposit and resets meter).
- The meter persists across spins until reset.
- Multiplier of 3× point gain during Free Spins.
- **Contribution to RTP:** 5.98%

---

## 7. Progressive jackpots — v2 hybrid model (fixed + pool)

### Architecture
The four tiers split into two payout models:

- **Mini & Major — FIXED bet-scaled.** Paid from house, value is a multiple of total bet (no pool, no climbing ticker). Sidesteps DGOJ/ADM size caps on progressives.
- **Minor & Grand — POOL-DRIVEN.** Each contributes from every spin's bet, accumulates in a shared row, awarded atomically with `SELECT … FOR UPDATE`.

### Tier ladder

| Tier   | Name              | Type   | Sizing                                  | Seed        | Cap           | Contribution |
| ------ | ----------------- | ------ | --------------------------------------- | ----------- | ------------- | ------------ |
| Mini   | Coin Jar          | Fixed  | 20× total bet | n/a         | n/a           | 0% pool      |
| Minor  | Side Hustle       | Pool   | full pool to above-reference winners    | $250 (USD)  | Uncapped by default | 1.00%        |
| Major  | Year-End Bonus    | Fixed  | 100× total bet | n/a         | n/a           | 0% pool      |
| Grand  | Jackpot Refund    | Pool   | full pool to above-reference winners    | $10,000 (USD)| Uncapped by default | 0.50%        |

**Per-currency seeds:** seeds are denominated in the operator's primary currency (default USD). For non-USD operators the same numeric values are used and the operator is responsible for any FX adjustment in the integration layer; the engine itself stores all amounts in minor units (cents) of the configured currency. Pool contribution rates (1.0% Minor, 0.5% Grand) are currency-invariant.

**Total pool contribution: 1.50%** from Minor and Grand. Fixed Mini/Major
payouts are included in jackpot-feature accounting and scale with total bet.

### Fixed-tier payout examples

At representative total-bet levels:

| Bet (total) | Mini (20×) | Major (100×) |
| ----------- | ---------- | ------------ |
| $1.00       | $20        | $100         |
| $2.50       | $50        | $250         |
| $5.00       | $100       | $500         |
| $25.00      | $500       | $2,500       |
| $250.00     | $5,000     | $25,000      |

### Pool-tier proportional payout (v2)

`PROGRESSIVE_REFERENCE_BET = 100` cents = $1.00.

When a pool tier (Minor/Grand) is awarded, the player receives:

```
payout = pool_value × min(bet_amount / PROGRESSIVE_REFERENCE_BET, 1.0)
```

- Above-reference winners (bet ≥ $1) collect the **full pool**, which then resets to seed.
- Below-reference winners (bet < $1) collect a **proportional share**; the unawarded remainder stays in the pool for the next winner (floored at the seed value).

This is industry-standard for hold-and-spin titles (Lightning Link, Dragon Link). It protects the pool from sub-reference farming while still letting low-stake players hit progressives.

### Trigger paths

- **Random per-spin:** 1 in 50,000 spins, weighted Mini=14000, Minor=1300, Major=180, Grand=6.
- **DD Deposit symbol:** weighted Mini=9500, Minor=480, Major=20, Grand=0 (Grand never from DD).
- **DD Grid Fill:** weighted Mini=200, Minor=9500, Major=300, Grand=0 (Grand never from DD).
- **Optional Must-Hit-By force:** disabled by default. If an operator sets a positive cap for a jurisdiction, a pool tier exceeding that cap force-awards on the next eligible spin.

Awards are atomic (`SELECT … FOR UPDATE` on the jackpot row) — concurrent winners cannot both collect the un-reset value.

---

## 8. Anti-frustration / persistence mechanic

Cold spins still advance visible, non-predictive persistence surfaces: the
Refund Meter, session stats, and theme-owned mascot copy. The game does not
force a payout after a losing streak and does not tell the player that a win is
"due."

---

## 9. Volatility & max-win analysis

- **Standard deviation per spin:** high-volatility class, index ≈ 6.0.
- **Non-progressive cap:** 10,000× total bet.
- **Pool-progressive maximum:** not fixed. Minor and Grand are uncapped pools
  and may grow until awarded.
- **Volatility classification:** High.

---

## 10. RTP validation results

The current operator ladder is pinned from chunked 1B-spin validation runs.
Receipt files are versioned under `docs/sim_receipts/`.

| Target | PAYTABLE_SCALE | Final RTP | Receipt |
| ------ | -------------- | --------- | ------- |
| 88     | 0.8423         | 88.0347%  | `docs/sim_receipts/sim_88_1B_final.txt` |
| 92     | 0.8920         | 91.9985%  | `docs/sim_receipts/sim_92_1B_final.txt` |
| 96     | 0.9427         | 95.9966%  | `docs/sim_receipts/sim_96_1B_final.txt` |

These are the only submission-ready variants. Other `RTP_TARGET` values may be
used for internal development but are not part of the aggregator-facing math
package.

---

## 11. RTP breakdown by component

The live submission package uses 1B aggregate RTP receipts as the cert-facing
truth. Component-level accounting remains an internal simulator diagnostic and
must be regenerated from the same commit before lab submission if a lab asks
for line-item contribution percentages.

---

## 12. Feature trigger frequencies

| Event                              | Hits     | 1 in     |
| ---------------------------------- | -------- | -------- |
| Meter — Standard Deduction         | 20,952   | 477      |
| Meter — Itemized Deduction         | 20,952   | 477      |
| Meter — Maximum Refund             | 20,950   | 477      |
| Direct Deposit (6+ dollars)        | 2,583    | 3,872    |
| Direct Deposit (from meter)        | 20,947   | 477      |
| Direct Deposit (total)             | 24,055   | 416      |
| DD Grid Fill                       | 2,231    | 4,482    |
| Free Spins trigger                 | 55,991   | 179      |
| Free Spins retrigger               | 8,917    | 1,122    |

### Progressive jackpot hit rates

| Tier                    | Sample hits | 1 in       | Target          |
| ----------------------- | ---------- | ---------- | --------------- |
| Mini (Coin Jar)         | 19,421     | 515        | ~500            |
| Minor (Side Hustle)     | 3,940      | 2,538      | ~3,024          |
| Major (Year-End Bonus)  | 367        | 27,248     | ~25,000         |
| Grand (Jackpot Refund)  | 10         | 1,000,000  | ~1.2M (band 1.0M–1.4M) |

All within target band.

---

## 13. Configurability

The math model ships 3 submission-ready RTP variants and uses a per-target
scale lookup table:

| Variant     | PAYTABLE_SCALE | Notes                                          |
| ----------- | -------------- | ---------------------------------------------- |
| **88.0347%** | 0.8423        | Lower-RTP operator configuration               |
| **91.9985%** | 0.8920        | Regulated-market configuration                 |
| **95.9966%** | 0.9427        | Default ship setting                           |

Off-spec targets (anything other than 88 / 92 / 96) fall back to the linear approximation `(target − 10.5) / 91.0` and are **not certified** — these are accepted only for development and internal testing.

`PAYTABLE_SCALE` multiplies the paytable, scatter pay, meter prizes, and
feature bonus values. Dollar credit values (Cash-on-Reels) are raw integer
multipliers and are not scaled, so the player sees clean denominations.
Progressive contributions, feature trigger rates, fixed-tier progressive
multipliers, and meter point accumulation are also invariant under this
scaling, which is why per-target tuning is required.

Bet limits and optional Must-Hit-By caps are env-tunable (operator override per-jurisdiction):

```
MIN_BET=100               # cents
MAX_BET=2500000           # cents
MUST_HIT_BY_MINOR=250000  # cents ($2,500)
MUST_HIT_BY_GRAND=25000000 # cents ($250,000)
```

Default production values for `MUST_HIT_BY_MINOR` and `MUST_HIT_BY_GRAND`
are `0`, meaning uncapped pool progressives that grow until hit.

---

## 14. Compliance notes

- **LDW (Losses Disguised as Wins):** in `compliance_mode=strict`, win celebration sounds and visual effects are suppressed for any sub-bet payout (`multiplier < 1`). The win counter still updates so the player sees what they got.
- **Autoplay cap:** `compliance_mode=strict` enforces a hard cap of 100 consecutive autoplay spins.
- **Spin time:** `compliance_mode=strict` enforces ≥ 2,500ms total spin time and ≥ 2,500ms hold for any spin paying ≥ stake.
- **Reality check:** 60-minute prompt in strict mode.
- **Self-exclusion:** native `/api/v1/game/self-exclude` endpoint, persisted to `game_sessions.self_excluded_until`. Spin endpoint enforces.
- **Pity mechanic:** see §8.

---

## 15. Reference

- Math model source: `/opt/Refund_Rush/game_server/app/core/`
- RNG source: `/opt/Refund_Rush/game_server/app/core/rng.py`
- Reel strips: `/opt/Refund_Rush/game_server/app/core/game_config.py`
- Simulator: `/opt/Refund_Rush/simulator/`
- 1B RTP receipts: `/opt/Refund_Rush/docs/sim_receipts/`
- Engine entry: `/opt/Refund_Rush/game_server/app/services/game_service.py`

This document supersedes any earlier PAR sheet drafts.

---

## 16. Current math changelog

- **243 ways** replaced the older line model.
- **Credit-based fixed-tier sizing:** Mini = 20× total bet, Major = 100× total bet.
- **Mini at genre-frequency target:** random and Direct Deposit weights favor
  frequent small jackpot confirmation.
- **Grand as long-chase tier:** random Grand weight is rare; Grand does not
  award from Direct Deposit grid-fill paths.
- **Bet ladder:** $1.00–$25,000 total bet.
- **Uncapped pool progressives by default:** Minor/Grand grow until hit;
  optional MHB caps remain env-tunable for markets/operators that require them.
- **Pool-tier proportional payout:** `PROGRESSIVE_REFERENCE_BET = $1.00`;
  sub-reference winners collect a proportional share, remainder retained in pool.

Math is pinned by the 1B receipts listed in §10.

---

## 17. v3 dollar-credit refresh (2026-04-19)

Cash-on-Reels distribution rework to deliver clean integer "$X" denominations the player can read as "I just won $5" rather than "I just won $4.74":

- **DOLLAR_CREDIT_VALUES** switched from `_make_scaled_weights` (PAYTABLE_SCALE-multiplied) to `_make_cum_weights` (raw integer multipliers). Player-facing values are now exact integers ∈ {1, 2, 3, 5, 8, 10, 15, 20, 25, 50, 100, 200, 250} × bet.
- **PAYTABLE_SCALE constant offset** recalibrated 9.7 → **5.2** to absorb the higher non-scaling RTP contribution from Cash-on-Reels (raw integers add ~0.4% more RTP than the scaled-down equivalents at default 96%).
- **Verification:** current shipping RTPs are pinned from 1B receipts; see §10.
- **Mini frequency** confirmed at 1/515.3 (within ±3% of 1/500 target). Item 2.5 from the project TODO can be marked DONE.
- **PAR sheet refresh** (item 2.3): scale formula corrected, sweep table added, Cash-on-Reels section added, per-currency seed note added.
