This repository has been archived on 2026-09-16. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
Syplheed-Reborn/docs/re/structures/mission-objective-counter.md
Sylpheed RE agent d412347c37 docs: the REMAINING OB address does not survive a run - refuted twice over
0xbdb59668 reads 0 in two independent Stage 02 runs while the HUD counts
004 -> 008 -> 012. Not an unmapped read: SEEK_DATA at that offset returns the
offset itself and the next hole is 5 MB later, so it is an allocated,
zero-filled word. The address was a per-run artefact, exactly as that file
already suspected it might be; the method is the durable result.

Re-finding it in the new run also failed, and both failures are recorded because
they are the instructive part. Two candidates were produced and both died on the
corpus's own rule -- verify across a transition you did not select on:
0xbc2377dc went 12 -> 18 while the HUD stayed 012 and read 3 two minutes later,
and 0xbd295b04 was plain noise.

One correction to the method note in that file: the scan is not slow. Over the
live /dev/shm image it takes 0.9 s. The real trap is that REMAINING OB climbs
004 -> 012 within about four minutes as waves spawn, so a scan is only valid if
the HUD is confirmed to hold the same value immediately before AND after it --
which is why the earlier 4-then-8 intersection came back empty.

What blocked finishing: with pilot.py retired at hull 340/1500 nothing was
killing objectives and the counter sat at 012 for five minutes, so there was no
later transition to filter on. What the counter counts, and whether an OB-badged
entity carries a flag, is untouched.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
2026-08-23 17:16:07 +00:00

5.5 KiB

REMAINING OB — the mission's own objective counter, in RAM

Status: ✅ CONFIRMED for one Stage 02 run: a big-endian u32 whose value is exactly the HUD's REMAINING OB, verified across two transitions it was not selected by. 🟡 the address itself is from one run — cross-run stability is untested. ❔ what it counts, and whether objective-marked entities carry a flag.

Why it matters

autopilot-memory-driven.md ranks this its problem #2: a pilot that flies well but ignores the objective cannot finish a mission. Its 300 s run took no damage, killed one fighter, and watched REMAINING OB rise from 004 to 011 as waves spawned. Reading the counter is what turns "shoot whatever is nearest" into "shoot what closes the mission".

The find

Guest VA 0xbdb59668, big-endian u32, in a Stage 02 run on the upstream baseline.

time RAM 0xbdb59668 HUD
selected on 18 → 24 018 → 024
t+40 s 24 024
t+75 s 23 023
t+110 s 22 022
t+145 s 22 022
t+180 s 22 022

The two middle rows are the ones that matter: the candidate was filtered on the 18→24 transition, and it then tracked 24→23→22 on its own.

Method, and the two traps in it

tools/re-capture/ob_scan.py. Scan one snapshot for the current value, then filter that candidate set against live /dev/shm/xenia_memory_* at the next distinct value. Only the first pass needs the 4.8 GB copy.

🔴 Filter on a change, not a repeat. The first attempt scanned at 19, filtered at 19 again, then at 18 — and left zero survivors. The value moves between the memory copy and the screenshot that reads it, so "still 19" is not reliable. Scanning 18 and filtering on 24 gave exactly one candidate on the first try.

🔴 Verify across a transition you did not select on. An earlier differential over 19→18 also gave exactly one candidate, 0xbc22e83c — and it was wrong: read live it held 26 while the HUD showed 017. It was an unrelated counter that happened to step 19→18 in the same window. One matching transition is not evidence; the same offset tracking a later, unselected change is.

What is not settled

  • 🟡 Cross-run stability. 0xbdb59668 is from a single run. The corpus's other runtime finds are re-scanned per run, so the durable result here is the method, not the number. Testing whether the address repeats costs one boot.
  • ❔ What it counts. It rose 18 → 24 while waves spawned and fell as things died, so it is objective targets remaining, not kills. Whether every OB-badged entity is one of them, and whether that badge is a flag in the entity object, is the natural follow-on — and it is what the pilot actually needs to choose targets rather than merely know how many are left.
  • ❔ Whether the same address holds for other stages.

🔴 2026-08-23 — cross-run stability: REFUTED

0xbdb59668 does not repeat. A second Stage 02 run on the same baseline (rebuilt per ../dynamic-re-state-restore.md) reads 0 at that address for the whole mission while the HUD counts up:

HUD RAM 0xbdb59668
004 (t+18 s, flight entry) 0
008 0
012 (held for ~5 min) 0

A second, independent run of the same mission repeats it: at TIME 01:08.96 with the HUD on REMAINING OB 004, the word is again 0 (../captures/stage02-inflight-run2-ob-address-zero.png).

Read three times back-to-back at 004 — all zero — and ±64 bytes around it are zero too. The page is not a sparse hole (SEEK_DATA at the offset returns the offset itself; the next hole is 5 MB later), so this is an allocated, zero-filled word, not an unmapped read. The number was a per-run artefact, as this file already suspected; the method is the durable part, and every future session must re-scan.

And re-finding it in the new run failed too — recorded because both failures are instructive. Two candidates were produced and both were killed by the "verify across a transition you did not select on" rule:

  • 0xbc2377dc — held 12 at selection, then went 12 → 18 while the HUD stayed 012, and was reading 3 two minutes later at HUD 012.
  • 0xbd295b04 — read 12 once, then 0, 21, 54, 46, 4 in the next 50 s. Noise.

🔴 A correction to this file's own method note. The trap is not that the scan is slow: ob_scan.py scan over the live /dev/shm image takes 0.9 s (9 555 hits at value 12; the SEEK_DATA extent walk skips the sparse 4.6 GB). The real trap is that REMAINING OB climbs fast early in Stage 02 — 004 → 008 → 012 inside about four minutes as waves spawn — so a scan is only valid if the HUD is confirmed to hold the same value immediately before and after it. The earlier 4 ∩ 8 intersection here came back with no survivor for exactly that reason: the value-8 scan was actually taken at 12.

What blocked finishing it: with the pilot in RETIRE (hull 340/1500) nothing was killing objectives, and the counter sat at 012 for five minutes — no transition to filter on. A run that intends to find this address needs a pilot that is still engaging, which is the same constraint ../autopilot-memory-driven.md records.

Unchanged and still open: what the counter counts, and whether an OB-badged entity carries a flag in its entity object. Nothing in this pass touched that.