lane DT: T34 implemented and measured -- 36 closed / 2 regressed on the rich turn, 1 / 0 on the canonical pair

The observed-design list is a MOVE-TO-BACK vector capped at 20 records per
DESIGN OWNER, and that is why lane CV's 55 odes leaves looked unrelated: a turn's
output is a permutation of its input, not an append.

  rich turn   ad-turn27 + BR's deep tcb vs bp-pinB-turn28   1092 -> 1058
              36 closed / 2 regressed vs CV's run; 116 / 8 vs the 1166 baseline
  canonical   turn2-state + CB's tcb vs turn3-state           62 -> 61
              1 closed / 0 regressed, set-differenced by leaf PATH

All five committed predictions held; P5 held in direction and was wrong in
magnitude (9 leaves, not 4 -- I predicted spurious records, not leaves).

CV's "no upstream dependency" is right for the design half and wrong for the
other 24 leaves of the 79, two separate ways, and both are named rather than
attempted: the otch/owep arms need three undecoded design->tech/weapon set
builders (the wire's own DOpts list covers 13 of the 18 tech names the turn
moves), and the design half is itself capped by SHIP CONSTRUCTION -- two designs
get their first ships that turn. Fed the true post-turn ship list the same code
leaves 1 leaf of 55 instead of 21, so the mechanism is not the residual.

Control, run: with the NPC-owner guard compiled out the canonical pair goes
61 -> 70 and the rich turn stays at 1058. The guard is load-bearing on one pair
and inert on the other, which is why both were run.

Coverage, stated as loudly as the divergence: 8 players swept, TWO produce any
record; the canonical pair offers 16 (player, ship) pairs of which the guard
drops 15, leaving one record call on one design. No foreign observation moves on
either pair, so the visibility gate -- a two-bit-per-player word at Ship+0x54
that is not on the wire, stood in for with ownership -- is entirely unexercised
and is labelled a hypothesis.

