The standalone now models the turn's dominant generator cost -- 16 of a measured 18-22 words -- and lands 4 and 2 short of the two calibrated pairs, which is exactly the per-call-site ledger's split for those turns. The state block is byte-identical; only left differs. The answer to 'does it match the oracle' is no, by a stated amount, and tools/rng_oracle_check.py is the instrument that says so. The tail's last phase is modelled for the six turn-record fields recoverable from the wire and checked against the record the game itself archived: 480 fields over 80 player-records, 0 mismatches. It stays blocked; --commit-blocked shows exactly which five fields are missing and what they cost. By-product, and probably worth more than the phase: the stored bankruptcy elimination limit is injective in the maximum-income sum it is built from, so every save states the per-system output term that blocks ComputeBudget. tools/max_income_oracle.py inverts it -- 25 player-records over the corpus -- and recovers the protection factor as 3.3 from the saves rather than from the data files. It also shows the engine's -0.15 divisor disagrees with the game on 6 of those 25. divergence unchanged: 209->204 and 108->103, 5 closed / 0 regressed on both pairs.
51 lines
No EOL
2.1 KiB
JSON
51 lines
No EOL
2.1 KiB
JSON
{
|
|
"binary": "/home/alex/sots-engine-wt-yield/build-host/src/app/sots_turn",
|
|
"pairs": [
|
|
{
|
|
"input": "z2-endturn.sav",
|
|
"oracle": "z2-autosave.sav",
|
|
"note": "ref-turn2, turn 4 -> 5",
|
|
"oracleWords": 20,
|
|
"exit": 0,
|
|
"oracleWordsFromFiles": 20,
|
|
"oracleTwists": 0,
|
|
"ourWords": 16,
|
|
"ourTwists": 0,
|
|
"blockIdentical": true,
|
|
"leftOurs": 379,
|
|
"leftOracle": 375,
|
|
"stateMatches": false,
|
|
"residual": 4,
|
|
"standaloneRngWords": 16,
|
|
"standaloneRngCommitted": true,
|
|
"unaccounted": [
|
|
"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",
|
|
"the research-allocation draw is downstream of the budget, which is blocked on the per-system money output (0 or 1 word)",
|
|
"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"
|
|
]
|
|
},
|
|
{
|
|
"input": "z-t6-endturn.sav",
|
|
"oracle": "z-t6-autosave.sav",
|
|
"note": "ref-turn2, turn 5 -> 6",
|
|
"oracleWords": 18,
|
|
"exit": 0,
|
|
"oracleWordsFromFiles": 18,
|
|
"oracleTwists": 0,
|
|
"ourWords": 16,
|
|
"ourTwists": 0,
|
|
"blockIdentical": true,
|
|
"leftOurs": 359,
|
|
"leftOracle": 357,
|
|
"stateMatches": false,
|
|
"residual": 2,
|
|
"standaloneRngWords": 16,
|
|
"standaloneRngCommitted": true,
|
|
"unaccounted": [
|
|
"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",
|
|
"the research-allocation draw is downstream of the budget, which is blocked on the per-system money output (0 or 1 word)",
|
|
"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"
|
|
]
|
|
}
|
|
]
|
|
} |