sots-re/verify/results/shim/airng/par-pin-a1.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

121 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=5a17c0de
airng: PINNING IS ON -- this run's autosave is EXPECTED to differ from the published oracle and must not be compared against it
airng: facade cl_Chance rva=0x00178cf0 va=00ff8cf0 create=MH_OK enable=MH_OK
airng: facade cl_RandRange rva=0x001798e0 va=00ff98e0 create=MH_OK enable=MH_OK
airng seq=1 pid=16 agent=0x00000000 rng=0x0e1c6020 pin=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=0x33a03cf0 rng=0x1ec14450 pin=5a17c0df left=624->621 idx=0->3 left_delta=3 observed=3 calls=3 residual=0 foreign_words=0 foreign_calls=0 sites=2 overflow=0 life_in=9 life_out=12
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
airngcall seq=2 pid=32 ret_rva=0x002ad94c va=0x006ad94c facade=cl_RandRange calls=1
airngcall seq=2 pid=32 ret_rva=0x00291ea0 va=0x00691ea0 facade=cl_RandRange calls=1
airngen seq=2 rng=0x01576e58 life_words=3 life_calls=3
airngen seq=2 rng=0x1ec14450 life_words=12 life_calls=12 <-- this bracket
airngen seq=2 rng=0x0e1bece8 life_words=411 life_calls=287
airngen seq=2 rng=0x0e1e8678 life_words=421 life_calls=289
airngcensus seq=2 rng=0x01576e58 ret_rva=0x00384f9e va=0x00784f9e entry=NextUInt calls=3 words=3
airngcensus seq=2 rng=0x1ec14450 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=0
airngcensus seq=2 rng=0x1ec14450 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=2 rng=0x1ec14450 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=3 words=3
airngcensus seq=2 rng=0x1ec14450 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x1ec14450 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x0e1bece8 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=142
airngcensus seq=2 rng=0x0e1bece8 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=261
airngcensus seq=2 rng=0x0e1bece8 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=4 words=0
airngcensus seq=2 rng=0x0e1bece8 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=4 words=4
airngcensus seq=2 rng=0x0e1bece8 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=1 words=2
airngcensus seq=2 rng=0x0e1bece8 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x0e1bece8 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x0e1e8678 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=155
airngcensus seq=2 rng=0x0e1e8678 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=257
airngcensus seq=2 rng=0x0e1e8678 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=0
airngcensus seq=2 rng=0x0e1e8678 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=2 rng=0x0e1e8678 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x0e1e8678 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x0e1e8678 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=2 rng=0x1ec14450 ret_rva=0x002ad878 va=0x006ad878 entry=NextFloat calls=1 words=1
airng seq=3 pid=496 agent=0x33a04b10 rng=0x0e1bece8 pin=5a17c0e0 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=411 life_out=411
airngen seq=3 rng=0x01576e58 life_words=3 life_calls=3
airngen seq=3 rng=0x1ec14450 life_words=12 life_calls=12
airngen seq=3 rng=0x0e1bece8 life_words=411 life_calls=287 <-- this bracket
airngen seq=3 rng=0x0e1e8678 life_words=421 life_calls=289
airngcensus seq=3 rng=0x01576e58 ret_rva=0x00384f9e va=0x00784f9e entry=NextUInt calls=3 words=3
airngcensus seq=3 rng=0x1ec14450 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=0
airngcensus seq=3 rng=0x1ec14450 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=3 rng=0x1ec14450 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=3 words=3
airngcensus seq=3 rng=0x1ec14450 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x1ec14450 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x0e1bece8 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=142
airngcensus seq=3 rng=0x0e1bece8 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=261
airngcensus seq=3 rng=0x0e1bece8 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=4 words=0
airngcensus seq=3 rng=0x0e1bece8 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=4 words=4
airngcensus seq=3 rng=0x0e1bece8 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=1 words=2
airngcensus seq=3 rng=0x0e1bece8 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x0e1bece8 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x0e1e8678 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=155
airngcensus seq=3 rng=0x0e1e8678 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=257
airngcensus seq=3 rng=0x0e1e8678 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=0
airngcensus seq=3 rng=0x0e1e8678 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=3 rng=0x0e1e8678 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x0e1e8678 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x0e1e8678 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=3 rng=0x1ec14450 ret_rva=0x002ad878 va=0x006ad878 entry=NextFloat calls=1 words=1
airng seq=4 pid=512 agent=0x33a04078 rng=0x0e1e8678 pin=5a17c0e1 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=421 life_out=421
airngen seq=4 rng=0x01576e58 life_words=3 life_calls=3
airngen seq=4 rng=0x1ec14450 life_words=12 life_calls=12
airngen seq=4 rng=0x0e1bece8 life_words=411 life_calls=287
airngen seq=4 rng=0x0e1e8678 life_words=421 life_calls=289 <-- this bracket
airngcensus seq=4 rng=0x01576e58 ret_rva=0x00384f9e va=0x00784f9e entry=NextUInt calls=3 words=3
airngcensus seq=4 rng=0x1ec14450 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=0
airngcensus seq=4 rng=0x1ec14450 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=4 rng=0x1ec14450 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=3 words=3
airngcensus seq=4 rng=0x1ec14450 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x1ec14450 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x0e1bece8 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=142
airngcensus seq=4 rng=0x0e1bece8 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=261
airngcensus seq=4 rng=0x0e1bece8 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=4 words=0
airngcensus seq=4 rng=0x0e1bece8 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=4 words=4
airngcensus seq=4 rng=0x0e1bece8 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=1 words=2
airngcensus seq=4 rng=0x0e1bece8 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x0e1bece8 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x0e1e8678 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=155
airngcensus seq=4 rng=0x0e1e8678 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=257
airngcensus seq=4 rng=0x0e1e8678 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=0
airngcensus seq=4 rng=0x0e1e8678 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=4 rng=0x0e1e8678 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x0e1e8678 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x0e1e8678 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=1 words=1
airngcensus seq=4 rng=0x1ec14450 ret_rva=0x002ad878 va=0x006ad878 entry=NextFloat calls=1 words=1
airng seq=5 pid=16 agent=0x00000000 rng=0x0e1c6020 pin=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=0x1ec14450 life_words=15 life_calls=15
airngen seq=5 rng=0x0e1bece8 life_words=414 life_calls=289
airngen seq=5 rng=0x0e1e8678 life_words=423 life_calls=291
airngen seq=5 rng=0x0e1e0860 life_words=19 life_calls=19
airngcensus seq=5 rng=0x01576e58 ret_rva=0x00384f9e va=0x00784f9e entry=NextUInt calls=3 words=3
airngcensus seq=5 rng=0x1ec14450 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=7 words=0
airngcensus seq=5 rng=0x1ec14450 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=7 words=7
airngcensus seq=5 rng=0x1ec14450 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=4 words=4
airngcensus seq=5 rng=0x1ec14450 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=5 rng=0x1ec14450 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=2 words=2
airngcensus seq=5 rng=0x0e1bece8 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=142
airngcensus seq=5 rng=0x0e1bece8 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=261
airngcensus seq=5 rng=0x0e1bece8 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=4 words=0
airngcensus seq=5 rng=0x0e1bece8 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=4 words=4
airngcensus seq=5 rng=0x0e1bece8 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=2 words=4
airngcensus seq=5 rng=0x0e1bece8 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=5 rng=0x0e1bece8 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=2 words=2
airngcensus seq=5 rng=0x0e1e8678 ret_rva=0x002cd02f va=0x006cd02f entry=NextInt calls=120 words=155
airngcensus seq=5 rng=0x0e1e8678 ret_rva=0x002cd062 va=0x006cd062 entry=NextInt calls=160 words=257
airngcensus seq=5 rng=0x0e1e8678 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=6 words=0
airngcensus seq=5 rng=0x0e1e8678 ret_rva=0x00178d15 va=0x00578d15 entry=Chance calls=6 words=6
airngcensus seq=5 rng=0x0e1e8678 ret_rva=0x00179915 va=0x00579915 entry=NextInt calls=2 words=2
airngcensus seq=5 rng=0x0e1e8678 ret_rva=0x0029dc02 va=0x0069dc02 entry=NextInt calls=1 words=1
airngcensus seq=5 rng=0x0e1e8678 ret_rva=0x0029dc2e va=0x0069dc2e entry=NextInt calls=2 words=2
airngcensus seq=5 rng=0x1ec14450 ret_rva=0x002ad878 va=0x006ad878 entry=NextFloat calls=1 words=1
airngcensus seq=5 rng=0x0e1e0860 ret_rva=0x0018788d va=0x0058788d entry=NextFloat calls=1 words=1
airngcensus seq=5 rng=0x0e1e0860 ret_rva=0x004e6e09 va=0x008e6e09 entry=NextFloat calls=16 words=0
airngcensus seq=5 rng=0x0e1e0860 ret_rva=0x0049342b va=0x0089342b entry=Chance calls=8 words=8
airngcensus seq=5 rng=0x0e1e0860 ret_rva=0x00493518 va=0x00893518 entry=Chance calls=8 words=8
airngcensus seq=5 rng=0x0e1e0860 ret_rva=0x001032a2 va=0x005032a2 entry=NextFloat calls=1 words=1
airngcensus seq=5 rng=0x0e1e0860 ret_rva=0x003929a9 va=0x007929a9 entry=NextInt calls=1 words=1