Xenon 2

Autopilot · write-up

Fixed wall model and route execution: validation

xenondoc/NAVIGATION_FIX_VALIDATION_20261005.MD · 7 KB · updated 2026-10-05

The shared navigation repair is enabled in resident C. It corrects the original wall footprint, rejects non-executable colliding game updates, reconnects after actual rollback and preserves checked steering for the initial Level 2 eye approach. It introduces no larger search budget or unbounded pathfinding.

Recorded coverage

One fresh prefix and its continuation cover all five levels with the same Release Hatari executable, SHA256 ef90763f6ca0dce23705ae37d37245df289ab93a0241c0c9814f6c2a670aa999. The run pauses at the Level 3 boundary to save/restart; this is not three uninterrupted campaign repeats.

  • A / R561, beginning through Level 3 entry: E:/xenon_runs/campaign-executable-navigation-20261005-r561-1.validation/campaign-executable-navigation-20261005-r561-1.x2events
  • B / R562, Level 3 entry through final completion: E:/xenon_runs/campaign-navigation-continuation-20261005-r562-1.validation/campaign-navigation-continuation-20261005-r562-1.x2events

Both use validate_campaign_repeats.py, which calls validate_campaign.py native-run: resident C control, visible Hatari, fast-forward, memory tracing off, both AVIs and 150-frame checkpoint requests. Level traces are retained. Actual checkpoint frames can exceed the requested interval while a save is being serviced. Both pairs of AVIs finalized normally; no Hatari process remains running.

Final completion: f48915. No reported stalls. No lives lost.

Level Recording Shield damage Actual restoration Ending shield Lives lost
1 A 0 0 39 0
2 A 32 32 39 0
3 B 20 20 39 0
4 B 32 32 39 0
5 B 28 28 39 0

Restoration includes collected health and paid shop repairs, not respawns or level resets. For example Level 2 restores 20 in its first shop at f11109 and 12 from a health pickup at f12686. This meets the accepted recovered-shield budget, but does not mean the individual combats are damage-free.

Damage incidents

Each row identifies the recording above. Hit sources are captured facts; their update procedure alone is not proof of a prediction root cause.

Recording Frames Damage Description
A 7617 16 First active Level 2 capture already reports damage; the preceding native captures have no player/world objects, so initialization/contact ordering requires separate investigation.
A 7991 16 Enemy #13754, update $E1E, contacts the ship.
B 17327 16 Scripted swarm #42489 ($4F24E) contacts the ship; the level still passes every gate without a stall.
B 22244 4 Directional projectile #61234 contacts the ship.
B 29065, 29070 8 + 8 Enemies #86941/#86942 ($E1E) contact the ship before the first boss.
B 34926 16 Enemy #110418 ($E1E) contacts the ship after the first shop.
B 41343, 41345, 41347, 41349 4 + 4 + 8 + 12 Directional rounds #134306/#134438, retiring body #134190 ($107C), then enemy #134191 plus round #134468 cause a damage cluster before the tank reward.

Remaining pickup and reward incidents

These are not accepted as fixed by the navigation result.

Recording Frames Description
A 5011–5067 Level 1 Cannon #9655 is missed. The previous three R554 prefixes also missed Cannon; saved-checkpoint loadouts do not establish fresh-prefix acquisition.
A 14936–15038 Spider drops all 1500 cash, but the ship remains on the side and collects none.
B 18944 Level 3 first reward collects 650/750; one 100-value coin expires.
B 37694 Level 4 final reward collects 1450/1500; one 50-value coin expires.

Other boss rewards: Level 1 1350/1350; Level 2 eyes 750/750; Level 3 final 1500/1500 (1400 observed collections plus 100 credited during allocation); Level 4 first 750/750; Level 5 tank 750/750 and final ship 1500/1500.

Several health pickups also expire: A f4246–4340 and f8241–8285; B f18074–18142, f22380–22471 and f25300–25368. The Level 5 side-shot drops are missed with that attachment already at maximum, so they provide no further equipment benefit. The damage and equipment audits are deliberately separate.

Cost and checks

Wall-motion admission performs one fixed-mask endpoint probe per game update. It no longer searches escape-distance rings. Animation changes no longer build or select new wall footprints; one immutable environment is retained for each current terrain key. Ordinary frames do not reconnect solely because of this repair; actual rollback completion expires the failed connector once.

The Level 2 approach reuses the established bounded navigation planner. Ordered connector feedback uses the next camera origin and actual waypoint interval, instead of the firing-station deadzone. Other eye combat/waiting guards remain.

  • 50 targeted wall/environment/maneuver/driver/session tests pass.
  • Eight generated assets reproduce with generate_native_assets.py --check.
  • The 196-test mission suite retains four existing pickup/older-eye-strategy expectation failures; it is not reported as passing.
  • A: native replay matches 16,371/16,371 live statuses, zero rejected frames; one final stopped-input comparison differs after validation stops the pilot.
  • B: native replay matches 32,546/32,546 live statuses and 32,545/32,545 applied inputs, zero rejected frames.
  • Observed desktop native replay cost is 2.06 ms/frame in A and 1.37 ms/frame in B. These are diagnostic replay timings, not a controlled before/after speedup measurement or a phone result. No WASM profiling is performed.
  • Official Hatari/DLL Release builds, local replay WASM and TypeScript builds succeed. The copied web-replay WASM digest matches the built module.

The rejected R560 broad rule must not be restored: route storage can remain populated during FORMATION_HOLD. Treating it as travel caused worm contacts and two lives lost. See AUTOPILOT_AIERRORS.MD error 218.

Reproduce

python xenon_tools/validate_campaign_repeats.py NAME --count 1 --stop-at-level 3 --build
python xenon_tools/validate_campaign_repeats.py NEXT --count 1 --snapshot "E:/xenon_runs/NAME-1.validation/NAME-1.sav"
python xenon_tools/report_campaign_comparison.py "RECORDING.x2events" --output "work/AUDIT"
python xenon_tools/replay_parity.py "RECORDING.x2events" --warmup 0 --checkpoint-every 0

Use fresh run names. The wrapper builds both native binaries through xenon_tools/hatari_dev.ps1; gameplay has no per-frame Python controller.