diff --git a/campaign/DASHBOARD.md b/campaign/DASHBOARD.md index 448d7fa..67b66bf 100644 --- a/campaign/DASHBOARD.md +++ b/campaign/DASHBOARD.md @@ -1,37 +1,37 @@ # SotS RE campaign — coverage dashboard -Generated 2026-09-08 21:01 UTC · `sots-re` @ 9075f60,2026-09-08 · `sots-engine` @ 0117495,2026-09-08 (192 commits) · regenerate with `tools/dashboard.py` +Generated 2026-09-08 22:06 UTC · `sots-re` @ 62b738d,2026-09-08 · `sots-engine` @ 7444c3b,2026-09-08 (194 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) -317 targets · mapped-or-better **284/317** `[█████████░] 90%` · verified **244/317** `[████████░░] 77%` +326 targets · mapped-or-better **293/326** `[█████████░] 90%` · verified **253/326** `[████████░░] 78%` | Status | Count | % | |---|---:|---:| -| verified | 244 | 77% | -| mapped | 40 | 13% | +| verified | 253 | 78% | +| mapped | 40 | 12% | | in-progress | 3 | 1% | | backlog | 28 | 9% | | blocked | 2 | 1% | | Type | verified | mapped | in-progress | backlog | blocked | total | |---|---:|---:|---:|---:|---:|---:| -| objects | 39 | 6 | 0 | 3 | 1 | 49 | +| objects | 40 | 6 | 0 | 3 | 1 | 50 | | control-flow | 23 | 2 | 0 | 0 | 0 | 25 | | subsystems | 4 | 8 | 0 | 2 | 1 | 15 | -| engine | 25 | 0 | 0 | 0 | 0 | 25 | -| verify | 70 | 14 | 3 | 22 | 0 | 109 | +| engine | 26 | 0 | 0 | 0 | 0 | 26 | +| verify | 73 | 14 | 3 | 22 | 0 | 112 | | phase2 | 13 | 3 | 0 | 0 | 0 | 16 | -| meta | 53 | 6 | 0 | 1 | 0 | 60 | +| meta | 57 | 6 | 0 | 1 | 0 | 64 | | other | 17 | 1 | 0 | 0 | 0 | 18 | ## 2. Binary understanding - RTTI type descriptors: **1,924** (`Game::` 1,404, `Mars::` 194; serializable types 179) - Classes with recovered member layouts: **384** / 1,598 named classes `[██░░░░░░░░] 24%` — `objects/layouts.json` (serializer recovery) plus classes recovered by hand in `struct-recovery.md` + `schema-gaps-resolved.md`. Note 179 types are *serializable*; the recovery also reaches non-serializable ones, so this is not a subset of that -- Functions: **41,411** (parsed from `01-fingerprint.md`); named/annotated in the **address contract** (`ghidra/addresses.json`, not Ghidra's full rename count): **1188**, verified **1093** `[█████████░] 92%` +- Functions: **41,411** (parsed from `01-fingerprint.md`); named/annotated in the **address contract** (`ghidra/addresses.json`, not Ghidra's full rename count): **1210**, verified **1100** `[█████████░] 91%` ## 3. Data layer @@ -45,7 +45,7 @@ Generated 2026-09-08 21:01 UTC · `sots-re` @ 9075f60,2026-09-08 · `sots-engine | Module | LOC | Test files | Checks | Wired | Doc | |---|---:|---:|---:|---|---| -| `app` | 4,210 | 8 | 169 | yes | N-output-term.md | +| `app` | 4,231 | 8 | 169 | yes | N-output-term.md | | `game/ai` | 1,197 | 5 | 206 | yes | — | | `game/combat` | 582 | 2 | 34 | yes | mars-parse.md | | `game/config` | 558 | 4 | 131 | yes | M1.md | @@ -54,18 +54,18 @@ Generated 2026-09-08 21:01 UTC · `sots-re` @ 9075f60,2026-09-08 · `sots-engine | `game/effects` | 973 | 3 | 231 | yes | game-effects.md | | `game/events` | 558 | 3 | 152 | yes | E-events.md | | `game/nav` | 581 | 2 | 113 | yes | — | -| `game/sim` | 4,752 | 14 | 1034 | yes | game-sim.md | +| `game/sim` | 4,780 | 14 | 1038 | yes | game-sim.md | | `mars/parse` | 875 | 12 | 277 | yes | mars-parse.md | | `mars/rng` | 244 | 0 | 0 | yes | mars-rng.md | | `mars/stream` | 5,407 | 7 | 310 | yes | mars-stream.md | | `mars/text` | 899 | 8 | 245 | yes | mars-text.md | | `mars/vfs` | 788 | 9 | 140 | yes | mars-vfs.md | -| `shim` | 13,257 | 0 | 0 | direct (WIN32) | H-probes.md | -| `shim/hooks` | 10,204 | 0 | 0 | direct (WIN32) | M0.md | +| `shim` | 13,384 | 0 | 0 | direct (WIN32) | H-probes.md | +| `shim/hooks` | 10,331 | 0 | 0 | direct (WIN32) | M0.md | | `shim/trace` | 2,258 | 9 | 273 | direct (WIN32) | shim-trace.md | -| **total** | **50,620** | **117** | **4080** | | | +| **total** | **50,923** | **117** | **4084** | | | -Board `engine:` rows: verified **25**, mapped 0, in flight 0 (of 25) — verified & merged `[██████████] 100%` +Board `engine:` rows: verified **26**, mapped 0, in flight 0 (of 26) — verified & merged `[██████████] 100%` ## 5. Phase 2 milestones @@ -86,24 +86,24 @@ Turn-driver phases: **16/44** modelled (12 committed) `[████░░░░ | turn drivers (44) | 0 | 4 | 8 | 4 | 28 | | post-combat tail (37) | 0 | 1 | 4 | 1 | 31 | -Reference pair `turn1-state.sav` → `turn2-state.sav`, leaves localised by `state_checksum.py` (coverage proved by re-serialisation): +Reference pair `turn2-state.sav` → `turn3-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: **124** leaves diverge — closed 85, regressed 0 -- byte match: ❌ not yet `[████░░░░░░] 41%` +- baseline (a standalone that does nothing): **108** leaves diverge +- after one standalone turn: **63** leaves diverge — closed 45, regressed 0 +- byte match: ❌ not yet `[████░░░░░░] 42%` Where the remaining divergence lives: | Subsystem | Leaves | |---|---:| -| `/Sim/players` | 52 | -| `/Sim/systems` | 32 | -| `/Sim/turnstats` | 24 | -| `/Sim/SvSctOb` | 6 | -| `/Sim/DesignIDs[]` | 1 | +| `/Sim/systems` | 24 | +| `/Sim/players` | 20 | +| `/Sim/turnstats` | 8 | +| `/Sim/fleets` | 3 | | `/Sim/FleetIDs[]` | 1 | | `/Sim/ModCount` | 1 | | `/Sim/NMnx` | 1 | +| `/Sim/NumFlts` | 1 | Generator: 16 word(s) modelled per turn; unattributed per turn: 18-20 (lane Z, in flight). A byte-match is impossible until that closes — the generator state is saved state. @@ -120,7 +120,7 @@ Detail: `verify/results/standalone/report.txt`. ## 8. Open questions -Open **26** · resolved/parked 11 · backlog items: 1. The engine today 0, 2. The milestone, restated 2, 3. Engine work to Rung A 0, 4. Future engine modules 5, 5. Workloads to manufacture 7, 6. Multiplayer revival 4, 7. Method and infrastructure 5, Parked 2 +Open **26** · resolved/parked 11 · backlog items: 1. The engine today 0, 2. The milestone, restated 3, 3. Engine work to Rung A 0, 4. Future engine modules 5, 5. Workloads to manufacture 7, 6. Multiplayer revival 4, 7. Method and infrastructure 5, Parked 2 Most recent open: @@ -132,11 +132,11 @@ Most recent open: ## 9. Delta since previous dashboard -- verified targets: 223 → 244 (+21) · mapped-or-better: 263 → 284 (+21) -- engine LOC: 48,076 → 50,620 (+2,544) · test files: 113 → 117 (+4) · checks: 3,883 → 4,080 (+197) -- addresses verified: 1,057 → 1,093 (+36) · recovered layouts: 384 → 384 (+0) · open questions: 26 → 26 (+0) -- standalone leaves closed: 78 → 85 (+7) · leaves still diverging: 131 → 124 (-7) +- verified targets: 244 → 253 (+9) · mapped-or-better: 284 → 293 (+9) +- engine LOC: 50,620 → 50,923 (+303) · test files: 117 → 117 (+0) · checks: 4,080 → 4,084 (+4) +- addresses verified: 1,093 → 1,100 (+7) · recovered layouts: 384 → 384 (+0) · open questions: 26 → 26 (+0) +- standalone leaves closed: 85 → 45 (-40) · leaves still diverging: 124 → 63 (-61) --- 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/campaign/board.md b/campaign/board.md index 6a41359..abdf1e1 100644 --- a/campaign/board.md +++ b/campaign/board.md @@ -331,3 +331,4 @@ Status flow: `backlog → in-progress → mapped → verified` (or `blocked`). | DECISION: determinism qualified, Rung B restated, reference pair swapped | meta | verified | high | 100% | 2026-09-08 | Adopted after lane L5's finding. (1) The oracle HOLDS where no AI must choose a target and FAILS where one must - never wrong, measured on the idle turn. (2) This is NOT a contradiction of lockstep MP but the reason for its shape: the AI is a StrategyClient deciding ONCE and relaying commands; the sim is deterministic given the stream. (3) **Canonical reference pair is now turn2-state -> turn3-state** (deterministic, oracle-hashed); turn1 -> turn2 is secondary with its four non-deterministic leaves masked. (4) **Rung B = byte-match given a recorded command stream (--turn-commands)**; a behaviourally-equivalent game/ai is **Rung C**, verified against the distribution of the original's choices. (5) Mechanism inferred, not proved: one-of-three varying suggests a pointer-ordered tie under ASLR rather than a time seed (which would move all three); probe routed to L1. Documented in backlog.md 2 and determinism-oracle.md | | new crew member: re-resolver (Fable) | meta | verified | high | 100% | 2026-09-08 | `~/.claude/agents/re-resolver.md`. Invoked when a lane reports a SURPRISE - a falsified prediction, two lanes contradicting, a closed finding a new measurement qualifies, a number that does not add up, a possibly-perturbing instrument. It does NOT measure: it exonerates-or-indicts the instrument first, lists every standing claim touched (survives / qualified-with-scope / overturned), names the ONE probe that separates the live hypotheses, and sets the course - lane redirects, milestone restatement, a draft rule. Writes findings/resolutions/-.md and PROPOSES board/backlog text rather than editing them. Runs on the planning model. Calibrated on today's five resolutions (ModCount, non-deterministic reference pair, hook perturbation, widened literals, stale build) | | Rung C sharpened: the TIE-SET claim | meta | verified | high | 100% | 2026-09-08 | User's framing adopted: if the AI's variation is a per-process TIE, our engine picks canonically and the verification is "our choice is one of exactly k outcomes the original can produce, we can name all k, and every observed run lands in the set" - stronger than behavioural equivalence, and it keeps the byte-match alive wherever the tiebreaks agree. Lane L4 briefed to capture the varying empire's CANDIDATE SET and arrival order; lane L1 to read the AI client's generator seed across two processes. Between them the mechanism gets named | +| standalone on the CANONICAL pair: 108 -> 63, closed 45, regressed 0 | engine | verified | high | 100% | 2026-09-08 | First measurement on the deterministic reference pair turn2-state -> turn3-state, clean build (rule 24). Byte-match distance on the pair that has the oracle hashes. The secondary pair turn1 -> turn2 reads 209 -> 124 (closed 85) with four leaves the original itself cannot pin. Both are in status.json; the dashboard quotes the canonical one | diff --git a/verify/results/standalone/report.txt b/verify/results/standalone/report.txt index 1415783..24b80f2 100644 --- a/verify/results/standalone/report.txt +++ b/verify/results/standalone/report.txt @@ -1,11 +1,63 @@ # standalone vs the oracle -generated 2026-09-08T21:01:53Z binary /srv/re-lab/build/eng-rep3/build-host/src/app/sots_turn +generated 2026-09-08T22:06:02Z binary /srv/re-lab/build/eng-ref/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) 6/37 of the post-combat tail modelled -## turn1-state.sav -> turn2-state.sav (real End Turn) +## turn2-state.sav -> turn3-state.sav (real End Turn (canonical reference)) + baseline (do nothing) 108 leaves diverge + after one standalone turn 63 leaves diverge + closed 45, regressed 0, byte match: no + coverage proved on all three saves: {'input': True, 'oracle': True, 'ours': True} + closed: + + /Sim/Frame + + /Sim/SvSctOb/EncObj[5]/Hives/.[1]/NextQ + + /Sim/SvSctOb/EncObj[5]/Hives/.[2]/NextQ + + /Sim/players/Player[16 "re"]/BnkEl + + /Sim/players/Player[16 "re"]/PvSav + + /Sim/players/Player[16 "re"]/Sav + + /Sim/players/Player[32 "Fane Lao"]/BnkEl + + /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"]/PvSav + + /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"]/Pop2/PopG/PopC + + /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"]/Pop2/PopG/PopC + + /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 + +## turn1-state.sav -> turn2-state.sav (real End Turn (secondary; 4 leaves non-deterministic in the original)) baseline (do nothing) 209 leaves diverge after one standalone turn 124 leaves diverge closed 85, regressed 0, byte match: no @@ -97,64 +149,11 @@ phases: 16/44 of the two turn drivers modelled, 12 committed (implemented 4, par + /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 63 leaves diverge - closed 45, regressed 0, byte match: no - coverage proved on all three saves: {'input': True, 'oracle': True, 'ours': True} - closed: - + /Sim/Frame - + /Sim/SvSctOb/EncObj[5]/Hives/.[1]/NextQ - + /Sim/SvSctOb/EncObj[5]/Hives/.[2]/NextQ - + /Sim/players/Player[16 "re"]/BnkEl - + /Sim/players/Player[16 "re"]/PvSav - + /Sim/players/Player[16 "re"]/Sav - + /Sim/players/Player[32 "Fane Lao"]/BnkEl - + /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"]/PvSav - + /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"]/Pop2/PopG/PopC - + /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"]/Pop2/PopG/PopC - + /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 - 52 /Sim/players - 32 /Sim/systems - 24 /Sim/turnstats - 6 /Sim/SvSctOb - 1 /Sim/DesignIDs[] + 24 /Sim/systems + 20 /Sim/players + 8 /Sim/turnstats + 3 /Sim/fleets 1 /Sim/FleetIDs[] 1 /Sim/ModCount 1 /Sim/NMnx @@ -162,47 +161,46 @@ phases: 16/44 of the two turn drivers modelled, 12 committed (implemented 4, par 1 /Sim/RNG 1 /Sim/ShipIDs[] 1 /Sim/cmbtid - 1 /Sim/fleets 1 /Summary/Checksum ## first 40 remaining, named - /Sim/DesignIDs[]: removed [], added [18, 1712] (41 -> 43 entries) - /Sim/FleetIDs[]: removed [], added [1744] (6 -> 7 entries) - /Sim/ModCount: 2 -> 12 - /Sim/NMnx: 106 -> 109 - /Sim/NumFlts: 6 -> 7 - /Sim/RNG/.: '' -> '' - /Sim/ShipIDs[]: removed [], added [1728] (15 -> 16 entries) - /Sim/SvSctOb/EncObj[5]/Hives/.: only-in-A - /Sim/SvSctOb/EncObj[5]/Hives/.[0]: only-in-B - /Sim/SvSctOb/EncObj[5]/Hives/.[1]: only-in-B - /Sim/SvSctOb/EncObj[5]/Hives/.[2]: only-in-B - /Sim/SvSctOb/EncObj[6]/did: only-in-B - /Sim/SvSctOb/EncObj[6]/didc: 0 -> 1 - /Sim/cmbtid: 1 -> 2 - /Sim/fleets/Flt[1744 "Alpha Fleet"]: only-in-B - /Sim/players/Player[16 "re"]/BnkPr: -787353 -> -789323 - /Sim/players/Player[16 "re"]/Events/EvNxID: 0 -> 2 - /Sim/players/Player[16 "re"]/Events/Events/.: only-in-A - /Sim/players/Player[16 "re"]/Events/Events/.[0]: only-in-B - /Sim/players/Player[16 "re"]/Events/Events/.[EvTurn=2]: only-in-B - /Sim/players/Player[16 "re"]/Status: 0 -> 4 - /Sim/players/Player[32 "Fane Lao"]/BnkPr: -896580 -> -898837 - /Sim/players/Player[32 "Fane Lao"]/Events/EvNxID: 0 -> 2 - /Sim/players/Player[32 "Fane Lao"]/Events/Events/.: only-in-A - /Sim/players/Player[32 "Fane Lao"]/Events/Events/.[0]: only-in-B - /Sim/players/Player[32 "Fane Lao"]/Events/Events/.[EvTurn=2]: only-in-B - /Sim/players/Player[32 "Fane Lao"]/FNG/FNGNum: 0 -> 1 - /Sim/players/Player[32 "Fane Lao"]/Maint: 0 -> 500 - /Sim/players/Player[32 "Fane Lao"]/NumDes: 5 -> 6 - /Sim/players/Player[32 "Fane Lao"]/PvSav: 50000 -> 38100 - /Sim/players/Player[32 "Fane Lao"]/ResRate: 0.25 -> 0.800000011920929 [1.34218e+07 ulp] - /Sim/players/Player[32 "Fane Lao"]/ResTNm: '' -> 'IND_Waldo' - /Sim/players/Player[32 "Fane Lao"]/Sav: 298113 -> 92651 - /Sim/players/Player[32 "Fane Lao"]/ShipRecs/srb[0]: 0 -> 1 - /Sim/players/Player[32 "Fane Lao"]/ShipRecs/srb[3]: only-in-B - /Sim/players/Player[32 "Fane Lao"]/ShipRecs/srbd: 0 -> 1 - /Sim/players/Player[32 "Fane Lao"]/ShipRecs/src: only-in-B - /Sim/players/Player[32 "Fane Lao"]/ShipRecs/srd: only-in-B - /Sim/players/Player[32 "Fane Lao"]/ShipRecs/sri[0]: 0 -> 1 - /Sim/players/Player[32 "Fane Lao"]/ShipRecs/sri[3]: only-in-B + /Sim/FleetIDs[]: removed [1744], added [34, 1776] (7 -> 8 entries) + /Sim/ModCount: 14 -> 24 + /Sim/NMnx: 109 -> 111 + /Sim/NumFlts: 7 -> 8 + /Sim/RNG/.: '' -> '' + /Sim/ShipIDs[]: removed [], added [1760] (16 -> 17 entries) + /Sim/cmbtid: 2 -> 3 + /Sim/fleets/Flt[1744 "Alpha Fleet"]: only-in-A + /Sim/fleets/Flt[1776 "Gamma Fleet"]: only-in-B + /Sim/fleets/Flt[34 "Beta Fleet"]: only-in-B + /Sim/players/Player[16 "re"]/BnkPr: -789323 -> -791290 + /Sim/players/Player[16 "re"]/Events/EvNxID: 2 -> 3 + /Sim/players/Player[16 "re"]/Events/Events/.[0]: 1 -> 2 + /Sim/players/Player[16 "re"]/Events/Events/.[EvTurn=3]: only-in-B + /Sim/players/Player[32 "Fane Lao"]/BnkPr: -898837 -> -901002 + /Sim/players/Player[32 "Fane Lao"]/Events/EvNxID: 2 -> 4 + /Sim/players/Player[32 "Fane Lao"]/Events/Events/.[0]: 1 -> 2 + /Sim/players/Player[32 "Fane Lao"]/Events/Events/.[EvTurn=3]: only-in-B + /Sim/players/Player[32 "Fane Lao"]/FNG/FNGNum: 1 -> 3 + /Sim/players/Player[32 "Fane Lao"]/Maint: 500 -> 1000 + /Sim/players/Player[32 "Fane Lao"]/PvSav: 92651 -> 80751 + /Sim/players/Player[32 "Fane Lao"]/Sav: 142379 -> 135486 + /Sim/players/Player[32 "Fane Lao"]/ShipRecs/srb[0]: 1 -> 2 + /Sim/players/Player[32 "Fane Lao"]/ShipRecs/srb[3]: 1 -> 2 + /Sim/players/Player[32 "Fane Lao"]/ShipRecs/sri[0]: 1 -> 2 + /Sim/players/Player[32 "Fane Lao"]/ShipRecs/sri[3]: 1 -> 2 + /Sim/players/Player[32 "Fane Lao"]/TechTree/TResDone[106]: 2879 -> 5768 + /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/systems/Sys[112 "Gamma Cephei"]/PvPop2/PopG/PopC: 500000000 -> 520000000 + /Sim/systems/Sys[112 "Gamma Cephei"]/RepCur: 336360.0 -> 336840.0 [15360 ulp] + /Sim/systems/Sys[112 "Gamma Cephei"]/RepMax: 336360.0 -> 336840.0 [15360 ulp] + /Sim/systems/Sys[112 "Gamma Cephei"]/TShn: 2 -> 3 + /Sim/systems/Sys[224 "Spica"]/TShn: 2 -> 3 + /Sim/systems/Sys[288 "Ke'Dolarra"]/DefF: 1744 -> 1776 + /Sim/systems/Sys[288 "Ke'Dolarra"]/Flt: 1744 -> 1776 + /Sim/systems/Sys[288 "Ke'Dolarra"]/PvPop2/PopG/PopC: 500000000 -> 520000000 + /Sim/systems/Sys[288 "Ke'Dolarra"]/RepCur: 370000.0 -> 370520.0 [16640 ulp] + /Sim/systems/Sys[288 "Ke'Dolarra"]/RepMax: 370000.0 -> 370520.0 [16640 ulp] diff --git a/verify/results/standalone/status.json b/verify/results/standalone/status.json index 753cb77..e3b4c57 100644 --- a/verify/results/standalone/status.json +++ b/verify/results/standalone/status.json @@ -1,22 +1,21 @@ { "schema": "sots-standalone-status/1", - "generated": "2026-09-08T21:01:53Z", - "binary": "/srv/re-lab/build/eng-rep3/build-host/src/app/sots_turn", + "generated": "2026-09-08T22:06:02Z", + "binary": "/srv/re-lab/build/eng-ref/build-host/src/app/sots_turn", "engineArgs": [], "reference": { - "input": "turn1-state.sav", - "oracle": "turn2-state.sav", - "baselineDiverging": 209, - "divergingAfterTurn": 124, - "closed": 85, + "input": "turn2-state.sav", + "oracle": "turn3-state.sav", + "baselineDiverging": 108, + "divergingAfterTurn": 63, + "closed": 45, "regressed": 0, "byteMatch": false, "subsystems": { - "/Sim/players": 52, - "/Sim/systems": 32, - "/Sim/turnstats": 24, - "/Sim/SvSctOb": 6, - "/Sim/DesignIDs[]": 1, + "/Sim/systems": 24, + "/Sim/players": 20, + "/Sim/turnstats": 8, + "/Sim/fleets": 3, "/Sim/FleetIDs[]": 1, "/Sim/ModCount": 1, "/Sim/NMnx": 1, @@ -24,7 +23,6 @@ "/Sim/RNG": 1, "/Sim/ShipIDs[]": 1, "/Sim/cmbtid": 1, - "/Sim/fleets": 1, "/Summary/Checksum": 1 } }, @@ -53,1082 +51,14 @@ "wordsPerTurnUnattributed": "18-20 (lane Z, in flight)" }, "pairs": [ - { - "input": "turn1-state.sav", - "oracle": "turn2-state.sav", - "note": "real End Turn", - "engineArgs": [], - "exit": 0, - "stdout": [ - "load: /srv/re-lab/build/sre4/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)", - "data: no root given (--data DIR / $SOTS_DATA_DIR); the tail's ship census stays unmodelled", - "", - "phases", - " turn drivers (the milestone's denominator): 16 of 44 modelled, 12 committed", - " verified 0 implemented 4 partial 8 blocked 4 stub 28", - " post-combat tail (written to the autosave, tracked separately): 6 of 37 modelled", - " verified 0 implemented 1 partial 4 blocked 1 stub 31", - "", - "this run", - " leaves written 93", - " leaves NOT written by a blocked phase 96", - " 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", - " - two draws are downstream of the budget's research allocation -- ProcessResearch's completion Chance and the tech-effect callback's own roll (0 or 1 word each). The allocation needs ComputeBudget's per-system money, which is ComputeOutput with the system's OWN rate sliders; the max-income form of that money is now modelled and self-checked (see T31), but it is NOT the one this path takes", - " - 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", - " ! 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/tmpz2xrayx3/post-turn1-state.sav (65980 bytes gzipped, 595192 inflated)", - "metric -> /tmp/tmpz2xrayx3/metric-turn1-state.sav.json" - ], - "coverage": { - "input": true, - "oracle": true, - "ours": true - }, - "roots": { - "input": "64b836b966299d9b72fc02244ed31e31", - "oracle": "4bed514f853332b9fa35b388c3aa5558", - "ours": "9f767c16c83cfa6c653b51a3bd027659" - }, - "baselineDiverging": 209, - "divergingAfterTurn": 124, - "closed": 85, - "regressed": 0, - "closedPaths": [ - "/Sim/Frame", - "/Sim/SvSctOb/EncObj[3]/CDiff", - "/Sim/SvSctOb/EncObj[6]/ini", - "/Sim/players/Player[16 \"re\"]/BnkEl", - "/Sim/players/Player[16 \"re\"]/Sav", - "/Sim/players/Player[32 \"Fane Lao\"]/BnkEl", - "/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", - "/Sim/systems/Sys[112 \"Gamma Cephei\"]/NVE", - "/Sim/systems/Sys[112 \"Gamma Cephei\"]/Pop2/PopG/PopC", - "/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\"]/Pop2/PopG/PopC", - "/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": [], - "remainingSample": [ - "/Sim/DesignIDs[]: removed [], added [18, 1712] (41 -> 43 entries)", - "/Sim/FleetIDs[]: removed [], added [1744] (6 -> 7 entries)", - "/Sim/ModCount: 2 -> 12", - "/Sim/NMnx: 106 -> 109", - "/Sim/NumFlts: 6 -> 7", - "/Sim/RNG/.: '' -> ''", - "/Sim/ShipIDs[]: removed [], added [1728] (15 -> 16 entries)", - "/Sim/SvSctOb/EncObj[5]/Hives/.: only-in-A", - "/Sim/SvSctOb/EncObj[5]/Hives/.[0]: only-in-B", - "/Sim/SvSctOb/EncObj[5]/Hives/.[1]: only-in-B", - "/Sim/SvSctOb/EncObj[5]/Hives/.[2]: only-in-B", - "/Sim/SvSctOb/EncObj[6]/did: only-in-B", - "/Sim/SvSctOb/EncObj[6]/didc: 0 -> 1", - "/Sim/cmbtid: 1 -> 2", - "/Sim/fleets/Flt[1744 \"Alpha Fleet\"]: only-in-B", - "/Sim/players/Player[16 \"re\"]/BnkPr: -787353 -> -789323", - "/Sim/players/Player[16 \"re\"]/Events/EvNxID: 0 -> 2", - "/Sim/players/Player[16 \"re\"]/Events/Events/.: only-in-A", - "/Sim/players/Player[16 \"re\"]/Events/Events/.[0]: only-in-B", - "/Sim/players/Player[16 \"re\"]/Events/Events/.[EvTurn=2]: only-in-B", - "/Sim/players/Player[16 \"re\"]/Status: 0 -> 4", - "/Sim/players/Player[32 \"Fane Lao\"]/BnkPr: -896580 -> -898837", - "/Sim/players/Player[32 \"Fane Lao\"]/Events/EvNxID: 0 -> 2", - "/Sim/players/Player[32 \"Fane Lao\"]/Events/Events/.: only-in-A", - "/Sim/players/Player[32 \"Fane Lao\"]/Events/Events/.[0]: only-in-B", - "/Sim/players/Player[32 \"Fane Lao\"]/Events/Events/.[EvTurn=2]: only-in-B", - "/Sim/players/Player[32 \"Fane Lao\"]/FNG/FNGNum: 0 -> 1", - "/Sim/players/Player[32 \"Fane Lao\"]/Maint: 0 -> 500", - "/Sim/players/Player[32 \"Fane Lao\"]/NumDes: 5 -> 6", - "/Sim/players/Player[32 \"Fane Lao\"]/PvSav: 50000 -> 38100", - "/Sim/players/Player[32 \"Fane Lao\"]/ResRate: 0.25 -> 0.800000011920929 [1.34218e+07 ulp]", - "/Sim/players/Player[32 \"Fane Lao\"]/ResTNm: '' -> 'IND_Waldo'", - "/Sim/players/Player[32 \"Fane Lao\"]/Sav: 298113 -> 92651", - "/Sim/players/Player[32 \"Fane Lao\"]/ShipRecs/srb[0]: 0 -> 1", - "/Sim/players/Player[32 \"Fane Lao\"]/ShipRecs/srb[3]: only-in-B", - "/Sim/players/Player[32 \"Fane Lao\"]/ShipRecs/srbd: 0 -> 1", - "/Sim/players/Player[32 \"Fane Lao\"]/ShipRecs/src: only-in-B", - "/Sim/players/Player[32 \"Fane Lao\"]/ShipRecs/srd: only-in-B", - "/Sim/players/Player[32 \"Fane Lao\"]/ShipRecs/sri[0]: 0 -> 1", - "/Sim/players/Player[32 \"Fane Lao\"]/ShipRecs/sri[3]: only-in-B" - ], - "byteMatch": false, - "standalone": { - "schema": "sots-standalone-metric/1", - "input": "/srv/re-lab/build/sre4/verify/results/saves/turn1-state.sav", - "output": "/tmp/tmpz2xrayx3/post-turn1-state.sav", - "spine": { - "total": 44, - "verified": 0, - "implemented": 4, - "partial": 8, - "blocked": 4, - "stub": 28, - "modelled": 16, - "committed": 12 - }, - "tail": { - "total": 37, - "verified": 0, - "implemented": 1, - "partial": 4, - "blocked": 1, - "stub": 31, - "modelled": 6, - "committed": 5 - }, - "run": { - "leafWrites": 93, - "blockedLeafWrites": 96, - "rngWords": 16, - "rngLoaded": true, - "rngCommitted": false, - "rngUnaccounted": [ - "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", - "two draws are downstream of the budget's research allocation -- ProcessResearch's completion Chance and the tech-effect callback's own roll (0 or 1 word each). The allocation needs ComputeBudget's per-system money, which is ComputeOutput with the system's OWN rate sliders; the max-income form of that money is now modelled and self-checked (see T31), but it is NOT the one this path takes", - "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" - ] - }, - "phases": [ - { - "driver": "host turn sequence (outside the two turn drivers)", - "id": "H00", - "name": "BeginProcessTurn", - "status": "implemented", - "ran": 1, - "writes": 1, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "host turn sequence (outside the two turn drivers)", - "id": "H03", - "name": "ScriptHookTurnBegin", - "status": "partial", - "ran": 2, - "writes": 1, - "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", - "name": "SnapshotPreviousTurn", - "status": "partial", - "ran": 9, - "writes": 1, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S01", - "name": "SystemPrePassMoraleAndAbandon", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S02", - "name": "TradeManagerTurn", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S03", - "name": "RegisterTradeSystems", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S04", - "name": "RebuildAllianceMasks", - "status": "implemented", - "ran": 8, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S05", - "name": "BuildShipActionTypeSets", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S06", - "name": "ShipActionsExceptType2", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S07", - "name": "NodeSpaceTravel", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S08", - "name": "FleetMovement", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S09", - "name": "ShipActionsType2", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S10", - "name": "ShipUpkeep", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S11", - "name": "SystemTurn", - "status": "partial", - "ran": 28, - "writes": 5, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S12", - "name": "TradeSliderFinalisation", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S13", - "name": "PlayerTurn", - "status": "partial", - "ran": 8, - "writes": 3, - "blockedWrites": 19, - "rng": 0 - }, - { - "driver": "ServerPlayer::ProcessTurn", - "id": "P01", - "name": "ComputeBudget", - "status": "partial", - "ran": 8, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "ServerPlayer::ProcessTurn", - "id": "P02", - "name": "ApplyNetToSavings", - "status": "partial", - "ran": 0, - "writes": 3, - "blockedWrites": 3, - "rng": 0 - }, - { - "driver": "ServerPlayer::ProcessTurn", - "id": "P03", - "name": "RecordBudgetDerivedFields", - "status": "blocked", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "ServerPlayer::ProcessTurn", - "id": "P04", - "name": "ProcessSpecialProjectsSpend", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "ServerPlayer::ProcessTurn", - "id": "P05", - "name": "ProcessResearch", - "status": "blocked", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "ServerPlayer::ProcessTurn", - "id": "P06", - "name": "ResearchRefund", - "status": "blocked", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "ServerPlayer::ProcessTurn", - "id": "P07", - "name": "ClearTimedResearchAccumulators", - "status": "partial", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "ServerPlayer::ProcessTurn", - "id": "P08", - "name": "DecayRebellionOutputModifier", - "status": "implemented", - "ran": 2, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "ServerPlayer::ProcessTurn", - "id": "P09", - "name": "AccumulateTimedResearchBonuses", - "status": "implemented", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "ServerPlayer::ProcessTurn", - "id": "P10", - "name": "ConsumeResearchRollPending", - "status": "partial", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "ServerPlayer::ProcessTurn", - "id": "P11", - "name": "PostNoResearchEvent", - "status": "blocked", - "ran": 4, - "writes": 0, - "blockedWrites": 16, - "rng": 0 - }, - { - "driver": "ServerPlayer::ProcessTurn", - "id": "P12", - "name": "PruneRaidTargets", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S14", - "name": "ProcessMissions", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S15", - "name": "ProcessStations", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S16", - "name": "ProcessDefenceSats", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S17", - "name": "ShipStatCacheRefresh", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S18", - "name": "ShipActionsForceValidate", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S19", - "name": "ProcessAid", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S20", - "name": "ProcessSpecialProjectsServer", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S21", - "name": "ProcessSurrenders", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S22", - "name": "AdvanceAIRebellion", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S23", - "name": "ScriptHookTurnStart", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S24", - "name": "SensorUpdate", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S25", - "name": "ScriptHookPostSensor", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S26", - "name": "RefreshPlayerViews", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S27", - "name": "RecomputePlayerReports", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S28", - "name": "GrantMetSpeciesTechs", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S29", - "name": "SystemObservedStamp", - "status": "implemented", - "ran": 28, - "writes": 8, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S30", - "name": "BuildTeamPartition", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::ProcessTurn", - "id": "S31", - "name": "EncounterDetectionAndStatusRestore", - "status": "partial", - "ran": 8, - "writes": 0, - "blockedWrites": 2, - "rng": 16 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T00", - "name": "IncrementModCount", - "status": "implemented", - "ran": 1, - "writes": 1, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T01", - "name": "ValidateEncounterResultArity", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T02", - "name": "ResolveFirstContact", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T03", - "name": "AnnounceEncounterSightings", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T04", - "name": "TallyBattlesFought", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T05", - "name": "UpdateDiplomacyStatsFromCombat", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T06", - "name": "ApplyEncounterResults", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T07", - "name": "ClearEncounters", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T08", - "name": "ScriptHookCombatDone", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T09", - "name": "AdvanceAIRebellionPostCombat", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T10", - "name": "NodeSpaceTravelSecondPass", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T11", - "name": "DecayNodeLines", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T12", - "name": "DrainColonyLossQueue", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T13", - "name": "UpdateTreasuryMorale", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T14", - "name": "UpdateForeignFleetMorale", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T15", - "name": "ProcessBankruptcy", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T16", - "name": "ResolveArrivedColonizers", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T17", - "name": "RebuildPlayerViewTree", - "status": "partial", - "ran": 28, - "writes": 32, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T18", - "name": "PostFleetWarnings", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T19", - "name": "DrainInfraTerraformQueue", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T20", - "name": "ScriptHooksTurnEnd", - "status": "partial", - "ran": 1, - "writes": 1, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T21", - "name": "UpdateSurveyAndSystemStats", - "status": "partial", - "ran": 28, - "writes": 6, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T22", - "name": "TradeSliderFinalisationSecondPass", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T23", - "name": "TradeManagerEndOfTurnHooks", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T24", - "name": "RecomputeMaintenanceAndResearchBonus", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T25", - "name": "SensorUpdateSecondPass", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T26", - "name": "ScriptHookPostSensorTail", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T27", - "name": "RefreshPlayerViewsSecondPass", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T28", - "name": "UpdateNodeLineSightingMasks", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T29", - "name": "AbortInvisibleInterceptOrders", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T30", - "name": "RebuildCommunicationMasks", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T31", - "name": "UpdateBankruptcyLimits", - "status": "partial", - "ran": 8, - "writes": 2, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T32", - "name": "PostIncomingFleetWarnings", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T33", - "name": "ShipManagerEndOfTurnHooks", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T34", - "name": "RecordObservedDesigns", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T35", - "name": "RebuildPlayerReports", - "status": "stub", - "ran": 0, - "writes": 0, - "blockedWrites": 0, - "rng": 0 - }, - { - "driver": "StrategyServer::OnAllCombatDone_Tail", - "id": "T36", - "name": "FinalizeTurnRecords", - "status": "blocked", - "ran": 8, - "writes": 0, - "blockedWrites": 56, - "rng": 0 - }, - { - "driver": "host turn sequence (outside the two turn drivers)", - "id": "H01", - "name": "SaveWriterInvariants", - "status": "implemented", - "ran": 1, - "writes": 1, - "blockedWrites": 0, - "rng": 0 - } - ] - } - }, { "input": "turn2-state.sav", "oracle": "turn3-state.sav", - "note": "real End Turn", + "note": "real End Turn (canonical reference)", "engineArgs": [], "exit": 0, "stdout": [ - "load: /srv/re-lab/build/sre4/verify/results/saves/turn2-state.sav", + "load: /srv/re-lab/build/sre5/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)", @@ -1151,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/tmpz2xrayx3/post-turn2-state.sav (66882 bytes gzipped, 603360 inflated)", - "metric -> /tmp/tmpz2xrayx3/metric-turn2-state.sav.json" + "wrote /tmp/tmpf0cd3n4p/post-turn2-state.sav (66882 bytes gzipped, 603360 inflated)", + "metric -> /tmp/tmpf0cd3n4p/metric-turn2-state.sav.json" ], "coverage": { "input": true, @@ -1261,8 +191,8 @@ "byteMatch": false, "standalone": { "schema": "sots-standalone-metric/1", - "input": "/srv/re-lab/build/sre4/verify/results/saves/turn2-state.sav", - "output": "/tmp/tmpz2xrayx3/post-turn2-state.sav", + "input": "/srv/re-lab/build/sre5/verify/results/saves/turn2-state.sav", + "output": "/tmp/tmpf0cd3n4p/post-turn2-state.sav", "spine": { "total": 44, "verified": 0, @@ -2148,6 +1078,1074 @@ } ] } + }, + { + "input": "turn1-state.sav", + "oracle": "turn2-state.sav", + "note": "real End Turn (secondary; 4 leaves non-deterministic in the original)", + "engineArgs": [], + "exit": 0, + "stdout": [ + "load: /srv/re-lab/build/sre5/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)", + "data: no root given (--data DIR / $SOTS_DATA_DIR); the tail's ship census stays unmodelled", + "", + "phases", + " turn drivers (the milestone's denominator): 16 of 44 modelled, 12 committed", + " verified 0 implemented 4 partial 8 blocked 4 stub 28", + " post-combat tail (written to the autosave, tracked separately): 6 of 37 modelled", + " verified 0 implemented 1 partial 4 blocked 1 stub 31", + "", + "this run", + " leaves written 93", + " leaves NOT written by a blocked phase 96", + " 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", + " - two draws are downstream of the budget's research allocation -- ProcessResearch's completion Chance and the tech-effect callback's own roll (0 or 1 word each). The allocation needs ComputeBudget's per-system money, which is ComputeOutput with the system's OWN rate sliders; the max-income form of that money is now modelled and self-checked (see T31), but it is NOT the one this path takes", + " - 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", + " ! 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/tmpf0cd3n4p/post-turn1-state.sav (65980 bytes gzipped, 595192 inflated)", + "metric -> /tmp/tmpf0cd3n4p/metric-turn1-state.sav.json" + ], + "coverage": { + "input": true, + "oracle": true, + "ours": true + }, + "roots": { + "input": "64b836b966299d9b72fc02244ed31e31", + "oracle": "4bed514f853332b9fa35b388c3aa5558", + "ours": "9f767c16c83cfa6c653b51a3bd027659" + }, + "baselineDiverging": 209, + "divergingAfterTurn": 124, + "closed": 85, + "regressed": 0, + "closedPaths": [ + "/Sim/Frame", + "/Sim/SvSctOb/EncObj[3]/CDiff", + "/Sim/SvSctOb/EncObj[6]/ini", + "/Sim/players/Player[16 \"re\"]/BnkEl", + "/Sim/players/Player[16 \"re\"]/Sav", + "/Sim/players/Player[32 \"Fane Lao\"]/BnkEl", + "/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", + "/Sim/systems/Sys[112 \"Gamma Cephei\"]/NVE", + "/Sim/systems/Sys[112 \"Gamma Cephei\"]/Pop2/PopG/PopC", + "/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\"]/Pop2/PopG/PopC", + "/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": [], + "remainingSample": [ + "/Sim/DesignIDs[]: removed [], added [18, 1712] (41 -> 43 entries)", + "/Sim/FleetIDs[]: removed [], added [1744] (6 -> 7 entries)", + "/Sim/ModCount: 2 -> 12", + "/Sim/NMnx: 106 -> 109", + "/Sim/NumFlts: 6 -> 7", + "/Sim/RNG/.: '' -> ''", + "/Sim/ShipIDs[]: removed [], added [1728] (15 -> 16 entries)", + "/Sim/SvSctOb/EncObj[5]/Hives/.: only-in-A", + "/Sim/SvSctOb/EncObj[5]/Hives/.[0]: only-in-B", + "/Sim/SvSctOb/EncObj[5]/Hives/.[1]: only-in-B", + "/Sim/SvSctOb/EncObj[5]/Hives/.[2]: only-in-B", + "/Sim/SvSctOb/EncObj[6]/did: only-in-B", + "/Sim/SvSctOb/EncObj[6]/didc: 0 -> 1", + "/Sim/cmbtid: 1 -> 2", + "/Sim/fleets/Flt[1744 \"Alpha Fleet\"]: only-in-B", + "/Sim/players/Player[16 \"re\"]/BnkPr: -787353 -> -789323", + "/Sim/players/Player[16 \"re\"]/Events/EvNxID: 0 -> 2", + "/Sim/players/Player[16 \"re\"]/Events/Events/.: only-in-A", + "/Sim/players/Player[16 \"re\"]/Events/Events/.[0]: only-in-B", + "/Sim/players/Player[16 \"re\"]/Events/Events/.[EvTurn=2]: only-in-B", + "/Sim/players/Player[16 \"re\"]/Status: 0 -> 4", + "/Sim/players/Player[32 \"Fane Lao\"]/BnkPr: -896580 -> -898837", + "/Sim/players/Player[32 \"Fane Lao\"]/Events/EvNxID: 0 -> 2", + "/Sim/players/Player[32 \"Fane Lao\"]/Events/Events/.: only-in-A", + "/Sim/players/Player[32 \"Fane Lao\"]/Events/Events/.[0]: only-in-B", + "/Sim/players/Player[32 \"Fane Lao\"]/Events/Events/.[EvTurn=2]: only-in-B", + "/Sim/players/Player[32 \"Fane Lao\"]/FNG/FNGNum: 0 -> 1", + "/Sim/players/Player[32 \"Fane Lao\"]/Maint: 0 -> 500", + "/Sim/players/Player[32 \"Fane Lao\"]/NumDes: 5 -> 6", + "/Sim/players/Player[32 \"Fane Lao\"]/PvSav: 50000 -> 38100", + "/Sim/players/Player[32 \"Fane Lao\"]/ResRate: 0.25 -> 0.800000011920929 [1.34218e+07 ulp]", + "/Sim/players/Player[32 \"Fane Lao\"]/ResTNm: '' -> 'IND_Waldo'", + "/Sim/players/Player[32 \"Fane Lao\"]/Sav: 298113 -> 92651", + "/Sim/players/Player[32 \"Fane Lao\"]/ShipRecs/srb[0]: 0 -> 1", + "/Sim/players/Player[32 \"Fane Lao\"]/ShipRecs/srb[3]: only-in-B", + "/Sim/players/Player[32 \"Fane Lao\"]/ShipRecs/srbd: 0 -> 1", + "/Sim/players/Player[32 \"Fane Lao\"]/ShipRecs/src: only-in-B", + "/Sim/players/Player[32 \"Fane Lao\"]/ShipRecs/srd: only-in-B", + "/Sim/players/Player[32 \"Fane Lao\"]/ShipRecs/sri[0]: 0 -> 1", + "/Sim/players/Player[32 \"Fane Lao\"]/ShipRecs/sri[3]: only-in-B" + ], + "byteMatch": false, + "standalone": { + "schema": "sots-standalone-metric/1", + "input": "/srv/re-lab/build/sre5/verify/results/saves/turn1-state.sav", + "output": "/tmp/tmpf0cd3n4p/post-turn1-state.sav", + "spine": { + "total": 44, + "verified": 0, + "implemented": 4, + "partial": 8, + "blocked": 4, + "stub": 28, + "modelled": 16, + "committed": 12 + }, + "tail": { + "total": 37, + "verified": 0, + "implemented": 1, + "partial": 4, + "blocked": 1, + "stub": 31, + "modelled": 6, + "committed": 5 + }, + "run": { + "leafWrites": 93, + "blockedLeafWrites": 96, + "rngWords": 16, + "rngLoaded": true, + "rngCommitted": false, + "rngUnaccounted": [ + "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", + "two draws are downstream of the budget's research allocation -- ProcessResearch's completion Chance and the tech-effect callback's own roll (0 or 1 word each). The allocation needs ComputeBudget's per-system money, which is ComputeOutput with the system's OWN rate sliders; the max-income form of that money is now modelled and self-checked (see T31), but it is NOT the one this path takes", + "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" + ] + }, + "phases": [ + { + "driver": "host turn sequence (outside the two turn drivers)", + "id": "H00", + "name": "BeginProcessTurn", + "status": "implemented", + "ran": 1, + "writes": 1, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "host turn sequence (outside the two turn drivers)", + "id": "H03", + "name": "ScriptHookTurnBegin", + "status": "partial", + "ran": 2, + "writes": 1, + "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", + "name": "SnapshotPreviousTurn", + "status": "partial", + "ran": 9, + "writes": 1, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S01", + "name": "SystemPrePassMoraleAndAbandon", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S02", + "name": "TradeManagerTurn", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S03", + "name": "RegisterTradeSystems", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S04", + "name": "RebuildAllianceMasks", + "status": "implemented", + "ran": 8, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S05", + "name": "BuildShipActionTypeSets", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S06", + "name": "ShipActionsExceptType2", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S07", + "name": "NodeSpaceTravel", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S08", + "name": "FleetMovement", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S09", + "name": "ShipActionsType2", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S10", + "name": "ShipUpkeep", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S11", + "name": "SystemTurn", + "status": "partial", + "ran": 28, + "writes": 5, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S12", + "name": "TradeSliderFinalisation", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S13", + "name": "PlayerTurn", + "status": "partial", + "ran": 8, + "writes": 3, + "blockedWrites": 19, + "rng": 0 + }, + { + "driver": "ServerPlayer::ProcessTurn", + "id": "P01", + "name": "ComputeBudget", + "status": "partial", + "ran": 8, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "ServerPlayer::ProcessTurn", + "id": "P02", + "name": "ApplyNetToSavings", + "status": "partial", + "ran": 0, + "writes": 3, + "blockedWrites": 3, + "rng": 0 + }, + { + "driver": "ServerPlayer::ProcessTurn", + "id": "P03", + "name": "RecordBudgetDerivedFields", + "status": "blocked", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "ServerPlayer::ProcessTurn", + "id": "P04", + "name": "ProcessSpecialProjectsSpend", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "ServerPlayer::ProcessTurn", + "id": "P05", + "name": "ProcessResearch", + "status": "blocked", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "ServerPlayer::ProcessTurn", + "id": "P06", + "name": "ResearchRefund", + "status": "blocked", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "ServerPlayer::ProcessTurn", + "id": "P07", + "name": "ClearTimedResearchAccumulators", + "status": "partial", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "ServerPlayer::ProcessTurn", + "id": "P08", + "name": "DecayRebellionOutputModifier", + "status": "implemented", + "ran": 2, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "ServerPlayer::ProcessTurn", + "id": "P09", + "name": "AccumulateTimedResearchBonuses", + "status": "implemented", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "ServerPlayer::ProcessTurn", + "id": "P10", + "name": "ConsumeResearchRollPending", + "status": "partial", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "ServerPlayer::ProcessTurn", + "id": "P11", + "name": "PostNoResearchEvent", + "status": "blocked", + "ran": 4, + "writes": 0, + "blockedWrites": 16, + "rng": 0 + }, + { + "driver": "ServerPlayer::ProcessTurn", + "id": "P12", + "name": "PruneRaidTargets", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S14", + "name": "ProcessMissions", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S15", + "name": "ProcessStations", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S16", + "name": "ProcessDefenceSats", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S17", + "name": "ShipStatCacheRefresh", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S18", + "name": "ShipActionsForceValidate", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S19", + "name": "ProcessAid", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S20", + "name": "ProcessSpecialProjectsServer", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S21", + "name": "ProcessSurrenders", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S22", + "name": "AdvanceAIRebellion", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S23", + "name": "ScriptHookTurnStart", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S24", + "name": "SensorUpdate", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S25", + "name": "ScriptHookPostSensor", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S26", + "name": "RefreshPlayerViews", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S27", + "name": "RecomputePlayerReports", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S28", + "name": "GrantMetSpeciesTechs", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S29", + "name": "SystemObservedStamp", + "status": "implemented", + "ran": 28, + "writes": 8, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S30", + "name": "BuildTeamPartition", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::ProcessTurn", + "id": "S31", + "name": "EncounterDetectionAndStatusRestore", + "status": "partial", + "ran": 8, + "writes": 0, + "blockedWrites": 2, + "rng": 16 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T00", + "name": "IncrementModCount", + "status": "implemented", + "ran": 1, + "writes": 1, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T01", + "name": "ValidateEncounterResultArity", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T02", + "name": "ResolveFirstContact", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T03", + "name": "AnnounceEncounterSightings", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T04", + "name": "TallyBattlesFought", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T05", + "name": "UpdateDiplomacyStatsFromCombat", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T06", + "name": "ApplyEncounterResults", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T07", + "name": "ClearEncounters", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T08", + "name": "ScriptHookCombatDone", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T09", + "name": "AdvanceAIRebellionPostCombat", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T10", + "name": "NodeSpaceTravelSecondPass", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T11", + "name": "DecayNodeLines", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T12", + "name": "DrainColonyLossQueue", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T13", + "name": "UpdateTreasuryMorale", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T14", + "name": "UpdateForeignFleetMorale", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T15", + "name": "ProcessBankruptcy", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T16", + "name": "ResolveArrivedColonizers", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T17", + "name": "RebuildPlayerViewTree", + "status": "partial", + "ran": 28, + "writes": 32, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T18", + "name": "PostFleetWarnings", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T19", + "name": "DrainInfraTerraformQueue", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T20", + "name": "ScriptHooksTurnEnd", + "status": "partial", + "ran": 1, + "writes": 1, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T21", + "name": "UpdateSurveyAndSystemStats", + "status": "partial", + "ran": 28, + "writes": 6, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T22", + "name": "TradeSliderFinalisationSecondPass", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T23", + "name": "TradeManagerEndOfTurnHooks", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T24", + "name": "RecomputeMaintenanceAndResearchBonus", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T25", + "name": "SensorUpdateSecondPass", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T26", + "name": "ScriptHookPostSensorTail", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T27", + "name": "RefreshPlayerViewsSecondPass", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T28", + "name": "UpdateNodeLineSightingMasks", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T29", + "name": "AbortInvisibleInterceptOrders", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T30", + "name": "RebuildCommunicationMasks", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T31", + "name": "UpdateBankruptcyLimits", + "status": "partial", + "ran": 8, + "writes": 2, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T32", + "name": "PostIncomingFleetWarnings", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T33", + "name": "ShipManagerEndOfTurnHooks", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T34", + "name": "RecordObservedDesigns", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T35", + "name": "RebuildPlayerReports", + "status": "stub", + "ran": 0, + "writes": 0, + "blockedWrites": 0, + "rng": 0 + }, + { + "driver": "StrategyServer::OnAllCombatDone_Tail", + "id": "T36", + "name": "FinalizeTurnRecords", + "status": "blocked", + "ran": 8, + "writes": 0, + "blockedWrites": 56, + "rng": 0 + }, + { + "driver": "host turn sequence (outside the two turn drivers)", + "id": "H01", + "name": "SaveWriterInvariants", + "status": "implemented", + "ran": 1, + "writes": 1, + "blockedWrites": 0, + "rng": 0 + } + ] + } } ] }