draft-v0.2 confirmation — hold-and-win-reference

Result: both acceptance bands satisfied. LandingChancePPM = 43000 with the option-A3 regular weights.

Feature figures are ESTIMATED (seeded Monte Carlo). Base RTP and trigger probability are EXACT (enumeration) and unchanged from draft-v0.1. Internal simulation is not certification.

Manifest

FieldValue
Date2026-08-09
Math revisiondraft-v0.2 (supersedes draft-v0.1, which is preserved)
Purposeconfirmation of the tuned candidate on independent seeds
Methodmathengine.RunBatch + MergeBatches — the canonical sharded path
Rounds2,000,000
Shards8 × 250,000, merged
Master seedhaw-draft-v0.2-confirm-independent
Seed independencethis master seed shares nothing with the sweep's haw-tune-crn-* stream. Confirming a tuned parameter on the seeds that selected it measures fit to its own sample, not behaviour
Backend Git SHAa3f644e on feat/hold-and-win-reference
Configlibs/mathengine/games/hold_and_win_reference/hold-and-win-reference.yaml
Config SHA-256a22129d99d21eb14acdb303efdf666f4065925fa461012d8e99f2144538d0508 (draft-v0.1 was 888f134c…917d88)
Mechanic versionhold_and_win/v1 (unchanged — the state machine did not change, only its parameters)
RNGsha256-trunc64-be/go1-alfg#1, unchanged
Go versiongo1.26.2 darwin/arm64
Elapsed118.8 s wall, including a full repeat run for the determinism check

Reproduce:

cd /Users/admin/kiro/backend
go test -tags hwdesign ./libs/mathengine/games/hold_and_win_reference \
    -run TestDraftSimulation -v -timeout 3600s

Shard seeds and per-shard trigger counts:

shard 0  423dc82634cd2eb6  1649      shard 4  8c681283e677b83c  1566
shard 1  b257a4263325a6ca  1570      shard 5  fcc90f55db32140f  1563
shard 2  04544bb9c1c8f54e  1546      shard 6  9ad92b20206afb6c  1636
shard 3  db8327cb7db0b719  1609      shard 7  5c21a3fac5619ded  1634

A repeat run with identical seeds reproduced identical aggregates — asserted in the test.

Parameters changed in this revision

Both families are OPEN parameters. Nothing else moved.

Parameterdraft-v0.1draft-v0.2
LandingChancePPM15000043000
regular weight, 1×4030
regular weight, 2×2825
regular weight, 3×1618
regular weight, 5×1015
regular weight, 10×510
regular weight, 20×12

Unchanged and asserted so by test: coin values 1×/2×/3×/5×/10×/20×; Mini 10×, Minor 25×, Major 100×, Grand 500×; prize-type weights 1000/20/5/1; base reels; trigger weights; base paytable; RNG mapping and draw order; mechanic version.

E[regular] = 349/100  = 3.49×          (was 264/100  = 2.64×)
E[prize]   = 3915/1026 ≈ 3.815789×     (was 3065/1026 ≈ 2.9873×)

Acceptance

CriterionRequiredMeasuredVerdict
Total RTP96.0% ±0.3pp96.0031% ± 0.1189pp, CI [95.7701%, 96.2362%]PASS — point estimate and whole CI in band
Feature contribution≈20.884%20.8871% ± 0.1189ppPASS
Conditional feature mean≈32.4545×32.4593× ± 0.1848, CI [32.0972×, 32.8215×]PASS
Full-grid conditional0.10%, band 0.05–0.25%0.0783% (10 of 12,773 triggers)PASS
Base RTP unchangedexactly 75.1160%75.1160% exact, re-enumeratedPASS
Trigger unchanged1 in 155.40351 in 155.4035 exact, re-enumeratedPASS
Max awardexactly 500×500.0000× observed, never exceededPASS

Total RTP: two estimators

EstimatorTotal RTPSE95% CI
exact base + exact trigger × simulated conditional mean96.0031%0.1189pp[95.7701%, 96.2362%]
all-simulated95.6695%0.2842pp[95.1125%, 96.2266%]

