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 }, {