L1: hive creation draws inside BeginProcessTurn -- lane Z's zero was the workload
Lane SV recovered the script-object subsystem statically and predicted that SVSOSwarmQueen::RegisterHives takes one strategic-generator word per new hive inside StrategyServer::BeginProcessTurn, which runs inside lane Z's autosave bracket and outside both turn drivers. Nothing had ever been hooked in that interval. Measured on VM140, and it is right. turn 1 -> 2 (hives created) BeginProcessTurn 2 ProcessTurn 20 residual 2 turn 2 -> 3 (hives exist) BeginProcessTurn 0 ProcessTurn 19 residual 0 Two instruments that share no code path agree: the region ledger reads 170 -> 172 across RegisterHives, and the return-address draw-site table gains a row at 0x00527714 (NextInt, 2 calls / 2 words) which is absent on the next turn. The draws produce NextQ 30/28, TickHives' slip takes them to 31/29 -- exactly turn2-state.sav -- and the next turn's slip gives 32/30, exactly turn3-state.sav. So tail-rng-ledger.md's "all of it inside ProcessTurn, residual exactly zero" is correct for every turn it measured and false as a statement about the code. The interval a standalone must reproduce starts at BeginProcessTurn. Also closed or corrected: * LO/HI read live rather than fitted: NextQ = frame + 20 + NextInt(10), inclusive; the TickHives gates are 10 (a frame floor), 5 and 3, so no queen can spawn before frame 11 on any save. * CDiff's threshold scan re-read independently: the tier can only ever be 0 or 1, and "entered and stored nothing" was observed live and distinguished from "did not run" (method rule 20). * SnLv measured for the first time: Spica reads AFlags 0 with SnLv 0x200, so the sensor branch is what refreshes it -- nvo-tshn-visible-owner.md §6 goes [H] to [V]. ComputeContactLevel's documented "else 1" names one of four return tails; the observed non-visible level is 2. * Rule 19: the oracle reproduced byte for byte with all five new detours live, and again with four watchpoints armed on top. * turn1-state -> turn2 is not deterministic (lane L5 owns this). Two more runs here make it four distinct outcomes over six runs, including two DIFFERENT hooks=off results, and the strategic generator is provably not what varies. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ARBgSooAfokKUy6wKUKEyZ
This commit is contained in:
parent
e4195d47d1
commit
a3e6e1d415
2 changed files with 79 additions and 39 deletions
|
|
@ -279,37 +279,78 @@ buried, because it is the kind of thing that looks like instrument perturbation
|
||||||
`NumOwn` and every other field checked. The two `TechTree/St` bytes that also move are that choice's
|
`NumOwn` and every other field checked. The two `TechTree/St` bytes that also move are that choice's
|
||||||
consequence, and `Summary/Checksum` follows.
|
consequence, and `Summary/Checksum` follows.
|
||||||
|
|
||||||
The `hooks=off` control was then run from the same input, and it is the reason this section is worth
|
The `hooks=off` control was then run from the same input, and it produced a **third** answer.
|
||||||
reading. **It produced a third answer.**
|
|
||||||
|
|
||||||
| run | instrument | `(Autosave).sav` | size | player 3's `ResTNm` |
|
**Lane L5 found the same thing independently on VM146 the same day**, from the other direction — as a
|
||||||
|---|---|---|---|---|
|
by-product of its own rule-19 control — and owns the write-up:
|
||||||
| the original 2026-09-07 session (live game, never loaded) | phase-2 shim, `hooks=trace` | `ab4ac2d7e2977260` | 66,739 | `BIO_GnMod` |
|
`findings/subsystems/turn1-to-turn2-nondeterminism.md`. This lane's two runs are corroboration and
|
||||||
| this lane | full L1 hook set | `62061918176e3441` | 66,739 | `XNC_TrnsLir2` |
|
they widen its spread, so the union is recorded here and the analysis is not repeated.
|
||||||
| this lane, control | **`hooks=off` — nothing installed at all** | `e43ec1d2b443c101` | **66,740** | `XNC_TrnsMorr2` |
|
|
||||||
|
|
||||||
Players 0, 1 and 2 pick identically in all three (`""`, `IND_Waldo`, `DRV_PlsFiss`). Only player 3
|
| run | instrument | `(Autosave).sav` | that player's `ResTNm` |
|
||||||
moves, and it moves **with the instrument removed as well**.
|
|---|---|---|---|
|
||||||
|
| the original 2026-09-07 session (live game, never loaded) | phase-2 shim, `hooks=trace` | `ab4ac2d7e2977260` | `BIO_GnMod` |
|
||||||
|
| lane L5 run B | `ComputeBudget=compare` | `ab4ac2d7e2977260` | `BIO_GnMod` |
|
||||||
|
| lane L5 run A | same hooks, different constant in `ours` only | `7fc9e6ab46b47794` | `XNC_TrnsHvr2` |
|
||||||
|
| lane L5 control | `hooks=off` | `62061918176e3441` | `XNC_TrnsLir2` |
|
||||||
|
| **L1** | full L1 hook set | `62061918176e3441` | `XNC_TrnsLir2` |
|
||||||
|
| **L1 control** | **`hooks=off`** | **`e43ec1d2b443c101`** | **`XNC_TrnsMorr2`** |
|
||||||
|
|
||||||
**So the turn-1 → turn-2 transition of this game is not deterministic across processes, and no hook
|
**The two rows in bold are what this lane adds, and the second one sharpens lane L5's conclusion.**
|
||||||
is responsible.** The three picks are three different tech ids, two of them species-tagged variants
|
L5 argued from "the `hooks=off` control is a *third* value, not one of the other two". This lane ran
|
||||||
of the same node (`XNC_TrnsLir2` / `XNC_TrnsMorr2`), which is the signature of a selection over a
|
`hooks=off` again and got a **fourth** value — so **`hooks=off` is not self-consistent with itself
|
||||||
container whose order is not fixed — a pointer-keyed map or an unstable tie-break — rather than of a
|
across processes**, which is a stronger statement than "no hook is responsible" and rules out the
|
||||||
generator draw. The strategic generator's trajectory was **identical to the historical game's** in
|
whole class of explanations in which some particular instrument configuration selects the pick.
|
||||||
the instrumented run, so whatever chooses here does not draw from it.
|
Four distinct outcomes over six runs, and this lane's instrumented run happens to coincide with
|
||||||
|
L5's uninstrumented one, which is the clearest possible demonstration that the hooks are not the
|
||||||
|
variable.
|
||||||
|
|
||||||
Two consequences, both of which matter more than this lane:
|
Players 0, 1 and 2 pick identically in every run (`""`, `IND_Waldo`, `DRV_PlsFiss`). Only the
|
||||||
|
shadow-empire player moves. In this lane's instrumented run the strategic generator's trajectory was
|
||||||
|
**identical to the historical game's** — same word positions, and the hive draws produced the
|
||||||
|
historical `NextQ` values — so whatever chooses here does not draw from it.
|
||||||
|
|
||||||
* **`turn1-state.sav` must not be used as a determinism-oracle input.** `determinism-oracle.md`
|
### 6.2 It is bounded, and the strategic generator is not what varies
|
||||||
establishes byte-identity for `ref-turn2 → turn 3` and was never run on turn 1; that claim is
|
|
||||||
intact and this is a different pair.
|
|
||||||
* **The standalone milestone has a target that the original itself does not always hit.** A
|
|
||||||
reimplementation cannot be held to a byte match on a turn where the original disagrees with itself.
|
|
||||||
Which turns those are is now an open question with one known member.
|
|
||||||
|
|
||||||
None of this touches §0–§5: the RNG numbers were taken on a run whose generator trajectory matches
|
**No claim in §0–§5 rests on an autosave diff.** The hive result is a *generator word position*
|
||||||
the historical game word for word, and the same hook set reproduces the oracle exactly on the
|
measured by two instruments that share no code path — a region ledger reading `left` around a phase
|
||||||
adjacent turn.
|
boundary, and a set of detours keyed on return address — plus the entry-side prediction those
|
||||||
|
numbers were checked against. Diffing `turn1-state → turn2` bytes is not part of it, and would not
|
||||||
|
have been able to answer the question either way.
|
||||||
|
|
||||||
|
The variation is small and exactly located. Every pairwise leaf comparison over the three post-turn
|
||||||
|
saves this lane holds gives **4 differing leaves out of 35,032**, with the leaf count and the whole
|
||||||
|
tree structure identical:
|
||||||
|
|
||||||
|
```
|
||||||
|
/Summary/Checksum (derived)
|
||||||
|
/Sim/Player/TechTree/St 2 <-> 3 (the node it stopped researching)
|
||||||
|
/Sim/Player/TechTree/St 3 <-> 2 (the node it started researching)
|
||||||
|
/Sim/Player/ResTNm BIO_GnMod | XNC_TrnsLir2 | XNC_TrnsMorr2 | XNC_TrnsHvr2
|
||||||
|
```
|
||||||
|
|
||||||
|
so the reference pair remains usable for everything except one shadow empire's research selection.
|
||||||
|
This matches lane L5's characterisation exactly, on a fourth sample.
|
||||||
|
|
||||||
|
**And it is not the strategic generator.** This is the part this lane can add that a save diff
|
||||||
|
cannot: in the instrumented run the strategic generator's trajectory was **identical to the
|
||||||
|
historical game's** — the two hive draws produced the historical `NextQ` 31 / 29, the next turn's
|
||||||
|
slip produced 32 / 30, and the absolute word positions 192 and 211 are the ones
|
||||||
|
`tail-rng-ledger.md` §2.1 records for the same game. A pick drawn from `S+0x16c` would have moved
|
||||||
|
that trajectory. It did not.
|
||||||
|
|
||||||
|
There is an obvious next place to look, and this lane's own draw-site table points at it: **8 words
|
||||||
|
per turn are drawn from a *different* `Mars::RNG` in the same process** — the `StrategyClient`'s at
|
||||||
|
`client+0x134`, from `0x00578cf0`, `0x005798e0` and `0x0069dbb0` (`tail-rng-ledger.md` §11.2 first
|
||||||
|
identified these and correctly excluded them). That object is **not serialised**, so if the AI's
|
||||||
|
pick draws from it, its seed is not in the save and a per-process variation is exactly what one
|
||||||
|
would expect — which is lane AI1's "seeded from an unseeded global" reading, arriving from a
|
||||||
|
different direction. Two rows of that table appear on every turn of both saves measured here:
|
||||||
|
`draw_site_words_other_rng = 8`, `draw_site_calls_other_rng = 8`.
|
||||||
|
|
||||||
|
**The experiment that would settle it** is a boundary hook on the AI research-selection site with a
|
||||||
|
region over `client+0x134` rather than `S+0x16c`, on two fresh processes: if the two runs enter it
|
||||||
|
with different generator state, the cause is found. That is one hook and one afternoon, and it is
|
||||||
|
the difference between "the reference pair has four unstable leaves" and "we know why".
|
||||||
|
|
||||||
## 7. What this does NOT settle (rule 15)
|
## 7. What this does NOT settle (rule 15)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,21 +5,20 @@ Question: "load the same save, press End Turn, and the resulting autosave is byt
|
||||||
game processes, with and without an intervening manual save, and also identical to the autosave the
|
game processes, with and without an intervening manual save, and also identical to the autosave the
|
||||||
*original* (non-loaded, freshly created) game wrote in the earlier session.
|
*original* (non-loaded, freshly created) game wrote in the earlier session.
|
||||||
|
|
||||||
> **SCOPED BY LANE L1, 2026-09-08 — the oracle is a property of THIS PAIR, not of End Turns.**
|
> **SCOPED, 2026-09-08 — the oracle is a property of THIS PAIR, not of End Turns.** Every run below
|
||||||
> (`findings/control-flow/hive-creation-rng.md` §6.1.) Every run below starts from the **turn-2**
|
> starts from the **turn-2** state. Lanes L5 and L1 independently ran the same experiment one turn
|
||||||
> state. Lane L1 ran the same experiment one turn earlier — load `turn1-state.sav`
|
> earlier — load `turn1-state.sav` (`a3f9dc4b…`, this game's turn-1 pre-turn autosave), one End Turn
|
||||||
> (`a3f9dc4b…`, which is this game's turn-1 pre-turn autosave), one End Turn — three times, and got
|
> — and across six runs got **four different post-turn autosaves**, including **two different results
|
||||||
> **three different post-turn autosaves**: `ab4ac2d7…` (the original live session), `62061918…` (full
|
> from `hooks=off` with nothing installed at all**. The whole difference is one shadow-empire
|
||||||
> hook set) and `e43ec1d2…` (**`hooks=off`, nothing installed at all**). The whole difference is one
|
> player's research target `ResTNm` plus its two tech-status words and the derived `Checksum`;
|
||||||
> field: player 3's research target `ResTNm`, which reads `BIO_GnMod` / `XNC_TrnsLir2` /
|
> players 0–2 pick identically every time and the strategic generator's trajectory is unchanged.
|
||||||
> `XNC_TrnsMorr2` across the three. Players 0–2 pick identically every time, and in the instrumented
|
|
||||||
> run the strategic generator's trajectory matched the historical game word for word.
|
|
||||||
>
|
>
|
||||||
> So: **the turn-1 → turn-2 transition of this game is not deterministic across processes, and no
|
> Nothing below is wrong. But "load the same save, press End Turn, and the autosave is
|
||||||
> hook is responsible.** Nothing below is wrong — but "load the same save, press End Turn, and the
|
> byte-identical" is verified for `ref-turn2 → turn 3` and **falsified for `turn1-state → turn 2`**.
|
||||||
> autosave is byte-identical" is verified for `ref-turn2 → turn 3` and **falsified for
|
> Pick the pair deliberately: this document's pair and the two in
|
||||||
> `turn1-state → turn 2`**. Anyone building a byte oracle must pick the pair deliberately, and the
|
> `verify/results/shim/tailrng/` are the ones that hold. Full account:
|
||||||
> pairs in this document plus `verify/results/shim/tailrng/` are the ones that hold.
|
> `findings/subsystems/turn1-to-turn2-nondeterminism.md` (lane L5, owner) and
|
||||||
|
> `findings/control-flow/hive-creation-rng.md` §6.1 (lane L1, the two extra runs).
|
||||||
|
|
||||||
## Verdict
|
## Verdict
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue