board: B4 code-complete with 22 corrections; harness audit lane opened

This commit is contained in:
alex 2026-09-08 00:58:59 -04:00
parent 4d535028ed
commit 2d1a097b07
2 changed files with 17 additions and 17 deletions

View file

@ -1,6 +1,6 @@
# SotS RE campaign — coverage dashboard
Generated 2026-09-08 04:30 UTC · `sots-re` @ ef3858c,2026-09-08 · `sots-engine` @ 646e4e8,2026-09-08 (56 commits) · regenerate with `tools/dashboard.py`
Generated 2026-09-08 04:58 UTC · `sots-re` @ 4d53502,2026-09-08 · `sots-engine` @ 89c0013,2026-09-08 (59 commits) · regenerate with `tools/dashboard.py`
> **North star:** A functional reimplementation of the engine — behavior-equivalent, NOT byte-for-byte
@ -13,7 +13,7 @@ Generated 2026-09-08 04:30 UTC · `sots-re` @ ef3858c,2026-09-08 · `sots-engine
| verified | 29 | 48% |
| mapped | 17 | 28% |
| in-progress | 3 | 5% |
| backlog | 10 | 17% |
| backlog | 9 | 15% |
| blocked | 1 | 2% |
| Type | verified | mapped | in-progress | backlog | blocked | total |
@ -22,15 +22,15 @@ Generated 2026-09-08 04:30 UTC · `sots-re` @ ef3858c,2026-09-08 · `sots-engine
| control-flow | 0 | 2 | 0 | 0 | 0 | 2 |
| subsystems | 2 | 6 | 1 | 3 | 1 | 13 |
| engine | 10 | 0 | 0 | 0 | 0 | 10 |
| verify | 4 | 2 | 0 | 4 | 0 | 10 |
| phase2 | 4 | 1 | 2 | 2 | 0 | 9 |
| verify | 4 | 2 | 1 | 3 | 0 | 10 |
| phase2 | 4 | 1 | 1 | 2 | 0 | 9 |
| meta | 4 | 4 | 0 | 1 | 0 | 9 |
## 2. Binary understanding
- RTTI type descriptors: **1,924** (`Game::` 1,404, `Mars::` 194; serializable types 179)
- Classes with recovered member layouts: **21** / 179 serializable types `[█░░░░░░░░░] 12%` — heuristic: distinct `Game::X`/`Mars::X` in `##`–`####` headings of `struct-recovery.md` + `schema-gaps-resolved.md`
- Functions: **41,411** (parsed from `01-fingerprint.md`); named/annotated in the **address contract** (`ghidra/addresses.json`, not Ghidra's full rename count): **211**, verified **202** `[██████████] 96%`
- Functions: **41,411** (parsed from `01-fingerprint.md`); named/annotated in the **address contract** (`ghidra/addresses.json`, not Ghidra's full rename count): **324**, verified **317** `[██████████] 98%`
## 3. Data layer
@ -48,16 +48,16 @@ Generated 2026-09-08 04:30 UTC · `sots-re` @ ef3858c,2026-09-08 · `sots-engine
| `game/data` | 2,053 | 12 | 462 | yes | game-data.md |
| `game/design` | 1,024 | 17 | 250 | yes | game-design.md |
| `game/effects` | 973 | 3 | 231 | yes | game-effects.md |
| `game/sim` | 1,731 | 9 | 512 | yes | game-sim.md |
| `game/sim` | 2,637 | 9 | 599 | yes | game-sim.md |
| `mars/parse` | 875 | 12 | 277 | yes | mars-parse.md |
| `mars/rng` | 206 | 0 | 0 | yes | mars-rng.md |
| `mars/stream` | 3,703 | 6 | 222 | yes | mars-stream.md |
| `mars/text` | 899 | 8 | 245 | yes | mars-text.md |
| `mars/vfs` | 788 | 9 | 140 | yes | mars-vfs.md |
| `shim` | 5,051 | 0 | 0 | direct (WIN32) | M0.md |
| `shim/hooks` | 2,924 | 0 | 0 | direct (WIN32) | M0.md |
| `shim` | 6,663 | 0 | 0 | direct (WIN32) | M0.md |
| `shim/hooks` | 4,520 | 0 | 0 | direct (WIN32) | M0.md |
| `shim/trace` | 1,836 | 8 | 248 | direct (WIN32) | shim-trace.md |
| **total** | **22,621** | **88** | **2718** | | |
| **total** | **26,735** | **88** | **2805** | | |
Board `engine:` rows: verified **10**, mapped 0, in flight 0 (of 10) — verified & merged `[██████████] 100%`
@ -94,10 +94,10 @@ Most recent open:
## 8. Delta since previous dashboard
- verified targets: 29 → 29 (+0) · mapped-or-better: 45 → 46 (+1)
- engine LOC: 22,612 → 22,621 (+9) · test files: 88 → 88 (+0) · checks: 2,718 → 2,718 (+0)
- addresses verified: 202 → 202 (+0) · recovered layouts: 21 → 21 (+0) · open questions: 27 → 27 (+0)
- verified targets: 29 → 29 (+0) · mapped-or-better: 46 → 46 (+0)
- engine LOC: 22,621 → 26,735 (+4,114) · test files: 88 → 88 (+0) · checks: 2,718 → 2,805 (+87)
- addresses verified: 202 → 317 (+115) · recovered layouts: 21 → 21 (+0) · open questions: 27 → 27 (+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
<!-- dashboard-metrics {"verified": 29, "mapped_plus": 46, "targets": 60, "loc": 22621, "tests": 88, "checks": 2718, "addr_verified": 202, "addr_total": 211, "layouts": 21, "open_q": 27} -->
warnings: board.md line 66: unknown status 'code-complete' for 'P2-B4 colony + movement (behavioral)'; mars-rng.md: no oracle total row parsed; mars-stream.md: no oracle total row parsed; mars-vfs.md: no oracle total row parsed
<!-- dashboard-metrics {"verified": 29, "mapped_plus": 46, "targets": 60, "loc": 26735, "tests": 88, "checks": 2805, "addr_verified": 317, "addr_total": 324, "layouts": 21, "open_q": 27} -->

View file

@ -58,10 +58,10 @@ Status flow: `backlog → in-progress → mapped → verified` (or `blocked`).
| P2-B3 ProcessResearch (behavioral, RNG) | phase2 | mapped | high | 85% | 2026-09-08 | LIVE, PARTIAL PASS: 15 calls compared, 13 zero-divergence; RNG post-state matched 14/15 incl. every roll (validates MT19937 + draw mapping + odds together). 2 divergences are the declared SetResearched boundary. ORACLE FAILS by exactly one item across 40,300: an unposted EVENT_RESEARCH_OVERBUDGET - compare was blind because the event list was never a declared region. fpu_cw=0x127f => 53-bit double, x87 question SETTLED. No Zuul in the save: double roll still disassembly-only |
| RNG signatures (Ghidra) | meta | verified | high | 100% | 2026-09-08 | Seed/Twist/NextFloat/NextInt verified; draw = y/(2^32-1); NextInt [0,n] inclusive; lazy twist; left@+0x9c4. RUNTIME CONFIRMED: fpu_cw=0x127f (53-bit double, round-nearest) - our next_float model is right, float_from_pc24 is an unused contingency |
| engine: game/effects | engine | verified | high | 100% | 2026-09-08 | merged: TechId enum (196 slots @10000+i), 44 ids with typed strategic effects, species flag bits, ApplyTechEffect; 254 checks |
| VM140 exclusivity (lab rule) | meta | verified | high | 100% | 2026-09-08 | one agent at a time deploys/relaunches. Holder: B2. QUEUE: B4. Non-holders build in /srv/re-lab/build/sots-engine-<lane>, stage dist-<lane>, deploy C:\SOTS\shimdist-<lane>. NOTE: a Windows Update dialog can hide a crash dialog and mimic a hang |
| VM140 exclusivity (lab rule) | meta | verified | high | 100% | 2026-09-08 | one agent at a time. Holder: B2. QUEUE: B4. Non-holders build /srv/re-lab/build/sots-engine-<lane>, stage dist-<lane>, deploy C:\SOTS\shimdist-<lane>. NOTE: Windows Update dialog can hide a crash dialog and mimic a hang |
| Zuul double-roll (behavioural) | verify | backlog | — | 0% | 2026-09-08 | CONFIRMED NEEDED: ref-turn2 has only species 0 and 2, so the double roll is verified by disassembly + host tests only. Needs one compare from a species-5 save; the check is just that `left` drops by 2 not 1 |
| budget tail coverage (expenses/aid/debt) | verify | backlog | — | 0% | 2026-09-08 | 8 ComputeBudget slots were always 0 in ref-turn2 (no sliders, no aid, no debt, no handicap). Need a save with expense sliders, a debtor and a research-aid treaty to exercise ExpenseTotal + the aid/bonus tail |
| hook GetDifficultyMods | meta | backlog | — | 0% | 2026-09-08 | B1 derived the two difficulty rows from trace values (AI maintenance divisor 3, research x1.5) instead of snapshotting them; hook it properly so they stop being constants |
| section-loader compare crash | verify | backlog | — | 0% | 2026-09-08 | SectionDictionary compare crashes the engine while the identical weapon path succeeds -> fault is in re-running LoadSection, not the manifest reader. Next boundary: hook LoadSection itself. docs/M2.md has 3 ranked leads |
| P2-B4 colony + movement (behavioral) | phase2 | code-complete | high | 80% | 2026-09-08 | offline+Ghidra done: all 3 prototypes VERIFIED from the instruction stream (ProcessTurn takes NO args - the decompile's 2nd param is a Ghidra fiction) and written back to the project; 22 formula corrections (growth curve has no pop/cap term; range grace is +0.05 not -0.05; jump SCATTERS not stops; ntdev not rbtn; ties-to-even rounding; stutter overlap is not a midpoint); ONLY ProcessRebellion draws RNG in a colony turn, so the generator region has teeth. 3 hooks + 2 host-tested adapters staged in /srv/re-lab/shim/dist-b4 (b4-646e4e8-dirty-20260908T0447Z), ctest 30/30. REMAINING: VM140 window - scout/trace/compare per docs/B4.md. No replace mode (input boundary) |
| harness gap: undeclared side-effect lists | verify | backlog | — | 0% | 2026-09-08 | B3's replace-oracle failed on one unposted event while compare passed, because the player's EVENT list was never a declared region. Every hook that can post events or append to a list must declare that list, else compare gives false confidence. Audit B1/B2/M2 descriptors for the same blind spot |
| P2-B4 colony + movement (behavioral) | phase2 | code-complete | med | 70% | 2026-09-08 | CODE-COMPLETE (engine 89c0013), dist-b4 staged, ctest 30/30. Verified 3 signatures (ProcessTurn takes NO stack arg - Ghidra's 2nd param was fiction, would have crashed). 22 corrections incl: population growth has NO pop/capacity term (base is a suitability ratio through pow()) - our model was wrong in SHAPE; range margin is +0.05f not -0.05 (fleets stopped 0.1 short); failed jump SCATTERS around the destination (2nd draw); AccrueSystemBonus gate is ntdev not rbtn; rounding is fistp ties-to-even; only ProcessRebellion draws RNG in a colony turn. NO replace/oracle this milestone (input boundary, deliberate). UNTESTED sub-paths: plague, rebellion, slaves, terraform, addiction, unowned decay, jumps, gate teleports, node-line travel, stranded fleets |
| harness gap: undeclared side-effect lists | verify | in-progress | — | 0% | 2026-09-08 | AUDIT LANE RUNNING: a clean compare can be silently incomplete (B3's unposted event). Auditing every descriptor for undeclared writes (event/message lists, vector/map appends, writes through pointers, globals) and making unmodelled coverage structurally visible in the trace + tracecmp report |