diff --git a/campaign/DASHBOARD.md b/campaign/DASHBOARD.md index 1516b3c..ac113c1 100644 --- a/campaign/DASHBOARD.md +++ b/campaign/DASHBOARD.md @@ -1,17 +1,17 @@ # SotS RE campaign — coverage dashboard -Generated 2026-09-08 19:03 UTC · `sots-re` @ a4cc500,2026-09-08 · `sots-engine` @ db99971,2026-09-08 (167 commits) · regenerate with `tools/dashboard.py` +Generated 2026-09-08 19:10 UTC · `sots-re` @ 449daeb,2026-09-08 · `sots-engine` @ eafbc5f,2026-09-08 (171 commits) · regenerate with `tools/dashboard.py` > **North star:** A functional reimplementation of the engine — behavior-equivalent, NOT byte-for-byte ## 1. Map coverage (campaign/board.md) -274 targets · mapped-or-better **246/274** `[█████████░] 90%` · verified **206/274** `[████████░░] 75%` +279 targets · mapped-or-better **251/279** `[█████████░] 90%` · verified **211/279** `[████████░░] 76%` | Status | Count | % | |---|---:|---:| -| verified | 206 | 75% | -| mapped | 40 | 15% | +| verified | 211 | 76% | +| mapped | 40 | 14% | | in-progress | 2 | 1% | | backlog | 24 | 9% | | blocked | 2 | 1% | @@ -21,11 +21,11 @@ Generated 2026-09-08 19:03 UTC · `sots-re` @ a4cc500,2026-09-08 · `sots-engine | objects | 35 | 6 | 0 | 2 | 1 | 44 | | control-flow | 20 | 2 | 0 | 0 | 0 | 22 | | subsystems | 4 | 8 | 0 | 2 | 1 | 15 | -| engine | 22 | 0 | 0 | 0 | 0 | 22 | -| verify | 57 | 14 | 2 | 19 | 0 | 92 | +| engine | 23 | 0 | 0 | 0 | 0 | 23 | +| verify | 58 | 14 | 2 | 19 | 0 | 93 | | phase2 | 13 | 3 | 0 | 0 | 0 | 16 | -| meta | 44 | 6 | 0 | 1 | 0 | 51 | -| other | 11 | 1 | 0 | 0 | 0 | 12 | +| meta | 46 | 6 | 0 | 1 | 0 | 53 | +| other | 12 | 1 | 0 | 0 | 0 | 13 | ## 2. Binary understanding @@ -45,7 +45,7 @@ Generated 2026-09-08 19:03 UTC · `sots-re` @ a4cc500,2026-09-08 · `sots-engine | Module | LOC | Test files | Checks | Wired | Doc | |---|---:|---:|---:|---|---| -| `app` | 2,920 | 6 | 82 | yes | N-output-term.md | +| `app` | 3,116 | 7 | 122 | yes | N-output-term.md | | `game/ai` | 304 | 2 | 66 | yes | — | | `game/combat` | 582 | 2 | 34 | yes | mars-parse.md | | `game/config` | 558 | 4 | 131 | yes | M1.md | @@ -63,9 +63,9 @@ Generated 2026-09-08 19:03 UTC · `sots-re` @ a4cc500,2026-09-08 · `sots-engine | `shim` | 12,606 | 0 | 0 | direct (WIN32) | H-probes.md | | `shim/hooks` | 9,561 | 0 | 0 | direct (WIN32) | M0.md | | `shim/trace` | 2,258 | 9 | 273 | direct (WIN32) | shim-trace.md | -| **total** | **46,608** | **110** | **3756** | | | +| **total** | **46,804** | **111** | **3796** | | | -Board `engine:` rows: verified **22**, mapped 0, in flight 0 (of 22) — verified & merged `[██████████] 100%` +Board `engine:` rows: verified **23**, mapped 0, in flight 0 (of 23) — verified & merged `[██████████] 100%` ## 5. Phase 2 milestones @@ -89,14 +89,14 @@ Turn-driver phases: **16/44** modelled (12 committed) `[████░░░░ Reference pair `turn1-state.sav` → `turn2-state.sav`, leaves localised by `state_checksum.py` (coverage proved by re-serialisation): - baseline (a standalone that does nothing): **209** leaves diverge -- after one standalone turn: **157** leaves diverge — closed 52, regressed 0 -- byte match: ❌ not yet `[██░░░░░░░░] 25%` +- after one standalone turn: **131** leaves diverge — closed 78, regressed 0 +- byte match: ❌ not yet `[████░░░░░░] 37%` Where the remaining divergence lives: | Subsystem | Leaves | |---|---:| -| `/Sim/players` | 81 | +| `/Sim/players` | 55 | | `/Sim/systems` | 34 | | `/Sim/turnstats` | 24 | | `/Sim/SvSctOb` | 8 | @@ -132,11 +132,11 @@ Most recent open: ## 9. Delta since previous dashboard -- verified targets: 198 → 206 (+8) · mapped-or-better: 237 → 246 (+9) -- engine LOC: 44,846 → 46,608 (+1,762) · test files: 109 → 110 (+1) · checks: 3,649 → 3,756 (+107) +- verified targets: 206 → 211 (+5) · mapped-or-better: 246 → 251 (+5) +- engine LOC: 46,608 → 46,804 (+196) · test files: 110 → 111 (+1) · checks: 3,756 → 3,796 (+40) - addresses verified: 1,020 → 1,020 (+0) · recovered layouts: 384 → 384 (+0) · open questions: 26 → 26 (+0) -- standalone leaves closed: 52 → 52 (+0) · leaves still diverging: 157 → 157 (+0) +- standalone leaves closed: 52 → 78 (+26) · leaves still diverging: 157 → 131 (-26) --- warnings: board.md: unknown types subsystems; mars-rng.md: no oracle total row parsed; mars-stream.md: no oracle total row parsed; mars-vfs.md: no oracle total row parsed - + diff --git a/verify/results/standalone/report.txt b/verify/results/standalone/report.txt index aba5c61..fd30594 100644 --- a/verify/results/standalone/report.txt +++ b/verify/results/standalone/report.txt @@ -1,18 +1,44 @@ # standalone vs the oracle -generated 2026-09-08T18:47:54Z binary /home/alex/sots-engine-c3/build-host/src/app/sots_turn +generated 2026-09-08T19:10:01Z binary /srv/re-lab/build/eng-t2/build-host/src/app/sots_turn phases: 16/44 of the two turn drivers modelled, 12 committed (implemented 4, partial 8, blocked 4, 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 157 leaves diverge - closed 52, regressed 0, byte match: no + after one standalone turn 131 leaves diverge + closed 78, regressed 0, byte match: no coverage proved on all three saves: {'input': True, 'oracle': True, 'ours': True} closed: + /Sim/Frame + + /Sim/players/Player[496 "Singularity"]/dipstats/. + + /Sim/players/Player[496 "Singularity"]/dipstats/.[0] + + /Sim/players/Player[496 "Singularity"]/dipstats/.[1] + + /Sim/players/Player[512 "Singularity"]/dipstats/. + + /Sim/players/Player[512 "Singularity"]/dipstats/.[0] + + /Sim/players/Player[512 "Singularity"]/dipstats/.[1] + + /Sim/players/Player[528 "Alien Menace"]/dipstats/. + + /Sim/players/Player[528 "Alien Menace"]/dipstats/.[0] + + /Sim/players/Player[528 "Alien Menace"]/dipstats/.[1] + + /Sim/players/Player[528 "Alien Menace"]/dipstats/.[2] + + /Sim/players/Player[528 "Alien Menace"]/dipstats/.[3] + + /Sim/players/Player[544 "Peacekeeper Enforcer"]/dipstats/. + + /Sim/players/Player[544 "Peacekeeper Enforcer"]/dipstats/.[0] + + /Sim/players/Player[544 "Peacekeeper Enforcer"]/dipstats/.[1] + + /Sim/players/Player[544 "Peacekeeper Enforcer"]/dipstats/.[2] + + /Sim/players/Player[544 "Peacekeeper Enforcer"]/dipstats/.[3] + + /Sim/players/Player[560 "Von Neumann"]/dipstats/. + + /Sim/players/Player[560 "Von Neumann"]/dipstats/.[0] + + /Sim/players/Player[560 "Von Neumann"]/dipstats/.[1] + + /Sim/players/Player[560 "Von Neumann"]/dipstats/.[2] + + /Sim/players/Player[560 "Von Neumann"]/dipstats/.[3] + /Sim/players/Player[576 "Independent Colony"]/Sav + + /Sim/players/Player[576 "Independent Colony"]/dipstats/. + + /Sim/players/Player[576 "Independent Colony"]/dipstats/.[0] + + /Sim/players/Player[576 "Independent Colony"]/dipstats/.[1] + + /Sim/players/Player[576 "Independent Colony"]/dipstats/.[2] + + /Sim/players/Player[576 "Independent Colony"]/dipstats/.[3] + /Sim/systems/Sys[112 "Gamma Cephei"]/EPid + /Sim/systems/Sys[112 "Gamma Cephei"]/ETS + /Sim/systems/Sys[112 "Gamma Cephei"]/Eid @@ -66,12 +92,26 @@ phases: 16/44 of the two turn drivers modelled, 12 committed (implemented 4, par ## turn2-state.sav -> turn3-state.sav (real End Turn) baseline (do nothing) 108 leaves diverge - after one standalone turn 86 leaves diverge - closed 22, regressed 0, byte match: no + after one standalone turn 72 leaves diverge + closed 36, regressed 0, byte match: no coverage proved on all three saves: {'input': True, 'oracle': True, 'ours': True} closed: + /Sim/Frame + + /Sim/players/Player[496 "Singularity"]/dipstats/.[1]/lastally + + /Sim/players/Player[512 "Singularity"]/dipstats/.[1]/lastally + + /Sim/players/Player[528 "Alien Menace"]/dipstats/.[1]/lastnap + + /Sim/players/Player[528 "Alien Menace"]/dipstats/.[2]/lastnap + + /Sim/players/Player[528 "Alien Menace"]/dipstats/.[3]/lastnap + + /Sim/players/Player[544 "Peacekeeper Enforcer"]/dipstats/.[1]/lastnap + + /Sim/players/Player[544 "Peacekeeper Enforcer"]/dipstats/.[2]/lastnap + + /Sim/players/Player[544 "Peacekeeper Enforcer"]/dipstats/.[3]/lastnap + + /Sim/players/Player[560 "Von Neumann"]/dipstats/.[1]/lastnap + + /Sim/players/Player[560 "Von Neumann"]/dipstats/.[2]/lastnap + + /Sim/players/Player[560 "Von Neumann"]/dipstats/.[3]/lastnap + /Sim/players/Player[576 "Independent Colony"]/Sav + + /Sim/players/Player[576 "Independent Colony"]/dipstats/.[1]/lastnap + + /Sim/players/Player[576 "Independent Colony"]/dipstats/.[2]/lastnap + + /Sim/players/Player[576 "Independent Colony"]/dipstats/.[3]/lastnap + /Sim/systems/Sys[112 "Gamma Cephei"]/ETS + /Sim/systems/Sys[112 "Gamma Cephei"]/ltis + /Sim/systems/Sys[112 "Gamma Cephei"]/ntdev @@ -94,7 +134,7 @@ phases: 16/44 of the two turn drivers modelled, 12 committed (implemented 4, par + /Summary/Turn ## what still differs on the reference pair, by subsystem - 81 /Sim/players + 55 /Sim/players 34 /Sim/systems 24 /Sim/turnstats 8 /Sim/SvSctOb diff --git a/verify/results/standalone/status.json b/verify/results/standalone/status.json index 39fbfd8..6260b86 100644 --- a/verify/results/standalone/status.json +++ b/verify/results/standalone/status.json @@ -1,17 +1,17 @@ { "schema": "sots-standalone-status/1", - "generated": "2026-09-08T18:47:54Z", - "binary": "/home/alex/sots-engine-c3/build-host/src/app/sots_turn", + "generated": "2026-09-08T19:10:01Z", + "binary": "/srv/re-lab/build/eng-t2/build-host/src/app/sots_turn", "reference": { "input": "turn1-state.sav", "oracle": "turn2-state.sav", "baselineDiverging": 209, - "divergingAfterTurn": 157, - "closed": 52, + "divergingAfterTurn": 131, + "closed": 78, "regressed": 0, "byteMatch": false, "subsystems": { - "/Sim/players": 81, + "/Sim/players": 55, "/Sim/systems": 34, "/Sim/turnstats": 24, "/Sim/SvSctOb": 8, @@ -58,7 +58,7 @@ "note": "real End Turn", "exit": 0, "stdout": [ - "load: /home/alex/sots-re/verify/results/saves/turn1-state.sav", + "load: /srv/re-lab/build/sre2/verify/results/saves/turn1-state.sav", " 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)", @@ -71,7 +71,7 @@ " verified 0 implemented 1 partial 2 blocked 2 stub 32", "", "this run", - " leaves written 59", + " leaves written 87", " leaves NOT written by a blocked phase 73", " generator words consumed 16 (state loaded, left untouched)", " generator words NOT accounted (never netted off the above):", @@ -81,8 +81,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/tmp3mqpqe52/post-turn1-state.sav (65218 bytes gzipped, 591664 inflated)", - "metric -> /tmp/tmp3mqpqe52/metric-turn1-state.sav.json" + "wrote /tmp/tmpf9f4k25u/post-turn1-state.sav (65970 bytes gzipped, 595192 inflated)", + "metric -> /tmp/tmpf9f4k25u/metric-turn1-state.sav.json" ], "coverage": { "input": true, @@ -92,15 +92,41 @@ "roots": { "input": "64b836b966299d9b72fc02244ed31e31", "oracle": "4bed514f853332b9fa35b388c3aa5558", - "ours": "436ff5f87928966e36bb61318bd0b35f" + "ours": "807894b688ac0c7d06171e2a15ad2b4f" }, "baselineDiverging": 209, - "divergingAfterTurn": 157, - "closed": 52, + "divergingAfterTurn": 131, + "closed": 78, "regressed": 0, "closedPaths": [ "/Sim/Frame", + "/Sim/players/Player[496 \"Singularity\"]/dipstats/.", + "/Sim/players/Player[496 \"Singularity\"]/dipstats/.[0]", + "/Sim/players/Player[496 \"Singularity\"]/dipstats/.[1]", + "/Sim/players/Player[512 \"Singularity\"]/dipstats/.", + "/Sim/players/Player[512 \"Singularity\"]/dipstats/.[0]", + "/Sim/players/Player[512 \"Singularity\"]/dipstats/.[1]", + "/Sim/players/Player[528 \"Alien Menace\"]/dipstats/.", + "/Sim/players/Player[528 \"Alien Menace\"]/dipstats/.[0]", + "/Sim/players/Player[528 \"Alien Menace\"]/dipstats/.[1]", + "/Sim/players/Player[528 \"Alien Menace\"]/dipstats/.[2]", + "/Sim/players/Player[528 \"Alien Menace\"]/dipstats/.[3]", + "/Sim/players/Player[544 \"Peacekeeper Enforcer\"]/dipstats/.", + "/Sim/players/Player[544 \"Peacekeeper Enforcer\"]/dipstats/.[0]", + "/Sim/players/Player[544 \"Peacekeeper Enforcer\"]/dipstats/.[1]", + "/Sim/players/Player[544 \"Peacekeeper Enforcer\"]/dipstats/.[2]", + "/Sim/players/Player[544 \"Peacekeeper Enforcer\"]/dipstats/.[3]", + "/Sim/players/Player[560 \"Von Neumann\"]/dipstats/.", + "/Sim/players/Player[560 \"Von Neumann\"]/dipstats/.[0]", + "/Sim/players/Player[560 \"Von Neumann\"]/dipstats/.[1]", + "/Sim/players/Player[560 \"Von Neumann\"]/dipstats/.[2]", + "/Sim/players/Player[560 \"Von Neumann\"]/dipstats/.[3]", "/Sim/players/Player[576 \"Independent Colony\"]/Sav", + "/Sim/players/Player[576 \"Independent Colony\"]/dipstats/.", + "/Sim/players/Player[576 \"Independent Colony\"]/dipstats/.[0]", + "/Sim/players/Player[576 \"Independent Colony\"]/dipstats/.[1]", + "/Sim/players/Player[576 \"Independent Colony\"]/dipstats/.[2]", + "/Sim/players/Player[576 \"Independent Colony\"]/dipstats/.[3]", "/Sim/systems/Sys[112 \"Gamma Cephei\"]/EPid", "/Sim/systems/Sys[112 \"Gamma Cephei\"]/ETS", "/Sim/systems/Sys[112 \"Gamma Cephei\"]/Eid", @@ -198,8 +224,8 @@ "byteMatch": false, "standalone": { "schema": "sots-standalone-metric/1", - "input": "/home/alex/sots-re/verify/results/saves/turn1-state.sav", - "output": "/tmp/tmp3mqpqe52/post-turn1-state.sav", + "input": "/srv/re-lab/build/sre2/verify/results/saves/turn1-state.sav", + "output": "/tmp/tmpf9f4k25u/post-turn1-state.sav", "spine": { "total": 44, "verified": 0, @@ -221,7 +247,7 @@ "committed": 3 }, "run": { - "leafWrites": 59, + "leafWrites": 87, "blockedLeafWrites": 73, "rngWords": 16, "rngLoaded": true, @@ -243,6 +269,16 @@ "blockedWrites": 0, "rng": 0 }, + { + "driver": "host turn sequence (outside the two turn drivers)", + "id": "H02", + "name": "StampTreatyTurns", + "status": "implemented", + "ran": 14, + "writes": 28, + "blockedWrites": 0, + "rng": 0 + }, { "driver": "StrategyServer::ProcessTurn", "id": "S00", @@ -1072,7 +1108,7 @@ "note": "real End Turn", "exit": 0, "stdout": [ - "load: /home/alex/sots-re/verify/results/saves/turn2-state.sav", + "load: /srv/re-lab/build/sre2/verify/results/saves/turn2-state.sav", " 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)", @@ -1085,7 +1121,7 @@ " verified 0 implemented 1 partial 2 blocked 2 stub 32", "", "this run", - " leaves written 29", + " leaves written 43", " leaves NOT written by a blocked phase 67", " generator words consumed 16 (state loaded, left untouched)", " generator words NOT accounted (never netted off the above):", @@ -1095,8 +1131,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/tmp3mqpqe52/post-turn2-state.sav (66882 bytes gzipped, 603360 inflated)", - "metric -> /tmp/tmp3mqpqe52/metric-turn2-state.sav.json" + "wrote /tmp/tmpf9f4k25u/post-turn2-state.sav (66879 bytes gzipped, 603360 inflated)", + "metric -> /tmp/tmpf9f4k25u/metric-turn2-state.sav.json" ], "coverage": { "input": true, @@ -1106,15 +1142,29 @@ "roots": { "input": "4bed514f853332b9fa35b388c3aa5558", "oracle": "e9c161e311f8ef8fad6f1aa1903dcf3f", - "ours": "5c5eb87437866b1563ff19ba4702ef32" + "ours": "4527034695edf755dbbdbf3605334c3d" }, "baselineDiverging": 108, - "divergingAfterTurn": 86, - "closed": 22, + "divergingAfterTurn": 72, + "closed": 36, "regressed": 0, "closedPaths": [ "/Sim/Frame", + "/Sim/players/Player[496 \"Singularity\"]/dipstats/.[1]/lastally", + "/Sim/players/Player[512 \"Singularity\"]/dipstats/.[1]/lastally", + "/Sim/players/Player[528 \"Alien Menace\"]/dipstats/.[1]/lastnap", + "/Sim/players/Player[528 \"Alien Menace\"]/dipstats/.[2]/lastnap", + "/Sim/players/Player[528 \"Alien Menace\"]/dipstats/.[3]/lastnap", + "/Sim/players/Player[544 \"Peacekeeper Enforcer\"]/dipstats/.[1]/lastnap", + "/Sim/players/Player[544 \"Peacekeeper Enforcer\"]/dipstats/.[2]/lastnap", + "/Sim/players/Player[544 \"Peacekeeper Enforcer\"]/dipstats/.[3]/lastnap", + "/Sim/players/Player[560 \"Von Neumann\"]/dipstats/.[1]/lastnap", + "/Sim/players/Player[560 \"Von Neumann\"]/dipstats/.[2]/lastnap", + "/Sim/players/Player[560 \"Von Neumann\"]/dipstats/.[3]/lastnap", "/Sim/players/Player[576 \"Independent Colony\"]/Sav", + "/Sim/players/Player[576 \"Independent Colony\"]/dipstats/.[1]/lastnap", + "/Sim/players/Player[576 \"Independent Colony\"]/dipstats/.[2]/lastnap", + "/Sim/players/Player[576 \"Independent Colony\"]/dipstats/.[3]/lastnap", "/Sim/systems/Sys[112 \"Gamma Cephei\"]/ETS", "/Sim/systems/Sys[112 \"Gamma Cephei\"]/ltis", "/Sim/systems/Sys[112 \"Gamma Cephei\"]/ntdev", @@ -1174,16 +1224,16 @@ "/Sim/players/Player[32 \"Fane Lao\"]/TechTree/Tbd[106]: 1 -> 2", "/Sim/players/Player[32 \"Fane Lao\"]/lboid: 1 -> 2", "/Sim/players/Player[32 \"Fane Lao\"]/odes/.[1]/otnL: 2 -> 3", - "/Sim/players/Player[496 \"Singularity\"]/dipstats/.[1]/lastally: 2 -> 3", - "/Sim/players/Player[512 \"Singularity\"]/dipstats/.[1]/lastally: 2 -> 3", - "/Sim/players/Player[528 \"Alien Menace\"]/dipstats/.[1]/lastnap: 2 -> 3", - "/Sim/players/Player[528 \"Alien Menace\"]/dipstats/.[2]/lastnap: 2 -> 3" + "/Sim/players/Player[576 \"Independent Colony\"]/PvSav: 0 -> 98871", + "/Sim/systems/Sys[112 \"Gamma Cephei\"]/Pop2/PopG/PopC: 520000000 -> 540000000", + "/Sim/systems/Sys[112 \"Gamma Cephei\"]/PvPop2/PopG/PopC: 500000000 -> 520000000", + "/Sim/systems/Sys[112 \"Gamma Cephei\"]/RepCur: 336360.0 -> 336840.0 [15360 ulp]" ], "byteMatch": false, "standalone": { "schema": "sots-standalone-metric/1", - "input": "/home/alex/sots-re/verify/results/saves/turn2-state.sav", - "output": "/tmp/tmp3mqpqe52/post-turn2-state.sav", + "input": "/srv/re-lab/build/sre2/verify/results/saves/turn2-state.sav", + "output": "/tmp/tmpf9f4k25u/post-turn2-state.sav", "spine": { "total": 44, "verified": 0, @@ -1205,7 +1255,7 @@ "committed": 3 }, "run": { - "leafWrites": 29, + "leafWrites": 43, "blockedLeafWrites": 67, "rngWords": 16, "rngLoaded": true, @@ -1227,6 +1277,16 @@ "blockedWrites": 0, "rng": 0 }, + { + "driver": "host turn sequence (outside the two turn drivers)", + "id": "H02", + "name": "StampTreatyTurns", + "status": "implemented", + "ran": 14, + "writes": 14, + "blockedWrites": 0, + "rng": 0 + }, { "driver": "StrategyServer::ProcessTurn", "id": "S00",