sots-re/findings/control-flow/raid-intercept-species-word.md
alex 2ad6652eac AZ: correct the archived save's size, stage both states, and add the pre-loss turn-11 save
az-turn23-tarka-comraid.sav is 89,285 B not 73,385 (that number was the
turn-11 file's). Both saves are now on the guest as well as in the repo.
az-turn11-16destroyers.sav is the same game with the 16-destroyer fleet
still alive and Commerce Raiding already in hand - it saves ten turns of
play for anyone retrying the player's own raider, though the AI's first
routes do not appear until turn 16.
2026-09-09 03:00:29 -04:00

612 lines
52 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# `z` — the raid interception word, and the species that pays it
- **Type:** control-flow (static decode of the gate + live measurement)
- **Owner / date:** lane AZ · 2026-09-09 · guest **VM141** (`sots-re-win10-b`, 192.168.10.143)
- **Status:** **static half verified, and it corrects two published sentences**; the live `z`
measurement was **NOT taken** — the workload was built to within one conjunct and then blocked
(§6). A new corpus save is the deliverable, and §7 names the next workload from the failed
conjunct
- **Decides:** the `z` term of lane AR's `k + s + z` tail model
(`findings/control-flow/raid-target-pick-verdict.md` §4.2) — **never observed through
`Slot13RngCalleeB` by any lane**, because every raid this campaign has run was Human
- **Instrument:** **none was armed.** `hooks=off` for the entire session; the `probes=8` set the
brief specifies was built and deployed to `C:\SOTS\shimdist-az` but never copied over
`C:\SOTS\shim.cfg`. **Nothing in this document is a measurement of the RNG.**
---
## 1. Predictions, committed before the build (rule 2)
*Everything in §1 was written and committed before the shim was built, before the workload was
played and before any counter was read. It is not edited after the fact — only annotated with
verdicts below the line.*
### 1.0 What the brief said, and the two ways it is incomplete
My brief — inherited from lane AR's §4.2 and lane AG's §5.2 — states the gate as:
> A **Human or Zuul** raider intercepts and draws nothing. **Every other species draws a word.**
That is **wrong in two places**, and both were found by reading `FUN_00820af0` from the
instruction stream on the host before any guest was touched (rule 18's corollary: static reading
is for explaining, but here it is also for *not wasting a workload*). The function has **three**
short-circuits and they are a disjunction; the campaign has only ever named the third.
```
FUN_00820af0(TradeManager* this, Vector3* out, TradeRoute* rt, StarFleet* fleet) ; 0x00820af0
ebx = registry_lookup(S+0x84, rt->tro) ; the ROUTE OWNER (ServerPlayer)
...
00820bc2 cmp DWORD PTR [ebx+0x5c],0x1 ; ServerPlayer+0x5c is the serialised `Species` tag
00820bc6 je 0x820bf6 ; SC1 -- route owner is species 1
00820bcf call 0x81a2d0 ; StarFleet_GetCrewSpeciesForIntercept(fleet)
00820bd7 cmp eax,0x1
00820bda je 0x820bf6 ; SC2 -- RAIDER's crew species is 1
00820bdd call 0x81a2d0 ; again, same value
00820be3 call 0x545cc0 ; SpeciesDef_Get(k) -> 0x00b10a00 + k*0x184
00820bed call 0x53baf0 ; SpeciesDef_HasInterceptFlag: [ecx+0x144] != 0
00820bf4 je 0x820bf8 ; SC3 -- flag clear: fall through to the draw
00820bf6 mov al,0x1
00820bf8 fldz ; fstp [ebp+0xc] ; frac = 0.0
00820bfd test al,al
00820bff jne 0x820c33 ; short-circuited: NO DRAW
00820c1b call 0x47d830 ; <<< NextFloat, ONE WORD -- this is `z`
```
**Correction 1 — species 1 short-circuits too, and species 1 is Hiver.** `SC2` is a plain
`== 1` test on the raider's own crew species and has nothing to do with `SpeciesDef+0x144`.
It is not mentioned in AR's §4.2 disjunct list as a *species* test at all (AR annotates it
"raider is Species 0 -- no", which is true of AR's state and hides the rule).
**Correction 2 — the route owner's species is a gate too.** `SC1` tests the *route owner*, not
the raider. A route owned by a species-1 empire is intercepted with **no draw whoever raids it**.
My brief does not mention this conjunct at all, and it is a way for this lane's run to come out
zero for a reason that has nothing to do with the raider.
### 1.1 The species enum, named from the image
`SpeciesDef_InitTable 0x005453a0` selects the `Species/%s/...` data-path prefix through
`jmp DWORD PTR [eax*4+0x545b60]`. Reading the seven-entry jump table **as bytes** (not by the
order the case bodies happen to be laid out in, which is a different order and would give the
wrong answer):
| index | jump-table target | string |
|---|---|---|
| **0** | `0x005453f2` | **`Human`** |
| **1** | `0x005453f9` | **`Hiver`** |
| **2** | `0x00545400` | **`Tarkas`** |
| **3** | `0x00545407` | **`Liir`** |
| **4** | `0x0054541c` | **`_NPC`** |
| **5** | `0x0054540e` | **`Zuul`** |
| **6** | `0x00545415` | **`Morrigi`** |
`SpeciesDef_Get 0x00545cc0` bounds-checks `k <= 6`, so **there are exactly seven**, and
`0x00b10a00 + k*0x184` is the element. This independently confirms lane AR's "species 5 = Zuul"
and "species 0 = Human", and it names 1, 2, 3, 4 and 6 for the first time in this campaign.
The `+0x144` flag word is written only at `0x0054562f` (`or [ebx+0x144],2` when the element's
index is **5**) and `0x00545638` (`or [ebx+0x144],1` when it is **0**) — AR's read, reproduced.
### 1.2 The gate as a predicate, and the corpus counted against it (rule 28 practices 1 and 5)
> **`0x00820c1b` draws one word through `Slot13RngCalleeB` iff**
> **(a)** the route's owner is **not species 1 (Hiver)**, **and**
> **(b)** the raider fleet's crew species is **not 1 (Hiver)**, **and**
> **(c)** the raider fleet's crew species is **not 0 (Human) and not 5 (Zuul)**.
>
> Equivalently: the raider's crew species is one of **2 Tarkas, 3 Liir, 4 _NPC, 6 Morrigi**,
> and the route owner is not Hiver.
`StarFleet_GetCrewSpeciesForIntercept 0x0081a2d0` returns the fleet **owner's** `Species`
(`FUN_0071e280(fleet)->+0x5c`) on every path except one: when that species is **4 (`_NPC`)** it
scans the fleet's ships for a `design->+0x14->+0xac..+0xb4` record and returns that record's
`+0x4`. So for a player-owned fleet, crew species == owner species, full stop.
**Corpus count, all 30 saves in `verify/results/saves/`, read with `save_reader.py --json`:**
| species present | saves |
|---|---|
| 0 Human (player 0) + 2 Tarkas (the AI) + 4 `_NPC` | **24** |
| 5 Zuul (both players) + 4 `_NPC` | 6 |
| 1 Hiver, 3 Liir, 6 Morrigi | **0** |
**Corpus count against the predicate: 0 of 30.** And the near miss is instructive: **24 saves
already contain a Tarka empire**, which is a *drawing* species — but it is the **AI**, and
`tscr` is `253` in every one of them (bit 0 set = player 0 permitted, **bit 1 clear** = the AI has
no Commerce Raiding). So the AI never rolls, `A` never fires for it, and no amount of patience on
an existing save reaches `z`. **The "an AI of another species already raids" option my brief asked
me to consider is dead, and the corpus count is what killed it** — the state has to be built.
**And the tech data says which species can even be a raider.** From
`verify/results/data-catalogs/tech_tree.json` (`MasterTechList.tech`, per-race
availability percentages as written):
| edge | rp | Human | Zuul | Hiver | Tarkas | Liir | Morrigi |
|---|---|---|---|---|---|---|---|
| `CCC_FTLBrdB -> CCC_FTLEcon` | 18,000 | 100 | **0** | 100 | 100 | 100 | 100 |
| `CCC_FTLBrdB -> CCC_ComRaid` | 5,000 | 0 | **100** | 0 | 0 | 0 | 0 |
| `CCC_FTLEcon -> CCC_ComRaid` | 12,000 | 100 | 0 | **0** | **100** | **100** | **100** |
So **Hiver can never research Commerce Raiding at all** (0% on both edges) — which makes `SC2`
unreachable for a Hiver *player* through `vslot13`, and leaves it as either a defensive test or
the path for an `_NPC`-owned fleet with a Hiver-crewed design. And the species that can both raid
and draw are exactly **Tarkas, Liir and Morrigi**.
**This lane picks Tarkas (species 2).** Liir is rejected on movement (their early game is a
sublight crawl, and this workload lives or dies on parking a fleet on a distant node), Morrigi on
their fleet-size-dependent drive. Tarkas is a plain node-drive empire with a 100% path to
Commerce Raiding, and it is the species the AI already is in the lineage every other trade lane
has used, so the route-owner side is a known quantity.
### 1.3 The workload
A **new single-player game on VM141** with the species pool cut to **Tarkas only** — lane V's
trick from the Zuul save, which makes *both* players Tarkas and so pins the route owner's species
to 2 as well, satisfying `SC1` by construction rather than by luck. Create-game parameters as
close as I can get to lane AC's `MyGamel3trade` (`NSys 28`, `MaxP 2`, `PCol 10`,
`PSav 9,850,000`, `PTech 15`, `IncM 1.48`, `ResM 1.46`), because that is the setup that put a
human raider on a trade sector by turn 20 and gave the AI four trade routes by turn 22.
Then: research `CCC_FTLBrdB -> CCC_FTLEcon -> CCC_ComRaid` (34,000 RP on this branch), build
**several separate single-ship long-range fleets**, and park them on a trade sector that **sources
a route**. Separate fleets, not one fleet — the roll is per fleet (lane AD) at
`ODDS + 0.01·nShips`, so `m` one-ship fleets roll `m` times and one `m`-ship fleet rolls once.
**Cruisers if their range reaches, destroyers if not.** Cruisers roll at
`(double)0.2f + (double)0.01f = 0.21` per fleet-turn against a destroyer's `0.06` — three and a
half times the signal per fleet-turn — and a raider is **displaced off the node by its own
success** (AR §4.3), so each fleet contributes at most one success per parking and the arm
exhausts itself. That is the structural constraint on this workload and it is why hull choice
matters more than turn count.
**The route set moves between turns and this map is not AD's map.** Lane AR's geometry table is
for the `MyGamel3trade` lineage only. I will re-read `trdmgr` on the state I actually build and
pick the target sector from *that* `trfr` set, preferring a sector that sources **one or two**
routes: `bound = n - 1`, so `n = 1` gives mask 0 and `n = 2` gives mask 1, and in both cases
`RNG_NextInt` **cannot reject** and `0x0088b613` costs exactly one word. At `n >= 3` the rejection
loop is live and `s` stops being one word per success.
### 1.4 The numbered predictions
| # | prediction |
|---|---|
| **P0** | The species enum is `0 Human, 1 Hiver, 2 Tarkas, 3 Liir, 4 _NPC, 5 Zuul, 6 Morrigi`, read from the jump table at `0x00545b60` as bytes. Falsifiable live: the save I build will carry `Species 2` on both `ServerPlayer` records and the game will have been created with **Tarkas** selected in the UI |
| **P1** | `FUN_00820af0` short-circuits on **three** conjuncts, not one. The campaign's published sentence ("Human or Zuul draws nothing, every other species draws") is incomplete: **Hiver raiders draw nothing** (`SC2`), and **a Hiver-owned route is intercepted without a draw whoever raids it** (`SC1`) |
| **P2** | The short-circuit sets `frac = **0.0**`, **not `1.0`** as both lane AG §5.2 and lane AR §4.2 write it. Traced through the x87 stack at `0x00820bf8`–`0x00820c33`: `fldz; fstp [ebp+0xc]` on the short-circuit arm, and `0.0 + (1.0 - 0.0)*NextFloat()` on the draw arm. The interception point is therefore at the route's **source** end for a Human or Zuul raider, not its destination. Word count unaffected; the published sentence is wrong (rule 28 practice 6 — read the polarity before the count) |
| **P3** | Corpus count against the predicate is **0 of 30**, and the "an AI of another species already raids" option is **dead**: 24 saves hold a Tarka AI, but `tscr = 253` in every one, so the AI lacks Commerce Raiding and never rolls |
| **P4** | **`OnAllCombatDone_Tail` costs `k + 2s` words** on this state, where `k` = permitted Tarka raiders parked with `Pos` bit-equal and `s` = successes on a route-sourcing sector. This is `k + s + z` with **`z = s`**, and it is the term no lane has ever observed |
| **P5** | `draw_sites` shows, on a turn with `s` successes: `NextFloat 0x00820e18` `calls == words == k`; `NextInt 0x0088b613` `calls == words == s`; and **`NextFloat 0x00820c1b` `calls == words == s`**. Bracket residual **0** on every turn |
| **P6** | **The `0x00820c1b` row is attributable to `B` and not to `CreateRaidEncounter` exactly when `NextInt 0x008939ee` reads `calls = 0` on the same turn.** Proof, and it is proof-carrying rather than a convention: `FUN_00820af0` has **exactly two `E8` callers in the whole image** — `0x0082cf65` and `0x0088b62c` — verified by an image-wide relative-call scan; `0x0082cf65` sits in `FUN_0082ce00`, whose only caller is `0x00892700` inside `FUN_00892640`, which `CreateRaidEncounter` calls at `0x00893a25`; and `0x008939ee` is on the **straight-line path** from the empty-list gate to `0x00893a25` with no branch around it (`0x008939c9 -> 0x008939ee -> 0x00893a25`, decoded). So `0x008939ee` at zero means the other caller never ran. If it is non-zero on a measured turn I will call that turn's attribution ambiguous and use another turn, not argue |
| **P7** | `B`'s cost on a success is **2** words for a Tarka raider. Lane AG §5.2's "1 (NextInt) + 1 (NextFloat)" is right for a drawing species; lane AR's measured **1** is right for Human and Zuul; AG's committed §3.3 figure of "3 words on a succeeding turn" is right for `k = 1` **and a drawing species**, and was wrong only because the lineage was Human |
| **P8** | The `hooks=off` control **will agree with itself** (two fresh processes, byte-identical autosaves) — I am predicting lane AR's outcome, not lane AD's, **and I am not confident**. AD's variation was confined to one AI player's decision sub-tree on a state ten turns earlier in a *different* game; a resolver is looking at the discrepancy now and neither outcome is safe to assume. If my control varies I will localise it by sub-tree with `state_checksum.py --tree` and state exactly which leaves my measurement depends on and whether *those* reproduce |
| **P9** | With `k` one-cruiser fleets at `p = 0.21` per fleet-turn (`(double)0.2f + (double)0.01f`) I expect the first success within the first two or three instrumented turns. Any zero is reported as a **binomial probability**, never as "unremarkable" (rule 20), and an entry probe on `B` separates "did not fire" from "fired and found nothing" |
| **P10** | **Not settled by this lane, predicted in advance** (rule 15): the freighter doubling of the raid odds; the `design+0x12c > 1` short-circuit; `bestScale` (`0x009f8d48 = 0.33f` when `ship+0x18 & 0x100000`); the rejection loop at `0x0088b613` for a candidate list of three or more; and whether `SC2` is reachable at all for a *player* (the tech data says no) |
### 1.5 The falsifier, stated as the sentence I will have to write
> **If a Tarka raider parked on a route-sourcing sector succeeds, `Slot13RngCalleeB` is entered,
> `NextInt 0x0088b613` fires — and there is still no `NextFloat 0x00820c1b` row — then the species
> flag is not the only thing gating that draw**, and the two conjuncts ahead of it become the live
> suspects. In that case I will report, per rule 28, exactly which conjunct I satisfied and which I
> did not: `SC1` is checkable in the save I built (the route owner's `Species`), `SC2` is checkable
> the same way (the raider's owner's `Species`), and if both check out then `SpeciesDef+0x144` is
> not what `0x0053baf0` is reading and the static decode is retired.
That is a real result and it is the more interesting one, because it would mean two lanes' static
reads of the same twelve-byte function produced a confident wrong answer.
### 1.6 What could go wrong with the *workload*, and what each failure looks like
| way it fails | symptom |
|---|---|
| the Tarka AI never builds a trade route in the turns I can afford | `trdmgr` holds zero `rt` records; no sector sources a route; `A` fires and `B` returns at `G_B4` with 0 words — the exact zero lanes AC and AD measured, for AC's reason not mine |
| no Tarka hull reaches a route-sourcing sector | `A` never fires (`G4` fails, `Pos` not bit-equal); probe 5 reads 0 |
| I cannot get Commerce Raiding in the session | `tscr` stays `252`; `vslot13`'s `G3b` rejects; probe 2 fires and probe 5 reads 0 |
| the target sector sources three or more routes | `0x0088b613` `words > calls` and `s` stops being one word per success — reported, not hidden |
| the encounter query eats a scripted End Turn | detected from the `Done` pixel at (233,673) before every End Turn, per AR §10 |
---
*Results, and the verdicts, follow below. Nothing above this line is edited after the run.*
---
## 2. The verdict, stated first
> ### The static half is decided and it corrects the campaign's published sentence twice. **The live `z` measurement was not taken** — the workload was built to within one conjunct of it and then blocked, and §7 says exactly which conjunct.
>
> **`FUN_00820af0` has three short-circuits, not one.** `0x00820c1b` draws its word only when the
> **route owner is not Hiver**, the **raider's crew species is not Hiver**, and the raider's species
> does not set `SpeciesDef+0x144` (Human and Zuul). The campaign's sentence — *"a Human or Zuul
> raider draws nothing; every other species draws a word"* — is **wrong for Hiver on both sides of
> the relation**, and my own brief inherited it.
>
> **And the short-circuit sets `frac = 0.0`, not `1.0`.** Both lane AG §5.2 and lane AR §4.2 write
> `1.0`. Traced through the x87 stack, the short-circuit arm stores a zero and the interception
> happens at the raided route's **source** end. The word count is unaffected; the sentence is wrong,
> and rule 28 practice 6 is exactly about not reading a count before the polarity.
>
> **The species enum is named from the image** and it agrees, independently, with lane AP's decode
> of the save's own `ISsp` list: `0 Human, 1 Hiver, 2 Tarkas, 3 Liir, 4 _NPC, 5 Zuul, 6 Morrigi`.
> Two derivations from different artefacts, one from `SpeciesDef_InitTable`'s jump table and one
> from the wire format, agreeing on all seven.
>
> **A new corpus state exists and it is the first of its kind**:
> `verify/results/saves/az-turn23-tarka-comraid.sav` — a **Tarka** empire (species 2) with
> **Commerce Raiding researched**, three AI-owned trade routes, `tscr = 127`, and **five AI Tarka
> fleets parked on trade-sector nodes with `Pos` bit-equal**, two of which clear G0–G4. It is the
> first non-Human, non-Zuul playable-species save in the corpus and the first save in which a
> **drawing species is standing on a route-sourcing sector**.
---
## 3. What was run
**Guest VM141, `hooks=off` for the entire session — no instrument was ever installed, and no
measurement is claimed.** `C:\SOTS\shim.cfg` was `shim.cfg.hoff` from this lane's own dist
(`C:\SOTS\shimdist-az`, `BUILD_ID az-989c692-dirty-20260909T0453Z`) throughout. The shim was built
on CT111 in **`/srv/re-lab/build/sots-engine-az`**, `rm -rf`'d before the build (rule 24), from a
lane-private `git worktree` at `~/sots-engine-az` (branch `wip/az`) with no local `build*` shipped
(rule 21); exports 66 names identical to the real `binkw32.dll`. The `dirty` in the build id is the
regenerated `include/generated/sots_addresses.h` (1,283 entries, rule 14 — regenerated, never
hand-resolved), and the generator's duplicate-name check **fired and was obeyed**: my first draft of
`ghidra/addresses.d/az.json` named `0x00820af0`, which lane AG already carries as
`TradeManager_ComputeRaidInterceptPoint`. My entry was withdrawn rather than renamed. That is rule 14
working exactly as designed, on the first fragment I wrote.
### 3.0 The species choice, and why it is Tarkas and not Morrigi
Tarkas was picked and committed in §1.2 on movement and tech-availability grounds, before the game
was created. **After the empire existed and Commerce Raiding was already researched**, the
coordinator relayed lane AP's finding that **Morrigi (6) would have been strictly better**: it is
equally a drawing species for `z`, and it is the *only* species that reaches
`SpyManager::Slot13RngCallee`'s `cmp [spyOwner+0x5c], 6` branch — `Chance(0.75f)` at `0x00840929`
and a `NextInt` at `0x008409c7` — so a Morrigi save would unblock a stuck spy target as well. The
instruction was explicitly **not to restart**, and I did not. Recorded here because the next lane to
build a non-Human raider should pick **Morrigi** unless it has a reason not to: the `z` question does
not care which of Tarkas, Liir or Morrigi it is, and one of the three is worth twice as much.
### 3.1 The game that was built
A fresh single-player custom game on VM141, **species pool cut to Tarkas only** (lane V's trick from
the Zuul save), so **both empires are species 2** and `SC1` is satisfied by construction rather than
by luck. Create parameters: 28 stars, 5 ly spacing, 2 players, 10 initial colonies, 9,850,000
treasury, **Initial Technologies 15 (max)**, Economic Efficiency 148%, **Research Efficiency 150%
(max)**, Alliances on, Random Encounters 100%. Saved on the guest as `MyGameazTarka`.
| turn | what happened |
|---|---|
| 1 | Tarkas confirmed in the lobby's species dropdown — **the dropdown offered only `Tarkas` and `Random`**, which is the UI-side confirmation that the pool was cut correctly. `CCC_FTLEcon` set as the research target: **4 turns**, so `CCC_FTLBrdB` was among the 15 initial techs |
| 1–6 | 16 stock `Extended Range` destroyers queued and built at Kea'Donum (Tarka hull: **Range 20.0**, Speed 2.0, cost 2,690 — not the Human 27.0/2,252 lane AR used) |
| 6 | `CCC_FTLEcon` **completed**. `CCC_ComRaid` appeared as a new node and was set: **3 turns** |
| ~10 | `CCC_ComRaid` **completed**. `tscr` reads **127** on all five sectors |
| 16 | first two AI trade routes appear (`trfr` 4 and 27, `tro` 32) |
| 16 | 16-destroyer `Alpha Fleet` ordered to **Ku'Valt** (a sector-752 member system), ETA 7 |
| 23 | **the fleet arrived into a defended system and was destroyed** — 16 DE lost, 15 DE + 3 CR killed. Player 0 has **zero fleets** |
| 23 | state saved as `az-turn23-tarka-comraid.sav`; three AI routes; five AI fleets parked on sector nodes |
Two ceasefire offers from Fane Kona were **declined** on sight. Diplomacy confirms **War**, so
`G_B3`'s relation test passes for any route of the AI's raided by me.
### 3.2 The state, read from the save (rule 28 — field values, not a summary)
`az-turn23-tarka-comraid.sav`, `save_reader.py --strict`: **0 error, 0 warn, resyncs 0,
hint-failures 0**, 58,892 items, 6,397 frames, 2,503 raw bytes.
**Players — and this is the corpus's first playable non-Human, non-Zuul empire:**
| PID | `PlyrIdx` | `Species` | name | `AL`/`NA`/`CF` |
|---|---|---|---|---|
| **16** | **0** | **2 = Tarkas** | `re` (this lane) | 0 / 0 / 0 |
| **32** | **1** | **2 = Tarkas** | `Fane Kona` (the AI) | 0 / 0 / 0 |
| 496 | 2 | 2 = Tarkas | `Chandra` (no home, no colonies) | 4 / 0 / 0 |
| 512–560 | 3–6 | 4 = `_NPC` | Alien Menace, Peacekeeper Enforcer, Von Neumann, Independent Colony | — |
**Trade sectors:**
| `TradeID` | grid | `tsct` | `tscr` | `tsnumflt` | `Pos` |
|---|---|---|---|---|---|
| 736 | 1 | 0 | **127** | 0 | `[0.1028, 8.0082, 0.1116]` |
| **752** | 2 | **2** | **127** | 2 | `[0, 0, 8.0]` |
| 768 | 3 | 0 | **127** | 1 | `[-0.4027, -0.8793, 1.7497]` |
| 784 | 4 | 0 | **127** | 0 | `[-8.0, 8.0, 0]` |
| **800** | 5 | **2** | **127** | 2 | `[-8.0, -8.0, 0]` |
**Routes** (`trdmgr`, three `rt` records, `tro = 32` on all three, `trfrs = trtos = 0`):
`trfr = 4 → trto 9`, `trfr = 27 → trto 15`, `trfr = 27 → trto 1`. With
`index = id/16 − 3` (pinned from `Sim.systemIds` and cross-checked against the `Idx` tag on every
system, which reproduces the name list exactly), system **4 = `Ke'Sothram` lies in sector 752** and
system **27 = `Keo'Va` lies in sector 800**. So **sector 752 sources one route and sector 800 sources
two** at turn 23; sectors 736, 768 and 784 source none.
**`tscr = 127` is a new value and it matters** (rule 28 practice 3). Every earlier corpus save reads
**252** (`0b11111100`) or **253**; lane AC watched bit 0 flip 252→253 the turn Commerce Raiding
completed, and lane AG read the mask as "the NPC slots default set, your bit is the tech". This game
has **seven** players rather than eight, and the mask reads `0b1111111` — **bit 1, the AI's, is set
too**. Either the Tarka AI has researched Commerce Raiding in this game, or the mask's default for a
non-human empire differs from what the AC lineage showed. **I did not find the writer and I am not
guessing**: this is recorded as a *falsification of the corpus-wide constant*, which is what practice
3 asks for, and the writer of `TradeSector+0x90` is now a named open item.
### 3.3 Five AI Tarka fleets are parked on sector nodes, and two of them clear G0–G4
Read straight out of the save — `Flt.Pos` against `Trade[id].Pos`, all three floats:
| fleet | id | ships | `LocID` | `FtFlg` | `Pos` vs sector `Pos` | G3c armed (`tsct` bit 1)? | clears G0–G4? |
|---|---|---|---|---|---|---|---|
| `Rho Fleet` | 274 | 6 | **768** | `0x80c` | **bit-equal** | no (`tsct` 0) | **yes** |
| `Freighters` | 3248 | 3 | 752 | `0x400` | bit-equal | yes | no — no `0x800` |
| **`Escorts`** | 3344 | 6 | **752** | **`0xc00`** | **bit-equal** | yes | **yes** — carries `0x800` |
| `Freighters` | 4160 | 9 | 800 | `0x400` | bit-equal | yes | no — no `0x800` |
| `Nu Fleet IV` | 1490 | 1 | 800 | `0xd` | bit-equal | yes | no — no `0x800` |
> **So `k = 2` on this save with the player owning no fleets at all, and both raiders are Tarka.**
> `ServerTradeManagerImpl::vslot13` should enter `TradeManager::Slot13RngCalleeA` **exactly twice per
> turn** here, and `0x00820e18` should read `calls == words == 2`. That is a committed, cheap,
> falsifiable prediction about a save that is now in the repo, and it needs one `probes=8` run to
> settle.
It also confirms lane AG's reading of `G3c` from the other side: `Freighters` at 752 and 800 are
**rejected** because `tsct` bit 1 is set (the AI trades in its own sector) and they do not carry
`FtFlg & 0x800`, while `Escorts` in the same sector, on the same node, **does** carry it. Two fleets,
same sector, same position, opposite outcomes, and the only field that differs is the one AG's decode
names.
---
## 4. Verdicts on the committed predictions
| # | prediction | verdict |
|---|---|---|
| **P0** | species enum `0 Human, 1 Hiver, 2 Tarkas, 3 Liir, 4 _NPC, 5 Zuul, 6 Morrigi` from the jump table at `0x00545b60` | **CONFIRMED, twice over.** The game was created with **Tarkas** selected in the lobby and both `ServerPlayer` records in the resulting save carry `Species = 2`. Independently, lane AP decoded the same seven values from the save's own `ISsp` list. Two artefacts, two methods, no disagreement |
| **P1** | three short-circuits, not one; Hiver raiders draw nothing; a Hiver-owned route is intercepted without a draw | **CONFIRMED statically** (`0x00820bc2`, `0x00820bd7`, `0x00820bed`, decoded to the next function start). **Not testable live** and, for the raider side, **not testable at all through `vslot13`**: `CCC_ComRaid` is 0% for Hiver on both of its edges, so a Hiver *player* can never raid. `SC2` is therefore either defensive or the `_NPC`-crew path — see §6 |
| **P2** | the short-circuit sets `frac = 0.0`, not `1.0` | **CONFIRMED statically**, and it **corrects lane AG §5.2 and lane AR §4.2 in place** (rule 11). `0x00820bf8` is `fldz; fstp [ebp+0xc]`; the draw arm at `0x00820c20`–`0x00820c30` computes `0.0 + (1.0 − 0.0)·NextFloat()`. A Human, Zuul or Hiver interception lands at the route's **source** system, not its destination |
| **P3** | corpus count 0 of 30; the "an AI of another species already raids" option is dead | **CONFIRMED for the corpus as it stood** — and **the reason I gave was wrong in an interesting way.** I said the Tarka AI never rolls because `tscr` bit 1 is clear. That is true of all 24 AC-lineage saves. It is **false on the map I built**, where `tscr = 127` and two AI Tarka fleets clear G0–G4 (§3.3). The option was dead for the corpus, not for the mechanism |
| **P4** | tail costs `k + 2s` | **NOT TESTED.** No instrumented run was made |
| **P5** | `draw_sites` rows at `0x00820e18`, `0x0088b613`, `0x00820c1b` | **NOT TESTED** |
| **P6** | `0x008939ee == 0` proves a `0x00820c1b` row belongs to `B` | **CONFIRMED as a static argument**, and it is proof-carrying rather than a convention: an image-wide `E8 rel32` scan finds **exactly two** callers of `FUN_00820af0` — `0x0082cf65` and `0x0088b62c`. `0x0082cf65` sits in `FUN_0082ce00`, whose only caller is `0x00892700` inside `FUN_00892640`, which `CreateRaidEncounter` calls at `0x00893a25`; and `0x008939ee` is on the straight-line path from the empty-list gate to that call (`0x008939c9 → 0x008939ee → 0x00893a25`, decoded, no branch around it). Not exercised, because there was no run |
| **P7** | `B` costs 2 words for a Tarka raider | **NOT TESTED** |
| **P8** | the `hooks=off` control will agree with itself | **NOT TESTED** — see §5 for the predicate-based prediction I owe under rule 26 corollary (c), committed but unrun |
| **P9** | first success within two or three instrumented turns at `p = 0.21` | **NOT TESTED**, and the hull assumption was **wrong before the run started**: no cruiser design is available to a Tarka empire at game start (the Cruiser category in the Build screen is **empty**), so the arm would have been destroyers at `p = 0.06`, not cruisers at `0.21` |
| **P10** | freighter doubling, `design+0x12c`, `bestScale`, the rejection loop — not settled | **HELD.** None of them was settled |
**The prediction that was wrong is the useful one, again.** P3's *count* was right and its *reason* was
wrong, and the way it was wrong is the whole finding of §3.3: I asserted that a Tarka AI never rolls
because its `tscr` bit is clear, having checked that on 24 saves from one lineage. The first map I
generated has `tscr = 127`, the AI's bit set, and two AI Tarka fleets standing on trade-sector nodes
with `Pos` bit-equal. **A field constant across the whole corpus is a coincidence until its writer is
found** — practice 3 predicted its own violation here, and I still wrote the sentence.
---
## 5. The control I owe and did not run (rule 26 corollary (c))
The resolver's predicate arrived mid-run and it changes what a control on this state is worth. I am
recording the **prediction** here, unrun, so that whoever takes the state is testing a written number
rather than describing an outcome. Read from `az-turn23-tarka-comraid.sav`:
| AI player | `ResTNm` at turn start | exposed decision predicted? |
|---|---|---|
| `Fane Kona` (PID 32, `PlyrIdx` 1) | **`''`** | **YES — a research-pick turn** |
| `Chandra` (PID 496, `PlyrIdx` 2) | `XNC_TrnsHum2` | held |
> **Committed: two `hooks=off` processes loading `az-turn23-tarka-comraid.sav` and taking one End
> Turn will NOT agree.** `Fane Kona` enters the turn with `ResTNm == ''`, which is the resolver's
> named pick-turn predicate and lane AS's signature exactly. I expect the variation to be confined to
> `Player[32]`'s TechTree leaves, and I expect `/Sim/trdmgr` and the five `Trade` records to be
> bit-identical across processes — which would still leave `k = 2` and the raid arm reproducible even
> though the whole-save hash is not.
That prediction is cheap to falsify and it is the first test of the resolver's predicate on a map
outside the AD/AR and AS lineages.
---
## 6. What blocked the measurement, precisely (rule 28)
**Which conjuncts the built state satisfies, and which it does not.** For the AI's two qualifying
Tarka raiders on `az-turn23-tarka-comraid.sav`:
| conjunct | satisfied? | evidence |
|---|---|---|
| G0–G2 fleet at a trade-sector node | **yes** | `Rho Fleet` `LocID 768`, `Escorts` `LocID 752` |
| G3b owner's bit in `tscr` | **yes** | `tscr = 127`, bit 1 set |
| G3c `FtFlg & 0x800` where armed | **yes** for both | `0x80c` and `0xc00` |
| G4 `Pos` bit-equal | **yes** for both | §3.3, all three floats |
| **`SC1` route owner not Hiver** | **yes** | `tro = 32`, species **2** |
| **`SC2` raider crew species not Hiver** | **yes** | owner species **2**, and `0x0081a2d0` returns the owner's species for any non-`_NPC` owner |
| **`SC3` `SpeciesDef[2]+0x144 == 0`** | **yes** | the flag word is written only for species 0 and 5 |
| **`G_B3` relation to the route owner is 0 (war)** | **NO** | every route in the save has `tro = 32`, and the qualifying raiders are **owned by 32**. `PlayerAlliances_Relation` returns **3 for self**, `B` rejects on `> 0`, the candidate list empties and `B` returns at `G_B4` with **0 words** |
> **The failed conjunct is `G_B3`, and it is failed by *self-relation*, not by the species gate.**
> Everything the species half of this lane exists to test is satisfied on this save; the raider is
> simply parked next to routes it owns. That is a different sentence from "the species word did not
> fire" and it must not be written as one.
**Why my own raider never got there** — two causes, both worth recording because both are cheap to
avoid:
1. **The fleet was destroyed.** I ordered the 16-destroyer `Alpha Fleet` to **Ku'Valt**, a
sector-752 *member system*, intending to use it as a staging post. Ku'Valt is an AI colony; the
arrival produced a real tactical battle and the whole fleet died (Ranking screen: DE built 16,
lost 16, enemy killed 15 DE + 3 CR). **Never stage a raider through a member system — order it to
the node directly.** My blind "resolve the encounter peacefully" click sequence also does not
work for a real battle: the four icons are fight / auto-resolve / retreat / peaceful, and the
peaceful option is not offered when both sides have ships.
2. **The sector node could not be aimed at from the default camera**, and this is a genuine map
property rather than a mistake. Lane AR reports that a node is a legal move target whose hover
readout names it (`Sector 5 / Range / ETA`). On **this** map the two route-sourcing nodes lie
**2.4 ly from `Ke'Sothram`** (sector 752) and **2.6 ly from `Ka'Sogroth`** (sector 800), and the
Move-mode hover snaps to the nearest *system* over a radius of well over 100 screen pixels. Every
probe I placed — twelve of them, on a grid — named a system. Fitting `screen = f(world)` from
hover-confirmed reference points reproduces the systems to ~10 px but places the node within
~30 px of `Ke'Sothram`, because the offset from the star to the node points nearly along the
camera axis and is foreshortened to almost nothing.
**The fix for the next lane, and it is one gesture.** `rdrag` on the star map **rotates the camera**
(verified — the whole field re-projects and the rotation is reversible). Rotating ~90° takes the
star-to-node offset out of the camera axis and separates them by the full 40-plus pixels per light
year the zoom provides. Left-drag does **not** pan, the arrow keys do nothing, and the camera does
not follow the selection — so rotation is the only tool, and it is sufficient.
---
## 7. The cheapest next workload, named from the failed conjunct (rule 28 practice 2)
Not "park a raider" — that is the nearest container and it is what cost this lane its session. The
failed conjunct is `G_B3`, and the state that satisfies it is:
> **A trade route whose owner is at war with a raider that is already parked.**
On `az-turn23-tarka-comraid.sav` that is **one route sourced at a system inside sector 768**, because
`Rho Fleet` (PID 32, Tarka, 6 ships) is already parked on 768's node with `Pos` bit-equal and clears
G0–G4. Sector 768's member systems include **`Ku'Paaka` (index 17) and `Ka'Palum` (index 26), both
owned by player 0**. So:
1. Give **player 0** a trade route sourced at `Ku'Paaka` or `Ka'Palum`. The empire already has
`CCC_FTLEcon`; what it does not have is freighters, and lane L3's row 374 records that a trade
station is a bonus rather than a prerequisite (`NumTradeRoutesSupported` has a floor of one per
owned system).
2. Then, on any turn `A` succeeds for `Rho Fleet`, `B`'s candidate list contains **a route owned by
player 0**, `PlayerAlliances_Relation` is **0 = war**, `G_B3` passes, `0x0088b613` fires, and
`FUN_00820af0` runs with a **Tarka raider** and a **Tarka route owner** — all three
short-circuits fail and **`z` draws its word**.
3. **No fleet of the player's needs to move at all**, which removes both of the failures in §6.
The alternative — the player's own raider on 752 or 800 — is still open and now costs only the
camera rotation of §6 plus about seven turns of travel, with the ship built at **`Ku'Paaka`**
(10.0 ly from 752's node) rather than the homeworld (13.2 ly).
**Two numbers the next lane should carry in:** on this map a Tarka `Extended Range` destroyer has
**Range 20.0, Speed 2.0, cost 2,690** (the Human hull lane AR used is 27.0 and 2,252), and **no
cruiser design exists at game start for a Tarka empire**, so the raid odds are the destroyer's
`0.05 + 0.01·nShips`, not the cruiser's `0.2 + 0.01·nShips`. Send many one-ship fleets.
---
## 8. Corrections to earlier findings (rule 11)
1. **Lane AG `gate-indexed-rng-audit.md` §5.2** and **lane AR `raid-target-pick-verdict.md` §4.2** —
both render `FUN_00820af0`'s short-circuit as `frac = 1.0`. It is **`0.0`** (`fldz; fstp` at
`0x00820bf8`). Word counts unaffected; the interception geometry claim is inverted.
2. **Lane AR §4.2 and its board row** — *"A Human or Zuul raider intercepts at frac = 1.0 and draws
nothing; every other species draws a `NextFloat`."* Incomplete on both sides: **a Hiver raider
also draws nothing** (`0x00820bd7`, an ordinary `== 1` test that has nothing to do with
`SpeciesDef+0x144`), and **a route owned by a Hiver empire is intercepted without a draw whoever
raids it** (`0x00820bc2`, on the *route owner*). The species that both can raid and do draw are
**Tarkas, Liir and Morrigi**.
3. **`ghidra/addresses.d/ag.json`, `TradeManager_ComputeRaidInterceptPoint`** — its prototype text
carries the same `frac = 1.0`. Corrected in place, with the two extra conjuncts named.
4. **The `tscr` reading** — `raid-gate-multiplicity.md` §4 and `gate-indexed-rng-audit.md` §3.3 both
describe the mask as 252/253 with the NPC slots set and the human's bit as the tech flag. That is
a fact about the AC lineage. **This lane's map reads 127**, with the AI's bit set as well. The
mask's writer is unfound and the value is **not** a corpus constant.
---
## 9. Coverage, and what was not done (rule 15)
* **No instrumented run, no control pair, no word count.** `hooks=off` for the whole session; no
`shim.cfg.hp8` was ever copied over `C:\SOTS\shim.cfg`. Nothing in this document is a measurement
of the RNG.
* **`z` remains unobserved through `B`.** It is still the cheapest unexercised state in the trade
half, and it is now one trade route away rather than one save away.
* **`SC2` (Hiver) is unreachable through `vslot13` for a player** and was not tested at all. Whether
an `_NPC`-owned fleet with a Hiver-crewed design can reach it is untested and is the only route to
that conjunct I can see.
* **The `tscr = 127` reading is one save.** I did not capture a pre-Commerce-Raiding save of this
game, so I cannot say which bit the tech set here, or whether the AI has the tech.
* **The freighter doubling, `design+0x12c`, `bestScale` and the `0x0088b613` rejection loop** are all
exactly where lane AR left them.
* **`Chandra` (PID 496)** is a Tarka empire with no homeworld, no colonies, no designs and `AL = 4`.
I did not chase what it is; it holds no routes and no fleets, so it is inert for this question.
* **One `--strict`-clean save was added and one game state was lost.** The 16-destroyer fleet is
gone; the save is the turn-23 autosave and is the state as it stands.
---
## 10. Artefacts
| what | where |
|---|---|
| this document | `findings/control-flow/raid-intercept-species-word.md` |
| **new corpus save — first Tarka empire, Commerce Raiding, AI raiders parked** | `verify/results/saves/az-turn23-tarka-comraid.sav` (sha256 `3d5eb826c149d1fd0278c746f32e6148ca9883a1bc5b522c0d5e6e13fac9788a`, 89,285 B, turn 23, `--strict` clean: 0 error 0 warn, resyncs 0, hint-failures 0) |
| **new corpus save — the same game before the fleet was lost**, 16 Tarka `Extended Range` destroyers alive in `Alpha Fleet` at Kea'Donum, Commerce Raiding already researched, **no trade routes yet** | `verify/results/saves/az-turn11-16destroyers.sav` (sha256 `501583c7cf2ac81c9db3191203cd3dc5ba5b9e228b9b9ce3dbdcc3650d0070a9`, 73,385 B, turn 11, `--strict` clean). Saves the next lane ten turns of play if it wants to retry the *player's own* raider — but note the AI's first two routes do not appear until turn 16 |
| new address (1 entry, no name collides) | `ghidra/addresses.d/az.json` |
| shim build (unused for measurement) | `az-989c692-dirty-20260909T0453Z`, `/srv/re-lab/shim/dist-az` → `C:\SOTS\shimdist-az` |
| build tree | lane worktree `~/sots-engine-az` (branch `wip/az`) → CT111 `/srv/re-lab/build/sots-engine-az`, `rm -rf`'d first |
**New content for the coverage ratchet (rule 27):** this save carries a `TradeSector` with
`tscr = 127` (every earlier save reads 252 or 253), seven `ServerPlayer` records rather than eight,
two `Species = 2` player-controlled empires, and five `StarFleet`s whose `LocID` is a `TradeSector`
id with `Pos` bit-equal to the node. Nothing here is a new *kind* of item, so the ratchet should
hold; the `--strict` run above is the check.
---
## 11. VM141 as left
Guest **restored**, hold **released**. Game stopped; `C:\SOTS\shim.cfg` is `shim.cfg.hoff`;
`C:\SOTS\binkw32.dll` is this lane's build (`az-989c692-dirty-20260909T0453Z`), original still at
`binkw32_real.dll`. Left in place, all additive: `C:\SOTS\shimdist-az` (4 files) and
`C:\SOTS\ui\az-{go,ui}.ps1`. **`click_helper.ps1` is unmodified.**
**`C:\SOTS\SavedGames` is now 17 files.** Lane AR's set plus **`az-turn23-tarka-comraid.sav`**
(staged deliberately, so the next lane can load it without a transfer) and `MyGameazTarkat11cr.sav`
(this lane's turn-11 manual save, kept because it is the pre-loss state with the 16-destroyer fleet
still alive), and the three autosaves now belong to the Tarka game.
**Screenshot the Load dialog and re-derive the rows — they have moved again.**
**Five things that cost this lane time, for the next holder.**
* **`rdrag` on the star map ROTATES the camera.** Left-drag does not pan, the arrow keys do nothing,
and the camera does **not** follow the selection — it moves only when the game moves it (a combat,
a fleet order). Rotation is the only camera tool and it is enough: it is what separates a trade
sector node from a member star when the offset between them lies along the camera axis.
* **The Move-mode hover snaps to the nearest *system* over a radius of >100 px**, so a sector node
within ~3 ly of a member star cannot be hovered from a camera angle that foreshortens the offset.
Do not conclude the node is unreachable — rotate first. This is the caveat lane AR's
"fit two points and land first try" needs on a crowded map.
* **`wheel` DOES zoom both the star map and the research tree**, and it zooms toward the screen
centre. Board row 374's "wheel-zoom does nothing useful" is true of *panning* the tech tree, not of
zooming: `wheel x y -120 3` on the Research screen is what made the top-row `CCC` nodes clickable
when the `Research` title bar and the `Savings` panel were sitting on top of them.
* **A research node hidden under a HUD panel is not clickable** — the panel eats the click silently
and no preview appears. Zoom out until the node clears the chrome.
* **A blind "auto-resolve peacefully" click sequence does not resolve a real battle.** The four
encounter icons are fight / auto-resolve / retreat / peaceful, and peaceful is not offered when
both sides have ships. My turn loop clicked them blind and put a 16-destroyer fleet into a tactical
battle it lost. Sample the `Done` pixel at (233,673) first, **and screenshot the query before
choosing** — the icon set is not constant.
---
## Proposed board rows
New rows:
```
| CORRECTION: the raid-intercept species gate has THREE short-circuits, and HIVER is in two of them | control-flow | verified | high | 100% | 2026-09-09 | **Lane AZ**, static, `findings/control-flow/raid-intercept-species-word.md`. The campaign's published sentence - lane AR section 4.2, lane AG section 5.2, and my own brief - is *"a Human or Zuul raider draws nothing; every other species draws a word"*. **Incomplete on both sides of the relation.** `FUN_00820af0` short-circuits on THREE disjuncts, decoded to the next function start: **SC1 `cmp [routeOwner+0x5c],1` at 0x00820bc2** - the ROUTE OWNER's `Species`, so a HIVER-owned route is intercepted with no draw WHOEVER raids it; **SC2 `cmp eax,1` at 0x00820bd7** on `StarFleet_GetCrewSpeciesForIntercept(raider)` - a HIVER raider draws nothing, and this is an ordinary `== 1` test with nothing to do with `SpeciesDef+0x144`; **SC3 `SpeciesDef_HasInterceptFlag` at 0x00820bed** - Human (0) and Zuul (5) only, which is the one the campaign had. So `0x00820c1b` draws only for a raider of species **2 Tarkas, 3 Liir, 6 Morrigi** (or 4 `_NPC`) against a route owned by a **non-Hiver**. **AND THE POLARITY IS INVERTED IN BOTH PUBLISHED RENDERINGS**: the short-circuit arm sets **frac = 0.0**, not 1.0 (`fldz; fstp [ebp+0xc]` at 0x00820bf8; the draw arm computes `0.0 + (1.0-0.0)*NextFloat()`), so a Human/Zuul/Hiver interception happens at the raided route's SOURCE end. Word counts unaffected; the sentence is wrong (rule 28 practice 6 - read the polarity before the count). **Species enum named from the image**: `SpeciesDef_InitTable 0x005453a0` dispatches through the jump table at **0x00545b60**, whose seven entries READ AS BYTES give `0 Human, 1 HIVER, 2 TARKAS, 3 LIIR, 4 _NPC, 5 Zuul, 6 MORRIGI` - the case bodies are NOT laid out in case order, so reading the disassembly top-to-bottom gives the wrong enum. This agrees with lane AP's independent decode of the save's `ISsp` list on all seven. **And the tech data closes SC2 for players**: `CCC_ComRaid` is **0% for Hiver** on both of its edges (`CCC_FTLBrdB->CCC_ComRaid` and `CCC_FTLEcon->CCC_ComRaid`), so a Hiver empire can never raid and SC2 is unreachable through `vslot13` for any player |
```
```
| FIRST TARKA SAVE IN THE CORPUS - and two AI raiders are already parked on sector nodes | verify | verified | high | 100% | 2026-09-09 | Lane AZ, VM141, `verify/results/saves/az-turn23-tarka-comraid.sav` (`3d5eb826...`, 89,285 B, turn 23, `--strict` 0 error 0 warn, resyncs 0, hint-failures 0). A fresh 2-player custom game with the species pool cut to **Tarkas only** (lane V's Zuul trick), so **both empires are species 2** - the first playable non-Human, non-Zuul empire the campaign has. `CCC_FTLBrdB` came free in the 15 starting techs, `CCC_FTLEcon` took 4 turns and `CCC_ComRaid` 3 more at Research Efficiency 150%, so **Commerce Raiding by turn 10**. Three AI trade routes (`tro 32`, `trfr` 4, 27, 27). **FIVE AI TARKA FLEETS ARE PARKED ON TRADE-SECTOR NODES WITH `Pos` BIT-EQUAL**, and two of them clear G0-G4: `Rho Fleet` (274, 6 ships, `LocID 768`, `FtFlg 0x80c`) and `Escorts` (3344, 6 ships, `LocID 752`, `FtFlg 0xc00`). The other three are rejected at **G3c** exactly as lane AG's decode says - `tsct` bit 1 is set on 752 and 800 (the AI trades in its own sectors) and they lack `FtFlg & 0x800`; `Escorts` sits on the SAME NODE as `Freighters` 3248 and differs only in that bit. **COMMITTED PREDICTION, one `probes=8` run to settle: `k = 2` on this save with the player owning NO fleets, so `Slot13RngCalleeA` is entered exactly twice per turn and `0x00820e18` reads calls == words == 2.** `B` will still cost 0 - every route is `tro 32` and the qualifying raiders are owned by 32, so `PlayerAlliances_Relation` returns 3 for self and `G_B3` empties the candidate list |
```
```
| `tscr` IS NOT A CORPUS CONSTANT - it reads 127 on a fresh map, with the AI's bit SET | control-flow | verified | high | 100% | 2026-09-09 | Lane AZ. Every one of the 30 earlier corpus saves reads `Trade[].tscr` = **252** or **253**, and lane AC watched bit 0 flip 252->253 the turn Commerce Raiding completed; lane AG's section 3.3 reads the mask as "the NPC slots default set, your bit is the tech". On the first map this lane generated, **all five sectors read 127** - seven players instead of eight, and **bit 1, the AI's, is SET as well as bit 0**. Either the Tarka AI researched Commerce Raiding, or the default for a non-human empire differs from what the AC lineage showed; **the writer of `TradeSector+0x90` is still unfound and no guess is offered**. This is rule 28 practice 3 landing on the lane that quoted it: my own committed prediction P3 said a Tarka AI never rolls because its `tscr` bit is clear, which is true of 24 saves from one lineage and false on the first new map. The COUNT was right and the REASON was wrong |
```
```
| WORKLOAD BLOCKED, and the failed conjunct is G_B3 not the species gate | control-flow | in-progress | — | 60% | 2026-09-09 | Lane AZ. `z` - the `NextFloat` at `0x00820c1b` charged to `Slot13RngCalleeB` - is **still unobserved**, and this lane did not run an instrument at all (`hooks=off` throughout, no `shim.cfg.hp8` ever copied). What it built is a state that satisfies **SC1, SC2, SC3 and G0-G4** and fails only **G_B3**: the qualifying raiders are the AI's and every route is the AI's own, so `PlayerAlliances_Relation` returns **3 for self**, `B` rejects on `> 0` and returns at `G_B4` with 0 words. **THE CHEAPEST NEXT WORKLOAD IS NAMED FROM THAT CONJUNCT AND NEEDS NO FLEET MOVEMENT AT ALL**: give **player 0** a trade route sourced at `Ku'Paaka` (index 17) or `Ka'Palum` (index 26), both player-0 colonies and both members of **sector 768**, where the AI's `Rho Fleet` is already parked and already clears G0-G4. Then a success for `Rho Fleet` puts a player-0 route in `B`'s candidate list at relation **0 = war**, `0x0088b613` fires, and `FUN_00820af0` runs with a Tarka raider against a Tarka owner - all three short-circuits fail and **`z` draws**. Two failures worth not repeating: the 16-destroyer raider fleet was **destroyed** staging through `Ku'Valt`, a sector-752 MEMBER SYSTEM that is an AI colony (order to the NODE, never through a member), and a blind "auto-resolve peacefully" click sequence **does not resolve a real battle** - peaceful is not offered when both sides have ships |
```
```
| GUEST GOTCHA: `rdrag` ROTATES the star map, and that is how you aim at a crowded sector node | meta | verified | high | 100% | 2026-09-09 | Lane AZ, VM141. Lane AR's recipe - fit `screen = (A*wx+B*wz+C, D*wx+E*wz+F)` from two known points and land on any node first try - **does not generalise to a crowded map**. On lane AZ's map the two route-sourcing sector nodes lie **2.4 ly from `Ke'Sothram`** and **2.6 ly from `Ka'Sogroth`**, the Move-mode hover snaps to the nearest **system** over a radius of well over 100 screen pixels, and twelve grid probes all named a system. The offset from star to node points nearly **along the camera axis** and foreshortens to ~30 px however far you zoom in. **THE FIX IS ONE GESTURE: `rdrag` on the star map ROTATES the camera** (verified, reversible, the whole field re-projects). Left-drag does NOT pan, the arrow keys do nothing, and **the camera does not follow the selection** - it moves only when the game moves it (a combat, a fleet order). Also: **`wheel` DOES zoom, on the star map AND the research tree**, toward the screen centre - board row 374's "wheel-zoom does nothing useful" is true of PANNING the tech tree, not of zooming, and `wheel x y -120 3` is what made the top-row `CCC` nodes clickable when the `Research` title bar and `Savings` panel were sitting on top of them. **A research node under a HUD panel is not clickable and the click is eaten silently** - no preview appears and nothing tells you why |
```
Edits to existing rows:
- **Row 62** (guest holders) — `VM141 = FREE (lane AZ released 2026-09-09; guest restored, `shim.cfg.hoff`, this lane's binkw32.dll). **SavedGames has grown by a whole new game**: lane AR's 12-row set PLUS `MyGameazTarka.sav` and `MyGameazTarkat11cr.sav`, and the three autosaves now belong to the Tarka game - **screenshot the Load dialog and re-derive the rows**. Left `C:\SOTS\shimdist-az` + `ui\az-{go,ui}.ps1`; `click_helper.ps1` unmodified. GOTCHAS: `rdrag` rotates the star map (left-drag does NOT pan, arrow keys do nothing, the camera does not follow the selection); the Move-mode hover snaps to the nearest SYSTEM over >100 px so a node within ~3 ly of a member star needs a camera rotation first; `wheel` zooms both the star map and the research tree; a research node under a HUD panel is silently unclickable; and a blind auto-resolve-peacefully click sequence DOES NOT resolve a real battle - it cost this lane a 16-ship fleet.`
- **Row 186 / the `k + s + z` row** — append: `Lane AZ 2026-09-09: the `z` term's gate is THREE conjuncts, not one - the route owner must not be HIVER (0x00820bc2), the raider's crew species must not be HIVER (0x00820bd7), and only then does `SpeciesDef+0x144` (Human, Zuul) decide. And the short-circuit sets frac = **0.0**, not 1.0. `z` is still unobserved; the cheapest state for it is now a player-owned route sourced in a sector where an AI raider is already parked, which needs no fleet movement at all.`
- **Lane AR's `B costs ONE word` row** — append: `SCOPE CORRECTED (lane AZ 2026-09-09): "every other species draws a word" is wrong for HIVER raiders and for HIVER-owned routes, and Hiver can never research Commerce Raiding anyway (`CCC_ComRaid` pct 0 on both edges), so SC2 is unreachable through `vslot13` for a player. The drawing raiders are Tarkas, Liir and Morrigi.`