Experiments Failures and Superseded Findings - smeagol44/MKMSZ-Randomizer GitHub Wiki

Experiments, failures, and superseded findings

Rich Inventory failure evidence (2026-10-08): do not equate every music-speed symptom with a proven corrupting write. Fortress preload removes the reliable hang but does not alone eliminate acceleration. The accepted changing-data materialization proof passes its extensive route; production Vanilla v01 shows a stray glyph, and v02 fixes two continuation targets yet later accelerates tempo. Prepared-glyph renderer experiments remain rejected. Current v02 snapshot checks contradict present code/HUD/private-palette/audio-bank damage, while transient history and native audio submission chronology remain Pending. See focused manifest and negative controls.

Inventory-HUD independent failures (2026-10-05): v09 synchronous TEST LAB pickup bootstrap caused startup failure; v13 added a stale call into reclaimed 0x800742E0; v14 repaired that trampoline but introduced a separate first-load size bug in compacted HUD ensure. v16 disables startup setup and Runtime-confirms Inventory still hangs. v17 misinterpreted the signed stage-resource offset; v18 fixed it and showed nine pickups; v19 count 9→2 still hung. v20 Runtime-confirms the one-word HUD allocation-size correction removes the Inventory hang on the bounded TEST LAB route. Do not reattribute this older Inventory failure to later pickup-manager/resource pressure. Earth horizontal wall spikes are difficulty-gated, not broken; earlier HUD proofs accidentally used difficulty 2 instead of the project Very Hard baseline. See TEST LAB Inventory diagnosis.

Power Upgrade synchronous-flash lifecycle failure (2026-10-05): v21 showed that rapidly collecting two or three adjacent Power pickups could leave later items uncollectible. v22 removed only the yielding white-flash wrapper and Runtime-confirmed normal rapid pickup, isolating sleeps/yields inside the pickup callback. v23 moves the same visual cadence to one guarded child process and Runtime-confirms the correction. Rejected architecture: do not sleep/yield inside a logical pickup-award callback merely for presentation; award and return synchronously, then schedule visual feedback separately.

Scope: This page is the cross-domain index of durable Rejected / failed and superseded findings. It records only enough detail to identify the attempted path, observed failure, reusable lesson, and canonical page containing the full evidence.

It is not a proof-history page. Version chronology, artifact hashes, complete routes, and extended diagnostics stay with the owning domain.

Keep an entry here when the negative result establishes a safety constraint, rules out an architectural assumption, explains why an approach was abandoned, provides a meaningful negative control, or prevents expensive work from being repeated.

Address, action, and lifecycle corrections

