diff --git a/campaign/DASHBOARD.md b/campaign/DASHBOARD.md index 3ca336c..6b9d08d 100644 --- a/campaign/DASHBOARD.md +++ b/campaign/DASHBOARD.md @@ -1,19 +1,19 @@ # SotS RE campaign — coverage dashboard -Generated 2026-09-07 21:47 UTC · `sots-re` @ 1eb9677,2026-09-07 · `sots-engine` @ 12a3666,2026-09-07 (20 commits) · regenerate with `tools/dashboard.py` +Generated 2026-09-07 21:53 UTC · `sots-re` @ e4adf2f,2026-09-07 · `sots-engine` @ 9e110b4,2026-09-07 (23 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) -43 targets · mapped-or-better **32/43** `[███████░░░] 74%` · verified **16/43** `[████░░░░░░] 37%` +45 targets · mapped-or-better **33/45** `[███████░░░] 73%` · verified **17/45** `[████░░░░░░] 38%` | Status | Count | % | |---|---:|---:| -| verified | 16 | 37% | -| mapped | 16 | 37% | -| in-progress | 3 | 7% | -| backlog | 7 | 16% | +| verified | 17 | 38% | +| mapped | 16 | 36% | +| in-progress | 5 | 11% | +| backlog | 6 | 13% | | blocked | 1 | 2% | | Type | verified | mapped | in-progress | backlog | blocked | total | @@ -21,9 +21,9 @@ Generated 2026-09-07 21:47 UTC · `sots-re` @ 1eb9677,2026-09-07 · `sots-engine | objects | 5 | 2 | 0 | 0 | 0 | 7 | | control-flow | 0 | 2 | 0 | 0 | 0 | 2 | | subsystems | 1 | 5 | 1 | 3 | 1 | 11 | -| engine | 4 | 1 | 2 | 0 | 0 | 7 | -| verify | 3 | 2 | 0 | 0 | 0 | 5 | -| phase2 | 1 | 0 | 0 | 4 | 0 | 5 | +| engine | 5 | 1 | 2 | 0 | 0 | 8 | +| verify | 3 | 2 | 1 | 0 | 0 | 6 | +| phase2 | 1 | 0 | 1 | 3 | 0 | 5 | | meta | 2 | 4 | 0 | 0 | 0 | 6 | ## 2. Binary understanding @@ -47,20 +47,21 @@ Generated 2026-09-07 21:47 UTC · `sots-re` @ 1eb9677,2026-09-07 · `sots-engine | `game/sim` | 1,342 | 9 | 356 | yes | game-sim.md | | `mars/parse` | 750 | 12 | 188 | yes | mars-parse.md | | `mars/rng` | 166 | 0 | 0 | yes | mars-rng.md | -| `mars/stream` | 3,703 | 5 | 195 | yes | mars-stream.md | +| `mars/stream` | 3,703 | 6 | 195 | yes | mars-stream.md | | `mars/text` | 855 | 8 | 205 | yes | mars-text.md | | `mars/vfs` | 788 | 9 | 140 | yes | mars-vfs.md | -| `shim` | 184 | 0 | 0 | direct (WIN32) | M0.md | -| **total** | **7,788** | **43** | **1084** | | | +| `shim` | 2,052 | 0 | 0 | direct (WIN32) | M0.md | +| `shim/trace` | 1,824 | 8 | 248 | direct (WIN32) | shim-trace.md | +| **total** | **11,480** | **52** | **1332** | | | -Board `engine:` rows: verified **4**, mapped 1, in flight 2 (of 7) — verified & merged `[██████░░░░] 57%` +Board `engine:` rows: verified **5**, mapped 1, in flight 2 (of 8) — verified & merged `[██████░░░░] 62%` ## 5. Phase 2 milestones | Milestone | Status | Coverage | Notes | |---|---|---:|---| | P2-M0 shim bootstrap | ✅ verified | 100% | sots-engine 5f5bc41: proxy binkw32.dll (66 exports identical), MinHook, asm-stub trace hoo | -| P2-M1 flat-KV config loader | ⬜ backlog | 0% | HOOK: GlobalConsts::LoadFile(const char* file, map*) 0x008b73c0 cdecl (driven by LoadAll 0 | +| P2-M1 flat-KV config loader | 🔄 in-progress | 0% | lane running: hook GlobalConsts::LoadFile (cdecl, verified) trace -> golden -> compare (0 | | P2-M2 manifest/id registry | ⬜ backlog | 0% | no registry object: WeaponDictionary::Init 0x0059a4c0 / SectionDictionary ctor 0x00576f40 | | P2-M3 Mars brace-block parser | ⬜ backlog | 0% | Mars::Script pull tokenizer (Open 0x008cd7d0, ReadToken 0x008cd2f0, Next 0x008cd3e0, SkipB | | P2-M4 gobio VFS read | ⬜ backlog | 0% | choke point: bool __cdecl gobio::ReadFile(const char*, IBuffer**) 0x008d5140; FileSystemSe | @@ -88,10 +89,10 @@ Most recent open: ## 8. Delta since previous dashboard -- verified targets: 14 → 16 (+2) · mapped-or-better: 30 → 32 (+2) -- engine LOC: 3,919 → 7,788 (+3,869) · test files: 38 → 43 (+5) · checks: 889 → 1,084 (+195) -- addresses verified: 90 → 90 (+0) · recovered layouts: 21 → 21 (+0) · open questions: 22 → 23 (+1) +- verified targets: 16 → 17 (+1) · mapped-or-better: 32 → 33 (+1) +- engine LOC: 7,788 → 11,480 (+3,692) · test files: 43 → 52 (+9) · checks: 1,084 → 1,332 (+248) +- addresses verified: 90 → 90 (+0) · recovered layouts: 21 → 21 (+0) · open questions: 23 → 23 (+0) --- warnings: 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 f260fc8..0e954e5 100644 --- a/campaign/board.md +++ b/campaign/board.md @@ -4,7 +4,7 @@ Status flow: `backlog → in-progress → mapped → verified` (or `blocked`). `verified` requires re-verifier evidence. Maintained by **re-quartermaster**. | Target | Type | Status | Conf | Coverage | Updated | Notes | -|---|---|---|---|---|---|---| +| --- | --- | --- | --- | --- | --- | --- | | RTTI class inventory | meta | mapped | high | 100% | 2026-09-07 | `findings/objects/00-inventory.md` — 1924 types, engine=Mars | | `.gob` format | subsystem | mapped | high | 100% | 2026-09-07 | renamed uncompressed ZIP (community-known) | | `Mars::AppStartup` (entry) | control-flow | mapped | high | 100% | 2026-09-07 | entry 0x00925794 -> WinMain 0x0089dd30 -> DemoApp ctor 0x0089c950 -> Mars::Application::Initialize 0x008a0e50 (config/affinity, D3D9, window, sound thread, OnStartup -> net thread). findings/control-flow/turn-spine.md | @@ -34,7 +34,7 @@ Status flow: `backlog → in-progress → mapped → verified` (or `blocked`). | Ghidra type write-back | meta | verified | high | 100% | 2026-09-07 | structs saved in project (ServerSystem 87f, ServerPlayer 110f, StarFleet, StarShip, StrategyServer partial, 22 nested); 52 serializers + primitives + ~60 spine fns renamed; decompile shows field names | | strategic turn internals (economy/research/colony/movement/diplomacy) | subsystem | mapped | high | 90% | 2026-09-07 | findings/subsystems/strategic-turn-internals.md: budget/RP/trade/bankruptcy formulas, research rolls (unlisted race=1.0, Zuul x2), colony growth, movement, RNG=MT19937; ~600 g_KEY labels in Ghidra | | P2-M0 shim bootstrap | phase2 | verified | high | 100% | 2026-09-07 | sots-engine 5f5bc41: proxy binkw32.dll (66 exports identical), MinHook, asm-stub trace hook on Application::Initialize; menu reached; evidence verify/results/shim/. Initialize signature unverified -> asm stubs only | -| P2-M1 flat-KV config loader | phase2 | backlog | — | 0% | 2026-09-07 | HOOK: GlobalConsts::LoadFile(const char* file, map*) 0x008b73c0 cdecl (driven by LoadAll 0x008b76d0 from Initialize). Semantics: _stricmp keys, FIRST occurrence wins (dupes log 'multiply defined'), unknown keys ignored, type = parser pushed by stub (int/float/float*k/colour->float[4]). Needs shim-trace emitter | +| P2-M1 flat-KV config loader | phase2 | in-progress | — | 0% | 2026-09-07 | lane running: hook GlobalConsts::LoadFile (cdecl, verified) trace -> golden -> compare (0 div) -> replace + End-Turn oracle hashes | | P2-M2 manifest/id registry | phase2 | backlog | — | 0% | 2026-09-07 | no registry object: WeaponDictionary::Init 0x0059a4c0 / SectionDictionary ctor 0x00576f40 read 'id file' pairs via Script::ReadToken; id stored on def (+4), sorted vector at dict+8; DELETED lines are comments; call site DemoApp::LoadGameData 0x00899280 (deferred to first OnTick) | | P2-M3 Mars brace-block parser | phase2 | backlog | — | 0% | 2026-09-07 | Mars::Script pull tokenizer (Open 0x008cd7d0, ReadToken 0x008cd2f0, Next 0x008cd3e0, SkipBlock 0x008cd4b0); whitespace-only delimiting, quotes " ' ` no escapes, EOF ends, stray } ignored, LAST PAIR W/O TRAILING NEWLINE DROPPED; consumers = _stricmp if/else chains (WeaponDef::ParseScript 0x00599070, SectionDef::ParseScript 0x005744e0, MasterTechTree::ParseTech 0x0058b050). .effect = Mars::TextFileStream (Open 0x008cfb90) | | P2-M4 gobio VFS read | phase2 | backlog | — | 0% | 2026-09-07 | choke point: bool __cdecl gobio::ReadFile(const char*, IBuffer**) 0x008d5140; FileSystemSet ctor 0x008d6d60 pushes NativeFileSystem(".") FIRST then sots.ini [Modules] Mount (fallback sots.gob, sots_local_en.gob); zip lookup case+slash-insensitive 0x008d4a50 -> matches mars/vfs NativeFirst | @@ -47,6 +47,6 @@ Status flow: `backlog → in-progress → mapped → verified` (or `blocked`). | engine: game/data catalogs | engine | in-progress | — | 0% | 2026-09-07 | typed WeaponDef/ShipSectionDef/TechTree/IdRegistry on mars/parse+text; oracle = data-catalogs JSON | | engine: mars/vfs (gob) | engine | verified | high | 100% | 2026-09-07 | merged: ZIP reader + native override; 8352+2035 entries = unzip -l; all 10268 files CRC-clean; byte-equal spot checks; ctest 11/11 | | determinism oracle | verify | verified | high | 100% | 2026-09-07 | BYTE-IDENTICAL across 5 runs incl. cross-process: (Autosave).sav 978041ac…, (Autosave EndTurn).sav bb4fd9ac…; gzip MTIME=0; only loaded-post-turn re-save differs (Player.Status 4->0, Summary.Checksum). findings/subsystems/determinism-oracle.md | -| engine: shim trace/compare emitter | engine | in-progress | — | 0% | 2026-09-07 | C++ port of harness emit_record/esc/fmt_num + hook modes + snapshot/diff; validated by tracecmp.py exit codes | +| engine: shim trace/compare emitter | engine | verified | high | 100% | 2026-09-07 | merged (sots-engine 9e110b4): emitter byte-exact vs mkfixture, tracer, snapshot/diff, Hook; ctest 18/18; tracecmp exits 0/1/2 as specified; shim links | | engine parity: first-wins keys + tokenizer rules | engine | in-progress | — | 0% | 2026-09-07 | fix mars/text + mars/parse + Python oracle to confirmed Mars::Script/GlobalConsts semantics; re-verify 100% | | save-format tag corrections | verify | in-progress | — | 0% | 2026-09-07 | otnF/nextid/FAIDes/DHide/DWep/DName/ords/wpts into SAVE_FORMAT + save_reader; strict must stay 3/3 |