tools+docs: the bit-level OB test, and a liveness hole - GAME OVER animates

ob_bitflag.py is the follow-on the word-level refutation named: for every 4-byte
offset in the window and every one of its 32 bits, count how many entities have
it set, keep the pairs whose count is exactly the counter, and require them to
match again after a transition. Both polarities, since an objective could be
marked by a bit that is CLEAR on it.

Three runs, no verification, and the reasons are recorded: run 1 gave 187 + 33
candidates at counter 4 and then reported "the counter never moved" for 700 s -
about a mission that had ENDED in GAME OVER partway through; run 2 hit the same
dead mission; run 3 had the counter at a different address (the guard refused,
correctly) and then froze after one filter.

The hole is closed. frozen() asks whether the guest is ANIMATING, and the GAME
OVER screen animates happily - mean colour (114,22,63) - so every liveness check
passed while the mission was over. frozen.in_flight() classifies the screen with
screen_id, and ob_hunt/ob_flag/ob_bitflag now abort with NO LONGER IN FLIGHT.
That is the second confident negative in this investigation that was really about
a dead world, so the rule is written down: before believing "X never happened",
show that the thing that would produce X was still running.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PMRJjbxLqZtsb5Vb7KunPE
This commit is contained in:
Sylpheed RE agent
2026-08-24 00:20:04 +00:00
parent 426b54bae8
commit 825baf5cba
5 changed files with 256 additions and 7 deletions

View File

@@ -208,3 +208,46 @@ by position changing, so a sample that lands on a load or loses the race with
another scanner returns nothing — and a zero-entity sample silently yields zero
candidates and a run that proves nothing. Seen exactly that way once, with the
following sample finding 81 entities moments later.
---
## 2026-08-24 — the bit-level test exists; three runs, no verification, and one hole closed
[`ob_bitflag.py`](../../tools/re-capture/ob_bitflag.py) is the follow-on the
word-level refutation named: for every 4-byte offset in the window (now
`-0x400 … +0xC00`) and every one of its 32 bits, count how many entities have it
**set**, keep the `(offset, bit)` pairs whose count is exactly the counter, and
require the survivors to match again after the counter moves. Both polarities are
counted, because an objective could equally be marked by a bit that is *clear* on
it.
It ran three times and **verified nothing**. What each attempt cost is the useful
part:
| run | sample A | outcome |
|---|---|---|
| 1 | counter 4, 29 entities → **187** set-polarity + **33** clear-polarity candidates | "counter never moved" for the whole 700 s window — **and the mission had ended in GAME OVER partway through** |
| 2 | — | HUD unreadable: still the GAME OVER screen |
| 3 (fresh boot) | — | the counter was at a **different address**; the guard refused to run. `ob_hunt` got one filter (`008 → 012`, 4 survivors including `0xbdb58668`) and then the guest froze |
### 🔴 The hole run 1 exposed: "animating" is not "still in a mission"
`frozen.py` asks whether the guest is advancing. The **GAME OVER screen animates
perfectly happily** — mean colour (114, 22, 63), the magenta plate — so every
liveness check passed while the mission was over, and the tool reported *"the
counter never moved"*, which reads as a fact about the game and was a fact about
a finished one.
Closed: `frozen.in_flight()` classifies the screen with `screen_id.py`, and
`ob_hunt.py` / `ob_flag.py` / `ob_bitflag.py` now abort with **`NO LONGER IN
FLIGHT`** instead of waiting out their windows. That is the second time a
confident negative in this investigation turned out to be about a dead world —
the first was the freeze — and the pattern is worth naming: *before believing
"X never happened", show that the thing that would produce X was still running.*
### Attrition is now the dominant cost
Of the Stage 02 runs that have reached flight, roughly half end early — a freeze,
or a GAME OVER when the escorted ACROPOLIS or the craft is lost — and the scan
needs the run to survive **two** counter transitions. Nothing here fixes that; it
is why three attempts produced one filter between them.