diff --git a/campaign/backlog.md b/campaign/backlog.md index 49f3dac..fc384a9 100644 --- a/campaign/backlog.md +++ b/campaign/backlog.md @@ -154,11 +154,22 @@ mode and the **same hashes**, with a count from the hook proving the path execut | # | module | today | evidence for the attempt | target | |---|---|---|---|---| -| 1a | `TechTree::ProcessResearch` + unlock cascade | compared | 35 calls / 3 workloads / 0 div; advance prediction held on a changed workload | **replaced** — lane CR running | +| 1a | `TechTree::ProcessResearch` + unlock cascade | compared | 35 calls / 3 workloads / 0 div; advance prediction held on a changed workload | **stays `compared`** (lane CR, 2026-09-09): our code displaced all 13 tech-tree leaves live, oracle missed by **16**, every one written by `OnTechResearched` — a different function. Next: the write-back | | 1b | `ServerSystem::ComputeTotalOutput` + `GroupOutput` | compared | 24,357 calls, 0 undeclared writes — but **13 distinct states** (rule 23) | replaced, after widening the state set | | 1c | `ServerSystem::ProcessTurn` (colony) | compared | 36 calls 0 div; 3 owned systems, gates all zero | replaced, on a save with gate traffic | | 1d | `game/nav`, `game/design`, `game/combat` retreat, `mars/vfs` | modelled, **never hooked** | host-tested only | compared — one lane each | +**Ruling (2026-09-09, on lane CR's policy question).** Reaching `replaced` on research needs two +event *records* whose text comes from the game's string table. That text is **game data**, not +engine code: the engine already reads every catalogue, tech name and design from the user's own +install through `$SOTS_DATA_DIR` / the VFS, and a string table is no different. So the answer is +**not** "call the game's `PostEvent` and take a QUALIFIED caveat" — it is **load the string table +through the same VFS path everything else uses** and construct the record clean. We ship no +strings; the user's copy supplies them. That is the same clean-room posture as every other data +dependency, and it turns the last research residual into ordinary engine work rather than a +policy exception. Track 1a, next lane: `OnTechResearched` write-back (~90 tech-effect fields) + +`ObservedTech` element + the two event records via the VFS string table. + ### Track 2 — Rung B worklist, ranked against a real rich turn (lane CV, residual 0) | leaves | subsystem | note |