Attempt / scope Observed failure or correction What it established Detailed owner
Ordinary enemy 0x71..0x74 class normalization reported as 0x6F..0x72 in the prior GRUNT reaction trace The signed immediate at 0x80071B64 is minus 0x6F, so the stored classes are 2..5; the earlier result confused the subtractor with its result Collision 0x80028510 scans classes 2..4, making ordinary slots 0x71..0x73 eligible victims. Class 5 is outside this three-slot scan. This correction does not by itself prove the later nonzero-flag reaction overlap. Enemy randomization, Function registry
Stage-7 Fire God Room diagnostics v02–v05 after overlay-file 0x9D repair v02 late clear of 0x800EEC1C unchanged; v03 extra 0x800655EC duplicated scream/music but left controls unchanged; v04 late ordinary reset plus class-0x75 unchanged; v05 late 0x802C1A04=1 and 0x800EEC1C=0 unchanged These are insufficient late tests, not a normal-Fire entry-order composition. Clean-ROM static trace shows the Stage-7 negative debug branch clears action gate 0x802C1A04, whereas normal Fire schedules the synchronized gate transition. Pause/Inventory and dark scene still need their consumers traced. No Stage-7 v06 ROM was built. Stage flow and selector
Treat current-process global as 0x802FCE20 Address interpretation was wrong Signed low immediate 0xCE20 paired with lui 0x802F yields effective address 0x802ECE20 Player actions and special moves
Direction-facing control proof v01 First opposite-direction press immediately hard-hung The proof accidentally reused rejected 0x802FCE20 as the current-controller global on the flip-only path; v02 changed only that interpretation to 0x802ECE20 and Runtime-confirmed the intended control behavior on the tested route Player actions and special moves
TURN boss fallback v04/v05 v04 deterministically hung on the Temple checkpoint+pickup+reverse route; v05 reproduced that and added an Action/A hang in the upper Temple room Do not make nested native helper/scanner calls from the fragile release/action-install mid-function hooks. v06 keeps those hooks leaf-only and uses a bounded direct controller-list scan instead. Native HUD and UI; Player actions and special moves
First production TURN frontend integration Entering GAME SETTINGS hard-hung immediately The failed build tried to raw-load shared file 0x1A into the gameplay expansion pool from the title/frontend lifecycle. Frontend code must not assume gameplay-reservation availability. The accepted production composition keeps the menu wrapper in global/title-resident code and loads file 0x1A only at stage initialization. Native HUD and UI; Memory and allocation map
Full GAME SETTINGS frontend v01 Immediate hard hang on menu entry JUMP draw helper was entered by jal but nested renderer calls clobbered ra; v02 preserves/restores ra. Native HUD and UI
Full GAME SETTINGS frontend v02 Cursor misalignment, JUMP/EXIT cursor collision, accelerated/crunchy menu music Logical index 4 was published into stock GAME SETTINGS cursor type 2, which has only indices 0..3. Do not exceed native cursor-table contracts. Native HUD and UI
Full GAME SETTINGS frontend v03 cursor result Music corruption gone, but cursor positions still followed the wrong stock table A third displaced stock store at ROM 0x00077918 rewrote process +0x6F8 after the helper returned. v04 owns/NOPs that trailing store and is the accepted Runtime-confirmed frontend baseline. Native HUD and UI
RUN:HOLD/AUTO proof v07 Five-setting menu was visibly over-compressed; Block hard-hung; pressing Run during an active AUTO run did not transition to Walk; full analog deflection stopped auto-running Frontend rewrite overlapped the small ATTACK gameplay trampolines in reclaimed GAME SETTINGS tails, including Block. Also, vanilla semantic Run can be synthesized by full analog deflection, so global inversion of the merged semantic Run bit cannot represent a physical Run-button walk modifier. Rebuild from accepted v06 and reconcile frontend/trampoline ownership first. Native HUD and UI; Player actions and special moves
RUN:HOLD/AUTO proof v08 Block regression was gone, but entering GAME SETTINGS hard-hung immediately Static audit isolates the frontend cause: the draw helper preloaded t0 in a renderer-call delay slot, then reused it after 0x8001CA88 even though the renderer clobbers caller-saved t0; a second instance and an unsafe cross-call t5 assumption exist. Separately, the v08 active-run hook at 0x800296E8 is rejected as the final seam because it can bypass the accepted running-jump classifier. 0x800293A8 itself is a valid re-entry target; a later post-classifier Run-loop back-edge is the safer hook candidate. Native HUD and UI; Player actions and special moves
Controls v05/v06 Block-startup helper interpreted as owning the real player startup path v09 retest showed Block itself worked but the transition into Block still could not be cancelled The helper's controller+0x6DC == 0x000B gate was dead on the normal path because the dispatcher clears +0x6DC before calling 0x80032810. v10 identifies the exact normal-player caller by return address 0x80029C30; that correction is Runtime-confirmed. Player actions and special moves
Copy complete controls v10 proof layout directly into production Rejected before integration: proof file 0x1A reaches runtime 0x801B0DC0, overlapping production Toasty at 0x801B0000 Runtime-confirmed semantics do not convert proof caves/addresses into production ownership. Repack/relocate through a guarded composed allocation and manually validate the full product before merge. Player actions and special moves; Memory and allocation map
First real-progression controls + CI4 Toasty production-composition candidate At 0 XP, MODERN Slide and Super Slide were still executable Earlier SPECIALS proofs forced XP=20,000, masking that these two routes alone called their callbacks directly rather than their stock progression recognizers. Preserve the modern chords but route Slide through 0x8003C9F8 and Super Slide through 0x8003CAF4; do not add bespoke XP thresholds when the native recognizers already own the full eligibility contract. Player actions and special moves
ATTACK: MODERN proof v01 Core neutral/Block/straight-air cases partly worked, but somersault kick/backward attacks/combo failed and music later accelerated Reject the bespoke standalone bootstrap/composition. The exact audio writer was not isolated; rebuild on the production Runtime-V2/file-0x1A lifecycle before interpreting gameplay failures. Player actions and special moves
ATTACK: MODERN proof v02 Music and somersault kick were fixed, but Sweep/Roundhouse/combo still failed The helper loaded address 0x802C1AC0 but omitted the dereference to the actual player controller. Controller-local fields cannot be read from the pointer variable's address. Player actions and special moves
ATTACK: MODERN proof v03 Sweep/Roundhouse began working, but the last walk direction leaked into later idle attacks and combo still failed Controller +0x6FC records locomotion setup and can remain sticky; it is not a live backward predicate. v04 uses the normal map + currently-held horizontal input + stock +0x704 mismatch and moves combo assist into the stock combo parser. Player actions and special moves
Stock Low Kick table interpreted as two 0x2C records Clean-ROM reconciliation shows the first record at 0x800B0F68, zero sentinel at 0x800B0F94, and the separate High Kick table beginning at 0x800B0F98 Do not treat the HK table as a second LK descriptor or extend an LK table through the sentinel. The older two-record statement is superseded. Player actions and special moves
Use 0x8004CC14 as player propulsion Movement model was based on projectile setup 0x8004CC14 owns projectile setup; player velocity uses 0x8002B1EC Player actions and special moves
Treat 0x8004B82C as a player action Caller/data flow contradicted the interpretation It is the ice-projectile flight callback Player actions and special moves
Treat 0x8004AA4C as a generic initializer Later selector analysis showed scheduler transfer semantics Action adapters must preserve target scheduler/context-transfer behavior Player actions and special moves
Return normally from a top-level callback installed by the special-action path Reverse Elbow v3 immediately self-reentered/hung Installed callbacks must transfer through proven scheduler/native cleanup rather than ordinary jr ra Player actions and special moves
Sektor missile v80–v84: infer same-shape render poisoning or treat selector zero as the resident Sektor palette v80/v83 keep the Ice fallback; v81/v82/v84 remove it but show sparse rocket art. Static trace shows both relevant entries mark +0xFA dirty even on repeated binds, while selector zero maps to handle 0x80 rather than the dynamically acquired player source; v83 is overwritten by the parent Ice advance Preserve separate frame-schedule and palette-source ownership; exact slot-zero TLUT remains unmeasured. Player actions and special moves, Sektor takeover proof history
Sektor missile v88: treat early descriptor/cursor binding as sufficient first-frame readiness v88 keeps the correct v87 rocket/palette and still shows one frame of corrupted Sektor-like texture before the missile 0x800304C0/0x8001BDA0 update descriptor/render state but texture pixels are uploaded later through the deferred +0xFA -> 0x800185B8 -> 0x8001D6EC path. v84's apparent first-frame suppression was confounded by selector zero. Texture-slot readiness was the missing seam: v89's synchronous pre-publication slot preparation removes the artifact. Keep the v88 failure as evidence that descriptor/cursor binding alone is insufficient. Player actions and special moves, Sektor takeover proof history
Sektor missile v85: suppress token insertion and reinsert in v75 parent wrapper Built but untested; ordinary straight mode skips that wrapper, so reinsertion is unreachable, update/render never processes the actor, and cleanup cannot return the unlisted actor Statically reject this candidate as built; an untested builder establishes no runtime result. Sektor takeover proof history
Reverse Elbow v5 omitted native special lock 0x800BF308 Lifecycle model remained unstable/incomplete Native action-lock state is part of the host action contract Player actions and special moves
XP final threshold read as 7345 Value was misread Canonical value is 0x1CBA = 7354 XP and progression

