Reads: TechTree::PrereqsMet 0x0057d8e0 (AND of ORs; zero groups TRUE, an empty group FALSE), the prerequisite layout at TechDef+0x88/+0x98, the tail collector 0x00587cc3, and the head of OnTechResearched (RecordObservedTech unconditional; the research-event roll gated on ResT == def && ResearchRollPending). Live: 35 compared calls over three workloads, 0 divergences, tracecmp exit 0, End-Turn oracle hashes unchanged. The EVENT_TECHS_UNLOCKED residual lane P predicted and lane V measured is closed by running the cascade, not by posting on completion. 12 new addresses in ghidra/addresses.d/lane-u.json (header 615 -> 627). |
||
|---|---|---|
| .. | ||
| lane-u.json | ||
| README.md | ||
Per-lane address fragments
addresses.json is a single shared file. When several lanes run concurrently they edit the
same lines, and three times on 2026-09-08 one lane's git add swept another's in-flight
entries into the wrong commit. Nothing was lost, but authorship and atomicity were.
A lane may instead drop its own file here:
{ "entries": [ { "name": "...", "addr": "0x...", "convention": "...",
"prototype": "...", "status": "verified", "source": "findings/..." } ] }
Name it after the lane (lane-d.json). tools/gen_addresses.py merges every fragment in
sorted order after addresses.json. A duplicate name across files is a hard error, not
last-wins — two lanes disagreeing about an address is exactly the thing we must not paper over.
The integrator folds fragments back into addresses.json once the lane's work is merged.