The complement to the per-function compare harness. Instead of "did this function's declared outputs match", it asks "is the entire simulation state still identical" -- so no region-declaration mistake can hide from it. Coverage is PROVED, not declared: the digest tree is re-serialised and compared byte-for-byte against the inflated save on every run. When that reconstruction reproduces the stream, the whole file is a function of the digest's inputs. A run that cannot account for the file says so and exits non-zero. This is the direct answer to B4's three hooks that printed "0 diverged" over an empty region set. It localises. The root is the fold of a per-subsystem / per-object tree with named objects, so the known load->re-save delta reports as exactly five leaves -- /Summary/Checksum and four /Sim/players/Player[...]/Status 4->0 -- naming the two Singularity players by id where the raw byte diff could only say "1st of two". One real End Turn reports as 108 fully attributed differences. Float-parity policy is explicit and strict by default (STATE_CHECKSUM.md 3): raw IEEE-754 bits; a `canonical` policy for signed zero and NaN payloads only; and deliberately NO tolerant hashing mode, because quantisation moves the cliff rather than removing it and destroys the roll-up. Tolerance lives in the differ as --ulps, applied after localisation. Corpus census: 0 NaN, 0 -0.0, 0 subnormals across 4,474 float leaves, so the strict default costs nothing today and a test fails the day that changes. Validated on the real saves (verify/results/state-checksum/): 10 files, 4 distinct contents, all STABLE + COVERED; chain record/verify works on the real turn1-3 saves. The VM-driven replay loop is designed (section 5) but UNRUN. Section 3.5 names the one question the host side cannot settle -- whether the turn pipeline depends on x87 intermediate precision -- and the experiment that would: force fpu_cw to 0x027f / 0x127f / 0x137f across End Turn and checksum the three autosaves. Also recorded: Summary.Checksum is NOT a byte sum over the inflated stream nor a sum over the int leaves (both ruled out), so nobody repeats those two. 38 tests; sots-engine untouched, clean_room_check.sh OK.
115 lines
6.4 KiB
Text
115 lines
6.4 KiB
Text
# one real End Turn (turn 2 -> turn 3), every difference named
|
||
|
||
A aa85fe76d412cdb3a0e7e52c8f0ca9e2 /home/alex/sots-re/verify/results/saves/turn2-state.sav
|
||
B 5ac4a24197e82de49f3077cd8dd25fad /home/alex/sots-re/verify/results/saves/turn3-state.sav
|
||
policy: floats=bits mask=none reader=fe5a6f7cd4ae7910
|
||
DIVERGED: 108 leaf difference(s)
|
||
/Summary/Turn: 2 -> 3
|
||
/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/ModCount: 12 -> 24
|
||
/Sim/Frame: 2 -> 3
|
||
/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"]/Sav: 289688 -> 532369
|
||
/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"]/PvSav: 50000 -> 289688
|
||
/Sim/players/Player[16 "re"]/BnkPr: -789323 -> -791290
|
||
/Sim/players/Player[16 "re"]/BnkEl: -1594593 -> -1598566
|
||
/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: 92651 -> 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: 38100 -> 80751
|
||
/Sim/players/Player[32 "Fane Lao"]/BnkPr: -898837 -> -901002
|
||
/Sim/players/Player[32 "Fane Lao"]/BnkEl: -1815833 -> -1820206
|
||
/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/players/Player[496 "Singularity"]/dipstats/.[1]/lastally: 2 -> 3
|
||
/Sim/players/Player[512 "Singularity"]/dipstats/.[1]/lastally: 2 -> 3
|
||
/Sim/players/Player[528 "Alien Menace"]/dipstats/.[1]/lastnap: 2 -> 3
|
||
/Sim/players/Player[528 "Alien Menace"]/dipstats/.[2]/lastnap: 2 -> 3
|
||
/Sim/players/Player[528 "Alien Menace"]/dipstats/.[3]/lastnap: 2 -> 3
|
||
/Sim/players/Player[544 "Peacekeeper Enforcer"]/dipstats/.[1]/lastnap: 2 -> 3
|
||
/Sim/players/Player[544 "Peacekeeper Enforcer"]/dipstats/.[2]/lastnap: 2 -> 3
|
||
/Sim/players/Player[544 "Peacekeeper Enforcer"]/dipstats/.[3]/lastnap: 2 -> 3
|
||
/Sim/players/Player[560 "Von Neumann"]/dipstats/.[1]/lastnap: 2 -> 3
|
||
/Sim/players/Player[560 "Von Neumann"]/dipstats/.[2]/lastnap: 2 -> 3
|
||
/Sim/players/Player[560 "Von Neumann"]/dipstats/.[3]/lastnap: 2 -> 3
|
||
/Sim/players/Player[576 "Independent Colony"]/Sav: 98871 -> 198730
|
||
/Sim/players/Player[576 "Independent Colony"]/PvSav: 0 -> 98871
|
||
/Sim/players/Player[576 "Independent Colony"]/dipstats/.[1]/lastnap: 2 -> 3
|
||
/Sim/players/Player[576 "Independent Colony"]/dipstats/.[2]/lastnap: 2 -> 3
|
||
/Sim/players/Player[576 "Independent Colony"]/dipstats/.[3]/lastnap: 2 -> 3
|
||
/Sim/systems/Sys[64 "Hyperion"]/ltis: 2 -> 3
|
||
/Sim/systems/Sys[64 "Hyperion"]/rcex: 65536 -> 0
|
||
/Sim/systems/Sys[64 "Hyperion"]/TShn: 2 -> 3
|
||
/Sim/systems/Sys[64 "Hyperion"]/ETS: 2 -> 3
|
||
/Sim/systems/Sys[112 "Gamma Cephei"]/Pop2/PopG/PopC: 520000000 -> 540000000
|
||
/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"]/ntdev: 1 -> 2
|
||
/Sim/systems/Sys[112 "Gamma Cephei"]/ltis: 2 -> 3
|
||
/Sim/systems/Sys[112 "Gamma Cephei"]/TShn: 2 -> 3
|
||
/Sim/systems/Sys[112 "Gamma Cephei"]/ETS: 2 -> 3
|
||
/Sim/systems/Sys[224 "Spica"]/TShn: 2 -> 3
|
||
/Sim/systems/Sys[288 "Ke'Dolarra"]/Pop2/PopG/PopC: 520000000 -> 540000000
|
||
/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"]/ntdev: 1 -> 2
|
||
/Sim/systems/Sys[288 "Ke'Dolarra"]/ltis: 2 -> 3
|
||
/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[288 "Ke'Dolarra"]/ETS: 2 -> 3
|
||
/Sim/systems/Sys[304 "Koa’Vo"]/ntdev: 1 -> 2
|
||
/Sim/systems/Sys[304 "Koa’Vo"]/ltis: 2 -> 3
|
||
/Sim/systems/Sys[304 "Koa’Vo"]/rcex: 268435456 -> 0
|
||
/Sim/systems/Sys[304 "Koa’Vo"]/TShn: 2 -> 3
|
||
/Sim/systems/Sys[304 "Koa’Vo"]/ETS: 2 -> 3
|
||
/Sim/systems/Sys[336 "Kaa’Vaalu"]/ltis: 2 -> 3
|
||
/Sim/systems/Sys[336 "Kaa’Vaalu"]/rcex: 65536 -> 0
|
||
/Sim/systems/Sys[336 "Kaa’Vaalu"]/TShn: 2 -> 3
|
||
/Sim/systems/Sys[336 "Kaa’Vaalu"]/ETS: 2 -> 3
|
||
/Sim/systems/Sys[400 "Markab"]/ltis: 2 -> 3
|
||
/Sim/systems/Sys[400 "Markab"]/rcex: 65536 -> 0
|
||
/Sim/systems/Sys[400 "Markab"]/TShn: 2 -> 3
|
||
/Sim/systems/Sys[400 "Markab"]/ETS: 2 -> 3
|
||
/Sim/systems/Sys[448 "Kea’Pono"]/ltis: 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[448 "Kea’Pono"]/ETS: 2 -> 3
|
||
/Sim/systems/Sys[480 "Ko'Rorkor"]/ltis: 2 -> 3
|
||
/Sim/systems/Sys[480 "Ko'Rorkor"]/rcex: 65536 -> 0
|
||
/Sim/systems/Sys[480 "Ko'Rorkor"]/TShn: 2 -> 3
|
||
/Sim/systems/Sys[480 "Ko'Rorkor"]/ETS: 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
|
||
/Sim/SvSctOb/EncObj[5]/Hives/.[1]/NextQ: 31 -> 32
|
||
/Sim/SvSctOb/EncObj[5]/Hives/.[2]/NextQ: 29 -> 30
|
||
floats: 4 differ, 0 within 2 ULP
|