L4: engine doc for the research-selection capture

This commit is contained in:
lane-l4 2026-09-08 18:26:59 -04:00
parent ca0de05e07
commit c842d44d62

View file

@ -82,3 +82,33 @@ Lane L5 established this first and better, on VM146, and owns it
oracle, not this pair. What this lane adds is where the divergence lives: the differing value is in oracle, not this pair. What this lane adds is where the divergence lives: the differing value is in
the **submitted command block**, in player 512's research-target gate, so the decision is made the **submitted command block**, in player 512's research-target gate, so the decision is made
client-side before submission and the sim is not diverging on identical input. client-side before submission and the sim is not diverging on identical input.
## Addendum — the research-selection tie set
`airesearch=on` adds three more register-transparent dump hooks: the per-player delimiter
(`SelectResearchTarget 0x006c8890`, which also prints the player's current target so a player that
returns immediately is distinguishable from one that walks an empty list), one line per candidate
(`TryResearchCandidate 0x006c8580`, in the order the selector sees them), and the outcome
(`cl_SetResearchTarget 0x00578f60`, which takes the tech's **name**, so the chosen tech is a string
in a register and needs no id table). Four reachability probes go with them: the two producers phase
18 tries before the walk, and the two halves of the fallback rotation.
Measured on one End Turn from `turn1-state.sav`:
* **Only one of the three AI players reaches the candidate walk.** The other two get their target
from a producer that runs first, which is why they are stable across every run of both lanes and
the third is not — they are on a different code path, not a luckier one.
* **The candidate stream has length one**, and the single entry is `{2, 12}` — small integers, a
*category*, not a tech. A vector of one has no order to scramble, so arrival order is not the
mechanism and the prediction that said it was is falsified.
* **The fallback never ran** (both probes zero), so it is not the three-arm rotation either.
The variation is therefore inside the resolver that turns a category into a tech. `k` is nameable
from the shipped tech data for the arm that was observed: `XNC_ROOT` allows six tier-1 techs at an
identical 2000 RP, one per species, and each allows exactly one tier-2 successor — the six
`XNC_Trns<Species>2`. Four of those six are among the five values observed across six runs between
lanes L4 and L5. **Their costs differ (13000–30000), so the resolver is not ranking by cost**; it is
taking whichever member of the available set it reaches first.
Full account, including the one observed value that is *not* in that family and what single run
would settle it, in `sots-re/findings/subsystems/ai-order-capture.md` §3.2.