ghidra/addresses.d/dt.json: 10 entries (the sweep 0x007c2350, the recorder
0x007be340, RecordObservedWeapon, the vector helpers, sizeof(ObservedDesign) =
0x10, the vftable, and ServerPlayer +0x254 / +0xfb). gen_addresses.py merges it
clean at 1320 entries, no duplicate name or address.
This commit is contained in:
alex 2026-09-09 10:18:52 -04:00
parent 3368e28091
commit d9b06ca447
7 changed files with 1777 additions and 3 deletions

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1,84 @@
{
"entries": [
{
"name": "RecordObservedDesignsSweep",
"addr": "0x007c2350",
"convention": "thiscall",
"prototype": "void __thiscall Game::StrategyServer::RecordObservedDesigns() -- TAIL PHASE 34 (called at 0x007d98aa from OnAllCombatDone_Tail 0x007d92a0; also from BuildTurnEvents 0x007db780 at 0x007dbc98 and from LoadGame 0x007dd530 at 0x007ddc2b). 222 bytes. Triple loop: for each player p in Players (this+0x54/0x58), for each fleet f in Fleets (this+0x64/0x68), for each ship sh in f->ships (f+0xa4/0xa8) -- so the recorder is called once per SHIP, not once per design, and the repetition is load-bearing because the recorder moves a re-observed record to the back of the list. TWO GATES: `p->PlyrIdx(+0x28) >= 15` skips the player (0x007c23bf `cmp eax,0xf; jge`), and `((sh->+0x54 >> (2*PlyrIdx)) & 3) != 3` skips the ship (0x007c23c4-0x007c23d6, `lea ecx,[eax+eax]; mov eax,3; shl eax,cl; and eax,[edx+0x54]; shr eax,cl; cmp eax,3`). Ship+0x54 is a TWO-BIT-PER-PLAYER visibility word and is NOT serialised -- the ship's on-disk field list runs +0x4c Dep, +0x4d Atq, +0x5c LCT with 0x54 and 0x58 absent. Then `RecordObservedDesign(p, sh->design(+0x14))` at 0x007c23e2",
"status": "verified",
"source": "findings/subsystems/t34-observed-designs.md (lane DT, 2026-09-09, own disassembly pass over dumps/sots.exe with tools/x86disp.py)"
},
{
"name": "RecordObservedDesign",
"addr": "0x007be340",
"convention": "thiscall",
"prototype": "void __thiscall Game::StrategyServer::RecordObservedDesign(Game::ServerPlayer* observer, Game::Design* design) -- RET 8. Four early returns: null observer, null design, `design->owner(+0x130)->+0xfb != 0 && ->+0xfc == 0` (0x007be389/0x007be392 -- NPC and RebAI, so a design owned by an NPC that is not a rebel AI is never observed by anyone), `!0x0080baf0(design)` (0x007be3a1) and `0x00813ab0(design, 0x400, 0)` (0x007be3b7, a design flag test). DEDUP ON odid ALONE: linear scan of observer->odes (+0x254/+0x258) comparing element+0x8, stride 0x10 (0x007be3c4-0x007be3ef). MISS -> ObservedDesign ctor 0x0080da30 on the stack, push_back 0x00799d80, then otnF/otnL = server->turn(+0xc) as WORDS at +0x4/+0x6, odid = design->+0xa0->+0x4 at +0x8, opid = owner->+0x4 at +0xc; if the owner is not the observer, the design id is also appended to a per-player vector at server->+0x284 + 0x10*observer->PlyrIdx. HIT -> the element's four fields are COPIED OUT, the element is ERASED (vector::erase 0x00795c40) and a copy is PUSHED ON THE BACK (0x007be618-0x007be66d): a re-observation is a MOVE-TO-BACK, not an in-place update, so the list is in last-observation order and otnF survives. Both paths then set back->+0x6 = turn. Finally the TRIM at 0x007be67f: walk from the last element to the first, count elements whose opid equals this design's owner id, keep the first 20 (`cmp [ebp-0x10],0x14; jge erase`) and erase the rest -- a CAP OF 20 RECORDS PER DESIGN OWNER, applied after EVERY record call, not once per sweep. Tail: three set builders feed the tech and weapon lists -- 0x00862c90 and 0x008629b0 into RecordObservedTech 0x007ba1a0 (at 0x007be4e1 and 0x007be535), 0x008626a0 into RecordObservedWeapon 0x007be1b0 (at 0x007be591)",
"status": "verified",
"source": "findings/subsystems/t34-observed-designs.md (lane DT, 2026-09-09)"
},
{
"name": "RecordObservedWeapon",
"addr": "0x007be1b0",
"convention": "thiscall",
"prototype": "void __thiscall Game::StrategyServer::RecordObservedWeapon(Game::ServerPlayer* observer, Game::ServerPlayer* designOwner, <weapon>) -- the owep sibling of RecordObservedTech 0x007ba1a0 (lane X). Its single call site is RecordObservedDesign+0x251 (0x007be591), fed from the design's weapon set built by 0x008626a0. Named from that call site and from ObservedWeapon::Write 0x00817bc0; its body is NOT read",
"status": "hypothesis",
"source": "findings/subsystems/t34-observed-designs.md (lane DT, 2026-09-09) -- call-site attribution only"
},
{
"name": "vector_ObservedDesign_push_back",
"addr": "0x00799d80",
"convention": "thiscall",
"prototype": "void __thiscall std::vector<Game::ObservedDesign>::push_back(const ObservedDesign&) -- both call sites are inside RecordObservedDesign with ecx = ServerPlayer+0x254 (0x007be40b append, 0x007be65c move-to-back)",
"status": "verified",
"source": "findings/subsystems/t34-observed-designs.md (lane DT, 2026-09-09)"
},
{
"name": "vector_ObservedDesign_erase",
"addr": "0x00795c40",
"convention": "thiscall",
"prototype": "iterator __thiscall std::vector<Game::ObservedDesign>::erase(iterator) -- called at 0x007be64d with ecx = ServerPlayer+0x254, on the move-to-back path only. The trim at the end of RecordObservedDesign does its own inline element shift (0x007be7de, four moves of 0x10 bytes per element) rather than calling this",
"status": "verified",
"source": "findings/subsystems/t34-observed-designs.md (lane DT, 2026-09-09)"
},
{
"name": "ObservedDesign_ctor",
"addr": "0x0080da30",
"convention": "thiscall",
"prototype": "Game::ObservedDesign::ObservedDesign() -- called at 0x007be3f8 on a stack temporary that is immediately pushed back. Writes the vptr 0x00a23c64 (the same constant the move-to-back path stores into its stack copy at 0x007be62e)",
"status": "verified",
"source": "findings/subsystems/t34-observed-designs.md (lane DT, 2026-09-09)"
},
{
"name": "ObservedDesign_sizeof",
"convention": "constant",
"prototype": "sizeof(Game::ObservedDesign) = 0x10 (16). Measured three ways inside RecordObservedDesign: the dedup scan advances `add eax,0x10` (0x007be3e6), the trim indexes `shl edx,4` / `sar eax,4` (0x007be6a1, 0x007be692) and the erase shift steps 0x10 per element (0x007be7fc). Layout {vptr @+0x0, uint16 otnF @+0x4, uint16 otnL @+0x6, int odid @+0x8, int opid @+0xc} -- fully accounted, no padding slack. That is the wire record otnF otnL odid opid plus the vptr, and it is the SMALL sibling of Game::ObservedTech (0x2c), whose extra 0x1c is the embedded tech-name std::string",
"status": "verified",
"source": "findings/subsystems/t34-observed-designs.md (lane DT, 2026-09-09); cf. findings/subsystems/observedtech-append.md",
"offset": "0x10"
},
{
"name": "ObservedDesign_vftable",
"addr": "0x00a23c64",
"convention": "data",
"prototype": "Game::ObservedDesign vftable. Stored at +0x0 by ObservedDesign_ctor 0x0080da30 and written directly into the stack copy on RecordObservedDesign's move-to-back path (0x007be62e `mov [ebp-0x50], 0xa23c64`)",
"status": "verified",
"source": "findings/subsystems/t34-observed-designs.md (lane DT, 2026-09-09)"
},
{
"name": "ServerPlayer_off_ObservedDesigns",
"convention": "offset",
"prototype": "std::vector<Game::ObservedDesign> Game::ServerPlayer::odes at +0x254 (_Myfirst +0x254, _Mylast +0x258, _Myend +0x25c, _Alval +0x260). Already in objects/layouts as the odes vector; recorded here with its WRITER, which was not previously attributed: RecordObservedDesign 0x007be340 is the only function that appends to, erases from or trims it. Its sibling ServerPlayer_off_ObservedTechs is +0x274 (lane X)",
"status": "verified",
"source": "findings/subsystems/t34-observed-designs.md (lane DT, 2026-09-09)",
"offset": "0x254"
},
{
"name": "ServerPlayer_off_IsNPC",
"convention": "offset",
"prototype": "bool Game::ServerPlayer::NPC at +0xfb. Read by RecordObservedDesign at 0x007be389 as the first half of the observability guard `if (owner->+0xfb && !owner->+0xfc) return`. The identification is by ADJACENCY, not by a direct read: lane T pinned RebAI at +0xfc (ProcessTurn phase 8, 0x00891517), and the wire writes Elim, NPC, RebAI, ReqCL consecutively, so +0xfb is NPC. CORROBORATED BY THE WHOLE CORPUS: every observation record in every save names a design owned by one of the two non-NPC empires, and the four NPC factions' 26 designs appear in nobody's list; and removing the guard from the reimplementation regresses the canonical pair by 9 leaves (four spurious records for the NPC 'Alien Menace') while costing nothing on the rich turn",
"status": "hypothesis",
"source": "findings/subsystems/t34-observed-designs.md (lane DT, 2026-09-09) -- adjacency plus a corpus-wide and a differential check, not a direct read of the writer",
"offset": "0xfb"
}
]
}

