From 58c2cd14b46d3fb32771d1be7f9ce2eaa20df75e Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 8 Sep 2026 13:38:57 -0400 Subject: [PATCH] lane E3: ten addresses for the visibility record, and the standalone's new distance The NVE writer 0x00756300 and its four siblings, `ltis`'s writer 0x00743ec0, the encounter-placement routine whose unserialised field feeds Eid, the tail phase that calls the writer, and the resolution of an indirect edge lane B5 left open -- ServerSystem primary vftable 0x00a2044c slot 7 is 0x007480b0, and it writes only a runtime mask, so it never reaches the wire. None of the ten collides with an address already in the DB (checked against all 714 addressed entries across addresses.json and every fragment); gen_addresses.py validated to a scratch path at 1019 entries, no duplicate names. Standalone report regenerated from the lane worktree: turn1 -> turn2 209 -> 158 closed 51, regressed 0 turn2 -> turn3 108 -> 87 closed 21, regressed 0 Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01ARBgSooAfokKUy6wKUKEyZ --- ghidra/addresses.d/lane-e3.json | 84 ++++++++++ verify/results/standalone/report.txt | 78 ++++++++- verify/results/standalone/status.json | 220 ++++++++++++++++---------- 3 files changed, 294 insertions(+), 88 deletions(-) create mode 100644 ghidra/addresses.d/lane-e3.json diff --git a/ghidra/addresses.d/lane-e3.json b/ghidra/addresses.d/lane-e3.json new file mode 100644 index 0000000..5afbf95 --- /dev/null +++ b/ghidra/addresses.d/lane-e3.json @@ -0,0 +1,84 @@ +{ + "entries": [ + { + "name": "ServerSystem_RecordObservation", + "addr": "0x00756300", + "convention": "thiscall", + "prototype": "void (ServerSystem* this, ServerPlayer* p, int encounterId) // 75 B, ret 8. THE NVE WRITER. if (!p) return; s = (int16)this->owner(+0x10)->Frame(+0x8); rec = NVE_map_at(&this->NVE(+0x284), &p->PlyrIdx(+0x28)); rec[0] = (s<<16)|s; rec[1] = encounterId. The map value is 8 bytes at node+0x10: an UNSERIALISED int16 touch stamp at +0, the saved ETS int16 at +2, the saved Eid int32 at +4 -- so ETS and the touch stamp are both set to the frame here, and only the writer at 0x007536a0 makes them differ. Sole caller is the tail's PlayerView-rebuild phase 0x007cf560, under the gate (AFlags >> PlyrIdx) & 1", + "status": "mapped", + "source": "findings/subsystems/system-visibility-record.md (lane E3 2026-09-08); closes 32+8 leaves in sots-engine on the reference pairs" + }, + { + "name": "ServerSystem_CopyObservationTo", + "addr": "0x007536a0", + "convention": "thiscall", + "prototype": "void (ServerSystem* this, ServerPlayer* p, NveValue* src) // 70 B, ret 8. Intel sharing. rec = NVE_map_at(&this->NVE, &p->PlyrIdx(+0x28)); rec[0] = (hi16(src[0]) << 16) | (int16)this->owner(+0x10)->Frame(+0x8); rec[1] = src[1]. i.e. the receiver gets the DONOR's sighting turn (ETS) and encounter id unchanged, and only the unserialised touch stamp becomes the current frame. Never executed by any save in the corpus: no save has two players in an alliance", + "status": "mapped", + "source": "findings/subsystems/system-visibility-record.md (lane E3 2026-09-08)" + }, + { + "name": "ServerSystem_ShareObservation", + "addr": "0x00754d90", + "convention": "cdecl", + "prototype": "bool (ServerSystem* sys, ServerPlayer* from, ServerPlayer* to) // 96 B. Null-guards all three and from != to; a = FindObservation(from); b = FindObservation(to); if (a && (!b || b->ETS(+2) < a->ETS(+2))) { CopyObservationTo(to, a); return true; } return false. NEWER SIGHTING WINS, compared as a signed int16", + "status": "mapped", + "source": "findings/subsystems/system-visibility-record.md (lane E3 2026-09-08)" + }, + { + "name": "ServerSystem_FindObservation", + "addr": "0x0074d360", + "convention": "thiscall", + "prototype": "NveValue* (ServerSystem* this, ServerPlayer* p) // 58 B, ret 4. Map find on p->PlyrIdx(+0x28); returns node+0x10 (the 8-byte value) or null when the search ended at this->NVE head (+0x284)", + "status": "mapped", + "source": "findings/subsystems/system-visibility-record.md (lane E3 2026-09-08)" + }, + { + "name": "ServerSystem_LastSeenEncounterId", + "addr": "0x0074f830", + "convention": "thiscall", + "prototype": "int (ServerSystem* this, ServerPlayer* p) // 64 B, ret 4. Same map find; returns node+0x14 (Eid) or -1. The extra `!= -0x10` guard is the null-node case reached through node+0x10", + "status": "mapped", + "source": "findings/subsystems/system-visibility-record.md (lane E3 2026-09-08)" + }, + { + "name": "ServerSystem_IsVisibleTo", + "addr": "0x00743fb0", + "convention": "thiscall", + "prototype": "bool (ServerSystem* this, ServerPlayer* p) // 34 B, ret 4. return ((1 << (p->PlyrIdx(+0x28) & 0x1f)) & this->AFlags(+0xd4)) != 0. THE gate on the observation record, on the explored sweep and on the PlayerView rebuild -- AFlags, the DERIVED non-sticky union, not VFlags. 19 callers", + "status": "verified", + "source": "instruction-verified body; combat-retreat-pipeline.md already had AFlags = FFlags|GFlags|isOwner" + }, + { + "name": "ServerSystem_UpdateLastObservedTurn", + "addr": "0x00743ec0", + "convention": "fastcall", + "prototype": "void (ServerSystem* this) // 41 B, WHOLE BODY. if (this->AFlags(+0xd4) != 0) this->ltis(+0x2c8) = this->owner(+0x10)->Frame(+0x8). This is `ltis`'s writer, which board.md recorded as unnamed; it is driver phase 29 (0x007dcbd6, per system). TShn's writer is still unnamed and is demonstrably a DIFFERENT rule: Spica in turn1-state has AFlags == 0 and its TShn moves anyway", + "status": "mapped", + "source": "findings/subsystems/system-visibility-record.md (lane E3 2026-09-08); closes 8 leaves per pair in sots-engine" + }, + { + "name": "ServerSystem_OnExploredChanged", + "addr": "0x007480b0", + "convention": "thiscall", + "prototype": "void (ServerSystem* this, ServerPlayer* p, bool wasSet, bool on) // 71 B, WHOLE BODY. Game::ServerSystem primary vftable 0x00a2044c SLOT 7 -- this RESOLVES the indirect edge lane B5 flagged in SetExploredBy's tail (vft[0x1c]). if (!wasSet && on && this->owner(+0x10)->Frame(+0x8) > 1) { FUN_00747a20(p->PlyrIdx(+0x28), 1); if (p->PlyrIdx < 0xf) this->+0x2a4 |= 1 << (PlyrIdx & 0x1f); } -- +0x2a4 sits past NVs and is NOT in the serialised table, so this edge writes no save state. Note the Frame > 1 guard: turn 1 is special-cased", + "status": "mapped", + "source": "tools/vtable_map.py vt 0xa2044c + decompile (lane E3 2026-09-08); resolves an open item in ghidra/addresses.d/lane-b5.json" + }, + { + "name": "StarSystem_PlaceEncounter", + "addr": "0x007887c0", + "convention": "cdecl", + "prototype": "bool (StarSystem* sys, int encounterId) // 129 B. Refuses unless the system is unowned (FUN_007437e0 == 0), has no planets, sys->+0x184 == -1 and two further tests pass; then sys->+0x184 = encounterId and ORs a mask from the encounter def into sys->+0x19c. sys->+0x184 is the field ServerSystem_RecordObservation copies into Eid. It is constructed to -1 (StarSystem ctor 0x00752ea0, member index 0x61) and IS NOT ON THE WIRE, so a reimplementation has to recover it from the encounter fleet's FtEnc -- which agrees on all six encounter fleets in the corpus and which no save can separate from the real field", + "status": "mapped", + "source": "findings/subsystems/system-visibility-record.md (lane E3 2026-09-08)" + }, + { + "name": "StrategyServer_RebuildPlayerViews", + "addr": "0x007cf560", + "convention": "fastcall", + "prototype": "void (StrategyServer* S) // 948 B, tail phase 17. Four passes: (1) walk the per-(system, player) view tree at S+0x228 and drop entries whose player can no longer see the system, then clear the tree and reset S+0x22c = 0; (2) per player x per system, if IsVisibleTo, FUN_0075f550; (3) per player x per system, if IsVisibleTo, ServerSystem_RecordObservation(sys, player, sys->+0x184) -- byte-decoded at 0x007cf7a7..0x007cf7ce, this is the ONLY caller of the NVE writer outside intel sharing; (4) per system x per player, if IsExploredBy and a colony exists, build a PlayerView via 0x00755ab0/0x007561d0 and apply it. Draw-free", + "status": "mapped", + "source": "findings/subsystems/system-visibility-record.md (lane E3 2026-09-08)" + } + ] +} diff --git a/verify/results/standalone/report.txt b/verify/results/standalone/report.txt index f456306..83c0767 100644 --- a/verify/results/standalone/report.txt +++ b/verify/results/standalone/report.txt @@ -1,37 +1,99 @@ # standalone vs the oracle -generated 2026-09-08T17:23:54Z binary /home/alex/sots-engine-wt-turnrecord/build-host/src/app/sots_turn +generated 2026-09-08T17:37:38Z binary /home/alex/sots-engine-e3/build-host/src/app/sots_turn -phases: 15/44 of the two turn drivers modelled, 9 committed (implemented 3, partial 6, blocked 6, stub 29) - 3/37 of the post-combat tail modelled +phases: 16/44 of the two turn drivers modelled, 10 committed (implemented 4, partial 6, blocked 6, stub 28) + 5/37 of the post-combat tail modelled ## turn1-state.sav -> turn2-state.sav (real End Turn) baseline (do nothing) 209 leaves diverge - after one standalone turn 204 leaves diverge - closed 5, regressed 0, byte match: no + after one standalone turn 158 leaves diverge + closed 51, regressed 0, byte match: no coverage proved on all three saves: {'input': True, 'oracle': True, 'ours': True} closed: + /Sim/Frame + + /Sim/systems/Sys[112 "Gamma Cephei"]/EPid + + /Sim/systems/Sys[112 "Gamma Cephei"]/ETS + + /Sim/systems/Sys[112 "Gamma Cephei"]/Eid + + /Sim/systems/Sys[112 "Gamma Cephei"]/NVE + + /Sim/systems/Sys[112 "Gamma Cephei"]/ltis + /Sim/systems/Sys[112 "Gamma Cephei"]/ntdev + + /Sim/systems/Sys[288 "Ke'Dolarra"]/EPid + + /Sim/systems/Sys[288 "Ke'Dolarra"]/ETS + + /Sim/systems/Sys[288 "Ke'Dolarra"]/Eid + + /Sim/systems/Sys[288 "Ke'Dolarra"]/NVE + + /Sim/systems/Sys[288 "Ke'Dolarra"]/ltis + /Sim/systems/Sys[288 "Ke'Dolarra"]/ntdev + + /Sim/systems/Sys[304 "Koa’Vo"]/EFlags + + /Sim/systems/Sys[304 "Koa’Vo"]/EPid + + /Sim/systems/Sys[304 "Koa’Vo"]/ETS + + /Sim/systems/Sys[304 "Koa’Vo"]/Eid + + /Sim/systems/Sys[304 "Koa’Vo"]/NVE + + /Sim/systems/Sys[304 "Koa’Vo"]/ltis + /Sim/systems/Sys[304 "Koa’Vo"]/ntdev + + /Sim/systems/Sys[336 "Kaa’Vaalu"]/EFlags + + /Sim/systems/Sys[336 "Kaa’Vaalu"]/EPid + + /Sim/systems/Sys[336 "Kaa’Vaalu"]/ETS + + /Sim/systems/Sys[336 "Kaa’Vaalu"]/Eid + + /Sim/systems/Sys[336 "Kaa’Vaalu"]/NVE + + /Sim/systems/Sys[336 "Kaa’Vaalu"]/ltis + + /Sim/systems/Sys[400 "Markab"]/EFlags + + /Sim/systems/Sys[400 "Markab"]/EPid + + /Sim/systems/Sys[400 "Markab"]/ETS + + /Sim/systems/Sys[400 "Markab"]/Eid + + /Sim/systems/Sys[400 "Markab"]/NVE + + /Sim/systems/Sys[400 "Markab"]/ltis + + /Sim/systems/Sys[448 "Kea’Pono"]/EFlags + + /Sim/systems/Sys[448 "Kea’Pono"]/EPid + + /Sim/systems/Sys[448 "Kea’Pono"]/ETS + + /Sim/systems/Sys[448 "Kea’Pono"]/Eid + + /Sim/systems/Sys[448 "Kea’Pono"]/NVE + + /Sim/systems/Sys[448 "Kea’Pono"]/ltis + + /Sim/systems/Sys[480 "Ko'Rorkor"]/EFlags + + /Sim/systems/Sys[480 "Ko'Rorkor"]/EPid + + /Sim/systems/Sys[480 "Ko'Rorkor"]/ETS + + /Sim/systems/Sys[480 "Ko'Rorkor"]/Eid + + /Sim/systems/Sys[480 "Ko'Rorkor"]/NVE + + /Sim/systems/Sys[480 "Ko'Rorkor"]/ltis + + /Sim/systems/Sys[64 "Hyperion"]/EFlags + + /Sim/systems/Sys[64 "Hyperion"]/EPid + + /Sim/systems/Sys[64 "Hyperion"]/ETS + + /Sim/systems/Sys[64 "Hyperion"]/Eid + + /Sim/systems/Sys[64 "Hyperion"]/NVE + + /Sim/systems/Sys[64 "Hyperion"]/ltis + /Summary/Turn ## turn2-state.sav -> turn3-state.sav (real End Turn) baseline (do nothing) 108 leaves diverge - after one standalone turn 103 leaves diverge - closed 5, regressed 0, byte match: no + after one standalone turn 87 leaves diverge + closed 21, regressed 0, byte match: no coverage proved on all three saves: {'input': True, 'oracle': True, 'ours': True} closed: + /Sim/Frame + + /Sim/systems/Sys[112 "Gamma Cephei"]/ETS + + /Sim/systems/Sys[112 "Gamma Cephei"]/ltis + /Sim/systems/Sys[112 "Gamma Cephei"]/ntdev + + /Sim/systems/Sys[288 "Ke'Dolarra"]/ETS + + /Sim/systems/Sys[288 "Ke'Dolarra"]/ltis + /Sim/systems/Sys[288 "Ke'Dolarra"]/ntdev + + /Sim/systems/Sys[304 "Koa’Vo"]/ETS + + /Sim/systems/Sys[304 "Koa’Vo"]/ltis + /Sim/systems/Sys[304 "Koa’Vo"]/ntdev + + /Sim/systems/Sys[336 "Kaa’Vaalu"]/ETS + + /Sim/systems/Sys[336 "Kaa’Vaalu"]/ltis + + /Sim/systems/Sys[400 "Markab"]/ETS + + /Sim/systems/Sys[400 "Markab"]/ltis + + /Sim/systems/Sys[448 "Kea’Pono"]/ETS + + /Sim/systems/Sys[448 "Kea’Pono"]/ltis + + /Sim/systems/Sys[480 "Ko'Rorkor"]/ETS + + /Sim/systems/Sys[480 "Ko'Rorkor"]/ltis + + /Sim/systems/Sys[64 "Hyperion"]/ETS + + /Sim/systems/Sys[64 "Hyperion"]/ltis + /Summary/Turn ## what still differs on the reference pair, by subsystem 82 /Sim/players - 80 /Sim/systems + 34 /Sim/systems 24 /Sim/turnstats 8 /Sim/SvSctOb 1 /Sim/DesignIDs[] diff --git a/verify/results/standalone/status.json b/verify/results/standalone/status.json index 2e29f14..1cb9523 100644 --- a/verify/results/standalone/status.json +++ b/verify/results/standalone/status.json @@ -1,18 +1,18 @@ { "schema": "sots-standalone-status/1", - "generated": "2026-09-08T17:23:54Z", - "binary": "/home/alex/sots-engine-wt-turnrecord/build-host/src/app/sots_turn", + "generated": "2026-09-08T17:37:38Z", + "binary": "/home/alex/sots-engine-e3/build-host/src/app/sots_turn", "reference": { "input": "turn1-state.sav", "oracle": "turn2-state.sav", "baselineDiverging": 209, - "divergingAfterTurn": 204, - "closed": 5, + "divergingAfterTurn": 158, + "closed": 51, "regressed": 0, "byteMatch": false, "subsystems": { "/Sim/players": 82, - "/Sim/systems": 80, + "/Sim/systems": 34, "/Sim/turnstats": 24, "/Sim/SvSctOb": 8, "/Sim/DesignIDs[]": 1, @@ -30,22 +30,22 @@ "phases": { "total": 44, "verified": 0, - "implemented": 3, + "implemented": 4, "partial": 6, "blocked": 6, - "stub": 29, - "modelled": 15, - "committed": 9 + "stub": 28, + "modelled": 16, + "committed": 10 }, "tailPhases": { "total": 37, "verified": 0, "implemented": 1, - "partial": 0, + "partial": 2, "blocked": 2, - "stub": 34, - "modelled": 3, - "committed": 1 + "stub": 32, + "modelled": 5, + "committed": 3 }, "rng": { "wordsModelled": 16, @@ -62,17 +62,16 @@ " 591376 inflated bytes, 0 error(s), 0 warning(s)", " turn 1, frame 1, modCount 0, 8 player(s), 28 system(s), 6 fleet(s)", "roundtrip (untouched): byte-identical (591376 bytes)", - "data: /tmp/claude-1000/-home-alex/ec8e34f8-af37-4ef2-a309-ed6a15293097/scratchpad/data -- 885 section(s) over 7 race(s), 46 load problem(s)", "", "phases", - " turn drivers (the milestone's denominator): 15 of 44 modelled, 9 committed", - " verified 0 implemented 3 partial 6 blocked 6 stub 29", - " post-combat tail (written to the autosave, tracked separately): 3 of 37 modelled", - " verified 0 implemented 1 partial 0 blocked 2 stub 34", + " turn drivers (the milestone's denominator): 16 of 44 modelled, 10 committed", + " verified 0 implemented 4 partial 6 blocked 6 stub 28", + " post-combat tail (written to the autosave, tracked separately): 5 of 37 modelled", + " verified 0 implemented 1 partial 2 blocked 2 stub 32", "", "this run", - " leaves written 7", - " leaves NOT written by a blocked phase 120", + " leaves written 53", + " leaves NOT written by a blocked phase 72", " 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", @@ -81,8 +80,8 @@ " ! 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/tmpbodkynxg/post-turn1-state.sav (65145 bytes gzipped, 591376 inflated)", - "metric -> /tmp/tmpbodkynxg/metric-turn1-state.sav.json" + "wrote /tmp/tmpex18kut6/post-turn1-state.sav (65208 bytes gzipped, 591664 inflated)", + "metric -> /tmp/tmpex18kut6/metric-turn1-state.sav.json" ], "coverage": { "input": true, @@ -92,17 +91,63 @@ "roots": { "input": "64b836b966299d9b72fc02244ed31e31", "oracle": "4bed514f853332b9fa35b388c3aa5558", - "ours": "1acc372b1d410b966ab544dffbe43cb5" + "ours": "d77168aa0a5bd1b8890d8c0f994aed3f" }, "baselineDiverging": 209, - "divergingAfterTurn": 204, - "closed": 5, + "divergingAfterTurn": 158, + "closed": 51, "regressed": 0, "closedPaths": [ "/Sim/Frame", + "/Sim/systems/Sys[112 \"Gamma Cephei\"]/EPid", + "/Sim/systems/Sys[112 \"Gamma Cephei\"]/ETS", + "/Sim/systems/Sys[112 \"Gamma Cephei\"]/Eid", + "/Sim/systems/Sys[112 \"Gamma Cephei\"]/NVE", + "/Sim/systems/Sys[112 \"Gamma Cephei\"]/ltis", "/Sim/systems/Sys[112 \"Gamma Cephei\"]/ntdev", + "/Sim/systems/Sys[288 \"Ke'Dolarra\"]/EPid", + "/Sim/systems/Sys[288 \"Ke'Dolarra\"]/ETS", + "/Sim/systems/Sys[288 \"Ke'Dolarra\"]/Eid", + "/Sim/systems/Sys[288 \"Ke'Dolarra\"]/NVE", + "/Sim/systems/Sys[288 \"Ke'Dolarra\"]/ltis", "/Sim/systems/Sys[288 \"Ke'Dolarra\"]/ntdev", + "/Sim/systems/Sys[304 \"Koa\u2019Vo\"]/EFlags", + "/Sim/systems/Sys[304 \"Koa\u2019Vo\"]/EPid", + "/Sim/systems/Sys[304 \"Koa\u2019Vo\"]/ETS", + "/Sim/systems/Sys[304 \"Koa\u2019Vo\"]/Eid", + "/Sim/systems/Sys[304 \"Koa\u2019Vo\"]/NVE", + "/Sim/systems/Sys[304 \"Koa\u2019Vo\"]/ltis", "/Sim/systems/Sys[304 \"Koa\u2019Vo\"]/ntdev", + "/Sim/systems/Sys[336 \"Kaa\u2019Vaalu\"]/EFlags", + "/Sim/systems/Sys[336 \"Kaa\u2019Vaalu\"]/EPid", + "/Sim/systems/Sys[336 \"Kaa\u2019Vaalu\"]/ETS", + "/Sim/systems/Sys[336 \"Kaa\u2019Vaalu\"]/Eid", + "/Sim/systems/Sys[336 \"Kaa\u2019Vaalu\"]/NVE", + "/Sim/systems/Sys[336 \"Kaa\u2019Vaalu\"]/ltis", + "/Sim/systems/Sys[400 \"Markab\"]/EFlags", + "/Sim/systems/Sys[400 \"Markab\"]/EPid", + "/Sim/systems/Sys[400 \"Markab\"]/ETS", + "/Sim/systems/Sys[400 \"Markab\"]/Eid", + "/Sim/systems/Sys[400 \"Markab\"]/NVE", + "/Sim/systems/Sys[400 \"Markab\"]/ltis", + "/Sim/systems/Sys[448 \"Kea\u2019Pono\"]/EFlags", + "/Sim/systems/Sys[448 \"Kea\u2019Pono\"]/EPid", + "/Sim/systems/Sys[448 \"Kea\u2019Pono\"]/ETS", + "/Sim/systems/Sys[448 \"Kea\u2019Pono\"]/Eid", + "/Sim/systems/Sys[448 \"Kea\u2019Pono\"]/NVE", + "/Sim/systems/Sys[448 \"Kea\u2019Pono\"]/ltis", + "/Sim/systems/Sys[480 \"Ko'Rorkor\"]/EFlags", + "/Sim/systems/Sys[480 \"Ko'Rorkor\"]/EPid", + "/Sim/systems/Sys[480 \"Ko'Rorkor\"]/ETS", + "/Sim/systems/Sys[480 \"Ko'Rorkor\"]/Eid", + "/Sim/systems/Sys[480 \"Ko'Rorkor\"]/NVE", + "/Sim/systems/Sys[480 \"Ko'Rorkor\"]/ltis", + "/Sim/systems/Sys[64 \"Hyperion\"]/EFlags", + "/Sim/systems/Sys[64 \"Hyperion\"]/EPid", + "/Sim/systems/Sys[64 \"Hyperion\"]/ETS", + "/Sim/systems/Sys[64 \"Hyperion\"]/Eid", + "/Sim/systems/Sys[64 \"Hyperion\"]/NVE", + "/Sim/systems/Sys[64 \"Hyperion\"]/ltis", "/Summary/Turn" ], "regressedPaths": [], @@ -152,30 +197,30 @@ "standalone": { "schema": "sots-standalone-metric/1", "input": "/home/alex/sots-re/verify/results/saves/turn1-state.sav", - "output": "/tmp/tmpbodkynxg/post-turn1-state.sav", + "output": "/tmp/tmpex18kut6/post-turn1-state.sav", "spine": { "total": 44, "verified": 0, - "implemented": 3, + "implemented": 4, "partial": 6, "blocked": 6, - "stub": 29, - "modelled": 15, - "committed": 9 + "stub": 28, + "modelled": 16, + "committed": 10 }, "tail": { "total": 37, "verified": 0, "implemented": 1, - "partial": 0, + "partial": 2, "blocked": 2, - "stub": 34, - "modelled": 3, - "committed": 1 + "stub": 32, + "modelled": 5, + "committed": 3 }, "run": { - "leafWrites": 7, - "blockedLeafWrites": 120, + "leafWrites": 53, + "blockedLeafWrites": 72, "rngWords": 16, "rngLoaded": true, "rngCommitted": false, @@ -609,10 +654,10 @@ { "driver": "StrategyServer::ProcessTurn", "id": "S29", - "name": "SystemTailFixup", - "status": "stub", - "ran": 0, - "writes": 0, + "name": "SystemObservedStamp", + "status": "implemented", + "ran": 28, + "writes": 8, "blockedWrites": 0, "rng": 0 }, @@ -810,9 +855,9 @@ "driver": "StrategyServer::OnAllCombatDone_Tail", "id": "T17", "name": "RebuildPlayerViewTree", - "status": "stub", - "ran": 0, - "writes": 0, + "status": "partial", + "ran": 28, + "writes": 32, "blockedWrites": 0, "rng": 0 }, @@ -850,9 +895,9 @@ "driver": "StrategyServer::OnAllCombatDone_Tail", "id": "T21", "name": "UpdateSurveyAndSystemStats", - "status": "stub", - "ran": 0, - "writes": 0, + "status": "partial", + "ran": 28, + "writes": 6, "blockedWrites": 0, "rng": 0 }, @@ -1003,7 +1048,7 @@ "status": "blocked", "ran": 8, "writes": 0, - "blockedWrites": 104, + "blockedWrites": 56, "rng": 0 }, { @@ -1029,17 +1074,16 @@ " 603360 inflated bytes, 0 error(s), 0 warning(s)", " turn 2, frame 2, modCount 12, 8 player(s), 28 system(s), 7 fleet(s)", "roundtrip (untouched): byte-identical (603360 bytes)", - "data: /tmp/claude-1000/-home-alex/ec8e34f8-af37-4ef2-a309-ed6a15293097/scratchpad/data -- 885 section(s) over 7 race(s), 46 load problem(s)", "", "phases", - " turn drivers (the milestone's denominator): 15 of 44 modelled, 9 committed", - " verified 0 implemented 3 partial 6 blocked 6 stub 29", - " post-combat tail (written to the autosave, tracked separately): 3 of 37 modelled", - " verified 0 implemented 1 partial 0 blocked 2 stub 34", + " turn drivers (the milestone's denominator): 16 of 44 modelled, 10 committed", + " verified 0 implemented 4 partial 6 blocked 6 stub 28", + " post-combat tail (written to the autosave, tracked separately): 5 of 37 modelled", + " verified 0 implemented 1 partial 2 blocked 2 stub 32", "", "this run", - " leaves written 7", - " leaves NOT written by a blocked phase 114", + " leaves written 23", + " leaves NOT written by a blocked phase 66", " 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", @@ -1048,8 +1092,8 @@ " ! 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/tmpbodkynxg/post-turn2-state.sav (66883 bytes gzipped, 603360 inflated)", - "metric -> /tmp/tmpbodkynxg/metric-turn2-state.sav.json" + "wrote /tmp/tmpex18kut6/post-turn2-state.sav (66882 bytes gzipped, 603360 inflated)", + "metric -> /tmp/tmpex18kut6/metric-turn2-state.sav.json" ], "coverage": { "input": true, @@ -1059,17 +1103,33 @@ "roots": { "input": "4bed514f853332b9fa35b388c3aa5558", "oracle": "e9c161e311f8ef8fad6f1aa1903dcf3f", - "ours": "22071ae1303f308a93b805e940b626b5" + "ours": "987447a85f9fcded1afd868fca112ef6" }, "baselineDiverging": 108, - "divergingAfterTurn": 103, - "closed": 5, + "divergingAfterTurn": 87, + "closed": 21, "regressed": 0, "closedPaths": [ "/Sim/Frame", + "/Sim/systems/Sys[112 \"Gamma Cephei\"]/ETS", + "/Sim/systems/Sys[112 \"Gamma Cephei\"]/ltis", "/Sim/systems/Sys[112 \"Gamma Cephei\"]/ntdev", + "/Sim/systems/Sys[288 \"Ke'Dolarra\"]/ETS", + "/Sim/systems/Sys[288 \"Ke'Dolarra\"]/ltis", "/Sim/systems/Sys[288 \"Ke'Dolarra\"]/ntdev", + "/Sim/systems/Sys[304 \"Koa\u2019Vo\"]/ETS", + "/Sim/systems/Sys[304 \"Koa\u2019Vo\"]/ltis", "/Sim/systems/Sys[304 \"Koa\u2019Vo\"]/ntdev", + "/Sim/systems/Sys[336 \"Kaa\u2019Vaalu\"]/ETS", + "/Sim/systems/Sys[336 \"Kaa\u2019Vaalu\"]/ltis", + "/Sim/systems/Sys[400 \"Markab\"]/ETS", + "/Sim/systems/Sys[400 \"Markab\"]/ltis", + "/Sim/systems/Sys[448 \"Kea\u2019Pono\"]/ETS", + "/Sim/systems/Sys[448 \"Kea\u2019Pono\"]/ltis", + "/Sim/systems/Sys[480 \"Ko'Rorkor\"]/ETS", + "/Sim/systems/Sys[480 \"Ko'Rorkor\"]/ltis", + "/Sim/systems/Sys[64 \"Hyperion\"]/ETS", + "/Sim/systems/Sys[64 \"Hyperion\"]/ltis", "/Summary/Turn" ], "regressedPaths": [], @@ -1119,30 +1179,30 @@ "standalone": { "schema": "sots-standalone-metric/1", "input": "/home/alex/sots-re/verify/results/saves/turn2-state.sav", - "output": "/tmp/tmpbodkynxg/post-turn2-state.sav", + "output": "/tmp/tmpex18kut6/post-turn2-state.sav", "spine": { "total": 44, "verified": 0, - "implemented": 3, + "implemented": 4, "partial": 6, "blocked": 6, - "stub": 29, - "modelled": 15, - "committed": 9 + "stub": 28, + "modelled": 16, + "committed": 10 }, "tail": { "total": 37, "verified": 0, "implemented": 1, - "partial": 0, + "partial": 2, "blocked": 2, - "stub": 34, - "modelled": 3, - "committed": 1 + "stub": 32, + "modelled": 5, + "committed": 3 }, "run": { - "leafWrites": 7, - "blockedLeafWrites": 114, + "leafWrites": 23, + "blockedLeafWrites": 66, "rngWords": 16, "rngLoaded": true, "rngCommitted": false, @@ -1576,10 +1636,10 @@ { "driver": "StrategyServer::ProcessTurn", "id": "S29", - "name": "SystemTailFixup", - "status": "stub", - "ran": 0, - "writes": 0, + "name": "SystemObservedStamp", + "status": "implemented", + "ran": 28, + "writes": 8, "blockedWrites": 0, "rng": 0 }, @@ -1777,9 +1837,9 @@ "driver": "StrategyServer::OnAllCombatDone_Tail", "id": "T17", "name": "RebuildPlayerViewTree", - "status": "stub", - "ran": 0, - "writes": 0, + "status": "partial", + "ran": 28, + "writes": 8, "blockedWrites": 0, "rng": 0 }, @@ -1817,8 +1877,8 @@ "driver": "StrategyServer::OnAllCombatDone_Tail", "id": "T21", "name": "UpdateSurveyAndSystemStats", - "status": "stub", - "ran": 0, + "status": "partial", + "ran": 28, "writes": 0, "blockedWrites": 0, "rng": 0 @@ -1970,7 +2030,7 @@ "status": "blocked", "ran": 8, "writes": 0, - "blockedWrites": 104, + "blockedWrites": 56, "rng": 0 }, {