diff --git a/campaign/DASHBOARD.md b/campaign/DASHBOARD.md index 7c8d3b0..45eaa75 100644 --- a/campaign/DASHBOARD.md +++ b/campaign/DASHBOARD.md @@ -1,16 +1,16 @@ # SotS RE campaign — coverage dashboard -Generated 2026-09-09 02:29 UTC · `sots-re` @ 48db3cc,2026-09-08 · `sots-engine` @ 35b05eb,2026-09-08 (239 commits) · regenerate with `tools/dashboard.py` +Generated 2026-09-09 02:32 UTC · `sots-re` @ 7eeb68b,2026-09-08 · `sots-engine` @ 989c692,2026-09-08 (240 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) -405 targets · mapped-or-better **358/405** `[█████████░] 88%` · verified **316/405** `[████████░░] 78%` +406 targets · mapped-or-better **359/406** `[█████████░] 88%` · verified **317/406** `[████████░░] 78%` | Status | Count | % | |---|---:|---:| -| verified | 316 | 78% | +| verified | 317 | 78% | | mapped | 42 | 10% | | in-progress | 4 | 1% | | backlog | 41 | 10% | @@ -21,7 +21,7 @@ Generated 2026-09-09 02:29 UTC · `sots-re` @ 48db3cc,2026-09-08 · `sots-engine | objects | 46 | 6 | 0 | 3 | 1 | 56 | | control-flow | 26 | 2 | 0 | 0 | 0 | 28 | | subsystems | 4 | 8 | 0 | 2 | 1 | 15 | -| engine | 29 | 0 | 0 | 0 | 0 | 29 | +| engine | 30 | 0 | 0 | 0 | 0 | 30 | | verify | 101 | 15 | 3 | 35 | 0 | 154 | | phase2 | 13 | 3 | 1 | 0 | 0 | 17 | | meta | 78 | 6 | 0 | 1 | 0 | 85 | @@ -57,16 +57,16 @@ Generated 2026-09-09 02:29 UTC · `sots-re` @ 48db3cc,2026-09-08 · `sots-engine | `game/nav` | 581 | 2 | 113 | yes | — | | `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,834 | 8 | 316 | yes | mars-stream.md | +| `mars/rng` | 273 | 0 | 0 | yes | mars-rng.md | +| `mars/stream` | 5,834 | 8 | 329 | yes | mars-stream.md | | `mars/text` | 899 | 8 | 245 | yes | mars-text.md | | `mars/vfs` | 788 | 9 | 140 | yes | mars-vfs.md | | `shim` | 16,295 | 0 | 0 | direct (WIN32) | H-probes.md | | `shim/hooks` | 13,189 | 0 | 0 | direct (WIN32) | L1-predictions.md | | `shim/trace` | 2,258 | 9 | 273 | direct (WIN32) | shim-trace.md | -| **total** | **58,618** | **122** | **4244** | | | +| **total** | **58,647** | **122** | **4257** | | | -Board `engine:` rows: verified **29**, mapped 0, in flight 0 (of 29) — verified & merged `[██████████] 100%` +Board `engine:` rows: verified **30**, mapped 0, in flight 0 (of 30) — verified & merged `[██████████] 100%` ## 5. Phase 2 milestones @@ -133,11 +133,11 @@ Most recent open: ## 9. Delta since previous dashboard -- verified targets: 314 → 316 (+2) · mapped-or-better: 356 → 358 (+2) -- engine LOC: 58,618 → 58,618 (+0) · test files: 122 → 122 (+0) · checks: 4,244 → 4,244 (+0) -- addresses verified: 1,122 → 1,139 (+17) · recovered layouts: 384 → 384 (+0) · open questions: 26 → 26 (+0) +- verified targets: 316 → 317 (+1) · mapped-or-better: 358 → 359 (+1) +- engine LOC: 58,618 → 58,647 (+29) · test files: 122 → 122 (+0) · checks: 4,244 → 4,257 (+13) +- addresses verified: 1,139 → 1,139 (+0) · recovered layouts: 384 → 384 (+0) · open questions: 26 → 26 (+0) - standalone leaves closed: 45 → 45 (+0) · leaves still diverging: 63 → 63 (+0) --- 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 73a88f9..7932111 100644 --- a/campaign/board.md +++ b/campaign/board.md @@ -410,3 +410,4 @@ Status flow: `backlog → in-progress → mapped → verified` (or `blocked`). | the spy sub-object is unexercised: 0 of 22 before lane AS starts | verify | verified | high | 100% | 2026-09-09 | Direct input to lane AS. The census reads `spymgr.spy.sdet = -1` in **all 22 saves**, with `cbh`/`cm`/`cmo`/`deat`/`sdo` all 0 - `sdet = -1` sits where a detection result would go and is a sentinel. So the **corpus count for any spy-path predicate is 0 of 22 before the lane takes a single measurement**, which is exactly what rule 28 requires before a zero may be called a negative. Also gives lane AG a mechanically computable corpus-count column: a predicate resting on any of the 234 constants has count 0 by construction | | GATE-INDEXED RNG AUDIT: 31 unread-gate rows, 6 new draw sites, the SVSO generator named | control-flow | verified | high | 100% | 2026-09-09 | **Lane AG**, host only, no VM, no Ghidra (`findings/control-flow/gate-indexed-rng-audit.md`). The resolution's §8 item 3, delivered: one row per STATICALLY REACHABLE draw site in `BeginProcessTurn` u `ProcessTurn` u `OnAllCombatDone_Tail` over direct + tail-jump + pinned-virtual edges, each carrying a MEASURED firing or a DECODED PREDICATE on save fields with the 22-save corpus counted against it. **NO TOTAL IS REPORTED - 31 rows (30 distinct sites + one grouped SVSO row) are UNREAD GATES**, and that visible blank column is the deliverable. THREE GATES DECODED. (1) `0x0082cdb8` is the **ADDICTION SPREAD ROLL**: `ServerTradeManagerImpl::vslot15` iterates the SERIALISED route vector (its G1, `BYTE[rt+0x25]!=0`, is byte-for-byte the test `Write` uses to emit an `rt`), and for each route with `trfrs==0 && trtos==0` rolls `Chance(ADDICTION_SPREAD_ODDS=0.2f)` once per species slot the FROM system is addicted to. Corpus **0 of 22**: `nadct` is 0 on all 28 systems of all 22 saves. WRITER FOUND (rule 28 practice 3): `ServerSystem::BeginAddiction 0x0074ef70` has EXACTLY TWO CALLERS, both inside vslot15 - so BLOCK 1 (an INTER-EMPIRE route, `trfow != trtow`, plus bit 4 of `player+0x348+4k`, which `RebuildSpeciesTechFlags` sets from the per-species ADDICT TECH table `FUN_0053b620`) must seed it before the roll can ever happen. Every corpus route is intra-AI (`trfow==trtow==1`), so neither block has run. (2) `0x0088dc43` is the SPY COUNTER-MISSION roll, `p = spy->cmo` starting at 0.2f and gaining 0.2f per failure - so `Chance` costs 0 WORDS from the fifth turn on (`p>=1` early-out), a stage costs at most 4 words. Predicate `deat != 0 AND cm in {1..4}`; corpus **0 of 22** by construction (both fields are among the census's 234 constants). (3) `0x0088b613` is the RAID TARGET PICK, and **`RNG_NextInt` HAS NO ZERO-BOUND EARLY-OUT** (read in full: mask smear then an unconditional draw loop) - so a single-candidate list still costs a word, which PROVES lane AC's `B` returned BEFORE the draw. The failed conjunct is named: AC's raider sat on sector `TradeID 832`, member systems 13/23/0/3, while the four `rt` records' `trfr` are 18/16/14/20, lying in sectors 816/816/768/752. **NEXT WORKLOAD: park the raider on sector 816 instead of 832** - two candidates, `NextInt(bound=1)` cannot reject, `tsct=2` is the AI's bit so no `FtFlg&0x800` is needed, and the AI's Freighters fleet is already there to test the doubled odds. SIX NEW DRAW SITES the firing-indexed table structurally could not hold: five behind `CreateRaidEncounter`'s empty-candidate-list gate (`0x0088f1eb`, `0x0088f356`, `0x0083b460`, `0x00848fd9`, `0x00820c1b` via `0x00892640`) and `0x00820c1b` AGAIN from `Slot13RngCalleeB` at `0x0088b62c`. **SVSO GENERATOR CLOSED**: all 17 overrides that can draw use `GetGame()->+0x16c` = `*(void**)0x00b29f9c` -> +0x16c, the STRATEGIC generator - V2 §4.3 caution (a) retired. Rule 17 bit twice more (`ServerSpyManager::vslot14` real end 0x0088dd2b vs Ghidra's 0x0088dd03, jump table past it) | | CORRECTION: `CreateRaidEncounter` success is not 0-or-1 words | control-flow | verified | high | 100% | 2026-09-09 | `tail-rng-ledger.md` 11.1's **"a success costs 0 or 1 further word"** is right about the **corpus** and wrong about the **code**. A success with a **non-empty** candidate list reaches **five** further draw sites through `0x00892640` (`0x0088f1eb`, `0x0088f356`, `0x0083b460`, `0x00848fd9`, `0x00820c1b`), each a `NextInt` with its own rejection loop. Lane AG 5.1. The firing-indexed table could not hold these because no corpus state has ever had a non-empty list | +| `Mars::RNG::Chance` modelled, with the zero-word cases and the NaN word | engine | verified | high | 100% | 2026-09-09 | Acting on lane AG's warning. Body read in full at `0x008e6dd0` (94 bytes, via the ReVa HTTP fallback - the MCP link was down): **`p <= 0` returns false and `p >= 1` returns true, each WITHOUT a draw**; in between exactly one `NextFloat` compared with a **strict `<`**. Now `MT19937::chance()` in the engine with tests pinning all four cases, the accumulating 0.2f-per-turn pattern (4 words then nothing for ever), and the strict comparison. **The NaN case is reproduced, not smoothed**: both early-outs are pairs of ordered comparisons that a NaN makes false, so a NaN probability falls through, **draws a word**, and returns false - hiding that would hide a real divergence. Engine `989c692`; `docs/mars-rng.md` updated. Rationale: a model without the early-outs is one word out of step from the fifth turn of every counter-mission onward, permanently, and one word of drift is the whole determinism claim |