From 9bf86325d94966b46bade5ea5b5c947cd61191fc Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 8 Sep 2026 10:46:23 -0400 Subject: [PATCH] Z: rewrite the opening for what the run actually found --- findings/control-flow/tail-rng-ledger.md | 33 +++++++++++++++--------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/findings/control-flow/tail-rng-ledger.md b/findings/control-flow/tail-rng-ledger.md index 09087c7..b76cd16 100644 --- a/findings/control-flow/tail-rng-ledger.md +++ b/findings/control-flow/tail-rng-ledger.md @@ -19,17 +19,22 @@ neither. ## 0. Where to start if you are building the standalone -Three sentences, then the evidence. - -1. A turn costs **18–22 generator words**, all of it inside - `StrategyServer::ProcessTurn`; the two autosave files bracket exactly that interval and nothing draws - between them outside the two turn drivers. -2. `verify/results/shim/tailrng/z-t6-endturn.sav` → `z-t6-autosave.sav` is a **byte-identical oracle pair - with a known RNG cost of 18 words**, verified from the file bytes independently of the live hook. Test - against that pair before any other. -3. Lane K's warning stands and is now quantified: the tail's cost is 0 **today** because no save is within - ~40 turns of a node-line expiry (§9) and no encounter has ever produced a battle (§8). Both terms are - real; both are latent. +1. **A turn costs 18–22 generator words on the reference save, and §11 says which call site spends each + one**, summing to the measured total with nothing left over on three consecutive turns. Sixteen of them + are two `Chance` calls per player in `FUN_00893290` — a function that is **not** in the static + inventory of `ProcessTurn`'s draw sites and is still unidentified. Model that one first. +2. **Two byte-identical oracle pairs with a known RNG cost** are in `verify/results/shim/tailrng/`: + `z-t6-endturn` → `z-t6-autosave` (18 words) and `z2-endturn` → `z2-autosave` (20). Both were verified + from the file bytes independently of any hook. Test against those before any other save, because no + corpus save carries a known cost. +3. **Combat is free.** The first battle ever instrumented in this campaign moved the strategic generator + by **0** words (§10). A reimplementation can model a turn's RNG and nothing about combat. +4. **Node-line decay is not free, and it is no longer hypothetical.** It fired on turn 64 of the Zuul save + and cost exactly the 1 word lane K predicted from the instruction stream (§9). Before that turn a + reimplementation modelling only `ProcessTurn` would have been correct; on that turn it would have been + one word out and every later turn would diverge. +5. **The generator does not move between turns** (§2.1), so the interval to reproduce is closed at both + ends. ## 1. The instrument, and why it is not an RNG hook @@ -320,7 +325,11 @@ would have said so by construction rather than by anyone noticing. * ~~The combat resolver has never run under an instrument.~~ **It has now, once — see §10. It cost 0 words.** What remains unsettled is everything a single auto-resolved encounter cannot speak for; §10.2 lists it. -* **Node-line expiry did not fire.** See §9 for the quantified distance rather than an absence. +* ~~Node-line expiry did not fire.~~ **It fired on turn 64 — §9.1.** What is still open about it is in + §9.3. +* **`FUN_00893290` is unidentified** and spends 16 of every turn's 18–20 words (§11.1). This is the single + biggest open item for anyone modelling a turn's RNG, and it is bigger than everything else on this list + put together. * **A turn with a genuinely empty encounter vector was not observed** (§4). Both saves produce exactly one sighting encounter on every turn. The tail-runs-every-turn claim is settled; the no-encounters variant is still an inference, now a much narrower one.