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:
lane-l4 2026-09-08 18:03:28 -04:00
parent b3299979a7
commit 1824dae2f5

View file

@ -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.
---