Autopilot · write-up
Fixed wall model and route execution: validation
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.