# Lane BP -- probe 2 of the 2026-09-09 resolution: runs A and B, the PINNED pair. # # THE PROBE. `ad-turn27-two-raiders.sav` is the richest AI turn the campaign owns: thirteen ships # complete into five new fleets, a design is created, a system is colonised. Two `hooks=off` # processes on it differ in 94 leaves (lane AD, `raid-gate-multiplicity.md` section 5). Row 360 # proved that PINNING the AI client seeds collapses three processes to one -- but only on # `turn1-state`, an early-game turn. If the seed is the only per-process input on a RICH turn too, # these two runs are byte-identical. If they are not, reading 3 of the resolution is alive, and # C-exact ("nothing else per-process reaches the turn") is false on the turns that matter. # # THE MECHANISM IS THE CONSTRUCTOR-ARGUMENT OVERWRITE, NOT A RE-SEED. `aiseed=pin` replaces the # fourth argument of `Game::StrategyApp::RunAI` -- the word the `StrategyClient` constructor hands # to `RNG_Seed` -- before the callee reads it. It is NOT `airng.pin_seed`, which re-seeds the # generator at bracket entry and is a declared perturbation; using that here would test a # different thing and the resolution says so in as many words. # # THE PIN SET IS COMPLETE BY CONSTRUCTION. Every net id run L observed is listed explicitly, AND # the wildcard is set, so a client with an id nobody has seen is still pinned instead of silently # passing through unpinned. A partial pin set is worse than none: the run would look pinned and # be half-natural. # # HOOK SET: identical to shim.cfg.bplog except the `aiseed=` line and the values. hooks=trace trace.path=C:\SOTS\shim.trace.jsonl trace.flush=always probes=off watch=off # LANE BR (2026-09-09), the ONLY change from shim.cfg.bppin, and it is exactly three # non-comment lines: the per-client draw ledger is turned ON. `airng.pin_seed=off` is stated # EXPLICITLY (it is also the default) because a pinned generator is a declared perturbation and # this run must not carry one -- the seed pin here is the constructor-argument overwrite in the # `aiseed=` block below, nothing else. `airng=on` installs the OnResumePlaying bracket plus the # two AI-exclusive facade detours (cl_Chance, cl_RandRange); that instrument is measured # behaviour-neutral in `roll-parity.md`. airng=on airng.pin_seed=off airng.out=C:\SOTS\shim.airng.txt aidesign=off # EVERY template hook, off by name. `Config::mode_for` falls through to `default_mode` for any # hook NOT named here, and `default_mode` is `trace`, so an omission from this list silently # leaves that hook INSTALLED. (`shim.cfg.cbpin` omits six of them -- see the finding.) hook.Shim::SelfTest::Fill=off hook.Mars::GlobalConsts::LoadFile=off hook.Game::WeaponDictionary::Init=off hook.Game::SectionDictionary::SectionDictionary=off hook.Game::TechTree::ProcessResearch=off hook.Game::ServerPlayer::OnTechResearched=off hook.Game::ServerPlayer::ComputeBudget=off hook.Game::ServerSystem::ProcessTurn=off hook.Game::ServerSystem::GroupOutput=off hook.Game::ServerSystem::ComputeTotalOutput=off hook.Game::ServerPlayer::ProcessTurn=off hook.Game::StrategyServer::MoveFleet=off hook.Game::StrategyServer::ProcessFleetMovement=off hook.Game::StrategyHost::Autosave=off hook.Game::StrategyServer::ProcessTurn=off hook.Game::StrategyServer::OnAllCombatDone_Tail=off hook.Game::StrategyServer::ApplyEncounterResult=off hook.Game::StrategyServer::NodeLineDecay=off hook.Game::StrategyServer::ProcessNodeSpaceTravel=off hook.Game::EncounterDetect::AssignContacts=off hook.Game::EncounterDetect::ProcessTeamRecord=off hook.Game::StrategyServer::BeginProcessTurn=off hook.Game::SVSOSwarmQueen::OnTurnBegin=off hook.Game::SVSOSwarmQueen::RegisterHives=off hook.Game::SVSOSwarmQueen::TickHives=off hook.Game::SVSOSlaversRefuel::UpdateDifficultyTier=off hook.Mars::RNG::Seed=off # The trace framework installs its own template hook on RunAI (lane L1's seed probe) and MinHook # refuses a second detour on one target (`MH_ERROR_ALREADY_CREATED`). Off here so the ONE detour # on RunAI is the aiseed module's. hook.Game::StrategyApp::RunAI=off # The command-block dump. `aiorders=on` alone installs exactly one detour # (StrategySim::ApplyTurnCommandBatch); `aiprobes=` would add more, and does not. # `aiorders.deep=off`: the deep follower chases heap pointers whose VALUES are per-process, which # would put per-process noise in the very log used to localise a per-process difference. aiorders=on aiorders.out=C:\SOTS\shim.aiorders.txt aiorders.words=12 aiorders.deep=off aiprobes=off airesearch=off aiseed=pin # The values run L observed for itself on THIS save, on this guest, with this build, at # 2026-09-09 01:20:53 local -- so the pinned runs reproduce a turn that actually happened # rather than a synthetic one (lane CB's rule). # # RUN L CORRECTS THE BRIEF: the save has seven non-human players but the engine constructs only # THREE AI clients. `RunAI` fired exactly three times, for net ids 32 (The Eternal Empire), 496 # and 512 (both "Spengler", RebelAI). The four NPC factions -- 528 Alien Menace, 544 Peacekeeper # Enforcer, 560 Von Neumann, 576 Independent Colony -- get no AI client, no RunAI call and no # seed. A seven-id pin list would have been three pins and four dead entries. # # The wildcard is deliberately a value that appears nowhere else: if a fourth client ever shows # up it is still pinned (no silent pass-through) AND its log line reads `used=0xdeadbeef`, so it # can never be mistaken for a natural seed. aiseed.values=32=156ebbbd,496=fe7b2826,512=0ed341d1,*=deadbeef # # With `aiseed=pin` and no values the module logs "PIN MODE WITH NO PINS -- every seed passes # through unchanged, so this run is NOT pinned and must not be reported as one". Read that, and # the three `aiseed call=... pinned=1` lines, in shim.log before trusting any run.