Pickup, resource, and materialization failures

Attempt / scope Observed failure What it established Detailed owner
Key-checkpoint suppression v01/v02: NOP the three 0x8002830C(0x15, 0x80062D60) spawns inside 0x80038770 Runtime test still triggered checkpoints on key pickup Those process spawns are not the checkpoint/death-respawn owner. Preserve this negative control; trace the actual state consumer before another patch. Do not globally disable 0x80062D60, which is also used by the Strength-urn path. Global item materialization and solvability, Function registry
Key-checkpoint suppression v03: override Prison player selector 7 to selector 0 only at spawn-coordinate lookup 0x8003BF4C Visible CHECK POINT event still appeared The spawn-coordinate consumer override does not suppress the banner. User did not report a death/respawn comparison, so do not overgeneralize this into a rejected respawn-override mechanism. Global item materialization and solvability
Key-checkpoint suppression v04: move L1 key to easy Prison pickup and NOP only ROM 0x39454 (0x802C18F8 = 7) Visible CHECK POINT event still appeared The Prison L1 selector write is not the visible checkpoint trigger. The event follows the key reward identity/callback path rather than the stock pickup location. Global item materialization and solvability
Key-checkpoint suppression v05: keep the easy relocated L1 key and NOP only ROM 0x394D4 (generic acquired-bit commit to 0x802C0D54) Visible CHECK POINT event still appeared The callback acquired-bit store is not the visible banner trigger; preserve this progression state. Global item materialization and solvability
Self-reporting v06: relocate full Prison L1 identity, suppress the three direct generic-key 0x80062D60 spawns, instrument candidate presentation/checkpoint paths HUD showed TRACE KA, G4 S7 B1; visible banner disappeared, but death still used the key-created checkpoint Presentation and respawn relocation are separate. On this bounded route, the three direct generic-key process spawns are sufficient to suppress the visible banner; selector/key state still creates the respawn checkpoint. Earlier v01/v02 banner evidence conflicts and remains a negative historical control pending minimal reconfirmation. Global item materialization and solvability
Combined checkpoint v07: keep v06 banner suppression and substitute Prison player selector 7 -> 0 only at spawn-coordinate lookup Trace became KAR after death, proving the respawn override fired; Level-1 door did not open Respawn-side substitution is mechanically reachable, but preserving inventory award, S7, and B1 is insufficient to preserve complete Prison progression in this proof. Trace the L1 door predicate before another production candidate. Global item materialization and solvability
Fire checkpoint v01 one-off crunchy/noisy audio near second-key area Observed once on the first combined two-edit v01 run Non-reproducible / unresolved, not attributed. Same-selector stock-callback control v02, split one-edit controls v03a/v03b, and a later v01 retest did not reproduce the symptom. Do not treat it as a confirmed checkpoint-patch regression unless a deterministic trigger is found. Global item materialization and solvability, Stage catalog — Fire
Wind checkpoint v01: remove pickup-time presentation + selector increments at 0xD500C/0xD5024 Death after Circle + Triangle rewound to the preceding non-key tornado-area checkpoint while later key/progression state remained; later upper-room Monk combat produced an abrupt live drop/relocation to the lower breaking-bridge area and earlier bridge geometry reappeared Rejected / failed design proof. Wind 0x802C18F8 is not respawn-only: selectors 1..9 form a live stage/checkpoint ladder, with key-created 3/5 interleaved among non-key states. Removing only the key steps desynchronizes scene/world state. Pause analogous Water/Earth proofs; do not globally freeze selector writes. Global item materialization and solvability, Stage catalog — Wind
Attribute raw overlay file 0xA2 acquired-bit presentation path to Prison Static reconciliation rejects the attribution Prison loads raw file 0x9F; overlay VAs are reused and must be source-qualified. The 0xA2 path is a real lead for another overlay, not Prison evidence. Resource and overlay system, Global item materialization and solvability
Change pickup callback/type only Award and art could diverge or change incompletely Ordinary pickup identity must move as the complete +0x10..+0x2B slice Pickups and item randomization
Copy Prison key into Fire without importing its resource Foreign item was absent/unusable Pickup +0x24 is stage-local; the foreign bundle must be resident Global item materialization and solvability
Treat a zero outer resource slot as physical storage Rejected before production use Zero selector capacity is not evidence of free backing bytes Global item materialization and solvability
PR #129 first wrapper integration kept the expanded materializer adjacent at the old 0x801B0970 candidate Current-main lifecycle v06 now owns 0x801B0A60..0x801B0FF3; CI exposed the overlap before runtime validation Superseded allocation composition, not a wrapper-semantics failure. Keep lifecycle v06 fixed and relocate the enlarged materializer to 0x801B2310..0x801B28EF inside the reserved expansion tail. CI #1583 passes the reconciled composition. Global item materialization and solvability, Memory and allocation map
Materializer production-composition v01: add a second raw-file 0x19 load from the pickup-manager stage-init resume path Mission-objective -> stage entry hung broadly; some stages reached music while Fire did not complete load Rejected / failed composition. The new per-stage raw load was the only globally-executed change at the failing boundary. Do not use pickup-manager resume as a second materializer transport. Corrected v02 returns that resume path to the established four-box reconstruction and routes helper transport through shared file 0x1A at the normal bootstrap expansion-load seam. Global item materialization and solvability, Memory and allocation map
Reuse an occupied no-pickup slot without a global reference trace Rejected as unsafe Non-pickup actors/scripts may still own the slot Global item materialization and solvability
Build the global pickup pool before the import/materialization planner Deferred as an unsafe ordering Stage-local production was the bounded safe scope until destination resources could be materialized Global item materialization and solvability
Destination-shell visual with logical award only Rejected before runtime promotion 1.0 requires the pickup visual/resource identity to match the randomized item Global item materialization and solvability