View file

@ -0,0 +1,65 @@
A 4d8ea15bd6ddfe746f97c45b37bdcc8f /tmp/claude-1000/-home-alex/ec8e34f8-af37-4ef2-a309-ed6a15293097/scratchpad/dt/out/canon-after.sav
B e9c161e311f8ef8fad6f1aa1903dcf3f /home/alex/sots-re/verify/results/saves/turn3-state.sav
policy: floats=bits mask=none reader=74fd562c75e2679e
DIVERGED: 61 leaf difference(s)
/Summary/Checksum: -1205790620 -> -769976634
/Sim/NMnx: 109 -> 111
/Sim/FleetIDs[]: removed [1744], added [34, 1776] (7 -> 8 entries)
/Sim/ShipIDs[]: removed [], added [1760] (16 -> 17 entries)
/Sim/RNG/.: '<raw 2503 B ef4d678696ed4c53>' -> '<raw 2503 B a80459bfd63a006b>'
/Sim/cmbtid: 2 -> 3
/Sim/turnstats/history/hist[0]/stats[2]: only-in-B
/Sim/turnstats/history/hist[1]/stats[2]: only-in-B
/Sim/turnstats/history/hist[2]/stats[2]: only-in-B
/Sim/turnstats/history/hist[3]/stats[2]: only-in-B
/Sim/turnstats/history/hist[4]/stats[2]: only-in-B
/Sim/turnstats/history/hist[5]/stats[2]: only-in-B
/Sim/turnstats/history/hist[6]/stats[2]: only-in-B
/Sim/turnstats/history/hist[7]/stats[2]: only-in-B
/Sim/players/Player[16 "re"]/Events/EvNxID: 2 -> 3
/Sim/players/Player[16 "re"]/Events/Events/.[EvTurn=3]: only-in-B
/Sim/players/Player[16 "re"]/Events/Events/.[0]: 1 -> 2
/Sim/players/Player[16 "re"]/BnkPr: -789323 -> -791290
/Sim/players/Player[32 "Fane Lao"]/TechTree/TResDone[106]: 2879 -> 5768
/Sim/players/Player[32 "Fane Lao"]/TechTree/Tbd[106]: 1 -> 2
/Sim/players/Player[32 "Fane Lao"]/Sav: 142379 -> 135486
/Sim/players/Player[32 "Fane Lao"]/Maint: 500 -> 1000
/Sim/players/Player[32 "Fane Lao"]/Events/EvNxID: 2 -> 4
/Sim/players/Player[32 "Fane Lao"]/Events/Events/.[EvTurn=3]: only-in-B
/Sim/players/Player[32 "Fane Lao"]/Events/Events/.[0]: 1 -> 2
/Sim/players/Player[32 "Fane Lao"]/FNG/FNGNum: 1 -> 3
/Sim/players/Player[32 "Fane Lao"]/PvSav: 92651 -> 80751
/Sim/players/Player[32 "Fane Lao"]/BnkPr: -898837 -> -901002
/Sim/players/Player[32 "Fane Lao"]/ShipRecs/srb[0]: 1 -> 2
/Sim/players/Player[32 "Fane Lao"]/ShipRecs/sri[0]: 1 -> 2
/Sim/players/Player[32 "Fane Lao"]/ShipRecs/srb[3]: 1 -> 2
/Sim/players/Player[32 "Fane Lao"]/ShipRecs/sri[3]: 1 -> 2
/Sim/players/Player[32 "Fane Lao"]/lboid: 1 -> 2
/Sim/systems/Sys[64 "Hyperion"]/rcex: 65536 -> 0
/Sim/systems/Sys[64 "Hyperion"]/TShn: 2 -> 3
/Sim/systems/Sys[112 "Gamma Cephei"]/PvPop2/PopG/PopC: 500000000 -> 520000000
/Sim/systems/Sys[112 "Gamma Cephei"]/RepCur: 336360.0 -> 336840.0 [15360 ulp]
/Sim/systems/Sys[112 "Gamma Cephei"]/RepMax: 336360.0 -> 336840.0 [15360 ulp]
/Sim/systems/Sys[112 "Gamma Cephei"]/TShn: 2 -> 3
/Sim/systems/Sys[224 "Spica"]/TShn: 2 -> 3
/Sim/systems/Sys[288 "Ke'Dolarra"]/PvPop2/PopG/PopC: 500000000 -> 520000000
/Sim/systems/Sys[288 "Ke'Dolarra"]/RepCur: 370000.0 -> 370520.0 [16640 ulp]
/Sim/systems/Sys[288 "Ke'Dolarra"]/RepMax: 370000.0 -> 370520.0 [16640 ulp]
/Sim/systems/Sys[288 "Ke'Dolarra"]/DefF: 1744 -> 1776
/Sim/systems/Sys[288 "Ke'Dolarra"]/Flt: 1744 -> 1776
/Sim/systems/Sys[288 "Ke'Dolarra"]/TShn: 2 -> 3
/Sim/systems/Sys[304 "Koa’Vo"]/rcex: 268435456 -> 0
/Sim/systems/Sys[304 "Koa’Vo"]/TShn: 2 -> 3
/Sim/systems/Sys[336 "Kaa’Vaalu"]/rcex: 65536 -> 0
/Sim/systems/Sys[336 "Kaa’Vaalu"]/TShn: 2 -> 3
/Sim/systems/Sys[400 "Markab"]/rcex: 65536 -> 0
/Sim/systems/Sys[400 "Markab"]/TShn: 2 -> 3
/Sim/systems/Sys[448 "Kea’Pono"]/rcex: 65536 -> 0
/Sim/systems/Sys[448 "Kea’Pono"]/TShn[0]: 2 -> 3
/Sim/systems/Sys[448 "Kea’Pono"]/TShn[1]: 2 -> 3
/Sim/systems/Sys[480 "Ko'Rorkor"]/rcex: 65536 -> 0
/Sim/systems/Sys[480 "Ko'Rorkor"]/TShn: 2 -> 3
/Sim/NumFlts: 7 -> 8
/Sim/fleets/Flt[1744 "Alpha Fleet"]: only-in-A
/Sim/fleets/Flt[34 "Beta Fleet"]: only-in-B
/Sim/fleets/Flt[1776 "Gamma Fleet"]: only-in-B

View file

@ -0,0 +1,66 @@
A d9b659d5413715b463f418f06ef23942 /tmp/claude-1000/-home-alex/ec8e34f8-af37-4ef2-a309-ed6a15293097/scratchpad/dt/out/canon-before.sav
B e9c161e311f8ef8fad6f1aa1903dcf3f /home/alex/sots-re/verify/results/saves/turn3-state.sav
policy: floats=bits mask=none reader=74fd562c75e2679e
DIVERGED: 62 leaf difference(s)
/Summary/Checksum: -1205790620 -> -769976634
/Sim/NMnx: 109 -> 111
/Sim/FleetIDs[]: removed [1744], added [34, 1776] (7 -> 8 entries)
/Sim/ShipIDs[]: removed [], added [1760] (16 -> 17 entries)
/Sim/RNG/.: '<raw 2503 B ef4d678696ed4c53>' -> '<raw 2503 B a80459bfd63a006b>'
/Sim/cmbtid: 2 -> 3
/Sim/turnstats/history/hist[0]/stats[2]: only-in-B
/Sim/turnstats/history/hist[1]/stats[2]: only-in-B
/Sim/turnstats/history/hist[2]/stats[2]: only-in-B
/Sim/turnstats/history/hist[3]/stats[2]: only-in-B
/Sim/turnstats/history/hist[4]/stats[2]: only-in-B
/Sim/turnstats/history/hist[5]/stats[2]: only-in-B
/Sim/turnstats/history/hist[6]/stats[2]: only-in-B
/Sim/turnstats/history/hist[7]/stats[2]: only-in-B
/Sim/players/Player[16 "re"]/Events/EvNxID: 2 -> 3
/Sim/players/Player[16 "re"]/Events/Events/.[EvTurn=3]: only-in-B
/Sim/players/Player[16 "re"]/Events/Events/.[0]: 1 -> 2
/Sim/players/Player[16 "re"]/BnkPr: -789323 -> -791290
/Sim/players/Player[32 "Fane Lao"]/TechTree/TResDone[106]: 2879 -> 5768
/Sim/players/Player[32 "Fane Lao"]/TechTree/Tbd[106]: 1 -> 2
/Sim/players/Player[32 "Fane Lao"]/Sav: 142379 -> 135486
/Sim/players/Player[32 "Fane Lao"]/Maint: 500 -> 1000
/Sim/players/Player[32 "Fane Lao"]/Events/EvNxID: 2 -> 4
/Sim/players/Player[32 "Fane Lao"]/Events/Events/.[EvTurn=3]: only-in-B
/Sim/players/Player[32 "Fane Lao"]/Events/Events/.[0]: 1 -> 2
/Sim/players/Player[32 "Fane Lao"]/FNG/FNGNum: 1 -> 3
/Sim/players/Player[32 "Fane Lao"]/PvSav: 92651 -> 80751
/Sim/players/Player[32 "Fane Lao"]/BnkPr: -898837 -> -901002
/Sim/players/Player[32 "Fane Lao"]/ShipRecs/srb[0]: 1 -> 2
/Sim/players/Player[32 "Fane Lao"]/ShipRecs/sri[0]: 1 -> 2
/Sim/players/Player[32 "Fane Lao"]/ShipRecs/srb[3]: 1 -> 2
/Sim/players/Player[32 "Fane Lao"]/ShipRecs/sri[3]: 1 -> 2
/Sim/players/Player[32 "Fane Lao"]/lboid: 1 -> 2
/Sim/players/Player[32 "Fane Lao"]/odes/.[1]/otnL: 2 -> 3
/Sim/systems/Sys[64 "Hyperion"]/rcex: 65536 -> 0
/Sim/systems/Sys[64 "Hyperion"]/TShn: 2 -> 3
/Sim/systems/Sys[112 "Gamma Cephei"]/PvPop2/PopG/PopC: 500000000 -> 520000000
/Sim/systems/Sys[112 "Gamma Cephei"]/RepCur: 336360.0 -> 336840.0 [15360 ulp]
/Sim/systems/Sys[112 "Gamma Cephei"]/RepMax: 336360.0 -> 336840.0 [15360 ulp]
/Sim/systems/Sys[112 "Gamma Cephei"]/TShn: 2 -> 3
/Sim/systems/Sys[224 "Spica"]/TShn: 2 -> 3
/Sim/systems/Sys[288 "Ke'Dolarra"]/PvPop2/PopG/PopC: 500000000 -> 520000000
/Sim/systems/Sys[288 "Ke'Dolarra"]/RepCur: 370000.0 -> 370520.0 [16640 ulp]
/Sim/systems/Sys[288 "Ke'Dolarra"]/RepMax: 370000.0 -> 370520.0 [16640 ulp]
/Sim/systems/Sys[288 "Ke'Dolarra"]/DefF: 1744 -> 1776
/Sim/systems/Sys[288 "Ke'Dolarra"]/Flt: 1744 -> 1776
/Sim/systems/Sys[288 "Ke'Dolarra"]/TShn: 2 -> 3
/Sim/systems/Sys[304 "Koa’Vo"]/rcex: 268435456 -> 0
/Sim/systems/Sys[304 "Koa’Vo"]/TShn: 2 -> 3
/Sim/systems/Sys[336 "Kaa’Vaalu"]/rcex: 65536 -> 0
/Sim/systems/Sys[336 "Kaa’Vaalu"]/TShn: 2 -> 3
/Sim/systems/Sys[400 "Markab"]/rcex: 65536 -> 0
/Sim/systems/Sys[400 "Markab"]/TShn: 2 -> 3
/Sim/systems/Sys[448 "Kea’Pono"]/rcex: 65536 -> 0
/Sim/systems/Sys[448 "Kea’Pono"]/TShn[0]: 2 -> 3
/Sim/systems/Sys[448 "Kea’Pono"]/TShn[1]: 2 -> 3
/Sim/systems/Sys[480 "Ko'Rorkor"]/rcex: 65536 -> 0
/Sim/systems/Sys[480 "Ko'Rorkor"]/TShn: 2 -> 3
/Sim/NumFlts: 7 -> 8
/Sim/fleets/Flt[1744 "Alpha Fleet"]: only-in-A
/Sim/fleets/Flt[34 "Beta Fleet"]: only-in-B
/Sim/fleets/Flt[1776 "Gamma Fleet"]: only-in-B

