Lane P wrote the expected numbers into sots-engine docs/P-events-wiring.md §4 before this run existed. Every one held. First End Turn (ref-turn2 -> Launch -> End Turn, shim.cfg.recapb3 unchanged, build eventlive-dd38117-20260908T0916Z, main dd38117 with no source change): 3 calls, 3 compared, 0 divergent, tracecmp exit 0 — where lane R's run exited 1 on side.events.after.v.next_id orig=4 ours=3. Call 0 read turn=3, events_turn_bucket_exists=true, events_next_id_in=3, events_in_turn_bucket=1, events_dedup_risk=0, no events_scan_truncated, next_id 3->4 on both sides, turns/turns_bytes 2/48 unchanged, node[144].progress 2879->5768, flag 1->2, rng identical — the whole predicted list. Five End Turns: exit 1 with 2 divergent calls instead of 3, each short by exactly 1 (next_id orig 7 ours 6, orig 12 ours 11) = the deliberately unmodelled EVENT_TECHS_UNLOCKED. A 0-divergence result there would have been suspicious. sizeof(Game::ObservedTech) = 44 measured live: observed_techs.bytes grew by exactly 44 on both completion calls (440->484, 484->528), confirming lane X's static pin behaviourally. Non-researching players measured 880 = 20 x 44 and never moved. One deviation from lane R, and it is a workload effect, not a defect: rng diverged on call 9 because the completed tech had research_roll_pending set and the OnTechResearched callback drew one word ours does not (left 374 vs 375). Lane R's "RNG matched 15 of 15" was workload luck; the honest statement is that the rng region matches on every call that does not complete a roll-triggering tech. Zuul double roll CLOSED. No species-5 save existed, so this lane made one: a custom game with only Zuul in the Available Species pool, 4 End Turns under the same compare config. 8 calls, 8 compared, 0 divergent, exit 0; all four researching calls have species=5 and advance the generator by two, not one (left 540->538, 522->520, 504->502, 485->483), and ours reproduced every post-state bit-for-bit. Save added as verify/results/saves/zuul-turn5-species5.sav. End-Turn oracle byte-identical to lane R's on the first turn, so none of this perturbs the game. clean_room_check OK and host ctest 33/33, run as separate commands. VM140 restored to the recap build at the main menu and released.
79 lines
8.5 KiB
Text
79 lines
8.5 KiB
Text
05:20:00.663 [tid 500] ==== sots-engine shim (binkw32 proxy) build eventlive-dd38117-20260908T0916Z ====
|
|
05:20:00.663 [tid 500] exe: C:\SOTS\Sword of the Stars.exe
|
|
05:20:00.663 [tid 500] exe base=0x00e80000 (link-time image base 0x00400000, ASLR delta +11010048) pid=936 shim=695c0000
|
|
05:20:00.663 [tid 500] addresses: Source: sots-re ghidra/addresses.json @ 3768f24, generated 2026-09-08 by tools/gen_addresses.py
|
|
05:20:00.663 [tid 500] config: hooks=trace
|
|
05:20:00.663 [tid 500] config: hook.Shim::SelfTest::Fill=off
|
|
05:20:00.663 [tid 500] config: hook.Mars::GlobalConsts::LoadFile=off
|
|
05:20:00.663 [tid 500] config: hook.Game::WeaponDictionary::Init=off
|
|
05:20:00.663 [tid 500] config: hook.Game::SectionDictionary::SectionDictionary=off
|
|
05:20:00.663 [tid 500] config: hook.Game::ServerPlayer::ComputeBudget=off
|
|
05:20:00.663 [tid 500] config: hook.Game::ServerPlayer::OnTechResearched=off
|
|
05:20:00.663 [tid 500] config: hook.Game::ServerSystem::ProcessTurn=off
|
|
05:20:00.663 [tid 500] config: hook.Game::StrategyServer::MoveFleet=off
|
|
05:20:00.663 [tid 500] config: hook.Game::StrategyServer::ProcessFleetMovement=off
|
|
05:20:00.663 [tid 500] config: hook.Game::TechTree::ProcessResearch=compare
|
|
05:20:00.663 [tid 500] config: trace.path=C:\SOTS\shim.trace.jsonl
|
|
05:20:00.663 [tid 500] config: trace.inline_max=256
|
|
05:20:00.663 [tid 500] config: trace.flush=always
|
|
05:20:00.726 [tid 500] trace: C:\SOTS\shim.trace.jsonl (default mode trace, inline_max 256, flush always)
|
|
05:20:00.726 [tid 500] hook: Mars_Application_Initialize rva=0x004a0e50 -> va=01320e50
|
|
05:20:00.726 [tid 500] hook: MH_Initialize -> MH_OK
|
|
05:20:00.726 [tid 500] hook: MH_CreateHook -> MH_OK (trampoline=01bb0fe0)
|
|
05:20:00.741 [tid 500] hook: MH_EnableHook -> MH_OK
|
|
05:20:00.741 [tid 500] cfg: GlobalConsts hook ready (scale constant 0.017453292519943295)
|
|
05:20:00.741 [tid 500] hook: Mars::GlobalConsts::LoadFile rva=0x004b73c0 mode=off (not installed)
|
|
05:20:00.741 [tid 500] dict: dictionaries hook ready (crt new=6adc232b delete=6adc0174)
|
|
05:20:00.741 [tid 500] hook: Game::WeaponDictionary::Init rva=0x0019a4c0 mode=off (not installed)
|
|
05:20:00.741 [tid 500] hook: Game::SectionDictionary::SectionDictionary rva=0x00176f40 mode=off (not installed)
|
|
05:20:00.741 [tid 500] research: ProcessResearch hook ready (Cost=00ffda00, node=0x34, rng=0x9cc, fpu_cw=0x027f)
|
|
05:20:00.741 [tid 500] hook: Game::TechTree::ProcessResearch rva=0x001876c0 -> va=010076c0 MH_CreateHook -> MH_OK (trampoline=01bb0fc0)
|
|
05:20:00.757 [tid 500] hook: Game::TechTree::ProcessResearch MH_EnableHook -> MH_OK mode=compare
|
|
05:20:00.757 [tid 500] techfx: OnTechResearched hook ready (regions=15, gate=0/0, fpu_cw=0x027f)
|
|
05:20:00.757 [tid 500] hook: Game::ServerPlayer::OnTechResearched rva=0x00491790 mode=off (not installed)
|
|
05:20:00.757 [tid 500] hook: Game::ServerPlayer::ComputeBudget rva=0x00463030 mode=off (not installed)
|
|
05:20:00.757 [tid 500] hook: Game::ServerSystem::ProcessTurn rva=0x003598e0 mode=off (not installed)
|
|
05:20:00.757 [tid 500] hook: Game::StrategyServer::MoveFleet rva=0x003d9ee0 mode=off (not installed)
|
|
05:20:00.757 [tid 500] hook: Game::StrategyServer::ProcessFleetMovement rva=0x003da9a0 mode=off (not installed)
|
|
05:20:00.757 [tid 500] fpu: module init, entry cw=0x027f 53bit-double/nearest; force=off value=0x0000 sample_ticks=on
|
|
05:20:00.757 [tid 500] fpu: StrategyClient::EndTurn rva=0x00383be0 -> va=01203be0 MH_CreateHook -> MH_OK (trampoline=01bb0fa0)
|
|
05:20:00.773 [tid 500] fpu: StrategyClient::EndTurn MH_EnableHook -> MH_OK
|
|
05:20:00.773 [tid 500] fpu: StrategyServer::BeginProcessTurn rva=0x003d98e0 -> va=012598e0 MH_CreateHook -> MH_OK (trampoline=01bb0f80)
|
|
05:20:00.773 [tid 500] fpu: StrategyServer::BeginProcessTurn MH_EnableHook -> MH_OK
|
|
05:20:00.773 [tid 500] fpu: StrategyServer::ProcessTurn rva=0x003dc6c0 -> va=0125c6c0 MH_CreateHook -> MH_OK (trampoline=01bb0f60)
|
|
05:20:00.788 [tid 500] fpu: StrategyServer::ProcessTurn MH_EnableHook -> MH_OK
|
|
05:20:00.788 [tid 500] fpu: DemoApp::OnTick rva=0x0049a640 -> va=0131a640 MH_CreateHook -> MH_OK (trampoline=01bb0f40)
|
|
05:20:00.804 [tid 500] fpu: DemoApp::OnTick MH_EnableHook -> MH_OK
|
|
05:20:00.804 [tid 500] selftest: Shim::SelfTest::Fill mode=off checksum=075ef0c3 records=0
|
|
05:20:00.820 [tid 500] Application::Initialize called (this=03b18128)
|
|
05:20:01.554 [tid 500] fpu: TICK BASELINE at OnTick (this=03b18128): cw=0x127f 53bit-double/nearest
|
|
05:24:40.874 [tid 500] fpu: sample at StrategyClient::EndTurn (this=0e963f00): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:24:43.937 [tid 500] fpu: sample at StrategyClient::EndTurn (this=35279a78): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:24:43.952 [tid 500] fpu: sample at StrategyClient::EndTurn (this=3527b050): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:24:43.983 [tid 500] fpu: sample at StrategyClient::EndTurn (this=3527b798): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:24:44.937 [tid 500] fpu: sample at StrategyServer::BeginProcessTurn (this=0e8eba90): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:24:44.937 [tid 500] fpu: sample at StrategyServer::ProcessTurn (this=0e8eba90): cw=0x127f 53bit-double/nearest
|
|
05:26:33.843 [tid 500] fpu: sample at StrategyClient::EndTurn (this=0e963f00): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:26:36.937 [tid 500] fpu: sample at StrategyClient::EndTurn (this=35279a78): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:26:36.968 [tid 500] fpu: sample at StrategyClient::EndTurn (this=3527b050): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:26:36.983 [tid 500] fpu: sample at StrategyClient::EndTurn (this=3527b798): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:26:37.968 [tid 500] fpu: sample at StrategyServer::BeginProcessTurn (this=0e8eba90): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:26:37.968 [tid 500] fpu: sample at StrategyServer::ProcessTurn (this=0e8eba90): cw=0x127f 53bit-double/nearest
|
|
05:27:16.640 [tid 500] fpu: sample at StrategyClient::EndTurn (this=0e963f00): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:27:19.687 [tid 500] fpu: sample at StrategyClient::EndTurn (this=35279a78): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:27:19.718 [tid 500] fpu: sample at StrategyClient::EndTurn (this=3527b050): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:27:19.733 [tid 500] fpu: sample at StrategyClient::EndTurn (this=3527b798): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:27:20.702 [tid 500] fpu: sample at StrategyServer::BeginProcessTurn (this=0e8eba90): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:27:20.702 [tid 500] fpu: sample at StrategyServer::ProcessTurn (this=0e8eba90): cw=0x127f 53bit-double/nearest
|
|
05:28:01.202 [tid 500] fpu: sample at StrategyClient::EndTurn (this=0e963f00): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:28:04.265 [tid 500] fpu: sample at StrategyClient::EndTurn (this=35279a78): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:28:04.296 [tid 500] fpu: sample at StrategyClient::EndTurn (this=3527b050): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:28:04.312 [tid 500] fpu: sample at StrategyClient::EndTurn (this=3527b798): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:28:05.265 [tid 500] fpu: sample at StrategyServer::BeginProcessTurn (this=0e8eba90): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:28:05.265 [tid 500] fpu: sample at StrategyServer::ProcessTurn (this=0e8eba90): cw=0x127f 53bit-double/nearest
|
|
05:28:46.796 [tid 500] fpu: sample at StrategyClient::EndTurn (this=0e963f00): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:28:49.874 [tid 500] fpu: sample at StrategyClient::EndTurn (this=35279a78): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:28:49.890 [tid 500] fpu: sample at StrategyClient::EndTurn (this=3527b050): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:28:49.921 [tid 500] fpu: sample at StrategyClient::EndTurn (this=3527b798): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:28:50.874 [tid 500] fpu: sample at StrategyServer::BeginProcessTurn (this=0e8eba90): cw=0x127f 53bit-double/nearest [no fpu.force configured]
|
|
05:28:50.874 [tid 500] fpu: sample at StrategyServer::ProcessTurn (this=0e8eba90): cw=0x127f 53bit-double/nearest
|