The simulator can be read now, not just totalled (R-263)

Every guard here reports a number per creature, and a number cannot say why a fight went
the way it did. That gap is what produced R-258 through R-260: each written from a side
harness built to watch a fight, each modelling something slightly different from the game,
two of the three wrong in ways no guard could catch because no guard was involved.

runFight takes an optional `say` sink. It reports what the simulator already decided — the
attack roll and its target, a defence and the penalty it was made at, the landing level
after a dodge downgrades it, damage against armour before and after armourAgainst, the
location, major wounds, disablement, death. It never touches the generator, so a narrated
fight and a silent one are the same fight; check-lethality and check-focus both still
match their baselines exactly with the hook in place.

tools/playthrough.mjs (npm run play) is its consumer, in the same commit deliberately: a
hook with no reader is the exact defect this project keeps finding in its own rules, and
adding one to the measurement pipeline with only a scratchpad file calling it would have
been committing the thing I have spent the session removing. Pack size comes from
focus-baseline.json so the fight you read is the fight check-focus measures; creatures
recorded as pinned are played solo.

Three redcaps, seed 20260913, same seed both ways. Spread fire: wiped in 10 rounds, 3
dead, and all three redcaps still standing — 39 hit points spread three ways so that none
of it finished anything. Focus fire: same opening, diverging at one target choice in round
1, party wins in 20 with two up. The +13.2 points check-focus records, seen once instead
of averaged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
slaguru666
2026-09-13 00:30:14 +01:00
co-authored by Claude Opus 5
parent 104b588e86
commit 5dcaaf519a
6 changed files with 164 additions and 9 deletions
+35
View File
@@ -5668,3 +5668,38 @@ tier finds this defect class.
`simulate.mjs` already uses, rather than letting a second copy grow in the new guard —
which is the one thing this repository forbids. `update-readme` caught the omission fairly
on the first attempt, since it cross-checks the advertised list against `npm run check`.
## R-263 — the simulator can be read now, not just totalled
Every guard in this suite reports a number per creature, and a number cannot say WHY a
fight went the way it did. That gap is why R-258, R-259 and R-260 happened: each was
written from a side harness built to watch a fight, each modelled something slightly
different from the game, and two of the three were wrong in a way no guard could catch
because no guard was involved.
`runFight` now takes an optional `say` sink. It reports what the simulator has already
decided — the attack roll and its target, a defence and the penalty it was made at, the
landing level after a dodge downgrades it, damage against armour before and after
`armourAgainst`, the location, major wounds, disablement and death. **It never touches
the generator**, so a narrated fight and a silent one are the same fight. check-lethality
and check-focus both still match their baselines exactly with the hook in place, which is
the proof rather than the claim.
`tools/playthrough.mjs` (`npm run play`) is its consumer, added in the same commit
deliberately: a hook with no reader is precisely the defect this project keeps finding in
its own rules, and adding one to the measurement pipeline with only a scratchpad file
calling it would have been me committing the thing I have spent the session removing. It
takes its pack size from `focus-baseline.json`, so the fight you read is the fight
check-focus measures, and creatures recorded as pinned are played solo where targeting
cannot mean anything.
**What it shows, immediately.** Three redcaps, seed 20260913, played twice from the same
seed. Spread fire: the party is wiped in 10 rounds, 4 down, 3 dead, and **all three
redcaps are still standing at the end** — thirty-nine hit points spread three ways so that
none of it ever finished anything. Focus fire: the same opening, diverging at one target
choice in round 1, and the party wins in 20 with two on their feet. That is the +13.2
points check-focus records for this creature, seen once instead of averaged.
The defence ladder is legible in the log too — `Ben → Redcap A: 26 SUCCESS — dodged
(10 vs 45, -30 for defences already spent)` — a 75% dodge meeting the second attack of the
round at 45.