sots-re/tools
lane Y c471a5515f lane Y: the standalone's generator against lane Z's calibrated oracle pairs, and the tail's turn record
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.
2026-09-08 11:40:19 -04:00
..
cache_functions.py lane X: x86 displacement xref scanner; pin sizeof(ObservedTech) and its append site 2026-09-08 04:44:18 -04:00
dashboard.py lane S2: the standalone scaffold, and the measured distance to the byte-match 2026-09-08 10:35:56 -04:00
DASHBOARD_README.md lane S2: the standalone scaffold, and the measured distance to the byte-match 2026-09-08 10:35:56 -04:00
gen_addresses.py gen_addresses: per-lane fragment dir; duplicate names are a hard error 2026-09-08 05:55:03 -04:00
gen_stream_schema.py lane G: wire-schema channel — layouts.json -> generated stream schema for sots-engine 2026-09-08 06:29:30 -04:00
max_income_oracle.py lane Y: the standalone's generator against lane Z's calibrated oracle pairs, and the tail's turn record 2026-09-08 11:40:19 -04:00
reva_call.py reva_call.py: HTTP fallback for Ghidra when the MCP link drops; claim VM140 for recapture lane 2026-09-08 02:12:16 -04:00
rng_ledger_report.py lane Z: the RNG ledger for one strategic turn, measured end to end 2026-09-08 09:45:06 -04:00
rng_oracle_check.py lane Y: the standalone's generator against lane Z's calibrated oracle pairs, and the tail's turn record 2026-09-08 11:40:19 -04:00
rng_site_report.py Z: per-call-site ledger -- every word of a turn attributed, nothing left over 2026-09-08 10:41:54 -04:00
rtti_map.py lane D: automated struct recovery from the IStreamable serializers 2026-09-08 05:51:37 -04:00
serializers.py lane D: automated struct recovery from the IStreamable serializers 2026-09-08 05:51:37 -04:00
serializers_ghidra.py lane D: automated struct recovery from the IStreamable serializers 2026-09-08 05:51:37 -04:00
serializers_golden.py lane D: automated struct recovery from the IStreamable serializers 2026-09-08 05:51:37 -04:00
standalone_report.py lane Y: the standalone's generator against lane Z's calibrated oracle pairs, and the tail's turn record 2026-09-08 11:40:19 -04:00
streams.py lane G: wire-schema channel — layouts.json -> generated stream schema for sots-engine 2026-09-08 06:29:30 -04:00
strfootprint.py lane S: std::string is 0x1c binary-wide; ObservedTech element fully mapped 2026-09-08 05:09:33 -04:00
x86disp.py lane X: x86 displacement xref scanner; pin sizeof(ObservedTech) and its append site 2026-09-08 04:44:18 -04:00