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.
36 lines
1.7 KiB
Text
36 lines
1.7 KiB
Text
# float census -- classes that separate the 'bits' and 'canonical'
|
|
# policies are: negative zero, NaN. Classes an x87 -> SSE port is
|
|
# most likely to move are: subnormal, and anything near FLT_MAX.
|
|
|
|
turn1-state.sav: 1101 float leaves
|
|
576 ordinary e.g. /CreateParams/MapP/.[1]/.[1]/.[0]/.[0]
|
|
275 positive zero e.g. /Summary/Session/TMRS/TQTLE
|
|
192 exact integer e.g. /Summary/Session/TMRS/TCTL
|
|
58 FLT_MAX (0x7f7fffff) e.g. /Summary/Session/TMRS/TSTL
|
|
|
|
turn2-state.sav: 1116 float leaves
|
|
581 ordinary e.g. /CreateParams/MapP/.[1]/.[1]/.[0]/.[0]
|
|
279 positive zero e.g. /Summary/Session/TMRS/TQTLE
|
|
198 exact integer e.g. /Summary/Session/TMRS/TCTL
|
|
58 FLT_MAX (0x7f7fffff) e.g. /Summary/Session/TMRS/TSTL
|
|
|
|
turn3-state.sav: 1141 float leaves
|
|
599 ordinary e.g. /CreateParams/MapP/.[1]/.[1]/.[0]/.[0]
|
|
281 positive zero e.g. /Summary/Session/TMRS/TQTLE
|
|
203 exact integer e.g. /Summary/Session/TMRS/TCTL
|
|
58 FLT_MAX (0x7f7fffff) e.g. /Summary/Session/TMRS/TSTL
|
|
|
|
Autosave EndTurn - turn3.sav: 1116 float leaves
|
|
581 ordinary e.g. /CreateParams/MapP/.[1]/.[1]/.[0]/.[0]
|
|
279 positive zero e.g. /Summary/Session/TMRS/TQTLE
|
|
198 exact integer e.g. /Summary/Session/TMRS/TCTL
|
|
58 FLT_MAX (0x7f7fffff) e.g. /Summary/Session/TMRS/TSTL
|
|
|
|
all distinct saves combined:
|
|
2337 ordinary
|
|
1114 positive zero
|
|
791 exact integer
|
|
232 FLT_MAX (0x7f7fffff)
|
|
|
|
'canonical' would change 0 leaf/leaves across the corpus (a no-op today).
|
|
subnormals: 0 (each one is an x87/SSE parity risk)
|