Tuning pass 1 — LandingChancePPM sweep and Pareto table

Outcome: no LandingChancePPM satisfies both acceptance targets. STOPPED before touching a second parameter family, as instructed.

Approved scope of this pass (user, 2026-08-09, DRAFT MATH gate): sweep only LandingChancePPM. Base reels, trigger weights, base paytable, jackpot values, coin values, prize-type weights and the RNG mapping are untouched, and remain untouched.

Manifest

FieldValue
Date2026-08-09
Methodconditional feature sampling, weighted by the exact trigger-count distribution
Samples200,000 per trigger count for k = 6…10; 20,000 for k = 11…15 (which together carry ≈0.3% of trigger mass)
Common random numberssample seed = haw-tune-crn-<k>-<i>, independent of the candidate PPM — every candidate replays the identical draw stream
Config under testhold-and-win-reference.yaml with LandingChancePPM overridden in memory only
Backendfeat/hold-and-win-reference
RNGsha256-trunc64-be/go1-alfg#1, unchanged
Reproducego test -tags hwdesign ./libs/mathengine/games/hold_and_win_reference -run 'TestTuningSweep|TestTuningRefine' -v -timeout 3600s

Why conditional sampling rather than whole rounds

The acceptance band for full-grid frequency is 0.05%–0.25% of triggered features. At a 1-in-155 trigger, resolving a 0.1% conditional rate from whole rounds would need tens of millions of rounds. Conditioning on the trigger spends every sample inside the feature, which is where LandingChancePPM acts. Finalists would still be confirmed on ≥2,000,000 whole rounds — there are no finalists.

Fixed points (EXACT, and structurally independent of LandingChancePPM)

LandingChancePPM is read only inside the mechanic's step loop, after a trigger, so it cannot move either of these. Both were re-enumerated during the sweep and are unchanged:

MetricValueRequired
Base RTP75.1160%remains exactly 75.1160% ✓
Trigger probability0.00643486 = 1 in 155.4035remains 1 in 155.4 ✓

Derived acceptance targets

required feature RTP  = 96.0% − 75.1160%           = 20.8840%
required cond mean    = 0.208840 / 0.00643486      = 32.4545×
total RTP band        = [95.7%, 96.3%]
full-grid target      = 0.10% of triggers, band [0.05%, 0.25%]

Coarse sweep

PPMtotal RTPfeature RTPcond meanordinary meanfull-grid %full-grid 1 in N roundsstepsreset ratecellsmax
30,00090.1239%15.0079%23.323×23.246×0.01605%1 in 968,3874.7550.2007.783500×
50,00092.5732%17.4572%27.129×26.086×0.22011%1 in 70,6036.0390.2868.747500×
70,00097.2187%22.1026%34.348×29.013×1.13270%1 in 13,7207.1860.3479.772500×
90,000105.8382%30.7222%47.743×31.606×3.44534%1 in 4,5118.0460.39210.734500×
110,000119.1251%44.0091%68.392×33.719×7.43592%1 in 2,0908.5820.42811.566500×

Refinement

PPMtotal RTPfeature RTPcond meanordinary meanfull-grid %full-grid 1 in N roundsstepsreset ratecellsmax
45,00091.8018%16.6858%25.930×25.348×0.12264%1 in 126,7135.7240.2688.495500×
52,00092.9116%17.7956%27.655×26.379×0.26935%1 in 57,6966.1630.2938.849500×
55,00093.4536%18.3376%28.497×26.826×0.35312%1 in 44,0096.3470.3049.003500×
58,00094.0609%18.9449%29.441×27.268×0.45965%1 in 33,8096.5250.3139.157500×
61,00094.7486%19.6326%30.510×27.711×0.59250%1 in 26,2296.6980.3229.311500×
64,00095.4934%20.3774%31.667×28.150×0.74543%1 in 20,8476.8680.3319.466500×

Max award is exactly 500.0000× at every candidate, and never above it. Containment holds throughout; reachability holds because a full grid still occurs.

Pareto table — the two targets are disjoint

Both acceptance criteria are monotone in LandingChancePPM, and they move in opposite directions. Their feasible intervals do not overlap.

CriterionDirectionFeasible intervalBoundary (interpolated)
Full-grid ≤ 0.25% of triggersneeds LOWER PPMPPM ≤ ≈51,2000.25% crossing between 50,000 and 52,000
Full-grid ≥ 0.05% of triggersneeds HIGHER PPMPPM ≥ ≈37,0000.05% crossing between 30,000 and 45,000
Total RTP ≥ 95.7%needs HIGHER PPMPPM ≥ ≈64,70095.7% crossing between 64,000 and 70,000
Total RTP ≤ 96.3%needs LOWER PPMPPM ≤ ≈66,800
full-grid window :  37,000 ─────────── 51,200
RTP window       :                                  64,700 ── 66,800
                                       └── gap ≈ 13,500 PPM ──┘

Consequences at each frontier:

At the frontierPPMTotal RTPFull-gridMiss
Highest full-grid-compliant≈51,200≈92.8%0.250%RTP ≈2.9 pp below the 95.7% floor
Lowest RTP-compliant≈64,70095.700%≈0.77%full-grid ≈3.1× above the 0.25% ceiling
Total RTP exactly 96.0%≈65,80096.000%≈0.86%full-grid ≈3.4× above ceiling, ≈8.6× above the 0.10% target

Why they conflict

The conditional mean is, to a very good approximation, locked cells × E[landed prize], plus a small grand term. With the approved prize tables:

E[landed prize] = 3065 / 1026 = 2.9873×
cells needed for a 32.4545× mean = 32.4545 / 2.9873 = 10.86 of 15

A grid that routinely reaches 10.9 of 15 cells cannot make a full grid rare. That is the whole conflict in one sentence. The measurements bear it out: 10.73 cells at 90,000 PPM comes with a 3.45% full-grid rate, and the full-grid band tolerates at most ≈8.6 cells.

Equivalently, at the full-grid-compliant 45,000 PPM the feature locks 8.4949 cells, so reaching the required 32.4545× would need

E[prize] = 32.4545 / 8.4949 = 3.8205×      (+27.9% on the current 2.9873×)

Note also that the ordinary settlement mean at 45,000 PPM is 25.348×, already below the required 32.4545× before full grids are considered at all. No landing chance fixes that, because landing chance buys cells and the shortfall is in value per cell.

Options for the next decision (not acted on)

OptionChangeExpected resultCost
ARaise prize value ≈+28%, keep PPM ≈45,000total RTP ≈96%, full-grid ≈0.12% — both in bandopens the second parameter family (regular coin values and/or prize-type weights)
BKeep prize tables, set PPM ≈65,800total RTP 96.0% on targetfull-grid ≈0.86% ≈ 1 in 18,000 base rounds — 8.6× the 0.10% target
CKeep prize tables, set PPM ≈51,000full-grid ≈0.25%, in bandtotal RTP ≈92.8%, ≈3.2 pp under target
DRaise the Grand above 500×not viable: 500× is locked at DESIGN and is also the round cap; at a 0.12% full-grid rate the grand would have to be ≈5,800× to close the gap

If Option A is chosen, two sub-routes reach E[prize] = 3.8205×:

  • A1 — scale regular coin values. E[regular] must rise from 2.64× to 3.4950× (+32.4%), leaving prize-type weights alone.
  • A2 — reweight the prize-type pool toward Mini/Minor/Major, leaving coin values alone. The jackpot term must rise from 425 to ≈1,280 weight-value units, which roughly triples Mini/Minor/ Major weights and materially changes how the feature feels rather than only what it pays.

A1 and A2 are not equivalent in player experience even where they match on RTP, so this is a design choice rather than an arithmetic one.

Discipline notes

  • One parameter family moved. Nothing else was touched, and no config file was modified — the sweep overrode LandingChancePPM in memory only.
  • Common random numbers throughout, so differences between rows are the parameter and not noise.
  • No finalist run was performed, because no candidate passed screening. Independent confirmation seeds and the ≥2,000,000-round confirmation are still owed once a candidate exists.
  • No new Draft revision was created and draft-v0.1 is unchanged, because no landing probability was selected.
  • Every conditional figure here is ESTIMATED. Base RTP and trigger probability are exact.
  • DRAFT / NOT FOR CERTIFICATION.