sots-re/verify/results/shim/airng/par-t1-br-p3.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

127 lines
12 KiB
Text

airng: bracket StrategyClient::OnResumePlaying rva=0x00377480 va=012b7480 create=MH_OK enable=MH_OK
airng: out=C:\SOTS\shim.airng.txt pin_seed=off:00000000
airng: facade cl_Chance rva=0x00178cf0 va=010b8cf0 create=MH_OK enable=MH_OK
airng: facade cl_RandRange rva=0x001798e0 va=010b98e0 create=MH_OK enable=MH_OK
airng seq=1 pid=16 agent=0x00000000 rng=0x1e381880 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=0x336e6530 rng=0x346f4fb0 pin=off:00000000 left=614->607 idx=10->17 left_delta=7 observed=7 calls=7 residual=0 foreign_words=0 foreign_calls=0 sites=4 overflow=0 life_in=10 life_out=17
airngsite seq=2 pid=32 ret_rva=0x002ad878 va=0x006ad878 entry=NextFloat calls=2 words=2 zero=0
airngsite seq=2 pid=32 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=4 words=4 zero=0
airngsite seq=2 pid=32 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=1 words=0 zero=0
airngsite seq=2 pid=32 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=1 words=1 zero=0
airngcall seq=2 pid=32 ret_rva=0x002ad94c va=0x006ad94c facade=cl_RandRange calls=2
airngcall seq=2 pid=32 ret_rva=0x00291ea0 va=0x00691ea0 facade=cl_RandRange calls=2
airngcall seq=2 pid=32 ret_rva=0x002adfca va=0x006adfca facade=cl_Chance calls=1
airngen seq=2 rng=0x01636e58 life_words=3 life_calls=3
airngen seq=2 rng=0x346f4fb0 life_words=17 life_calls=15 <-- this bracket
airngen seq=2 rng=0x349a6018 life_words=386 life_calls=286
airngen seq=2 rng=0x1e371498 life_words=391 life_calls=289
airngcensus seq=2 rng=0x01636e58 ret_rva=0x00384f9e va=0x00784f9e entry=NextUInt calls=3 words=3
airngcensus seq=2 rng=0x346f4fb0 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=0
airngcensus seq=2 rng=0x346f4fb0 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=2 rng=0x346f4fb0 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=5 words=7
airngcensus seq=2 rng=0x346f4fb0 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x346f4fb0 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x349a6018 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=139
airngcensus seq=2 rng=0x349a6018 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=241
airngcensus seq=2 rng=0x349a6018 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=3 words=0
airngcensus seq=2 rng=0x349a6018 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=3 words=3
airngcensus seq=2 rng=0x349a6018 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x349a6018 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x349a6018 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x1e371498 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=148
airngcensus seq=2 rng=0x1e371498 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=233
airngcensus seq=2 rng=0x1e371498 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=0
airngcensus seq=2 rng=0x1e371498 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=2 rng=0x1e371498 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=1 words=2
airngcensus seq=2 rng=0x1e371498 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x1e371498 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x346f4fb0 ret_rva=0x002ad878 va=0x006ad878 entry=NextFloat calls=2 words=2
airng seq=3 pid=496 agent=0x336e5710 rng=0x349a6018 pin=off:00000000 left=238->238 idx=386->386 left_delta=0 observed=0 calls=0 residual=0 foreign_words=0 foreign_calls=0 sites=0 overflow=0 life_in=386 life_out=386
airngen seq=3 rng=0x01636e58 life_words=3 life_calls=3
airngen seq=3 rng=0x346f4fb0 life_words=17 life_calls=15
airngen seq=3 rng=0x349a6018 life_words=386 life_calls=286 <-- this bracket
airngen seq=3 rng=0x1e371498 life_words=391 life_calls=289
airngcensus seq=3 rng=0x01636e58 ret_rva=0x00384f9e va=0x00784f9e entry=NextUInt calls=3 words=3
airngcensus seq=3 rng=0x346f4fb0 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=0
airngcensus seq=3 rng=0x346f4fb0 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=3 rng=0x346f4fb0 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=5 words=7
airngcensus seq=3 rng=0x346f4fb0 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x346f4fb0 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x349a6018 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=139
airngcensus seq=3 rng=0x349a6018 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=241
airngcensus seq=3 rng=0x349a6018 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=3 words=0
airngcensus seq=3 rng=0x349a6018 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=3 words=3
airngcensus seq=3 rng=0x349a6018 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x349a6018 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x349a6018 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x1e371498 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=148
airngcensus seq=3 rng=0x1e371498 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=233
airngcensus seq=3 rng=0x1e371498 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=0
airngcensus seq=3 rng=0x1e371498 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=3 rng=0x1e371498 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=1 words=2
airngcensus seq=3 rng=0x1e371498 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x1e371498 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x346f4fb0 ret_rva=0x002ad878 va=0x006ad878 entry=NextFloat calls=2 words=2
airng seq=4 pid=512 agent=0x336e6c40 rng=0x1e371498 pin=off:00000000 left=233->232 idx=391->392 left_delta=1 observed=1 calls=1 residual=0 foreign_words=0 foreign_calls=0 sites=1 overflow=0 life_in=391 life_out=392
airngsite seq=4 pid=512 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=1 words=1 zero=0
airngcall seq=4 pid=512 ret_rva=0x002a849a va=0x006a849a facade=cl_RandRange calls=1
airngen seq=4 rng=0x01636e58 life_words=3 life_calls=3
airngen seq=4 rng=0x346f4fb0 life_words=17 life_calls=15
airngen seq=4 rng=0x349a6018 life_words=386 life_calls=286
airngen seq=4 rng=0x1e371498 life_words=392 life_calls=290 <-- this bracket
airngcensus seq=4 rng=0x01636e58 ret_rva=0x00384f9e va=0x00784f9e entry=NextUInt calls=3 words=3
airngcensus seq=4 rng=0x346f4fb0 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=0
airngcensus seq=4 rng=0x346f4fb0 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=4 rng=0x346f4fb0 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=5 words=7
airngcensus seq=4 rng=0x346f4fb0 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x346f4fb0 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x349a6018 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=139
airngcensus seq=4 rng=0x349a6018 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=241
airngcensus seq=4 rng=0x349a6018 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=3 words=0
airngcensus seq=4 rng=0x349a6018 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=3 words=3
airngcensus seq=4 rng=0x349a6018 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x349a6018 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x349a6018 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x1e371498 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=148
airngcensus seq=4 rng=0x1e371498 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=233
airngcensus seq=4 rng=0x1e371498 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=0
airngcensus seq=4 rng=0x1e371498 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=4 rng=0x1e371498 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=2 words=3
airngcensus seq=4 rng=0x1e371498 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x1e371498 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x346f4fb0 ret_rva=0x002ad878 va=0x006ad878 entry=NextFloat calls=2 words=2
airng seq=5 pid=16 agent=0x00000000 rng=0x1e381880 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=0x01636e58 life_words=3 life_calls=3
airngen seq=5 rng=0x346f4fb0 life_words=22 life_calls=18
airngen seq=5 rng=0x349a6018 life_words=389 life_calls=288
airngen seq=5 rng=0x1e371498 life_words=394 life_calls=292
airngen seq=5 rng=0x0d8fd1b8 life_words=22 life_calls=22
airngcensus seq=5 rng=0x01636e58 ret_rva=0x00384f9e va=0x00784f9e entry=NextUInt calls=3 words=3
airngcensus seq=5 rng=0x346f4fb0 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=7 words=0
airngcensus seq=5 rng=0x346f4fb0 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=7 words=7
airngcensus seq=5 rng=0x346f4fb0 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=6 words=10
airngcensus seq=5 rng=0x346f4fb0 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=5 rng=0x346f4fb0 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=2 words=2
airngcensus seq=5 rng=0x349a6018 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=139
airngcensus seq=5 rng=0x349a6018 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=241
airngcensus seq=5 rng=0x349a6018 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=3 words=0
airngcensus seq=5 rng=0x349a6018 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=3 words=3
airngcensus seq=5 rng=0x349a6018 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=2 words=3
airngcensus seq=5 rng=0x349a6018 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=5 rng=0x349a6018 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=2 words=2
airngcensus seq=5 rng=0x1e371498 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=148
airngcensus seq=5 rng=0x1e371498 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=233
airngcensus seq=5 rng=0x1e371498 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=0
airngcensus seq=5 rng=0x1e371498 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=5 rng=0x1e371498 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=3 words=4
airngcensus seq=5 rng=0x1e371498 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=5 rng=0x1e371498 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=2 words=2
airngcensus seq=5 rng=0x346f4fb0 ret_rva=0x002ad878 va=0x006ad878 entry=NextFloat calls=2 words=2
airngcensus seq=5 rng=0x0d8fd1b8 ret_rva=0x00127714 va=0x00527714 entry=NextInt calls=2 words=2
airngcensus seq=5 rng=0x0d8fd1b8 ret_rva=0x0018788d va=0x0058788d entry=NextFloat calls=1 words=1
airngcensus seq=5 rng=0x0d8fd1b8 ret_rva=0x0048df54 va=0x0088df54 entry=NextFloat calls=1 words=1
airngcensus seq=5 rng=0x0d8fd1b8 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=16 words=0
airngcensus seq=5 rng=0x0d8fd1b8 ret_rva=0x0049342b va=0x0089342b entry=Chance calls=8 words=8
airngcensus seq=5 rng=0x0d8fd1b8 ret_rva=0x00493518 va=0x00893518 entry=Chance calls=8 words=8
airngcensus seq=5 rng=0x0d8fd1b8 ret_rva=0x001032a2 va=0x005032a2 entry=NextFloat calls=1 words=1
airngcensus seq=5 rng=0x0d8fd1b8 ret_rva=0x003929a9 va=0x007929a9 entry=NextInt calls=1 words=1