104 lines
5.7 KiB
Text
104 lines
5.7 KiB
Text
# 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.
|