rules: 18 - measure first, the lab exists; static reading explains what you measured
This commit is contained in:
parent
95b2bc81cf
commit
351acc07c3
1 changed files with 25 additions and 0 deletions
|
|
@ -186,3 +186,28 @@ coverage 89% -> 100%. Ghidra's size is also simply wrong sometimes — it gave 7
|
||||||
that is 7,641 and ends mid-instruction.
|
that is 7,641 and ends mid-instruction.
|
||||||
|
|
||||||
**Never trust a function's end. Disassemble to the next function start and find the real boundary.**
|
**Never trust a function's end. Disassemble to the next function start and find the real boundary.**
|
||||||
|
|
||||||
|
## 18. Measure first. The lab exists.
|
||||||
|
|
||||||
|
We have the game running under a hook framework, a debugger, 11 curated saves, a byte-identical
|
||||||
|
autosave oracle and a state-checksum tool that localises to named leaves. **Use them before deriving
|
||||||
|
anything.**
|
||||||
|
|
||||||
|
The RNG gap is the case study. Static analysis spent several lanes on it and produced a complete
|
||||||
|
draw-site inventory with an unexplained count — genuinely good work that could not close. The answer
|
||||||
|
came from ten minutes of live hooking: return-address capture on the entry points attributed every
|
||||||
|
word in one turn, and the dominant consumer turned out to hang off a **virtual** edge that no
|
||||||
|
direct-edge closure could ever have reached.
|
||||||
|
|
||||||
|
The general shape: **static reading is for explaining what you measured, not for predicting it.**
|
||||||
|
Derivation is the fallback when the path cannot be reached, not the default.
|
||||||
|
|
||||||
|
A question of the form *"what writes this?"*, *"how many times does this run?"*, *"does this branch
|
||||||
|
ever fire?"* is a **watchpoint or a hook**, not a week of reading. Open items that fit that shape
|
||||||
|
right now: the `Player.Status` writer between tail phase 31 and the autosave; the `TShn`/`ltis`
|
||||||
|
writer; `Summary.Checksum`'s inputs; whether a trade-raid roll ever succeeds (a word count cannot
|
||||||
|
separate "no success" from "empty candidate list" — a hook on the callee separates them instantly).
|
||||||
|
|
||||||
|
Corollary, from the same session: **search the notes before the binary.** The dominant RNG consumer
|
||||||
|
was already identified in `strategic-turn-internals.md` months of lanes earlier. What was missing was
|
||||||
|
never the identification — it was the connection.
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue