# Penaltys 50% investigation —2026-11-03-r2

**Result: the native 50% candidate filter works. No game-rule fix or new ROM release is required.** Exact current ROM SHA 256 `20793fce15e640bf60d31c48e95bd0d284105fc07f8ae01ed08b1a579b37e99f`. The source-assembled 246-byte helper and its two installed hooks match the released bytes.

| Setting | Comparable runs | Real candidates | Filtered | Admitted decisions | Actual committed penalties |
|---|---:|---:|---:|---:|---:|
|100%|24|442|0|442|432|
|50%|24|468|227|241|236|

50% admitted **51.5%** of its 468 natural candidates. Each cohort contained 7–33 candidates; its observed admission fraction ranged 39.1–71.4%. These short-cohort variations explain why an individual match is poor evidence.432 versus 236 actual positive-duration awards is an observation of this setup, not an exact-halving guarantee. Admitted delayed decisions can be cancelled by native play or remain pending, so admission and commitment are counted separately.

There were 662 versus 664 actual admitted native icing queue events. The separate stopped-clock bit rose 2688 versus 2604 times; this is a diagnostic flag-edge count, NOT an audible-whistle count or a sum of unique incident categories. Period/game endings and faceoff/zero-duration events are retained in the raw event classifications. The chosen Rules excluded offside; absence of natural offside events does not imply percentage filtering.

## Meaning of the setting

100% means the original native foul frequency under Rules; it does not mean every check is a penalty.50% makes one native bound 2 RNG draw per otherwise eligible new ordinary foul; 0 admits and 1 suppresses. Covered ordinary IDs are 0x12 injury-related elbowing and 0x16–0x24 charging, slashing, roughing, cross-checking, hooking, tripping, interference and holding. Both teams and CPU/human players share the same gate. Original native eligibility, Rules, pending-offender and full-queue checks remain; duplicates are not rerolled. Existing queued penalties are not cancelled by this setting.

Suppressed injury-related elbowing becomes native event 0x14, an injury-only report. The required injury stoppage remains. With Fighting enabled,50% gates an entire eligible new fight after native fighting-rating/HV checks; the two fighting/instigator awards are not independently halved. Controlled paired tests cover this path; natural cohorts used the current Fighting Off setting. Penalty-shot variants, goals, icing, offside when enabled, goalkeeper/faceoff zero-duration events and period/game endings are not halved. Off suppresses eligible new ordinary fouls and new fights, while those other rule paths remain native.

## Menu, real saves and locks

Current fresh default is 50%. Each season and standalone preference saves independently. Valid older 100% records stay 100%; changing the default does not rewrite an established season. After the first completed match the saved choice locks, including reboot, slot switching and playoffs.

Fresh complete regression: 1216 record/complement/load cases,40 companion/lock writers,30 actual menu/lifecycle cases,564 admission contexts,48 injury-caller contexts and 48 whole-fight contexts. The legacy first-match lifecycle test declares a final-goal fixture; it is not counted among the natural matches. New separate verification cold-rebooted actual naturally played Full/Light/Mini saves after four completed matches EACH, then attempted real Left/Right changes at the selected percentage row. All three retained 50%, correct slot, completed-game count and valid active checksum. Their copied private files are separate from user saves.

## Natural-play method and measurement correction

Six profiles × four timing replicates × two percentage settings: Full solo, Light cooperative, Mini four-pad, Quickgame 1v1, Quickgame 2v2 and Allstar versus CPU. Each run executes 180000 emulator frames, using the same feedback controller policy and matched initial timing parameters. There are 24 simulation cohorts per setting; they include natural later match/menu progression and are NOT 24 identical regulation matches. After filtering a decision, the physics, subsequent controller inputs and random stream naturally diverge. No score, player/puck position, foul, event queue, RNG or clock was injected. Initial private cold saved-menu preferences are declared test inputs.

The initial enlarged test exposed a defect in the older TEST OBSERVER: its E900 log ring overlaps current crowd/shot HUD buffers at E900/EA 00. Invalid 0x4444/0x7777 event records proved the collision. Those old live-input counts and the entire enlarged patched-ROM cohort were withdrawn, rather than treated as successful observations. The controlled reset/storage/menu sections are separate and retained. This is a measurement correction, not evidence of a native 50% game defect.

Final candidate/commit counts use the EXACT UNMODIFIED released ROM and a private read-only host-side GenesisPlusGX instruction observer based on official upstream commit a5834b3df455c49bb97bfaa328c20845831f576b. There are no added emulated instructions or writes to emulated RAM, CPU cycles/registers or RNG. 72 whole emulated-state snapshots with tracing enabled/disabled match, including sound and graphics. The serializer contains 56 compiler-typed host pointers; ELF ASLR relocation alone is normalized, preserving pointer targets. Clock-byte and changed-pointer-target negative controls are detected. Raw-pointer hash diagnostics are retained. Twelve extra unmodified-ROM games on the installed Steam core independently retain both settings across all six modes; their read-only frame/PIM samples are supplementary, not a replacement for instruction-level candidate counts.

Two additional exact-ROM native Off runs produced seven eligible ordinary candidates, all seven suppressed and zero committed penalties. Controlled probability qualification executes 108000 native event draws, but those 54 event/team cases repeat only THREE distinct 2000-draw RNG sequences: 50.95%,49.75%,48.45%. They are not 108000 independent matches; the 468 natural 50% candidates above are separate evidence.

No human hardware/multiplayer playtest or exact per-match whistle reduction is claimed. The live user's RetroArch, remaps and progress remained untouched. Native source/ROM bytes remain unchanged. Future regression runs must reject malformed observer records and HUD-overlapping scratch space, distinguish request/admission/commit/stoppage counts, and use the validated host observation method for this current build.

[Public audit and opened screenshots](../../audits/penalties50-20261103-r2/) · [Structured results](../../audits/penalties50-20261103-r2/results.json) · [Actual played-save checks](../../audits/penalties50-20261103-r2/actual-saved50.json) · [Observer equivalence](../../audits/penalties50-20261103-r2/host-equivalence.json) · [Native helper source](../source.php?file=experimental/penalty_rate.s).