View file

@ -0,0 +1,45 @@
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[2]/odid: 546 -> 1106
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[3]/odid: 770 -> 1042
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[4]/otnF: 28 -> 27
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[4]/odid: 1106 -> 226
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[5]/odid: 1042 -> 818
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[6]/odid: 226 -> 978
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[7]/odid: 818 -> 1202
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[8]/otnF: 28 -> 5
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[8]/odid: 978 -> 130
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[9]/odid: 1202 -> 1442
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[10]/otnF: 5 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[10]/odid: 130 -> 1506
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[11]/odid: 1442 -> 194
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[12]/odid: 1506 -> 1490
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[13]/odid: 962 -> 1826
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[14]/odid: 194 -> 386
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[15]/odid: 1490 -> 1474
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[16]/odid: 386 -> 1250
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[17]/odid: 1250 -> 1522
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[18]/otnF: 28 -> 27
/Sim/players/Player[32 "The Eternal Empire"]/odes/.[18]/odid: 1474 -> 962
/Sim/players/Player[32 "The Eternal Empire"]/owep/.[1]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/owep/.[2]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/owep/.[3]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/owep/.[4]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/owep/.[5]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[43]: only-in-B
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[0]: 42 -> 43
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[2]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[5]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[13]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[14]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[15]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[16]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[20]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[22]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[24]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[27]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[28]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[30]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[31]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[32]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[33]/otnL: 15 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[35]/otnL: 27 -> 28
/Sim/players/Player[32 "The Eternal Empire"]/otch/.[36]/otnL: 27 -> 28

