Hold & Win Reference

Reference pack for the reusable hold_and_win mechanic. This game exists to specify, implement and verify the mechanic — it is not a themed product release.

FieldCurrent value
Game IDhold-and-win-reference
Mechanic IDhold-and-win
GDDgdd/hold-and-win-reference-gdd.md
Backend response contractgdd/hold-and-win-backend-response.md
Math Specmath/hold-and-win-reference-math-spec.md
Mechanic Final mathmath/mechanics/hold-and-win/hold-and-win-math-final-v1.0.mdimmutable, approved
Mechanic Draft mathdraft-v0.2 (source of the Final, preserved) · draft-v0.1 (superseded, preserved)
Mechanic changelogmath/mechanics/hold-and-win/hold-and-win-math-changelog.md
Handoff protocolmath/mechanics/hold-and-win/hold-and-win-math-handoff-v0.1.md
Math lifecyclefinal-v1.0 — FREEZE & HANDOFF approved 2026-08-09; developer-ready
CertificationNOT EXTERNALLY CERTIFIED — internal approval is not certification
Canonical configlibs/mathengine/games/hold_and_win_reference/hold-and-win-reference.yaml (Go backend)
Config SHA-256a22129d99d21eb14acdb303efdf666f4065925fa461012d8e99f2144538d0508
Backend commitsealed at cd4c093; shipped f80cb60 on main (CI lint fixes only; no bound artifact changed)
Engine capabilityhold_and_win = SupportFull — the runtime routes it; the mechanic remains non-enumerable
Production statedormanthold_and_win_enabled and hold_and_win:<operator> both default to DENY
RNG algorithm/versionsha256-trunc64-be/go1-alfg#1

Design gate

DESIGN approved 2026-08-09 by user; scope bound to design spec c44bc01.

Implementation follows docs/superpowers/plans/2026-08-09-hold-and-win-reference.md.

Mechanic at a glance

Grid:            3 columns × 5 rows (15 cells)
Cell order:      column 0 rows 0-4, column 1 rows 0-4, column 2 rows 0-4
Trigger:         6 or more BONUS symbols visible
Initial respins: 3
Landing chance:  15% per empty cell (draft)
Respin reset:    any newly landed prize resets remaining respins to 3
Miss-only step:  remaining respins decrement by 1
Termination:     respins reach 0, or all 15 cells locked
Ordinary award:  sum of locked prizes, capped once at 500× total bet
Full grid:       exactly Grand 500× total bet, replacing the sum

Locked cells are never redrawn and consume no RNG. The feature charges no additional wager.

Current math

Confirmed on 2,000,000 rounds with an independent master seed — draft-v0.2 confirmation. Base RTP and trigger frequency are EXACT from enumeration of all 8000 reachable base grids.

total RTP     96.0031% +/- 0.1189pp   target 96.0% +/-0.3pp   PASS
feature RTP   20.8871%                required 20.8840%       PASS
cond mean     32.4593x +/- 0.1848     required 32.4545x       PASS
full-grid     0.090053% of triggers    band 0.05%-0.25%        PASS
              = 1 in 1,110 triggered features = 1 in 172,570 base rounds
base RTP      75.1160% EXACT          target 76%              unchanged
trigger       1 in 155.4035 EXACT     target 1 in 150         unchanged
max win       500.0000x observed, never exceeded              reachable and contained

Total RTP is quoted as exact base + exact trigger x simulated conditional mean; the all-simulated figure for the same run is 95.6695%, and the difference is attributed in the report.

Reached via two tuning passes. Pass 1 swept LandingChancePPM alone and proved no value works (the two bands are disjoint by ~13,500 PPM); pass 2, option A3, additionally moved the regular-value weights, leaving coin values, jackpot values and prize-type weights untouched.

Runtime

The mechanic is played by the live spin orchestrator, not only by the simulator.

paid base spin, 6+ BONUS
  -> the durable feature is opened INSIDE the paid gameplay transaction
  -> each respin is its own request, carrying expected_hold_and_win_step_index
  -> no additional wager; PostgreSQL is authoritative, Redis is a post-commit cache
  -> settlement writes exactly one credit intent

Reference/runtime parity is executed, not asserted: the orchestrator's complete state — every cell, prize, newly_landed delta, respin counter, step index and settled award — is compared with RunHoldAndWinToCompletion at 0, 43,000 and 1,000,000 PPM. That is what makes the RTP figures above statements about production play rather than about a second implementation.

The client contract is gdd/hold-and-win-backend-response.md, generated from fixtures captured on the live orchestrator path.

Evidence routing

  • evidence/simulation/ — seeded aggregate simulation reports and manifests.
  • evidence/parity/ — reference/runtime comparison.
  • evidence/max-win/ — max-win bound validation.
  • test-vectors/ — deterministic portable fixtures and their generation commands.

Scope exclusions (v0.1)

No collector, no multiplier, no feature buy, no additional wager. Art, audio, animation and market/compliance matrices are out of scope for a reference pack.

Known limitation

hold_and_win is RNG-driven per empty cell, so it is not grid-determined and exact enumeration is unavailable. All mechanic RTP evidence is seeded Monte Carlo, labelled estimated — full engine capability is a statement about what the runtime does, not a claim that the figure is exact. Internal tests and simulations are not external certification.