The first is the one to quote. Base RTP and trigger probability are known exactly by enumeration of the 8,000 reachable base grids; replacing known constants with sampled estimates strictly increases variance and cannot increase accuracy.

The 0.33 pp difference between the two is fully attributable to sampling noise on those two known quantities in this particular run:

base component     74.9394% simulated  vs  75.1160% EXACT   → −0.1766 pp
trigger component  1 in 156.58 simulated vs 1 in 155.4035 EXACT → −0.75% relative

Both are printed by the runner, so the difference is attributable rather than arguable. The all-simulated figure is reported here rather than omitted, because omitting the less flattering of two estimators is how a report stops being evidence.

Full results

Round level

MetricValue
Rounds2,000,000
Hit frequency14.4312%
Stdev per round4.0194
Observed max win500.0000×
Decomposition residual0.000000 pp

Note the volatility drop: draft-v0.1 measured σ = 17.78 per round, driven by an 18.71% full-grid rate paying 500×. At 0.078% the top award is genuinely rare and σ falls to 4.02. That is the intended consequence of the tuning, not a side effect.

Mechanic

MetricValue
Triggers12,773
Trigger frequency1 in 156.58, CI [1 in 153.92, 1 in 159.33]
Conditional mean32.4593× ± 0.1848
Mean steps per feature5.5999
Reset rate per step0.2608 (18,652 resets over 71,528 steps)
Full-grid probability0.000783 per trigger (10 of 12,773)
Full-grid contribution0.3915× of the conditional mean
Mean cells at trigger6.7265
Mean cells at settlement8.3974 of 15
Max single feature award500.0000×

Compare draft-v0.1: 8.87 steps, 0.4865 reset rate, 12.81 cells at settlement, full-grid contributing 93.54× of a 123.46× mean. The feature is now shorter, ends more decisively, and its value comes from the coins rather than from a routine jackpot.

Prize-kind frequency per locked cell

Prize-type weights were not touched, so these must still match the 1000:20:5:1 pool.

KindCountObservedConfigured
regular104,4630.9739230.974659
mini2,1190.0197560.019493
minor5640.0052580.004873
major1140.0010630.000975

Feature award distribution (per trigger)

BandCountProbability
[5, 10)780.006107
[10, 50)11,3320.887184
[50, 100)1,2380.096923
[100, 500)1150.009003
[500, 1000)100.000783

Round win distribution

BandCountProbability
01,711,3770.855688
[1, 5)184,9200.092460
[5, 10)78,3850.039192
[10, 50)23,9470.011973
[50, 100)1,2460.000623
[100, 500)1150.000058
[500, 1000)100.000005

Max win

PropertyValue
Declared max win500× total bet
Reachableyes — observed exactly 500.0000×
Exceedednever, in 2,000,000 rounds; asserted in the test
Max-win probability0.000005 per round (≈1 in 200,000)

Limitations

  • Feature figures are Monte Carlo, reported with standard errors and intervals. Nothing here is a closed form.
  • The full-grid rate rests on 10 events. Its Poisson interval is wide (roughly [0.038%, 0.144%] conditional), and it sits inside the band by both this run and the far more precise sweep estimate of 0.09561% (from >1M feature samples). Neither measurement is precise enough to distinguish 0.078% from the 0.10% target, and no claim to that precision is made.
  • Base RTP and trigger probability are cross-validated against exact enumeration. The mechanic has no independent cross-check; that remains a recorded risk.
  • This is the mechanic through the single-round simulation driver. Runtime routing and reference↔runtime parity are still outstanding and are required before FREEZE & HANDOFF.
  • DRAFT / NOT FOR CERTIFICATION.

Resolved 2026-08-09 (backend cd4c093). The limitation recorded above was accurate when this run was produced. Live-runtime routing and reference↔runtime parity now exist: the spin orchestrator opens the feature on a paid trigger, advances it one respin per request, and its complete state is compared with RunHoldAndWinToCompletion at three landing chances. The original wording is left in place because it is what this report observed; this note is the correction, not a rewrite.