TEST LAB / cross-stage materialization failures (2026-09-28)

Attempt / scope Observed failure What it established Detailed owner
v11 parent-field overwrite during TEST LAB pickup-manager setup Mission Objective hang after music Parent controller +0x6F4/+0x6F8 must be saved/restored around the isolated manager child TEST LAB proof history
v12-v14 placement/manager attempts without the selector-5 resource/manager composition No pickups appeared Normal Fire selector 5 skips ordinary overlay entry 0x802ECE30; placement edits alone cannot create ordinary pickups TEST LAB proof history
v15 Fire external-ID Potion/Formula/Extra-Life visuals Pickup actors appeared as corrupted vertical strips External-resource IDs are not portable merely because the pickup manager and selector resolve Global item materialization and solvability
v17/v19 guessed floor-coordinate conversions Pickups disappeared or moved higher Do not infer TEST LAB pickup placement from unrelated actor coordinates without bounded calibration TEST LAB proof history
v22-v25 custom standalone gallery All variants hung at Mission Objective, including compact, post-intro, and ten-item forms Preserve the destination stage's native resource-file/table architecture; the custom top-level gallery path is rejected TEST LAB proof history
v28 21-key native-Fire-file stress proof Emulator-core Unknown SI DMA PIF address: 00000000 Treat as severe runtime corruption; historical allocator-headroom comparison was not a sufficient safety bound TEST LAB proof history
v29 low-RAM 21-key proof Mission Objective hang followed by music-speed corruption Resource bytes alone do not explain safety; dynamic runtime composition matters TEST LAB proof history
v30 15-live threshold attempt Mission Objective hang Inconclusive as an actor-count threshold because the first 15 included all three Earth keys TEST LAB proof history
Earth TEST LAB v34-v36 using file 0x88 selectors 0..2 Mission Objective hangs; v36 still hangs with only Earth Square live The supposed Earth pickup source was actually MONK1 fighter file 0x88. These failures do not establish an exotic Earth pickup format. Superseded by file-0x30 v38 TEST LAB proof history
Earth TEST LAB v37 raw Type-0 conversion from file 0x88 Stage enters and awards Earth Square correctly, but pickup art is corrupted/contains MONK1 imagery Award semantics are valid; visual source was wrong. The monk imagery directly exposed file-0x88 misclassification TEST LAB proof history
v31 image-only frame reuse Room entered, but several imported pickups rendered as striped/glitched graphics Image deduplication cannot mix one payload with incompatible metadata from other native frames TEST LAB proof history
v32 freeze on native frame 0 Coherent but most imported spinning icons appeared edge-on / nearly identical A complete native frame is coherent, but frame 0 is a poor static presentation choice for these items; v33 supersedes it with a wider native poster frame TEST LAB proof history

Enemy-randomization failures

Attempt / scope Observed failure What it established Detailed owner
Fire enemy type 0x0A -> 0x01 without Temple resource Freeze at spawn Constructor dereferences a type-specific resource slot; type substitution alone is insufficient Enemy randomization
Add Temple file after all stock Fire allocations Would exceed the observed arena by 0x3098 Foreign-enemy residency needs bounded replacement/reallocation, not append-after-stock Enemy randomization
Fighter-only Fire × MONK2 import Fighter functioned, but normal death/despawn presentation was absent; a later bounded proof additionally materializing Temple selector 10 confirmed correct death/despawn on the tested route Fighter residency + constructor success alone is insufficient; retain the first proof as the negative control, not as a current unresolved Fire × MONK2 defect Enemy randomization
Apply ordinary-enemy policy to bosses/minibosses Rejected Boss/state branches carry custom resources, process IDs, scripts, and transitions Enemy randomization
Prison FAST phase-family proof v01 FAST MONK combat worked through both fence sections, then the game hard-hung entering the scripted capture Rejected / failed family-removal model. The capture set-piece directly needs file 0x8F even when ordinary 0x15 combat is replaced. Corrected v02 retains 0x8F as a fixed auxiliary and is Runtime-confirmed. Enemy randomization, Stage catalog — Prison
PRIS GRUNT compact palette v03 Runtime captures showed substantially worse color placement: teal/magenta appeared on unrelated materials and clothing looked corrupted/noisy. The derivation parsed the stock 64-color palette record two entries off, treating its first two colors as header fields. Rejected / failed. Do not use aggregate palette-slot reassignment from v03. v04 returns to the successful compact layout and corrects dictionary texel grouping from correctly parsed stock source indices; v04 is the accepted visual baseline. Enemy randomization

UI and Toasty diagnostic failures

Attempt / scope Observed failure What it established Detailed owner
Direct framebuffer drawing Unstable Native HUD/textured-node systems are the supported rendering direction Native HUD and UI
Treat 0x80073CEC -> 0x8001E578 as a universal gameplay sprite renderer Toasty diagnostics did not support the assumption Renderer/context conclusions must come from the actual textured gameplay-HUD node family Toasty visual research
Toasty visual v01 without an independent marker No visible image and no clean attribution A negative visual proof needs an independent known-good execution marker Toasty visual research
Toasty visual v03 allocator diagnostic Persistent slot failure coincided with loss of normal music/SFX The instrumentation was intrusive; its slot result is not clean allocator evidence Toasty visual research
Toasty visual v06 raw-loader wrapper extending into selector-cave tail 0x9A720..0x9A753 Mission Objective + music hang before gameplay Do not wrap the stock raw loader or reuse that proof-cave tail for this diagnostic Toasty visual research
Toasty visual v07 post-load helper instrumentation Reproduced the Mission Objective + music hang with the stock loader call restored Helper-based load instrumentation on that route is rejected; it does not prove loader success/failure Toasty visual research
Toasty visual v11 independent fixed-slot 0x17 allocation through a second 0x8001BF70 call Noisy/multicolored clone instead of the known-good control Reject that fixed-slot allocation recipe; later diagnostics must isolate slot identity without assuming it Toasty visual research
Toasty visual v24 secondary-rectangle normalization Fire/Earth reproduced the exact same edge corruption as v23 The remaining stage variance is not caused by inherited node coordinates at +0x28/+0x2A/+0x38/+0x3A; keep the v23 image/stride path and test slot/lifecycle identity separately Toasty visual research
Treat retail 0x80039BF4 / randper(0x28) as the reaction-driven Toasty probability Superseded static interpretation That 4% branch is a separate Toasty-capable path. Supplied Rev. 2 FX_COMMENT entry 0x0E -> 0x8002D810 uses 0x40 normally and 0xA0 on MK2 Pit Star: 6.4% / 16% per thousand. Toasty visual research

The earlier blanket statement that textured-image rendering was unproven is superseded: later Toasty work confirms the image/texture path at its documented bounded scope. The rejected entries above remain useful only for the diagnostic paths they rule out.

Reverse Elbow and MKT-adapter failures

Attempt / scope Observed failure What it established Detailed owner
Reverse Elbow v1-v2 early behavioral recreation Minimal movement/incomplete presentation; experimental victim callback could hard-hang on contact Separate host lifecycle, movement calibration, victim semantics, and donor semantics instead of changing them together Player actions and special moves
Reverse Elbow v3 ordinary return Immediate hang with or without an enemy Callback self-reentry is a host lifecycle hazard, not an enemy-contact issue Player actions and special moves
Reverse Elbow v4-v5 incomplete scheduler/action-root emulation Unstable/incomplete action lifecycle Native scheduler transfer, lock, bounded loops, and cleanup are required together Player actions and special moves
Reverse Elbow v8: velocity 0xD0000, locomotion index controller+0x6E6, per-tick reapply, forced crossover +0x3800 Intended speed/pass-through was not observed; attacks could stop motion; expanded diagnostics were absent These exact parameters are failed-proof reproduction data, not accepted movement values Player actions and special moves
Forced-X crossover as donor pass-through Did not reproduce donor behavior MKT pass-through is ordinary movement plus temporary three-tick repulsion suppression, not a teleport/fixed-position write MKT adapter primitives
Direct retail-instruction relocation as a general port strategy Rejected architecturally PROCESS/OBJECT layouts, scheduler ABI, tables, heaps, callbacks, and resource formats are engine-local MKT compatibility overview
Reuse donor strike/reaction numbers as target numbers Sektor v61 long combo caused catastrophic world/background corruption when selector 0x02 was copied numerically Translate reaction meaning into MKMSZ-native semantics; numeric equality is not compatibility MKT adapter primitives, Sektor takeover proof history
Copy donor animation callback/control words blindly Rejected by the cross-engine ABI boundary Visual frames may transfer while callback/control tokens require explicit semantic mapping MKT adapter primitives

Fighter-asset and Sektor proof failures

Attempt / scope Observed failure What it established Detailed owner
Use zero-filled-looking ROM [0xA1308,0xA1544) as a Sektor helper cave Input-specific hard hangs The range contains live action/dispatch records; zero bytes are semantic data, not free space Sektor takeover proof history, Memory and allocation map
Sektor v20 accumulated raw-resource growth Whole-scene corruption before Crouch Low Kick was selected The failure was a composition/resource-pressure boundary, not evidence against that animation mapping Sektor takeover proof history
Sektor v44 generated shapes at unaligned offsets such as +0x5037E and +0x51D81 Immediate crouch hard-hang before a frame appeared Generated shape records must be 4-byte aligned for target word loads Sektor takeover proof history, MKT fighter asset translation
Tight-pack donor/WIMP rows as width * height Diagonal/slashed frames Preserve source row pitch align4(width); visible width is not storage stride MKT fighter asset translation
Put decoded byte lengths such as 0x00000FEA / 0x00001054 into an MKMSZ image wrapper Target interpreted the header as type 0 Target wrapper type is encoded in header byte +3 & 0x3F; decoded length is not a raw-wrapper type declaration MKT fighter asset translation
Copy MKT codec 22/24/15 streams directly into MKMSZ Rejected as an asset path Decode donor formats offline, translate palette/geometry, then generate target-native assets MKT fighter asset translation
PS1-derived Sektor Run interpretation used by v55/v56 Imported even poses were malformed That PS1 pixel interpretation is rejected. v58's WIMP repair later supplied valid even poses, but the accepted 2026-09-25 Run design now removes the six supplemental even poses entirely and retains only retail N64 1,3,5,7,9,11. The earlier hold-each-twice timing rule is also superseded: static cadence reconciliation shows donor-equivalent timing is MKMSZ Run rate 3 with one entry per retained pose. The PS1 Run extraction/decoder is historical provenance, not a current build dependency. MKT fighter asset translation, Sektor takeover proof history
Treat Sektor v62 standalone combo continuation [0x9AD90,0x9ADA0) as reusable production space It overlaps production bootstrap composite [0x9AD84,0x9AF20) Runtime success of a proof does not make its allocation production-safe Sektor takeover proof history, Memory and allocation map
Sektor missile v63: reuse file-0x87 +0x41984..+0x43190 as a supposedly dead special bank Normal hit testing hard-hung and blood presentation became a visible artifact before the XP-gated missile was exercised File-local liveness must be proven by runtime ownership/use, not inferred from an incomplete reference audit; replacing stock-special storage can corrupt unrelated hit/effect paths Sektor takeover proof history, MKT fighter asset translation
Sektor missile v65-v67: replace/suppress pieces of the stock Ice action lifecycle while injecting chest/missile code Correct chest art could appear, but the move hard-hung immediately; restoring only the first helper process changed presentation but not the hang Preserve target lifecycle/setup until the exact host primitive is understood; changing animation setup and process composition together is too intrusive Sektor takeover proof history, Player actions and special moves
Sektor missile v70: tune the inherited Ice path with a hardcoded 96-pixel spawn shift and grafted acceleration callback Genuine rocket art travelled, but spawn remained far away, motion felt slow/constant, and Ice helper clones/tint remained Do not recreate donor specials by target-specific tuning; preserve donor do_robo_zap/rocket1_proc semantics and translate through generic MKMSZ projectile primitives Sektor takeover proof history, MKT adapter primitives
Sektor missile v71: change native placement and per-tick movement translation together Hard hang 1-3 frames after F,F+LP; post-test trace proves +0x648 placement and +0x714 child handoff use the same secondary actor, while the callback incorrectly reuses setup helper 0x8004CC14 every tick Isolate placement and movement changes in separate proofs; 0x8004CC14 setup semantics must not be assumed to equal a generic per-tick velocity update Sektor takeover proof history, Player actions and special moves
Sektor missile v78: call 0x80031394(owner, projectile) as a direct target analogue of donor match_ani_points at the v75 placement seam Immediate complete game hang Structural similarity is not lifecycle/ABI compatibility; do not promote 0x80031394 as a safe generic projectile-alignment primitive without proving its preconditions at the actual actor state Sektor takeover proof history, MKT adapter primitives
Sektor missile v79: change chest script/timing, palette selection, Ice tint and strike reaction/damage together from v75 Immediate complete game hang The composition is rejected; no individual cause is isolated and 0x04/20/2 are not validated rocket-impact semantics. The ninth chest advance reads the eight-frame script terminator and returns native completion; that alone does not establish a hang cause Sektor takeover proof history, MKT adapter primitives
Treat the Ice 0x80060A3C process as a disposable visual clone v65-v67 suppressed one/both process spawns while also changing parent setup and hard-hung The process constructs, inserts, animates and tears down two actors plus texture/palette state; the broad failures cannot isolate that suppression as sole cause. Keep parent/helper ownership intact until a replacement transaction and teardown are proven Player actions and special moves, MKT adapter primitives
Treat v72's stable direct (+5,+38) placement as proof that donor local units and MKMSZ world units are universally 1:1 v74's cadence-resampled path is stable, but comparative 60-fps donor/target video measures late visible flight at roughly half MKT speed Placement stability does not establish cross-engine spatial-unit equivalence; preserve the proven temporal resampler and calibrate donor-local -> target-world scale separately MKT adapter primitives, Sektor takeover proof history

