sots-re/verify/results/shim/bu/shim.cfg.bupin
alex 696935ea2a lane BU: H1 confirmed - the fleet-visit order is ascending fleet->Location, and the two-file outcome set is the two orderings of two heap pointers
Three fresh processes on ad-turn27 with the seeds pinned, hooking the two
single-caller per-element callees of the assignment walk.

  * ascending fleet->Location: 6 of 6 multi-element sequences
  * ascending element address (the committed prediction P3): 0 of 6
  * ascending fleet id / systemId / minimum ship id: 0 of 6 each

Three processes gave three different orders of the same six fleets, and every
difference is a pair whose Location addresses exchanged relative order. Runs 1
and 2 wrote byte-identical autosaves and still visited differently. Run 3
flipped the branch and its two Location addresses flipped with it: it is
byte-identical to lane BP's run B, runs 1 and 2 to BP's A and L.

So P3 is falsified as written and its hypothesis class, H1, is confirmed with
a sharper key. H1b is excluded on this path.

Second finding the static read had missed: the fleets already carry their new
ids when the walk first touches them, so the mint is upstream in the gather.
That moves the engine's canonicalisation point by one level.

rule 26(d) and rule 19 are both met by measurement rather than argument: an
instrumented pinned run reproduced an unpinned natural run byte for byte,
twice.
2026-09-09 03:38:22 -04:00

118 lines
6.6 KiB
Text

# Lane BU -- stage 2 of the fleet-visit-order chain: the container hook, runs 1 and 2.
# Derived from shim.cfg.bppin (via lane BR's shim.cfg.brprobe, which is bppin plus airng).
# exhaustive
#
# 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 BU (2026-09-09), stage 2 of the visit-order chain. The ONLY change from shim.cfg.bppin
# is exactly three non-comment lines: `aivisit=on` plus its two settings. `airng` stays at
# bppin's own value (`off`): lane BR already took the per-client draw ledger on this state and
# it came back clean -- zero foreign words in every AI bracket, the global generator drawn three
# times in a whole process -- so RNG is excluded by measurement and re-installing that bracket
# here would be three more detours for no answer.
#
# `aivisit=on` installs THREE detours, all function entries:
# StrategyAIAgent::AssignFleetsAndIssueOrders -- the bracket, for (agent, task, pass, vector)
# StrategyAIAgent::ClaimShipsOfFleet -- the head loop, ONE caller in the image
# StrategyAIAgent::ReleaseShipsOfFleet -- the tail loop, ONE caller in the image
# The two per-element targets are called from nowhere else in the game, so no return-address
# filter is needed and no traffic reaches this log from outside the assignment walk. The loop
# body itself is deliberately NOT patched: its first instruction is a branch target.
#
# `aivisit.ships=8` bounds the per-row ship-id list. The list is the JOIN KEY to the command
# block's list 10 (`{systemId, fleetId, ships[]}`); the join must not be by position, because the
# walk can visit more elements than it emits commands for.
airng=off
aidesign=off
aivisit=on
aivisit.out=C:\SOTS\shim.aivisit.txt
aivisit.ships=8
# 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.