sots-re/verify/results/shim/airng/par-br-p2.txt
alex 1893751ffa PAR: roll parity -- an AI client's per-turn RNG word count is not fixed at any scope
The hypothesis under test was the lockstep discipline: that each run of an AI client consumes a
fixed number of draws regardless of the path it takes, so a reimplementation could keep the
generator aligned with the right COUNT and order of draws while getting the decisions wrong.

It is false, and it fails at four scopes. Measured with a new bracket on
StrategyClient::OnResumePlaying over the per-client generator at +0x134, six runs across VM140 and
VM145, five fresh processes; every unpinned run's autosaves are byte-identical to the published
oracle, so the instrument is behaviour-neutral (rules 19 and 26 both discharged).

  across clients   turn2->turn3: 3 / 0 / 0 words for AI players 32 / 496 / 512; human 0
  across turns     client 32: 3 words on turn 2, 7 on turn 1
  across processes client 512 makes ONE cl_RandRange call on turn 1 -- the research-target
                   tie-break at 0x006a8495, phase 18 -- and it cost 1 word in one process and
                   3 in another, because RNG_NextInt is an unbounded rejection loop
  per site         RNG_Chance costs ZERO words at p<=0 and p>=1

Twenty-one live draw sites in an AI turn, in twelve functions (plus two provably dead ones); two
fired on the reference turn, three on turn 1. Only three are unconditional, and all three only
given that their enclosing function was called. Six of client 32's seven turn-1 words come from
the ship-design composer 0x006ad700, which is also where the only loop-carried draw lives.

Also: cl_RandFloat 0x00579c70, a third cl_* RNG facade, found twice independently. It reaches
RNG_NextFloat by a TAIL JUMP, so no rel32 sweep for the entry points can see it -- which is why
ai-turn-logic.md 5's 'zero NextFloat calls from the AI module' reads as true and is not. All 29
call sites of the three facades are inside the AI band: the cl_* RNG facade is AI-only surface.

Positives for the engine: the AI draws from nothing but its own client's generator (foreign_words
0 on every bracket), the human client draws nothing at all, and the per-turn cost is single digits.
Rung B is unaffected. Rung C needs the decisions.
2026-09-08 19:33:00 -04:00

116 lines
11 KiB
Text

airng: bracket StrategyClient::OnResumePlaying rva=0x00377480 va=011f7480 create=MH_OK enable=MH_OK
airng: out=C:\SOTS\shim.airng.txt pin_seed=off:00000000
airng seq=1 pid=16 agent=0x00000000 rng=0x0e303dd8 pin=off:00000000 left=624->624 idx=0->0 left_delta=0 observed=0 calls=0 residual=0 foreign_words=0 foreign_calls=0 sites=0 overflow=0 life_in=0 life_out=0
airng seq=2 pid=32 agent=0x33b9fa10 rng=0x34fd6ec0 pin=off:00000000 left=613->610 idx=11->14 left_delta=3 observed=3 calls=3 residual=0 foreign_words=0 foreign_calls=0 sites=2 overflow=0 life_in=17 life_out=20
airngsite seq=2 pid=32 ret_rva=0x002ad878 va=0x006ad878 entry=NextFloat calls=1 words=1 zero=0
airngsite seq=2 pid=32 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=2 words=2 zero=0
airngen seq=2 rng=0x01576e58 life_words=3 life_calls=3
airngen seq=2 rng=0x34fd6ec0 life_words=20 life_calls=18 <-- this bracket
airngen seq=2 rng=0x35214400 life_words=424 life_calls=295
airngen seq=2 rng=0x0e358bf8 life_words=427 life_calls=295
airngcensus seq=2 rng=0x01576e58 ret_rva=0x00384f9e va=0x00784f9e entry=NextUInt calls=3 words=3
airngcensus seq=2 rng=0x34fd6ec0 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=6
airngcensus seq=2 rng=0x34fd6ec0 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=2 rng=0x34fd6ec0 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=3 words=3
airngcensus seq=2 rng=0x34fd6ec0 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=3
airngcensus seq=2 rng=0x34fd6ec0 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x35214400 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=156
airngcensus seq=2 rng=0x35214400 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=253
airngcensus seq=2 rng=0x35214400 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=6
airngcensus seq=2 rng=0x35214400 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=2 rng=0x35214400 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x35214400 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x35214400 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x0e358bf8 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=144
airngcensus seq=2 rng=0x0e358bf8 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=268
airngcensus seq=2 rng=0x0e358bf8 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=6
airngcensus seq=2 rng=0x0e358bf8 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=2 rng=0x0e358bf8 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x0e358bf8 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x0e358bf8 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x34fd6ec0 ret_rva=0x002ad878 va=0x006ad878 entry=NextFloat calls=1 words=1
airng seq=3 pid=496 agent=0x33b9fd98 rng=0x35214400 pin=off:00000000 left=206->206 idx=418->418 left_delta=0 observed=0 calls=0 residual=0 foreign_words=0 foreign_calls=0 sites=0 overflow=0 life_in=424 life_out=424
airngen seq=3 rng=0x01576e58 life_words=3 life_calls=3
airngen seq=3 rng=0x34fd6ec0 life_words=20 life_calls=18
airngen seq=3 rng=0x35214400 life_words=424 life_calls=295 <-- this bracket
airngen seq=3 rng=0x0e358bf8 life_words=427 life_calls=295
airngcensus seq=3 rng=0x01576e58 ret_rva=0x00384f9e va=0x00784f9e entry=NextUInt calls=3 words=3
airngcensus seq=3 rng=0x34fd6ec0 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=6
airngcensus seq=3 rng=0x34fd6ec0 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=3 rng=0x34fd6ec0 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=3 words=3
airngcensus seq=3 rng=0x34fd6ec0 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=3
airngcensus seq=3 rng=0x34fd6ec0 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x35214400 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=156
airngcensus seq=3 rng=0x35214400 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=253
airngcensus seq=3 rng=0x35214400 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=6
airngcensus seq=3 rng=0x35214400 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=3 rng=0x35214400 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x35214400 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x35214400 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x0e358bf8 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=144
airngcensus seq=3 rng=0x0e358bf8 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=268
airngcensus seq=3 rng=0x0e358bf8 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=6
airngcensus seq=3 rng=0x0e358bf8 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=3 rng=0x0e358bf8 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x0e358bf8 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x0e358bf8 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x34fd6ec0 ret_rva=0x002ad878 va=0x006ad878 entry=NextFloat calls=1 words=1
airng seq=4 pid=512 agent=0x33b9e868 rng=0x0e358bf8 pin=off:00000000 left=203->203 idx=421->421 left_delta=0 observed=0 calls=0 residual=0 foreign_words=0 foreign_calls=0 sites=0 overflow=0 life_in=427 life_out=427
airngen seq=4 rng=0x01576e58 life_words=3 life_calls=3
airngen seq=4 rng=0x34fd6ec0 life_words=20 life_calls=18
airngen seq=4 rng=0x35214400 life_words=424 life_calls=295
airngen seq=4 rng=0x0e358bf8 life_words=427 life_calls=295 <-- this bracket
airngcensus seq=4 rng=0x01576e58 ret_rva=0x00384f9e va=0x00784f9e entry=NextUInt calls=3 words=3
airngcensus seq=4 rng=0x34fd6ec0 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=6
airngcensus seq=4 rng=0x34fd6ec0 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=4 rng=0x34fd6ec0 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=3 words=3
airngcensus seq=4 rng=0x34fd6ec0 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=3
airngcensus seq=4 rng=0x34fd6ec0 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x35214400 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=156
airngcensus seq=4 rng=0x35214400 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=253
airngcensus seq=4 rng=0x35214400 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=6
airngcensus seq=4 rng=0x35214400 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=4 rng=0x35214400 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x35214400 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x35214400 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x0e358bf8 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=144
airngcensus seq=4 rng=0x0e358bf8 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=268
airngcensus seq=4 rng=0x0e358bf8 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=6
airngcensus seq=4 rng=0x0e358bf8 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=4 rng=0x0e358bf8 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x0e358bf8 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x0e358bf8 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x34fd6ec0 ret_rva=0x002ad878 va=0x006ad878 entry=NextFloat calls=1 words=1
airng seq=5 pid=16 agent=0x00000000 rng=0x0e303dd8 pin=off:00000000 left=624->624 idx=0->0 left_delta=0 observed=0 calls=0 residual=0 foreign_words=0 foreign_calls=0 sites=0 overflow=0 life_in=0 life_out=0
airngen seq=5 rng=0x01576e58 life_words=3 life_calls=3
airngen seq=5 rng=0x34fd6ec0 life_words=25 life_calls=22
airngen seq=5 rng=0x35214400 life_words=426 life_calls=297
airngen seq=5 rng=0x0e358bf8 life_words=430 life_calls=297
airngen seq=5 rng=0x0e2c9fd8 life_words=35 life_calls=35
airngcensus seq=5 rng=0x01576e58 ret_rva=0x00384f9e va=0x00784f9e entry=NextUInt calls=3 words=3
airngcensus seq=5 rng=0x34fd6ec0 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=7 words=7
airngcensus seq=5 rng=0x34fd6ec0 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=7 words=7
airngcensus seq=5 rng=0x34fd6ec0 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=4 words=5
airngcensus seq=5 rng=0x34fd6ec0 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=3
airngcensus seq=5 rng=0x34fd6ec0 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=2 words=2
airngcensus seq=5 rng=0x35214400 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=156
airngcensus seq=5 rng=0x35214400 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=253
airngcensus seq=5 rng=0x35214400 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=6
airngcensus seq=5 rng=0x35214400 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=5 rng=0x35214400 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=2 words=2
airngcensus seq=5 rng=0x35214400 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=5 rng=0x35214400 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=2 words=2
airngcensus seq=5 rng=0x0e358bf8 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=144
airngcensus seq=5 rng=0x0e358bf8 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=268
airngcensus seq=5 rng=0x0e358bf8 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=6
airngcensus seq=5 rng=0x0e358bf8 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=5 rng=0x0e358bf8 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=2 words=3
airngcensus seq=5 rng=0x0e358bf8 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=5 rng=0x0e358bf8 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=2 words=2
airngcensus seq=5 rng=0x34fd6ec0 ret_rva=0x002ad878 va=0x006ad878 entry=NextFloat calls=1 words=1
airngcensus seq=5 rng=0x0e2c9fd8 ret_rva=0x0018788d va=0x0058788d entry=NextFloat calls=1 words=1
airngcensus seq=5 rng=0x0e2c9fd8 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=16 words=16
airngcensus seq=5 rng=0x0e2c9fd8 ret_rva=0x0049342b va=0x0089342b entry=Chance calls=8 words=8
airngcensus seq=5 rng=0x0e2c9fd8 ret_rva=0x00493518 va=0x00893518 entry=Chance calls=8 words=8
airngcensus seq=5 rng=0x0e2c9fd8 ret_rva=0x001032a2 va=0x005032a2 entry=NextFloat calls=1 words=1
airngcensus seq=5 rng=0x0e2c9fd8 ret_rva=0x003929a9 va=0x007929a9 entry=NextInt calls=1 words=1