Flow, inventory, and run-lifecycle rejections

Attempt / scope Observed failure / rejection What it established Detailed owner
Start-button selector shortcut Intermittent Production selector uses the A-button route from the title screen; inside the native selector, Start remains the actual stage-choice/commit control Stage flow and selector
Safe-selector confirmation SFX v01 Added title descriptor 0x1FD very late in the stage-commit path; no audible confirmation was reported Reject the late commit seam. The title confirmation voice is not proven safe/effective at that teardown boundary. Stage flow and selector
Safe-selector confirmation SFX v02 A inside the selector played 0x1FD, but A does not choose a stage; after stage load the user observed delayed crunchy/choppy/noisy audio Rejected / failed. A is not the native selector commit input; Start owns the commit event. The delayed audio symptom did not recur in movement-only v03a, so production drops the added confirmation path entirely. The exact v02 corruption mechanism remains unresolved; do not reintroduce this composition. Stage flow and selector; Address and patch-site registry
Selector helper remains, sound muted, s0 return preservation, Trace (11) Changed only addu s0,ra,zero/jr s0 to addu t9,ra,zero/jr t9 within the Trace 10 sound-call-muted helper. Observed one 5.2s burst of 79 consecutive guest FIFO rejects late in 247.770s session; user heard temporary acceleration. First attempt unexpectedly closed whole RMG GUI on normal Shutdown with no trace. Runtime-confirmed failed correction hypothesis. Preserving s0 did not prevent audio acceleration; helper executes with no memory writes when sound call is NOP. Preserve host-event-phase and unmonitored guest-state hypotheses, no production promotion. Stage flow and selector, audio investigation
Broad boot-routine deletion Rejected Fade/title normalization still has to run Stage flow and selector
Disable saving globally Rejected Selector-only suppression uses the native one-shot flag; normal post-stage saving remains Stage flow and selector
Tablet 0x24 as foreign-key placeholder Consumable Use inert Glass 0x08 for LIVE masking instead Persistence, inventory and lifecycle
Auto-spill/global inventory scan Intentionally rejected design Four boxes remain explicit backing stores with controlled switching; no hidden global scan Persistence, inventory and lifecycle
Lifecycle Pause-Quit v01 Supposed Game Over reset at ROM 0x364EC cleared all run state on normal stage entry Rejected. Do not reuse this reset composition or address. The clean-image stage-sensitive presentation mapping is separately documented; only a classified terminal seam can own reset. Lifecycle static closure
Lifecycle Pause-Quit v02 Inventory survived Quit, but XP/powers, HP and lives did not Partial evidence; inventory persistence does not establish resource/HP ownership. Lifecycle static closure
Lifecycle Pause-Quit v03 Mission Objective hang after bad stage-entry composition Rejected. Do not add lifecycle calls to the Mission Objective/progression restore graph. Lifecycle static closure
Lifecycle Pause-Quit v04 Intermittent music-speed corruption; lives floor around ×7/eight total, HP not restored, inventory reset on death Rejected / unsafe composition; must not be extended. XP/powers Pause -> Quit persistence is bounded Runtime-confirmed. Static ROM inspection identifies repeated saved-life restoration undoing the stock decrement and HP carrier restoration after construction. Death inventory commit is absent; correction and actual backing-vs-LIVE state need bounded validation. Exact audio corruption cause remains unresolved. SHA-256 63357955a89e3059c405e42bf127c79cb6692395e7f730d2bad0c733123c47db. Lifecycle static closure

