L4: credit lane L5 as owner of the turn-1 nondeterminism; add the command-block evidence that localises it to the client
This commit is contained in:
parent
b3299979a7
commit
1824dae2f5
1 changed files with 21 additions and 8 deletions
|
|
@ -257,6 +257,11 @@ measured to move an autosave by four bytes.
|
|||
|
||||
### 3.1 And a control that did **not** pass — the turn-1 workload is not reproducible
|
||||
|
||||
**Lane L5 got here first, on VM146, from the other end.** `turn1-to-turn2-nondeterminism.md` is the
|
||||
owner of this result and it is the better-designed experiment: three runs including a pair with
|
||||
*identical* hooks that still disagreed, which rules out the instrument in a way my configurations
|
||||
cannot. What follows is an independent third-instrument corroboration and one thing it adds.
|
||||
|
||||
`turn1-state.sav` + one End Turn does **not** reproduce `turn2-state.sav`, on this build, with or
|
||||
without instruments. Three runs, three different files:
|
||||
|
||||
|
|
@ -279,15 +284,23 @@ techId **288** on the instrumented run, a different id on the others.
|
|||
So: **the research-target choice of an AI player that owns nothing is not reproducible run to run.**
|
||||
Players 16, 32 and 496 are stable across all three; only 512 moves. Three samples, one field.
|
||||
|
||||
This is a correction to an assumption, not to a published claim: `determinism-oracle.md` verifies
|
||||
the oracle for the **`ref-turn2` workload** and says so; nobody had run the turn-1 workload three
|
||||
times. It is now on the record that the turn-1 workload is **not** an oracle, and any lane
|
||||
comparing bytes on it is comparing against noise.
|
||||
**What this instrument adds to L5's result.** L5 measured the divergence in the *save*. This lane
|
||||
sees it in the **`TurnCommands` block**: player 512's research-target gate carried techId **288** on
|
||||
the instrumented run and a different id on the others, in the block the client submits. So the
|
||||
divergent decision is made **client-side, before submission**, and reaches the save as a command
|
||||
like any other — it is not the sim diverging on identical input. That is consistent with L5's
|
||||
inference (a tie broken by per-process iteration order over a pointer-keyed container) and it
|
||||
removes the sim from the list of suspects, which their instrument could not do.
|
||||
|
||||
I did not find the mechanism. It is not the instrument (the `hooks=off` run diverges from the
|
||||
reference too, and by a *different* value). The shape — one player, one choice, stable everywhere
|
||||
else — fits a tie-break that reads a heap address or an uninitialised word, and that is a
|
||||
watchpoint on the selection site, not a reading exercise.
|
||||
Second corroborating detail: across L5's three runs and this lane's two, the observed values are
|
||||
`BIO_GnMod`, `XNC_TrnsLir2`, `XNC_TrnsHvr2`, `XNC_TrnsHum2`, `XNC_TrnsMorr2` — **five distinct
|
||||
values in five runs**, and four of the five are the same tech with a different **species** suffix.
|
||||
A selection walking a species- or player-keyed container and taking whichever arm it reaches first
|
||||
fits that shape exactly; a numeric roll over a flat tech list does not.
|
||||
|
||||
The right probe is the one L5 names: read the AI client's generator state after construction in two
|
||||
processes, and — from this side — put a write watchpoint on the block's research-target payload at
|
||||
`block+0x10` to catch the writer with its call chain.
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue