Xenon 2

Autopilot · write-up

Level 4 full validation, September 27, 2026

xenondoc/LEVEL4_FULL_VALIDATION_20260927.MD · 11 KB · updated 2026-10-01

Follow-up identification and fixes are documented in LEVEL4_SHIELD_AND_HANDOVER_FIX.MD.

The uninterrupted run did not complete Level 4: it stalled at the first boss after destroying all five satellite heads. A separate continuation from the previously successful first-boss shop checkpoint defeated the final boss and reached Level 5. No life was lost in either recording. Gameplay code was not changed during this validation.

Both runs used visible Hatari resident C control, both AVI streams, Level 4 tracing, and checkpoints every 150 frames. The official hatari_dev.ps1 build wrapper refreshed Hatari and the native inspection DLL before the first run. Python observed gameplay and audited recordings; it did not control the ship.

Recordings and coverage

Run Event recording Coverage and result
A E:/xenon_runs/level4-full-20260927-r67.validation/level4-full-20260927-r67.x2events 62580–70805; starts before Level 4 from the Level 3 shop; stopped gracefully after confirming the first-boss stall.
B E:/xenon_runs/level4-second-half-20260927-r68.validation/level4-second-half-20260927-r68.x2events 71126–77037; separate continuation from r66's first-boss shop checkpoint; Level 5 starts at 77036.

Run A restores xenon_tools/run_logs/native-level3-visible-20260914/end.sav. Run B restores E:/xenon_runs/level4-first-swing-20260927-r66.validation/level4-first-swing-20260927-r66.sav. This is not a continuation of A's stalled state and does not establish a successful uninterrupted full-level playthrough.

Each run directory contains its manifest, working-tree patch, incident log, pickup audit, shop report, checkpoints and both AVI files. Traces are E:/xenon_runs/level4-full-20260927-r67-trace.log and E:/xenon_runs/level4-second-half-20260927-r68-trace.log.

Gameplay incidents

Recording Frame(s) Problem
level4-full-20260927-r67.x2events 63865–63928; closest approach 63873 Temporary shield #560602, code $005C, appeared at screen (115,64), remained over 81px from the ship at its closest approach, and expired below the screen; its type was verified with ReVa in the follow-up investigation.
level4-full-20260927-r67.x2events 63933 Directional projectile #560806 ($4180) hit the ship near the left bottom edge, reducing shields 39→35.
level4-full-20260927-r67.x2events 64409 Directional projectile #562126 ($4180) hit the ship near the left bottom edge, reducing shields 35→31.
level4-full-20260927-r67.x2events 67213–70796 After the fifth satellite died, the ship continued moving near the upper-right station without hitting main head #568323; its health remained 175 and score stopped changing after 67232.
level4-second-half-20260927-r68.x2events 74372 Directional projectile #597134 ($4180) hit the ship during the final encounter, reducing shields 39→35.

There were no recorded chain-body hits or lost lives. A health pickup restored A's shields to 39 at 65254; that recovery does not erase its eight points of earlier damage. B finished with 35 shields and one life, unchanged in count.

First-boss stall evidence

A's fixed heads died at 66771, 66808, 66938 and 67108; the secondary head died at 67213. The main head was never damaged in this recording: health 175 from its first capture at 66315 until recording ended. The trace continued reporting target #568323, weapon 4 and goal approximately X=[264,272], Y=[2267,2269], while the ship repeatedly moved around X=264 near the upper clamp.

At 70732 the ship was at screen (264,16), world Y=2285, with scroll 2269. The primary anchor and main head were at world Y=2535, below the viewport. The unchanged goal did not return the ship to a firing height. This is a mission/route progress failure, rather than an observed curved-chain hit. The generic stall monitor missed it because the ship kept moving; unchanged target health and score exposed the attack stall. Investigate camera progression and route handover after the secondary head before further boss tuning.

Original-AVI evidence frames are saved in A's directory as original-f63873.png, original-f63933.png, original-f64409.png and original-f70600.png; B contains original-f74372.png. Extraction uses the recorded VBL plus the original renderer's two-VBL latency.

Pickups and cash

The existing pickup audit infers collection from retirement beside the ship; the capture does not provide explicit collection events for every item.

Run Equipment/health observations Cash observations
A One missed $005C upgrade; Health Power 1 #564628 collected at 65254; Side Shot #568591 collected at 66418. 17 likely collected, 27 missed.
B Rear Shot #588035 expired at 72217 and #588267 at 72245, both intentional skips; Zapper #590701 collected at 72799. 57 likely collected, 13 missed.

All 20 final-boss cash drops in B were inferred collected, with no missed or unresolved boss cash drops. No new Rear Shot was collected. A's historical starting snapshot already contained Rear Shot, later replaced by Side Shot. The per-pickup identities, closest approaches and expiry frames are in each directory's pickup-audit.json; the appendix below lists all missed cash.

Shops

The source snapshot's Level 3 shop was already leaving: A records no purchase. B's middle Level 4 shop spent 2000, upgrading Side Shot power 0→1 at 71674, leaving 50 cash. The final shop entered with 7200 and left with 200: Laser bought in slot 3 at 76143, Side Shot upgraded 1→2 at 76234, and the new Laser upgraded 0→1 at 76335. Complete starting/ending loadouts are in shops.md in the respective recording directories.

Prediction checks

The first-boss checker passes on A: 341 forecasts, 47,054 exact chain positions, 151,916 hull coverage checks, zero exact-position error and zero uncovered extent. Its 700 anticipated bullet comparisons have only the bounded two-pixel birth-camera difference.

The final-boss tongue position checker flags a discrepancy at 75453, immediately before the main head disappears at 75454 and during allocation of its death effects and cash. The tail differs by up to 11px, including in a 16-frame forecast seeded at 75439. There is no player hit at 75453. The checker compares the original motion even across this combat-triggered transition; further review is needed before attributing the discrepancy to ordinary live movement. Do not describe this tongue check as passing.

AVI recording caveat

All four files have matching RIFF lengths, can be indexed by HatariAvi, and their final images can be decoded. B's pair covers the complete continuation and its validator reports no cleanup error. A reports an AVI-finalization timeout: its sprite AVI ends near game frame 70265 (VBL 215915), earlier than its original AVI (last VBL 218077). Use A's original AVI and event capture for the later stall, and align video through VBL tags rather than frame indices.

Reproduce

$env:XAP_LEVEL4_TRACE_FILE='E:/xenon_runs/level4-full-trace.log'
python xenon_tools/validate_campaign.py native-run level4-full-check `
  --output-root E:/xenon_runs `
  --resume xenon_tools/run_logs/native-level3-visible-20260914/end.sav `
  --build-directory out/build/codex-validate --build --port 6903 `
  --frames 30000 --checkpoint-interval 150 --stop-at-level 5

Only observational reporting documents were changed for this request. The first-boss handover stall remains the highest-priority progression problem.

Missed cash appendix

Recording Pickup identity First frame Closest frame Expiry frame
level4-full-20260927-r67.x2events 558433 63199 63223 63271
level4-full-20260927-r67.x2events 558707 63287 63303 63336
level4-full-20260927-r67.x2events 558717 63290 63354 63357
level4-full-20260927-r67.x2events 558743 63295 63359 63366
level4-full-20260927-r67.x2events 558987 63366 63400 63440
level4-full-20260927-r67.x2events 559101 63400 63457 63462
level4-full-20260927-r67.x2events 559259 63446 63470 63512
level4-full-20260927-r67.x2events 559360 63478 63478 63559
level4-full-20260927-r67.x2events 559379 63484 63496 63550
level4-full-20260927-r67.x2events 560018 63685 63704 63746
level4-full-20260927-r67.x2events 560544 63846 63884 63920
level4-full-20260927-r67.x2events 564223 65086 65088 65141
level4-full-20260927-r67.x2events 564406 65139 65223 65230
level4-full-20260927-r67.x2events 564745 65255 65325 65327
level4-full-20260927-r67.x2events 565223 65398 65456 65465
level4-full-20260927-r67.x2events 565233 65400 65456 65466
level4-full-20260927-r67.x2events 565778 65557 65606 65615
level4-full-20260927-r67.x2events 565830 65572 65634 65637
level4-full-20260927-r67.x2events 566050 65637 65701 65703
level4-full-20260927-r67.x2events 566096 65649 65703 65707
level4-full-20260927-r67.x2events 566433 65748 65748 65806
level4-full-20260927-r67.x2events 566438 65749 65813 65815
level4-full-20260927-r67.x2events 566808 65853 65863 65915
level4-full-20260927-r67.x2events 566833 65861 65949 65952
level4-full-20260927-r67.x2events 567036 65915 65965 65983
level4-full-20260927-r67.x2events 567084 65929 66017 66022
level4-full-20260927-r67.x2events 567642 66098 66121 66181
level4-second-half-20260927-r68.x2events 588830 72322 72326 72378
level4-second-half-20260927-r68.x2events 588882 72333 72342 72403
level4-second-half-20260927-r68.x2events 589326 72431 72464 72507
level4-second-half-20260927-r68.x2events 589772 72542 72609 72619
level4-second-half-20260927-r68.x2events 590100 72617 72631 72676
level4-second-half-20260927-r68.x2events 590258 72654 72715 72721
level4-second-half-20260927-r68.x2events 590323 72670 72749 72760
level4-second-half-20260927-r68.x2events 590397 72687 72744 72751
level4-second-half-20260927-r68.x2events 591008 72825 72834 72882
level4-second-half-20260927-r68.x2events 591276 72889 72939 72946
level4-second-half-20260927-r68.x2events 591519 72945 72970 73024
level4-second-half-20260927-r68.x2events 591584 72958 72958 73029
level4-second-half-20260927-r68.x2events 591598 72962 73016 73021