View file

@ -0,0 +1,205 @@
load: /home/alex/sots-re/verify/results/saves/ad-turn27-two-raiders.sav
1052300 inflated bytes, 0 error(s), 1 warning(s)
turn 27, frame 27, modCount 1428, 8 player(s), 28 system(s), 54 fleet(s)
data: /tmp/claude-1000/-home-alex/ec8e34f8-af37-4ef2-a309-ed6a15293097/scratchpad/sotsdata -- 885 section(s) over 7 race(s), 5196 string(s), 46 load problem(s)
turn-commands: verify/results/turncommands/br2-turn27-deep.tcb -- 8 block(s), 3 seed(s)
source: BR2-deep-aiorders.txt
input: ad-turn27-two-raiders.sav
batch: seq=2 n=8
note: the load-time batch is excluded; this is the End-Turn submission
turn commands: 8 block(s), 4 submitting, 85 command(s)
ModCount bumps charged 70
applied 4 transcribed 0 declined 36 incomplete 45
leaves written by commands 0
step blk player cost disposition command
6 1 32 1 incomplete list 5 system rates [0]
the capture does not carry all eight fields of the rates frame
6 1 32 1 incomplete list 5 system rates [1]
the capture does not carry all eight fields of the rates frame
6 1 32 1 incomplete list 5 system rates [2]
the capture does not carry all eight fields of the rates frame
6 1 32 1 incomplete list 5 system rates [3]
the capture does not carry all eight fields of the rates frame
6 1 32 1 incomplete list 5 system rates [4]
the capture does not carry all eight fields of the rates frame
6 1 32 1 incomplete list 5 system rates [5]
the capture does not carry all eight fields of the rates frame
6 1 32 1 incomplete list 5 system rates [6]
the capture does not carry all eight fields of the rates frame
6 1 32 1 incomplete list 5 system rates [7]
the capture does not carry all eight fields of the rates frame
6 1 32 1 incomplete list 5 system rates [8]
the capture does not carry all eight fields of the rates frame
6 1 32 1 incomplete list 5 system rates [9]
the capture does not carry all eight fields of the rates frame
6 1 32 1 incomplete list 5 system rates [10]
the capture does not carry all eight fields of the rates frame
6 1 32 1 incomplete list 5 system rates [11]
the capture does not carry all eight fields of the rates frame
6 1 32 1 incomplete list 5 system rates [12]
the capture does not carry all eight fields of the rates frame
6 1 32 1 incomplete list 5 system rates [13]
the capture does not carry all eight fields of the rates frame
6 1 32 1 incomplete list 5 system rates [14]
the capture does not carry all eight fields of the rates frame
7 1 32 0 incomplete list 23 population [0]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
7 1 32 0 incomplete list 23 population [1]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
7 1 32 0 incomplete list 23 population [2]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
7 1 32 0 incomplete list 23 population [3]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
7 1 32 0 incomplete list 23 population [4]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
7 1 32 0 incomplete list 23 population [5]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
7 1 32 0 incomplete list 23 population [6]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
7 1 32 0 incomplete list 23 population [7]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
7 1 32 0 incomplete list 23 population [8]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
7 1 32 0 incomplete list 23 population [9]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
7 1 32 0 incomplete list 23 population [10]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
7 1 32 0 incomplete list 23 population [11]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
7 1 32 0 incomplete list 23 population [12]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
7 1 32 0 incomplete list 23 population [13]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
7 1 32 0 incomplete list 23 population [14]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
9 0 16 1 applied gate loop A (group5, research target, research rate) / research rate
the empire research/savings slider; the applier is a small handler and only this field write is modelled from it
9 1 32 1 applied gate loop A (group5, research target, research rate) / research rate
the empire research/savings slider; the applier is a small handler and only this field write is modelled from it
9 2 496 1 applied gate loop A (group5, research target, research rate) / research rate
the empire research/savings slider; the applier is a small handler and only this field write is modelled from it
9 3 512 1 applied gate loop A (group5, research target, research rate) / research rate
the empire research/savings slider; the applier is a small handler and only this field write is modelled from it
10 1 32 1 incomplete list 1 new designs [0]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
10 1 32 1 incomplete list 1 new designs [1]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
10 1 32 1 incomplete list 1 new designs [2]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
12 1 32 1 declined list 3 build orders [0]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
12 1 32 1 declined list 3 build orders [1]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
12 1 32 1 declined list 3 build orders [2]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
12 1 32 1 declined list 3 build orders [3]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
12 1 32 1 declined list 3 build orders [4]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
12 1 32 1 declined list 3 build orders [5]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
12 1 32 1 declined list 3 build orders [6]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
12 1 32 1 declined list 3 build orders [7]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
12 1 32 1 declined list 3 build orders [8]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
12 1 32 1 declined list 3 build orders [9]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
12 1 32 1 declined list 3 build orders [10]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
12 1 32 1 declined list 3 build orders [11]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
12 1 32 1 declined list 3 build orders [12]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
12 1 32 1 declined list 3 build orders [13]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
12 1 32 1 declined list 3 build orders [14]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
12 1 32 1 declined list 3 build orders [15]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
12 1 32 1 declined list 3 build orders [16]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
12 1 32 1 declined list 3 build orders [17]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
12 1 32 1 declined list 3 build orders [18]
ship construction: no phase in this engine builds a ship, so the build queue's ordinal, the maintenance charge, the savings debit and the hull's id allocation all have no model
17 1 32 1 declined list 10 [0]
an unnamed command; its three words fit 'assign these ships to this fleet at this system' and that reading has never been tested
17 1 32 1 declined list 10 [1]
an unnamed command; its three words fit 'assign these ships to this fleet at this system' and that reading has never been tested
17 1 32 1 declined list 10 [2]
an unnamed command; its three words fit 'assign these ships to this fleet at this system' and that reading has never been tested
17 1 32 1 declined list 10 [3]
an unnamed command; its three words fit 'assign these ships to this fleet at this system' and that reading has never been tested
18 1 32 1 incomplete list 12 fleet layouts [0]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
18 1 32 1 incomplete list 12 fleet layouts [1]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
18 1 32 1 incomplete list 12 fleet layouts [2]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
18 1 32 1 incomplete list 12 fleet layouts [3]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
18 1 32 1 incomplete list 12 fleet layouts [4]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
18 1 32 1 incomplete list 12 fleet layouts [5]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
18 1 32 1 incomplete list 12 fleet layouts [6]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
18 1 32 1 incomplete list 12 fleet layouts [7]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
18 1 32 1 incomplete list 12 fleet layouts [8]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
18 1 32 1 incomplete list 12 fleet layouts [9]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
18 1 32 1 incomplete list 12 fleet layouts [10]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
18 1 32 1 incomplete list 12 fleet layouts [11]
the capture recorded this element's presence but not all of its payload; the command is counted and deliberately not applied
20 1 32 1 declined list 14 fleet tasks [0]
a fleet task keyed on (fleet, mode); the two modes' effects are unread, and the fleet it names is the client-allocated one from list 8
20 1 32 1 declined list 14 fleet tasks [1]
a fleet task keyed on (fleet, mode); the two modes' effects are unread, and the fleet it names is the client-allocated one from list 8
20 1 32 1 declined list 14 fleet tasks [2]
a fleet task keyed on (fleet, mode); the two modes' effects are unread, and the fleet it names is the client-allocated one from list 8
20 1 32 1 declined list 14 fleet tasks [3]
a fleet task keyed on (fleet, mode); the two modes' effects are unread, and the fleet it names is the client-allocated one from list 8
20 1 32 1 declined list 14 fleet tasks [4]
a fleet task keyed on (fleet, mode); the two modes' effects are unread, and the fleet it names is the client-allocated one from list 8
20 1 32 1 declined list 14 fleet tasks [5]
a fleet task keyed on (fleet, mode); the two modes' effects are unread, and the fleet it names is the client-allocated one from list 8
20 1 32 1 declined list 14 fleet tasks [6]
a fleet task keyed on (fleet, mode); the two modes' effects are unread, and the fleet it names is the client-allocated one from list 8
20 1 32 1 declined list 14 fleet tasks [7]
a fleet task keyed on (fleet, mode); the two modes' effects are unread, and the fleet it names is the client-allocated one from list 8
23 1 32 1 declined list 7 colonize [0]
colonisation from a named colony ship: the colony formulas exist but the ship-to-planet resolution the command relies on does not
23 1 32 1 declined list 7 colonize [1]
colonisation from a named colony ship: the colony formulas exist but the ship-to-planet resolution the command relies on does not
24 1 32 1 declined list 8 fleet moves [0]
the order names a fleet the input save does not contain -- the client allocates the fleet object AND its id before it submits, and that allocator is unread, so applying a route would move a fleet that does not exist
24 1 32 1 declined list 8 fleet moves [1]
the order names a fleet the input save does not contain -- the client allocates the fleet object AND its id before it submits, and that allocator is unread, so applying a route would move a fleet that does not exist
24 1 32 1 declined list 8 fleet moves [2]
the order names a fleet the input save does not contain -- the client allocates the fleet object AND its id before it submits, and that allocator is unread, so applying a route would move a fleet that does not exist
phases
turn drivers (the milestone's denominator): 16 of 44 modelled, 12 committed
verified 0 implemented 4 partial 8 blocked 4 stub 28
post-combat tail (written to the autosave, tracked separately): 7 of 37 modelled
verified 0 implemented 1 partial 5 blocked 1 stub 30
this run
leaves written 135
leaves NOT written by a blocked phase 119
generator words consumed 16 (state loaded, left untouched)
generator words NOT accounted (never netted off the above):
- encounter detection draws one unit value and one bounded integer per turn on every turn measured (2 words), with no derived rule behind the count -- its bound is the product of the contact and detector counts, so it is left unmodelled
- two draws are downstream of the budget's research allocation -- ProcessResearch's completion Chance and the tech-effect callback's own roll (0 or 1 word each). The allocation needs ComputeBudget's per-system money, which is ComputeOutput with the system's OWN rate sliders; the max-income form of that money is now modelled and self-checked (see T31), but it is NOT the one this path takes
- a successful raid roll may draw one further word to pick its target; no roll succeeded on any measured turn, so the cost of a success is 0 or 1 and undetermined
! the generator advanced during this run but the save keeps its original state (--commit-rng to write it)
! the modelled words are a LOWER BOUND on the turn's cost, so a committed generator is short by the unaccounted sites below and its drawn VALUES are not the game's
wrote /tmp/claude-1000/-home-alex/ec8e34f8-af37-4ef2-a309-ed6a15293097/scratchpad/dt/out/dt-r1-deep.sav (100615 bytes gzipped, 1052288 inflated)

File diff suppressed because it is too large Load diff