R-267: a guarded home for the first disabling blow

Another session verified R-266's measurement, agreed the frame was better than
its own, and declined to publish it because the figure had no guarded lineage a
doubter could re-derive. It was right, and the fix costs 0.7s of build time --
which is the number I should have checked before calling it a reading tool and
not a guard.

first-blood.mjs gains --update/--check and is now both the reader and the
measurement of record; check-firstblood.mjs is a thin wrapper over it, the same
shape as check-bestiary. Compares the recorded figures exactly, then asserts only
what a page would claim: first blood lands within 5 points of even in the cut,
and its swing exceeds the six-a-side line's by more than both noises.

Recording it moved the swing from the scratch run's 43 to 40 against a
seed-to-seed spread of 2.1 -- high by more than its own noise, which is the
argument in miniature. update-readme's COUNT_WORD could not reach thirteen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
slaguru666
2026-09-13 09:42:31 +01:00
co-authored by Claude Opus 5
parent 8e5a30a263
commit ce1103ec0d
7 changed files with 357 additions and 74 deletions
+55 -11
View File
@@ -5831,26 +5831,70 @@ average blow takes a fighter out of the fight. Every disable removes an attacker
thins the return fire, which makes the next disable likelier. Nothing pulls a fight back
toward the middle once it has tipped, which is the whole of the bimodality.
**Measured, `tools/first-blood.mjs`, 2000 runs at seed 11:**
**Measured, `tools/first-blood.mjs`, 2000 runs across three seeds:**
| first fighter out | share of fights | mean round | wipes among those |
|---|---|---|---|
| the party strikes first | 49.7% | 1.7 | **23.1%** |
| the column strikes first | 50.3% | 1.7 | **66.5%** |
| the party strikes first | 50.3% | 1.8 | **25.5%** |
| the column strikes first | 49.7% | 1.8 | **65.5%** |
A true coin, settled in round two, worth **43 points of wipe rate**. Six against six of the
column is the control: first blood still matters there and matters far less — 8.6% against
22.4%, a 14-point swing, at mean round 1.3. One fighter is a sixth of that line and a
A true coin, settled in round two, worth **40 points of wipe rate**. Six against six of the
column is the control: first blood still matters there and matters far less — 7.8% against
23.2%, a 15-point swing, at mean round 1.3. One fighter is a sixth of that line and a
quarter of the cut, so the same blow compounds less. This is a property of the cut, which
is what the histogram said by a different route.
*Figures above are the recorded artifact, not the scratch run this entry was first written
from. That run was one seed and gave 49.7/23.1/66.5 and a swing of 43. Averaging three
seeds moves it to 40, and the seed-to-seed spread of the swing is 2.1 — so the single-seed
figure was high by more than its own noise, which is the argument for recording it rather
than quoting it. See R-267.*
**Dominic should be read before anyone is handed him.** In both narrations he attacks at
`vs 1` — four attempts in the seed 5 fight, all of them hopeless. The four-player cut is
three effective attackers, not four, and a table that assigns Ashcroft to a player without
saying so has quietly made the coin worse.
**`tools/first-blood.mjs` is a reading tool, not a guard.** It records nothing and no
figure from it belongs on a generated page — the bestiary and the scenarios read guarded
artifacts only. It is in the repo rather than in a scratch directory for one reason: the
number above was quoted to another session, and R-265's lesson is that a number the
person quoted it cannot re-run is a claim, not a result.
**`tools/first-blood.mjs` was a reading tool and not a guard when this was written.**
That was the right place to stop and the wrong place to stay — see R-267, which is the
consequence of being told so.
## R-267 — the thirteenth guard, built because a peer refused to print the twelfth's number
R-266 measured why the four-player cut is bimodal and said plainly that the figure had no
guarded home, so it should not reach a page. The session holding the scenario agreed and
went further: it verified both configurations, said the frame was better than its own, and
**still would not publish it**, because the numbers already in CLEAN GROUND come out of the
guarded lineage and can be re-derived by a doubter while mine could not. It offered to
reframe the paragraph the moment a guarded home existed.
That is the correct call and it is the whole reason this entry exists. The refusal was
worth more than the finding.
**What it cost to fix: 0.7 seconds of build time.** That was the number I should have
checked before writing "a reading tool, not a guard" as though it were a considered
position. `check-focus` runs 1000 fights x 3 seeds x 47 creatures and takes 8.6s; this
runs 2000 x 3 x 2 configurations and takes 0.7s. There was never a cost argument.
**Shape.** `tools/first-blood.mjs` gained `--update` and `--check` and is now both the
reading tool and the measurement of record; `tools/check-firstblood.mjs` is a thin wrapper
that spawns it, the same arrangement as `check-bestiary`/`bestiary.mjs`. The reader and
the guard cannot disagree, because they are the same code path — which is the defect this
whole sequence started from, one layer down.
**What it asserts, and deliberately no more.** The recorded figures are compared exactly,
so any movement at all shows as drift. On top of that, two claims, both of which a page
would actually make: first blood in the cut lands within 5 points of even, and the swing
it is worth in the cut exceeds the swing in the six-a-side line by more than both
samplings' noise. A guard that asserted the swing's exact size would fail on news rather
than on error — R-261, which this suite has already learned once.
**Recording it changed the number, which is the argument in miniature.** The scratch run
said the first blow was worth 43 points. Three seeds say 40, against a seed-to-seed spread
of 2.1 — so the figure I sent another session was high by more than its own noise. It was
not wrong enough to mislead anybody and it was wrong enough to print.
**`tools/update-readme.mjs` could not count to thirteen.** Its `COUNT_WORD` table stopped
at twelve, which is exactly the hardcoded-list failure its own comment warns about two
lines above, committed by the file that exists to prevent it. Extended to sixteen, which
defers the same defect rather than curing it.