XP productionization failure

Attempt / scope Observed failure What it established Detailed owner
V2 production integration with stage-entry progression restore calling native tier evaluator 0x80074FBC Temple music loaded, then the game hung before gameplay became visible Static/CI success did not establish stage-init timing safety XP and progression
V2 repartition and restore-helper behavior changed together Failure source was initially ambiguous Runtime-critical variables need isolated disposable diagnostics XP and progression
Diagnostic A: keep V2 allocation/reward path but redirect only the progression stage-entry JAL back to the existing load/mask wrapper Temple loaded and progression pickups at 85/258 worked, but combat XP path was absent by design V2 allocation/reward path was viable on the tested route; the restore helper was the bounded suspect XP and progression
Diagnostic B: restore persistent XP at stage entry but omit the tier evaluator there Temple/Wind/title->Fire routes retained XP and unlocked moves Accepted correction: restore XP at stage entry; evaluate tiers only on the Runtime-confirmed progression-pickup acquisition path XP and progression

Allocation rule

Historical proof offsets are evidence, not reusable allocations. A proof-only cave, zero-filled region, or successful standalone footprint does not become production-safe without current ownership analysis and validation of the composed layout.

Canonical allocation ownership is Memory and allocation map. Feature-specific proof details remain on their owning pages.

Temple intro audio corrections

| Rejected / superseded finding | Observation | Current conclusion | Owner |

Materializer high-tail allocation 0xF6B140..0xF6B69F Webapp build with Toasty donor audio failed the materializer pristine-FF guard at 0xF6B140; Toasty owns 0xF6B5D0..0xF6BDE5, producing a real 0xD0 overlap Rejected allocation composition. Wrapper semantics are unchanged. Relocate the 0x5E0-byte helper to 0xF6AAF0..0xF6B0CF / 0x801B2310..0x801B28EF, immediately after progression flash and before Toasty audio. Add direct non-overlap regression coverage. Global item materialization and solvability, Memory and allocation map
Temple carrier 0x20A -> 0x1A6 -> 579 -> 422 -> 412 promoted as isolated User runtime testing found the selected Temple donor clip also replacing unrelated robot/miniboss audio in Bridge and Prison Rejected. Direct-immediate absence was insufficient liveness proof. Preserve the entire 0x20A chain stock. Corrected v03 keeps Temple descriptors 0x41/0x42/0x43 stock and retargets only Temple events through isolated 486 -> 329 -> 319; Audio-1 plus Bridge/Prison negative controls are Runtime-confirmed. Audio system, Address and patch-site registry
v01 treated file 0x9B and descriptor candidates around 0x21D/0x21E/0x220 as Temple intro ownership Runtime showed no Temple change; file 0x9B is Bridge, while the real Temple overlay is file 0xA0 The old Bridge patch sites and “Temple” ownership claims are rejected. Correct Temple intro sites are in file 0xA0 at ROM 0xCB274/0xCB280/0xCB2F8. Audio system, Temple catalog
Proof carrier descriptor 0x220 -> event 0x1B8 promoted toward production Whole-ROM audit found live stock li a0,0x220 callers around ROM 0xBE744/0xBE750/0xBFACC, including stock 0x80064C18 audio calls The carrier remains valid for the bounded Temple proofs but is rejected for production reuse. That replacement was later also rejected: runtime testing showed unrelated Bridge/Prison robot/miniboss audio reaches 0x20A -> 0x1A6 -> 579 -> 422 -> 412 indirectly. The corrected architecture preserves stock Temple descriptors and edits only Temple events 123/124/125 through isolated host 486 -> 329 -> 319. Audio system, Address and patch-site registry
Retail MKT TS_SK_ITS_OFFICIAL interpreted as usable standalone “You suck” User audition of the extracted retail waveform produced a short hit/impact-like sound Excluded from both pools. Older Midway source shows skofficl then skyousuk as separate material; recovery of the complete phrase is optional future work. Audio system