9.7 KiB
Trade-raid gate multiplicity — does the tail draw once per turn, or once per qualifying fleet?
- Type: control-flow (static decode + live measurement)
- Status: predictions committed, not yet measured — this header block is replaced when the run lands
- Owner / date: lane AD · 2026-09-08 · guest VM141 (
sots-re-win10-b, 192.168.10.143) - Follows: the resolution
findings/resolutions/2026-09-09-tail-draws.md§4 (the one probe), lane AC'sfindings/control-flow/trade-raid-rng-gate.md - Instrument: lane Z's return-address ledger (
draw_sites) + lane H's entry probes atprobes=8— the configuration lane H bisected as byte-neutral. Notprobes=11.
1. Predictions, committed before the build (rule 2)
Written on the host, before the shim was built, before the workload was played and before any counter was read. What follows in §1 is frozen; everything after it is the run.
1.0 The callee, decoded in full first
Lane AC read the caller (ServerTradeManagerImpl::vslot13, 0x0088ef80) and reported the
short-circuit inside the callee from a partial read. This lane decompiled the whole of
TradeManager::Slot13RngCalleeA 0x00820ca0 (436 bytes, 89 decompiled lines, both the loop and
its converge point visible — rule 4), because the prediction depends on where the draw sits
relative to the loop. Transcribed to a model:
A(fleet, freighterInSector) -> bool:
if fleet == null: return false # 0 words
n = (fleet+0xa8 - fleet+0xa4) / 4 # ship vector count
if n <= 0: return false # 0 words
anyBig = OR over ships of ( *(design + 0x12c) > 1 )
allSuppressed= AND over ships of ( ship+0x18 & 0x80 )
nDE = #{ ships : !(flags & 0x80) and *(design+0x12c) == 0 }
nCR = #{ ships : !(flags & 0x80) and *(design+0x12c) == 1 }
bestScale = max over ships of ( (flags & 0x100000) ? K : 1.0 ) # K a float global
if anyBig: return TRUE # 0 words <-- short-circuit
if allSuppressed: return false # 0 words
odds = (nCR >= 1 ? ODDS_CR : (nDE > 0 ? ODDS_DE : 0.0)) + (nCR + nDE) * PER_SHIP
if freighterInSector: odds = odds + odds
r = NextFloat() # <-- EXACTLY ONE WORD
return (odds * bestScale > r)
Three consequences that the measurement is against:
- The draw is inside the callee, and the callee is called once per fleet. So the word cost of
the site is
Σ over fleets passing G0–G4 of (0 if short-circuited or shipless or all-suppressed, else 1). Not a per-sector constant. design + 0x12ctakes the values 0, 1 and >1 and is used to bucket ships into two counted classes plus a third that short-circuits. That is a hull class field, and lane AC's fleet — oneRepair and Salvage, built withIND_CruisCon— is the== 1bucket.> 1is therefore the next hull up (a dreadnought, if the ordering is DE/CR/DN), which this game has not researched.- There is exactly one
NextFloaton the path, with no rejection loop around it, so a fleet that reaches the roll costs exactly one word — never two.
1.1 The state this lane will build
From verify/results/saves/ac-turn22-raider.sav, read on the host before touching the guest:
| field | value read |
|---|---|
| player 0 | PlryName "re", PlyrIdx 0, HomeSys 48, Sav 63,032,174, CnRad true |
| player 0 fleets | exactly one: FltID 3744 "Alpha Fleet" PID 16, NShips 1, LocID 832, Pos [0, 0, 8.0], FtFlg 4, ship DesID 17 (Repair and Salvage, IND_CruisCon) |
| sector 6 | TradeID 832, tsgridID 6, Pos [0, 0, 8.0], tssec 0, tsct 0, tscr 253, tsnumsys 4 (tssys 256, 416, 48, 96), tsnumflt 1, tsflt 3744 |
| all six sectors | tscr 253 / ptscr 253 |
| player 0 designs | Armor, Tanker, Colonizer, Extended Range, Light Defense Platform, Repair and Salvage (DesID 17), Default Assault Shuttle |
Sector 6 contains the home system (48), tsct is 0 so the FtFlg & 0x800 conjunct is not armed,
and tscr bit 0 is set. Every conjunct of the gate is already satisfied for a second fleet
parked on the same node.
The workload: build one more Repair and Salvage cruiser at system 48, keep it as its own
fleet, order it to the sector-6 node, and confirm LocID 832 + Pos bit-equality from the
autosave, not the panel (lane AC's gotcha). That makes two single-cruiser fleets on one sector.
Deliberate deviation from the brief, stated up front. The brief and the resolution §4 ask for a
second raider of a hull satisfying design+0x12c > 1, to price the short-circuit. §1.0 shows that
field is a hull class and > 1 means a hull above cruiser, which this game has not researched and
cannot research and build inside five turns. Pricing the short-circuit is also the second question;
the first is multiplicity, and a second cruiser answers it with the cleanest possible signal —
under H-fleet the word count doubles, under H-sector it does not move. A dreadnought would leave the
word count at 1 under both hypotheses and force the entry counter to carry the whole result alone.
So: second cruiser, and the short-circuit stays unpriced. Recorded as a gap, not skipped.
1.2 P1 — H-fleet (primary)
With two single-cruiser fleets on sector 6, TradeManager::Slot13RngCalleeA is entered 2 times
per End Turn and StrategyServer::OnAllCombatDone_Tail costs 2 strategic words per turn, against
lane AC's 1 and 1 on the same lineage with one fleet.
Confidence: high, on §1.0 plus lane AC's read of the caller's loop over
StrategyServer+0x64..+0x68.
Falsification and symptom. calls = 1 on the TradeManager::Slot13RngCalleeA probe row with two
fleets confirmed on the node kills it, and P2 is then the answer.
1.3 P2 — H-sector (the hypothesis this lane exists to kill)
If the roll is per sector and not per fleet, Slot13RngCalleeA is entered 1 time and the tail
costs 1 word with two fleets exactly as with one.
Confidence: low. It is stated because four lanes have now been wrong about this call site by
reasoning rather than measuring, and because a 1 here would mean §1.0's model — and therefore the
generator model the standalone is about to gain — is wrong about the loop.
1.4 P3 — per-site attribution
draw_sites reports exactly one strategic-generator row inside the callee's body, entry kind
NextFloat, ret_rva in 0x00420ca0..0x00420e53, with calls == words == 2 and
no_draw_calls == 0. The site sum for the tail bracket equals the boundary ledger's tail delta.
Confidence: high on the row existing and on the equality; moderate on calls == 2, because
that is P1 restated through the other instrument. The two instruments disagreeing is itself the
interesting outcome and would be reported as one.
1.5 P4 — Slot13RngCalleeB and its inner NextInt
B is entered once per fleet whose roll succeeded, so 0, 1 or 2 times per turn, and it
costs 0 words on every entry — i.e. no strategic draw_sites row inside
0x0048b440..0x0048b976.
Confidence: low-to-moderate. "0 words" rests on lane AC's single observation and the resolution
itself flags the gate above that NextInt as unread (§3.1's unfilled rows). A row appearing there is
a result, not a failure: it prices a site the gate-indexed audit currently has to leave blank.
1.6 P5 — the oracle pair
Two hooks=off runs of the same End Turn from the same input save, in two fresh processes, produce
byte-identical (Autosave EndTurn).sav and (Autosave).sav.
Confidence: moderate, and this is the prediction most likely to fail. Rule 26's counter-example
is exactly this shape: three hooks=off runs on turn1-state gave three different files, pinned to
a per-process AI seed. That save has three AI empires; this one has seven, at turn 22, all of
them making research and build choices every turn. If the pair does not agree I will localise the
difference to named leaves with the state-checksum tool, report whether it is confined to the known
AI-seed leaves, and — if it is not — say plainly that no oracle pair exists for this state and
that the numbers in §3 are entry counts and word deltas rather than calibration data. Rule 26: a
control that does not agree with itself exonerates nothing.
1.7 P6 — instrument neutrality on this state (rule 19)
The (Autosave).sav produced by the probes=8 run is byte-identical to the hooks=off oracle
above. This is lane H's probes=8 neutrality claim re-tested on a state it was never tested on,
and it costs nothing to check because both files exist anyway.
Confidence: moderate. Conditional on P5: if the control does not agree with itself, this comparison
means nothing and will not be reported as evidence (rule 26's second half — agreeing with one run of
a varying control is a 1/k coincidence).
1.8 What would make this lane report a zero (rule 28)
If Slot13RngCalleeA is entered 0 times, the failed conjunct will be named from the save, not
guessed. The four to read on the post-move autosave are: Flt.LocID == 832 for both fleets;
Flt.Pos bit-equal to Trade.Pos [0, 0, 8.0] for both; tscr bit 0 still set (253); and
tsct still 0 on sector 6 — because if the AI starts trading through sector 6 during the five
turns, tsct bit 0 arms the FtFlg & 0x800 conjunct and both fleets fail it, taking the site
back to zero for a reason that has nothing to do with multiplicity.
(Sections 2 onward are written after the run.)