Magic Vault 5×3 — Seeded Simulation Evidence, draft-v0.1

DEV ONLY · NOT FOR PRODUCTION · NOT FOR CERTIFICATION. Every figure in this report is a Monte Carlo ESTIMATE. Exact results are in ../exact/draft-v0.1.md and are never restated here as if sampled, nor is anything here labelled exact.

FieldValue
Date2026-08-10
Game IDmagic-vault-5x3
Math versiondraft-v0.1
Canonical configlibs/mathengine/games/magic_vault_5x3/magic-vault-5x3.yaml
Config SHA-256a42ae35875e200728a8bc9178b18c1ca19d4af1fdb92d96e3d775cb6556e7873
Backend commiteb4cd2dfb4b176ebeab18a5c74212124b76fc7b9
RNG algorithm/versionsha256-trunc64-be/go1-alfg#1
Bet per round1.0 (fixed by RunBatch)

Commands

cd /Users/admin/kiro/backend
go test -tags mvdraft -count=1 -v ./libs/mathengine/games/magic_vault_5x3 \
    -run TestDraftSimulationConfirmation -timeout 20m
go test -tags mvdraft -count=1 -v ./libs/mathengine/games/magic_vault_5x3 \
    -run TestFeatureConditionedConfirmation -timeout 20m

Both are behind the mvdraft build tag so the default suite stays fast and -race clean.


Run A — whole-game confirmation

FieldValue
Master seedmagic-vault-draft-v0.1-confirmation
Rounds2,000,000
Shards8 non-overlapping [from, to) ranges of 250,000
Shard seedsmathengine.ShardSeed(master, i, from, to)
Mergemathengine.MergeBatches (canonical)
Merge controlshard 0 re-run unsharded over [0, 250000) — reproduced exactly

Shard boundaries and seeds

ShardRoundsShard seedShard RTP
0[0, 250000)8daaf60de07becea0.961543
1[250000, 500000)d89e07ce7503ffa30.977391
2[500000, 750000)445dc921f00d85990.948308
3[750000, 1000000)c70bac2b4699898b0.962326
4[1000000, 1250000)80fe0da8138943890.953039
5[1250000, 1500000)59156b4d0138f9600.946831
6[1500000, 1750000)7dfe608d29797d0f0.943312
7[1750000, 2000000)daf8c7bb23466aa60.953096

Results — all estimated

MetricValue
Total RTP (all-simulated)0.955731 — 95.5731%
Base RTP (simulated)0.558348 — 55.8348%
Feature RTP (simulated)0.397383 — 39.7383%
σ per round4.538431
Standard error0.003209 — 0.3209 pp
95% confidence interval[0.949441, 0.962021]
Hit frequency0.305370
Maximum observed round award500.0000×
Triggers25,125 — 1 in 79.6020
Conditional Hold & Win mean31.6324×
Mean initial locked cells6.4583
Mean respin steps5.7282
Full grids27 — 0.107463% of triggers
Maximum feature award500.0000×

Jackpot cells awarded across all features:

KindCount
regular201,045
Mini4,076
Minor957
Major173

Run B — feature-conditioned confirmation

FieldValue
Seedmagic-vault-draft-v0.1-feature-confirmation
Features executed1,000,000
Execution pathcanonical mathengine.RunHoldAndWinToCompletionStats
Initial statessampled from Magic Vault's own exact trigger distribution

How initial states were drawn

Not copied from the reference harness, and not rejection-sampled from whole rounds (at 1 in 79 that would discard 98.7% of the work). The sampler draws per-reel stops directly from P(stops | total visible COIN ≥ 6), reel by reel, weighting each candidate count by the suffix mass that can still complete the trigger. The only approximation beyond the exact integer weights is float64 normalisation.

Validation. The sampler's empirical distribution of initial locked cells is compared against the exact distribution at every count:

Initial lockedSampledExactDeviation
60.6842560.684265−0.02 σ
70.2052570.205144+0.28 σ
80.0809290.081024−0.35 σ
90.0225600.022499+0.41 σ
100.0051590.005237−1.08 σ
110.0014830.001493−0.25 σ
120.0003070.000286+1.23 σ
130.0000430.000043−0.05 σ
140.0000060.000009−0.90 σ
150.0000000.000001−0.93 σ

Every count agrees within 1.3 σ. The measured mean below therefore describes the game these reels produce, not a differently-shaped population.

Results — all estimated

MetricValue
Conditional Hold & Win mean31.6252×
σ20.2299
Standard error0.0202
95% confidence interval[31.5855×, 31.6648×]
Maximum feature award500.0000×
Full grids743 — 0.074300% of features
Mean initial locked cells6.4650 (exact: 6.4652)
Mean final locked cells8.2076
Mean respin steps5.7063

Comparison with the reference harness

Reference harnessMagic Vault
E[initial locked | trigger]6.73226.4652
Conditional mean32.4461×31.6252×

The 0.82× gap is expected, not a defect: the same mechanic entered from a lower distribution of starting coins returns less. It was reconciled by retuning the base paytable only — no Hold & Win parameter was changed. See ../../changelog.md.


Reconciliation

RECONCILED  = exact base RTP + exact P(trigger) × estimated conditional mean
            = 0.559961      + 0.0126493391      × 31.6252
            = 0.959998        (95.9998%)   ← the Draft acceptance measurement

ALL-SIMULATED (Run A)                        = 0.955731  (95.5731%)
difference                                   = 0.4268 pp = −1.33 SE
ComponentSimulatedExactDeviation
Base RTP0.5583480.5599610.1612 pp light
Trigger count25,12525,298.7 expected−1.099 σ

Both components ran slightly light in this sample, which fully accounts for the total.

Why the acceptance band is applied to the reconciled figure, not to Run A

At 2,000,000 rounds the all-simulated total's standard error is 0.3209 percentage points — wider than the ±0.30pp acceptance band itself. Requiring that point estimate to land inside the band would be roughly a coin flip for a pack that is perfectly correct, so it would not be a test of anything. Reaching 0.10pp of standard error would take about 20,600,000 rounds; that cost was deliberately not spent, because the base RTP and the trigger probability are already known exactly and re-sampling them only adds variance.

What Run A is therefore asserted to show:

AssertionResult
All-simulated total within 3 SE of the reconciled total−1.33 SE — PASS
Simulated 95% CI reaches the [0.957, 0.963] bandCI upper bound 0.962021 — PASS
Trigger count within 4 σ of the exact probability−1.10 σ — PASS
No round above the 500× ceilingmax 500.0000× — PASS
No feature award above the 500× ceilingmax 500.0000× — PASS
Merged shards reproduce an unsharded control sliceexact match — PASS

Stated plainly: the all-simulated point estimate, 95.5731%, sits below the acceptance band's lower edge. It is not the acceptance measurement, and it is statistically consistent with a game whose true RTP is 96.00%. The acceptance measurement is the reconciled 95.9998%.

Unresolved drift

  1. Full-grid rate disagrees between runs at low count. Run A gives 0.1075% of triggers (27 of 25,125, SE ≈ 0.0207pp); Run B gives 0.0743% (743 of 1,000,000, SE ≈ 0.0027pp). The difference is 1.6 σ on Run A's own error — consistent, but Run A's figure rests on 27 events. Use Run B's 0.0743% ± 0.0027%.
  2. Conditional mean differs trivially between runs. Run A 31.6324× (25,125 features), Run B 31.6252× (1,000,000 features). Run B is the recorded figure.
  3. Nothing else. No result in either run contradicts an exact value beyond sampling noise.