sots-re/verify/results/compare/recap-b3-compare-t1.md
alex 05095e93da lane R: golden-trace recapture with guards on the live game
Five hooks recaptured, build recap-7584bad-20260908T0615Z, no source change.

- ProcessResearch: the over-budget event is now a compare divergence
  (side.events.after.v.next_id orig=4 ours=3) instead of a 609 KB save diff.
  15 calls over 5 turns, 3 diverged, RNG matched 15/15.
- ComputeBudget: 4284 compared, 0 diverged, guard quiet - but only 20 distinct
  states and 13 of 22 slots always zero.
- MoveFleet: 8 of 45 calls diverge by 1 ULP of position. B4's clean verdict was
  a one-sample verdict.
- First guarded captures for OnTechResearched (RollResearchEvent draw fired and
  matched), the colony turn and MoveFleet.
- Guards mapped SetResearched live and found an undeclared ObservedTech append.

VM140 released at the main menu, hooks=trace.
2026-09-08 03:06:43 -04:00

2.2 KiB

tracecmp report: recap-b3-compare.jsonl

  • build: recap-7584bad-20260908T0615Z started: 2026-09-08T06:28:40Z inline_max: 256
  • calls: 3 compared: 3 diverged: 1 invalid records: 0 warnings: 0
  • coverage: 3 guarded call(s), 0 undeclared write(s) in 0 call(s); 0 hook(s) unstated, 0 contradicted
hook calls modes compared diverged errors
Game::TechTree::ProcessResearch 3 compare:3 3 1 0

coverage

hook verdict compared regions guards undeclared writes unmodelled
Game::TechTree::ProcessResearch partial events, node[0], node[105], node[106], node[107], node[108], +270 player, tree_header 0 5

Game::TechTree::ProcessResearch — not checked by this run

  • (high) posts EVENT_RESEARCH_OVERBUDGET on the owner's EventStorage in the same branch that sets node.flag = 2 — the message text is composed from the tech name, so ours cannot synthesise it; it would have to be posted through the game's own event API. This is the defect that made a clean compare false: replace mode's autosave differed from the oracle by exactly this one event [region:events (EvNxID now diverges instead of passing silently)]
  • (medium) posts EVENT_TECHS_UNLOCKED for nodes that became available this turn — the trailing unlock loop makes no draw and writes no node, but it does build a names list and post an event [region:events]
  • (high) TechTree::SetResearched on completion: the turn/order stamps, the child unlock cascade, the recursive research of zero-cost children, and the owner's OnTechResearched callback — its own milestone (B2); the callback writes live player state that compare mode must not touch, and it consumes one extra RNG word [guard:player, guard:tree_header]
  • (medium) bumps the tree's completion-order counter (TechTree+0x20) — part of SetResearched; the per-node order word is compared but the counter it comes from was not a region [guard:tree_header]
  • (low) writes a completion line to the game log — log text is not simulation state

Game::TechTree::ProcessResearch: first 1 of 1 divergent call(s)

  • call_id 0 (recap-b3-compare.jsonl:2) side.events.after.v.next_id [exact] orig={"t":"i32","v":4} ours={"t":"i32","v":3}