Autopilot · write-up
Level 5 full-entry C validation, September 30
Result
The full-entry test failed before the tank. It began at game frame 72856, with 31 shield and one remaining life, and stopped after that life was lost at 73641. The recording was finalized at 73643. The tank, intervening shop, train and final ship boss were not reached; their focused validations do not establish a successful uninterrupted Level 5 run.
For comparison, level5-right-egress-from-start-r22.validation used the same
start snapshot, reached 74758, and recorded only one eight-point hit at 73751.
The present early death is a regression relative to that September 28 recording.
Several C changes intervened; this comparison alone does not attribute the
regression to the latest final-boss fixes.
Recording and paired videos:
E:\xenon_runs\level5-full-current-r102.validation\level5-full-current-r102.x2eventsE:\xenon_runs\level5-full-current-r102.validation\level5-full-current-r102-original.aviE:\xenon_runs\level5-full-current-r102.validation\level5-full-current-r102-sprite.avi
The run used validate_campaign.py native-run, visible Hatari PID 70112,
resident C control and the current executable/DLL pair rebuilt with
hatari_dev.ps1. No Python pilot supplied per-frame inputs. The recording
contains frames 72857–73643 and periodic checkpoints with interval 150.
Its manifest archives the source diff, binary hash and command arguments.
Both AVIs decode their first and last frame, and their RIFF sizes equal their file lengths. Original: 3,147 indexed frames, 84,707,631 bytes; sprite: 3,141 frames, 84,637,340 bytes. Cleanup reported no errors.
Incidents
Every row refers to the recording above. Source identities and rectangles come from the original collision-time events, rather than replay recomputation.
| Frame | Shield | Problem |
|---|---|---|
| 73145 | 31→23 | Scripted sine-motion enemy #587673 reached the ship while formation-hold selected an unsafe stationary fallback. |
| 73602 | 23→19 | Directional projectile #589849 hit during an upward laser-gate approach. |
| 73622 | 19→11 | The gate approach climbed into scripted swarm body #589827. |
| 73623 | 11→3 | The continuing climb contacted body #589826; its collision event already names the unlink procedure. |
| 73624 | 3→0 | Directional projectile #590046 hit during the same climb and exhausted the shield. |
| 73641 | — | The last remaining life was lost; validation stopped. |
There was no formal wall/stationary-stall incident before the life loss. There were shorter periods of waiting and failed gate approach, covered below.
What the resident trace establishes
The live decision trace is E:\xenon_runs\level5-full-current-r102.trace.
This is the actual resident decision, not a newly calculated Python decision.
- At 73140–73144,
tactic=4(FORMATION_HOLD) held ship X=126. The evaluator reportedreason=6(BODY) with contact approaching from three frames to one, andverified=0. At 73143–73144 the applied movement was zero. Enemy #587673's handler was$0E1E, the scripted sine-motion/spawner thunk; its screen position moved from (197,92) at 73130 to (119,121) at 73144. Thus the planner reported an imminent body contact before the hit. This is not evidence that the hazard was absent from the prepared scene. - At 73600–73602,
tactic=26(LASER_GATE_EGRESS) applied UP while reportingreason=6,contact=1, andverified=0. - At 73614–73619, it held near X=117 with
reason=1(WALL) in its future rollout. At 73620 it resumed UP+RIGHT despiteverified=0. At 73621–73624, body contacts were again reported at frame one, and it continued climbing. Proposed, planned and applied masks in the trace show that a separate final boss or cash tactic did not override these decisions. - The hit on #589826 needs collision-order care: the body switches from
$0E1Eto$107Cduring frame 73622 and still produces an eight-point collision event at 73623. The retirement handler in a post-update observation alone must not be treated as proof that the original collision loop can no longer damage the ship. This run does not yet resolve that original-code ordering.
The next correction should address the early Level 5 formation/gate safety fallback, not change the successful final-ship tactics. The trace supports an action-selection failure, but does not prove that every predicted trajectory is accurate or that a particular alternative path was safe. Test a lateral escape or a staged gate crossing from the earlier checkpoint with collision/combat validation before adopting either. Recheck the full entry after any correction.
Pickups
The observational pickup audit was run with levels=(5,); it did not execute
Python prediction or gameplay. Its output is
D:\src\hatari\work\level5-full-r102-pickups.json.
- POWERUP #586870 retired beside the ship at 72967, and POWERUP #587248 at 73029. Both are classified as likely collected; capture has no explicit per-pickup collection event. No missed weapon attachment was observed in this short segment.
- Five cash pickups likely collected; four expired, and one lifetime was unresolved when the ship died. The expired cash totals 300:
| Expiry frame | Identity | Pickup | Value |
|---|---|---|---|
| 73241 | 588057 | Small cash | 50 |
| 73550 | 589428 | Large cash | 100 |
| 73594 | 589699 | Large cash | 100 |
| 73638 | 589841 | Small cash | 50 |
No boss drops or shop purchases occurred in this recording. The final boss's 20/20 cash result remains the focused r101 result documented in LEVEL5_FINAL_BOSS_REVA.md.
Reproduction
Start snapshot:
E:\xenon_runs\level5-full-from-l4-shop-r1.validation\start.sav.
For a focused probe before the damage cluster, use the new run's
checkpoints\f73458-periodic.sav; for the first hit use
checkpoints\f73007-periodic.sav. The run also retained
checkpoints\f73608-periodic.sav, which already follows two hits and is
unsuitable as a clean entry baseline.
$env:XAP_LEVEL5_TRACE_FILE='E:/xenon_runs/level5-full-repeat.trace'
$env:XAP_LEVEL5_PLAN_TRACE='E:/xenon_runs/level5-full-repeat.plan'
python xenon_tools/validate_campaign.py native-run level5-full-repeat `
--output-root E:/xenon_runs `
--resume E:/xenon_runs/level5-full-from-l4-shop-r1.validation/start.sav `
--port 6903 --frames 30000 --checkpoint-interval 150
Use a fresh output name. A lost life or detected gameplay stall stops the validation and finalizes the recordings. No tactics were changed for the original r102 test.
Original-AVI stills extracted with the replay's +2-VBL alignment:
D:\src\hatari\work\l5-boss-level5-full-current-r102-73145.pngD:\src\hatari\work\l5-boss-level5-full-current-r102-73602.pngD:\src\hatari\work\l5-boss-level5-full-current-r102-73621.pngD:\src\hatari\work\l5-boss-level5-full-current-r102-73623.png
Investigation and correction
The original fatal cluster was an action-selection failure: the resident trace already predicted contact, but its ordinary candidates consisted of a short held dodge followed by the original route. When that distant continuation was unsafe, usable near-term movement was discarded. The legacy ship hulls also closed legitimate gaps: an idle ship was represented as 21×30 pixels rather than the original 21×20 collision header, with still larger asymmetric boxes when turning. The existing sprite-hull simulator covers both movement endpoints without that stationary padding.
The C correction adds a bounded multi-turn fallback only when the ordinary search finds no escape. It evaluates four-frame extensions, retains six distinct positions, and shares the normal 4096-transition budget. A checked partial path may replace a worse imminent-contact path, but remains unverified; it is never reported as a complete safe horizon. Early corridor trials use actual sprite collision headers and continue to model firing and destruction.
Future Level 5 homing missiles now receive six hit points in trial combat,
instead of remaining indestructible hazards. Evidence in /level5dump:
$4F880 copies the word at $4F04C to object offset $32, and $4F04C
contains $0006. Captured live missiles also have six hit points. Their trial
health resets between candidates; no synthetic world identity is created.
The fallback and precise hulls apply before the existing tank-approach boundary, scroll Y>2544. Tank, train and final-ship tactics retain their existing planner configuration. There are no game-frame-number conditions in the correction. The DLL interface is ABI 98; the Python ctypes mirrors were updated together. Python remains recording/test/inspection infrastructure, not the live controller.
Rejected attempts and scope checks
All listed recordings are under E:\xenon_runs, in the matching .validation
folder, and retain original/sprite AVIs plus 150-frame checkpoints.
| Recording stem | Result | Finding |
|---|---|---|
level5-gate-local-r103 |
Life lost at 73932 | A 16-frame gate horizon passed the original cluster but climbed into the following missiles; discarded. |
level5-full-escape-r104 |
Life lost at 73904 | Full-horizon multi-turn search alone was insufficient. |
level5-full-missile-health-r105 |
Same loss and hits as r104 | Correct missile health alone did not fix action selection. |
level5-gate-stage-r106 |
Life lost at 73833 | Lower laser staging with legacy hulls was insufficient; staging discarded. |
level5-gate-safe-prefix-r107 |
No damage, later stall near Y=3200 | A focused success did not establish full-entry success. |
level5-full-local-scope-r108 |
Hits 73515–73518; life lost 74070 | Full entry invalidated the focused r107 conclusion. |
level5-full-sprite-hulls-r109 |
Original gate/missile section passed undamaged; four hits 74768–74772; life lost 75863 | Ending the correction at world Y=3504 left the same failure in the later corridor. |
level5-full-pre-tank-r110 |
Zero shield damage, stall at 75661 | Extending to the tank boundary exposed a navigation trap at world (92,3215). |
The later stall was traced to the three-barrier approach. Its left-to-right transfer allowed the camera to advance before the ship reached the right-hand lane, leaving it above the shelf in a left pocket with no upward exit. The local mission now retains shelf Y=3332 and requests bottom-edge camera hold while X<240, releasing that hold once the right lane is reached. It does not change tank or final-boss combat. The ordinary bottom-hold simulator uses DOWN and release at the exhausted backscroll limit instead of continuously reducing that limit.
Validation of that last navigation correction is recorded separately below.
Recurrent diagonal-entry stall: cause and correction
The affected gate is level5-tile-pair-r172-c09, with authored cells
(9,172), (10,172), (9,173), (10,173): world footprint X=144..176,
Y=2752..2784. This is distinct from the earlier three-barrier shelf trap.
Recording:
E:\xenon_runs\level5-full-corridor-fixed-r112.validation\level5-full-corridor-fixed-r112.x2events.
The native map already marked this entire group open. At frame 76060 the ship
was (164,2740), still following gate egress. At 76061 it reached (155,2734),
and diagonal_crossed was permanently set. The mission immediately changed
to the right lower cannon, with a 56-frame combat horizon instead of the
eight-frame crossing horizon. Its selected escape was DOWN. By 76072 the
ship was back at Y=2778, but diagonal_crossed remained true. Later, at
77307, it was (33,2740), outside the chamber under its left diagonal wall,
still marked crossed and targeting the upper-left cannon through terrain.
No missing map update was involved.
At the stalled frame, the camera was at Y=2563 with backward limit 2577. The ship's maximum screen anchor is 176, giving a reachable world anchor of only 2753 when scrolling back. Going around the diagonal shoulder below the gate requires returning below its bottom at 2784. The camera had already removed that recovery path. This is why another waypoint adjustment at the stalled position could not work; traversal ownership must be preserved before the ship leaves the entrance and the camera advances.
Previous waypoint and horizon changes did not repair this state contract: completion was latched even after retreat, and a failed crossing route could fall through to an unrelated cannon attack. The firing target's 32x16 dormant collision rectangle also must not substitute for the gate's 32x32 terrain footprint when planning passage.
The correction in xenon_autopilot_level5.c is local to this chamber:
- Derive the exit from the authored tile footprint and the maximum bottom extent of all five original ship poses. The shared pose table is unchanged; it moved from maneuver-local storage to the player module. The stable exit anchor is (160,2732), with X=156..164 accepted at the final waypoint.
- Recompute chamber membership from the current position. The whole ship must be beyond the exit, and its physical navigation component must connect to the exit without returning below it. A direct segment is the cheap normal case; a bounded exact-goal span search handles an interior dogleg.
- Restore crossing priority after a hazard dodge leaves that component.
- Route to a narrow exit region; never project its destination into another pocket. A failed connector retains the same gate mission and real goal.
- Open and cross the entrance before attacking the upper stacks. The diagonal wings block shots; the former comment claiming firing through terrain was legal was incorrect.
The maximum pose bottom is 15 pixels; the exit adds two pixels and rounds upward travel to a four-pixel grid row. Captured global collision bounds belong to the preceding collision pass. Deriving the exit from those bounds made it move between frames (2728..2744 in r115/r117), briefly changing phase without a real crossing. The final correction uses the shared original poses for a stable boundary, rather than adding another guessed Y threshold or timer.
There are no game-frame conditions, timed completion guesses, new Python
controller callbacks or new ABI fields in this gate correction. Other tile-pair
egress rules and tank/final-ship combat were not changed. Optional Level 5 trace
lines now include gate, diagonal_inside, egress and destination.
Live validation
Every recording below has both finalized AVIs and 150-frame checkpoints in its
matching E:\xenon_runs\<stem>.validation directory.
| Recording stem | Result |
|---|---|
level5-diagonal-ownership-r113 |
Restart at 75780 stalled at the preceding seal, before this gate; inconclusive for the correction. |
level5-diagonal-ownership-r114 |
Restart at 75935 crossed the entrance without damage. Subsequent tank-approach hits 76451, 76465, 76467, 76476, 76482, 76487, 76489; life lost 76506. This test preceded two route-failure/completion edge-case cleanups. |
level5-diagonal-full-regression-r115 |
Replay from the Level 5 start at 72856 passed the opening corridor and diagonal gate without damage, defeated the tank and reached the shop at 76701. No life lost. Tank-section eight-point hits at 76388 and 76491 remain. This run still used the moving captured-box crossing boundary. |
level5-diagonal-checkpoint-r116 |
Restart at 75875 stalled at the preceding seal, before this gate; inconclusive for the correction. |
level5-diagonal-repeat-r117 |
Restart immediately below the cleared entrance at 76026 progressed through it, but a later retreat through the opening incurred four-point damage at 76119. This exposed the captured-box crossing-boundary problem. |
level5-diagonal-stable-plane-r118 |
Final stable boundary; same 76026 checkpoint passed the opening and chamber, ending at 76328, with no shield damage, life loss or stall. |
level5-diagonal-final-regression-r119 |
Final stable boundary; full-start replay 72856–76886 passed the diagonal gate without damage or the left-pocket stall, defeated the tank and reached its shop. No life lost. Later tank-section hits: 76439 (4 shield), 76465 (8 shield), finishing with 27 shield. |
The earlier-checkpoint seal stalls and tank hits are retained as separate open issues; these results do not claim that all Level 5 tactics are regression-free. The full-start test is important because checkpoint restarts reset native mission state. No commits were made for these changes.
Comparison of r115 and the final stable-boundary r119 full-start test found identical player positions, camera scroll and consumed inputs through 76028. The first difference was at 76029, at the diagonal entrance. Moving the shared pose table did not change gameplay before this local correction activated.
Targeted verification after the stable-plane correction: 30 Level 5 mission tests and 70 native driver, decision, session, planner, maneuver, candidate, workspace and player tests passed. The full mission suite also has four Level 1/2 expectation failures unrelated to this Level 5 change. New tests exercise retreat after crossing, route failure without fallthrough, a disconnected side pocket, closed-entrance priority, and changing captured collision offsets. An additional diagonal-owner release test passed, checking that a cleared chamber resumes progression rather than routing back to its entrance.
Diagonal-gate validation recording:
E:\xenon_runs\level5-diagonal-final-regression-r119.validation\level5-diagonal-final-regression-r119.x2events.
Its paired AVIs were finalized without cleanup errors. This validation stops at
the post-tank shop; it does not revalidate the later train or final ship fight.
Full-level continuation: train chamber stall
Full-start recording:
E:\xenon_runs\level5-whole-current-r120.validation\level5-whole-current-r120.x2events.
Both AVIs and 150-frame checkpoints were recorded by validate_campaign.py
native-run; all live decisions came from the resident C pilot. This run
reproduced the damage-free opening corridors, tank hits at 76439 (4 shield)
and 76465 (8 shield), and all 10 tank reward coins collected (750 cash).
It missed an unequipped Homing Missile: first visible 76334, closest at
76413 with a 10-pixel gap, expired at 76425. Two uncollected Side Shots
were redundant: the installed Side Shot was already at maximum power 2.
The intermediate shop bought a third Laser for 6000, leaving 100 cash.
The run then stalled near frame 79586 and the monitor stopped at 80488. The ship was at world (130,1568), camera Y=1392, backward camera limit 1397. The chamber's right opening was visible, but the ship could no longer reach the crossing below its lower shoulder. Native wall probes show that the crossing needs world anchor Y=1584; the camera allowed only Y<=1573. The persistent map correctly contained the wall. No missed map update was involved. Generic center advancement projected its goal into the disconnected upper pocket, its connectors failed, and the fallback retained the current X.
At the earlier checkpoint f78904-periodic.sav, the ship was (129,1789)
with enough backward range to cross. The reserved span route to (280,1504)
passes through (116,1684), (144,1588), (240,1588) and (276,1544).
The local C correction claims this chamber from tile row 114 down to the
right exit at row 89, routes to X=280..288/Y=1420..1424 using an exact region
connector, and retains that goal instead of nearest-point projection or
fallthrough into the central pocket. Collision evaluation remains active.
level5-train-passage-r121 restarted from f78904-periodic.sav and reached
the right exit without damage. It exposed a second ownership conflict: at
79162 the old train hold replaced the exit route with a backward goal at
Y=1561..1569. The controller alternated between retreat and crossing, taking
2 shield damage at 79248. Both AVIs were finalized after a requested stop.
The train hold now ends at the chamber exit; surviving members behind the
ship cannot pull it back. No changes were made to Python autopilot behavior,
the tank, final boss, or map data for this chamber correction.
Targeted C mission verification: 34 Level 5 tests pass, including the exact exit region, route-failure ownership and surviving-train regression. Hatari and the Python replay DLL were both rebuilt with the official script. Live validation of the corrected train-hold boundary follows below.
E:\xenon_runs\level5-train-passage-r122.validation\level5-train-passage-r122.x2events
restarted at 78904 and reached final completion at 81705. There was no stall
or life loss. Two directional projectiles caused 2 shield damage each: 79248
(#611031, at the right exit) and 80137 (#615178, on the later approach).
The final ship appeared at 80669 with all 18 mounted parts intact. All mounts
were destroyed by 81482, its reward burst appeared at 81595, and all 20 coins
(1500 cash) were collected before completion. The final fight caused no shield
damage; shield remained 23 throughout it. One later Side Shot expired at
80436, but the installed Side Shot was already at maximum power. The original
and sprite AVIs finalized successfully with no cleanup errors.
This is a checkpoint continuation, not yet a full-start verification of the
new train route. level5-whole-fixed-r123 is the subsequent full-start run.
Full-start rejection of the immediate crossing
E:\xenon_runs\level5-whole-fixed-r123.validation\level5-whole-fixed-r123.x2events
did not pass: it lost its remaining life at 80973. It repeated the tank hits
at 76439 and 76465 and collected all tank cash, but entering the train choke
before the final wave cleared caused a 16-point damage cluster:
| Frame | Damage | Source |
|---|---|---|
| 79240 | 2 | Directional projectile #610925. |
| 79241 | 2 | Directional projectile #610973. |
| 79242 | 4 | Path-train member #609840. |
| 79243 | 4 | Path-train member #609841. |
| 79245 | 4 | Destroying hostile member #609843, still damaging during retirement. |
A later projectile hit at 79973 cost 2 more shield. Final-fight hits at 80901 (2), 80902 (4), 80952 (2) and 80956 (1) exhausted the remaining shield. The monitor stopped on life loss; both AVIs finalized with no cleanup errors.
The chamber damage was predicted, rather than a missing train path: the optional C trace reports unverified candidates and contact counting down from frame 79218. By then the ship was at X=277 in the narrow right lane. It retreated into the approaching wave without enough lateral space. An empty scene earlier in the approach was also misleading: another train appeared as the camera passed approximately Y=1448. The r122 checkpoint success therefore did not establish that immediate crossing was safe.
The revised local tactic stages at world (240,1588), below the wall shoulder. It holds this world row while the camera reaches the bottom-edge position Y=1412, which reveals the final scroll-triggered wave. It retains the full normal prediction horizon and waits for observed trains, damaging wrecks and hostile projectiles to retire. Only then does it claim the exact right exit region. Readiness uses camera geometry and observed hazards, not game-frame numbers or an arbitrary waiting timer. The existing exit route identifies a committed crossing, so ordinary route refresh cannot return to staging.
Targeted C mission verification now has 37 passing Level 5 tests, including
the initially empty scene before the last wave and a remaining projectile
after train destruction. Live verification starts with level5-train-stage-r124
from r123 checkpoint f78754-periodic.sav, before the chamber approach.
E:\xenon_runs\level5-train-stage-r124.validation\level5-train-stage-r124.x2events
completed at 83085 with one life and 21 shield. Staging held the world row
while the last train and shots cleared; the exit route was released at
79943 from (239,1585), camera Y=1408. The train chamber caused no shield
loss or stall. Three later directional shots caused 2 damage each at 80785,
80873 and 80938. The final ship appeared at 81465 with all 18 mounted parts;
all mounts were gone at 82900, the controller disappeared at 82973, and all
20 reward coins (1500 cash) were collected. The final fight caused no shield
loss. Both AVIs finalized with no cleanup errors. A redundant, already
maximum-power Side Shot expired at 81232.
level5-whole-staged-r125 is the full-start verification of this final local
staging correction. No automatic commits were made. The two repeated tank
hits remain open: r123's C trace was already unverified, predicting contact
before both 76439 and 76465. They must not be described as an unseen projectile
or missile without additional evidence.
Final full-start verification: r125
Full-start recording before the fast-forward repeat:
E:\xenon_runs\level5-whole-staged-r125.validation\level5-whole-staged-r125.x2events.
The resident C pilot completed the game at frame 82438, starting at 72856.
It finished with 23 shield and one life; no life was lost. The opening gates
and revised train passage caused no shield loss or reported stall. The train
passage retained its staging goal while the last wave cleared, then crossed
the right exit. Both Hatari and the replay DLL were rebuilt from the same
sources with the official PowerShell script before validation. No Python
autopilot controlled this run.
The full run is not damage-, pickup-, or cash-clean. These incidents remain:
| Frame | Incident | Observed source / result |
|---|---|---|
| 76425 | Missed valuable equipment | Homing Missile #603341, code $48, expired. It appeared at 76334; the closest observed approach was a 10-pixel gap at 76413. The missile was not equipped. |
| 76439 | 4 shield lost | Directional projectile #603764, update $4180; shield 39 to 35. |
| 76465 | 8 shield lost | Curved homing missile #603834, update $4FA1E; shield 35 to 27. |
| 80774 | 2 shield lost | Directional projectile #618528, update $4180, on the later approach; shield 27 to 25. |
| 81628 | 2 shield lost | Final-ship homing minion #622632, update $5025E; shield 25 to 23. |
| 82375 | Missed final-boss cash | Large coin #626049, value 100, expired below the player; last screen position (148,201). |
| 82403 | Missed final-boss cash | Large coin #626051, value 100, expired; last screen position (147,203). |
| 82416 | Missed final-boss cash | Large coin #626061, value 100, expired; last screen position (147,203). |
The two tank-section hits were already predicted as unsafe by the C trace; this evidence does not establish a missing trajectory model. The final cash collector retained priority, but the ship alternated around screen X=161 and 170 while the missed coins descended around X=147. This is a separate collection/alignment problem requiring further analysis, not a recurrence of the train passage stall. The 20/20 cash results from checkpoint runs r122 and r124 did not establish complete collection in this full-start run.
The tank reward appeared at 76814: all 10 coins, worth 750, were collected. The final ship appeared at 81369 with all 18 mounted parts. All mounts were destroyed by 82218; its reward burst appeared at 82327 and its controller disappeared at 82328. Only 17 of its 20 coins were collected, worth 1200 of 1500. The three missing large coins account for the remaining 300.
POWERUP pickups #586870 and #587248 and the health pickup #592547 were collected. Uncollected Side Shots #593695, #593840 and #620029 were redundant: the installed Side Shot was already at its maximum power of 2. No Rear Shot was collected. The intermediate shop, frames 76883-78228, bought a third Laser at 77782 for 6000 cash, leaving 100. The mode-255 interval at 82435-82438 is the completion screen, with no further equipment purchase.
Both AVIs finalized without cleanup errors. Their RIFF sizes match their
file sizes, and both first and last indexed frames decode: original AVI
35216 frames / 894657497 bytes; sprite AVI 35210 frames / 897173751 bytes.
The six-frame difference reflects the original display buffering. Checkpoints
were recorded every 150 frames. The optional C trace is
E:\xenon_runs\level5-whole-staged-r125.trace. Targeted verification passed
all 37 Level 5 mission tests. The finalized Hatari instance was closed.
Reproduction commands (run from the repository root):
$env:XAP_LEVEL5_TRACE_FILE='E:/xenon_runs/level5-whole-staged-r125.trace'
python xenon_tools/validate_campaign.py native-run level5-whole-staged-r125 --output-root E:/xenon_runs --resume E:/xenon_runs/level5-full-from-l4-shop-r1.validation/start.sav --port 6903 --frames 30000 --checkpoint-interval 150
python work/audit_level5_validation.py E:/xenon_runs/level5-whole-staged-r125.validation/level5-whole-staged-r125.x2events --output work/level5-r125-audit.json
python xenon_tools/analyze_level5_final_boss.py E:/xenon_runs/level5-whole-staged-r125.validation/level5-whole-staged-r125.x2events --interval 1000 --report-json work/level5-r125-final.json
No automatic commits were made. The navigation correction is confined to the Level 5 train passage; this validation did not change tank or final-boss combat tactics in response to the remaining incidents.
Fast-forward repeat: r126 (2026-10-01)
Latest complete recording:
E:\xenon_runs\level5-whole-fast-forward-r126.validation\level5-whole-fast-forward-r126.x2events.
Hatari stayed visible, with its native fast-forward enabled through the existing
control command. The official --build path rebuilt both Hatari and the replay
DLL before launch. Resident C supplied every gameplay decision; only the
campaign recording tool changed to expose native-run --fast-forward and
record that setting in the manifest. Cleanup restores normal speed.
The repeat covered frames 72856-82438 and completed without life loss or a reported stall, finishing with 23 shield and one life. Its four damage events, boss progression, equipment changes and boss cash outcomes match r125:
- Hits at 76439 (4), 76465 (8), 80774 (2), and 81628 (2).
- Homing Missile #603341 missed at 76425; the three uncollected Side Shots were already installed at maximum power.
- Tank cash: 10/10 coins, worth 750.
- Final-ship cash: 17/20 coins, worth 1200/1500; large coins #626049, #626051 and #626061 expired at 82375, 82403 and 82416.
- The shop bought the same third Laser for 6000, leaving 100 cash.
Recording wall time was approximately 832.4 seconds (13m52s), versus 1331.0
seconds (22m11s) for r125, about 1.60 times faster. These times span original-AVI
creation through finalized driver-result.json, including recording and
checkpoint overhead but excluding the build. This is a run comparison, not an
isolated kernel benchmark.
Both AVIs finalized without cleanup errors; first and last indexed frames decode at 640x400 and RIFF sizes match the file sizes. Original: 35230 frames/tags, 894876529 bytes. Sprite: 35224 frames/tags, 897400755 bytes. The requested checkpoint interval remains 150 canonical frames. Eight existing campaign option/incident-monitor tests passed before launch.
$env:XAP_LEVEL5_TRACE_FILE='E:/xenon_runs/level5-whole-fast-forward-r126.trace'
python xenon_tools/validate_campaign.py native-run level5-whole-fast-forward-r126 --output-root E:/xenon_runs --resume E:/xenon_runs/level5-full-from-l4-shop-r1.validation/start.sav --port 6903 --build --fast-forward --frames 30000 --checkpoint-interval 150
python work/audit_level5_validation.py E:/xenon_runs/level5-whole-fast-forward-r126.validation/level5-whole-fast-forward-r126.x2events --output work/level5-r126-audit.json
Optimized fast-forward repeat: r134 (2026-10-01)
Recording:
E:\xenon_runs\level5-whole-fast-optimized-r134.validation\level5-whole-fast-optimized-r134.x2events.
The visible resident C run used Release Hatari, immediate GPU presentation
during fast-forward, and automatic developer memory tracing. Both AVIs, the
150-frame checkpoint interval and Level 5 C trace remained enabled.
It completed frames 72856-82438 in 201.867 seconds (3m22s), approximately 4.12 times faster than r126. All compared ship positions, consumed input masks and scroll positions match r126. The complete read-only audit matches as well: the same four hits, missed Homing Missile, boss rewards and equipment changes, with no life loss or reported stall. Final shield is 23 and lives is one. Existing missed final-boss cash remains 300; no combat tactic changed.
Both AVIs finalized without cleanup errors, have 35216 indexed frames/tags, and have contiguous VBL tags. Their first and last frames decode at 640x400, and their RIFF sizes match the files: original 894675109 bytes, sprite 897238584 bytes. The finalized emulator was closed. Separate measurements and the reproduction command are in NATIVE_FAST_FORWARD_PERFORMANCE.MD.