R-296: the review log entry for the pack tables

The work landed in a5c4378 under the subject "R-294", which was already
taken by the peer session's derived-source resolver. R-295 was taken too,
so renumbering to 295 as I first proposed would have collided with
something already in the log. Read the log before writing rather than
accepting the correction: it runs to R-295, both of those entries are
theirs, and mine is R-296.

The commit subject stays wrong; rewriting a pushed subject to fix a number
is worth less than the entry pointing at it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
slaguru666
2026-09-13 16:36:08 +01:00
co-authored by Claude Opus 5
parent 47f2df9446
commit 7afd5b86cc
+53
View File
@@ -6995,3 +6995,56 @@ Everything in the step-5 prose now resolves to a derived value: `refused.*`, `cu
`accepted.*`, `hadHeRefused.*`, `blended.*`, the shares, the targets and the thing's own 75. `accepted.*`, `hadHeRefused.*`, `blended.*`, the shares, the targets and the thing's own 75.
The markers themselves are not placed yet — `CLEAN_GROUND.md` is c0's and they are in it, The markers themselves are not placed yet — `CLEAN_GROUND.md` is c0's and they are in it,
placing 91 `packs` citations of their own. placing 91 `packs` citations of their own.
## R-296 — EXPOSURE's tables were censored by a ceiling nobody had looked at
Desk pass 9 found the scenario's most consequential table — the one that decides whether a
GM lets a fight happen — held by nothing: about thirty sampled figures, no artifact, and
`lethality-baseline.json` covering none of them, since that measures creatures **solo**
against a frozen four-agent party that is not this cast.
Building the baseline found the figures were also wrong.
`simulate.mjs:490` calls `runFight(rng, partySpecs, enemySpecs)` with no options, so every
figure EXPOSURE ever printed was measured at the default `maxRounds` of 40 — and `runFight`
does not report truncation. Its loop is `for (; round < maxRounds; round++)` and it returns
whoever is standing when that stops. Truncation was inferable from `rounds === maxRounds`
and nothing was inferring it.
```
line.column6 14.8% -> 15.2% 34/2000 truncated
line.hollow6col2 7.8% -> 8.3% 129
line.hollow6col3 28.7% -> 30.1% 264
cut.hollow6 58.7% -> 74.9% 578 <- 29% of runs never finished
```
**Fourteen points on the most alarming number in the case**, and the one v0.16 added
specifically to warn four-player tables. R-270 taught this lesson in `fight-tail`, which has
carried an `assertUncensored` ever since; EXPOSURE's own tables never got one. The longest
fight at cap 400 is 120 rounds and 400 and 2000 give identical figures, so the new cap is
comfortable rather than merely sufficient.
`tools/pack-tables.mjs` measures all seventeen configs against the cast **derived** through
`castAndCut`, and refuses to report or record a truncated sweep rather than recording one
with a warning — a warning on a number that is already wrong is a number that gets quoted.
`tools/check-packs.mjs` holds the baseline against the game, so the pair is not a loop:
`check-cited` holds the prose against the record, this holds the record against the harness.
Its hard claims read `now` and never `base`.
**Two things worth keeping from building it.**
`measure()` threads ONE rng through every run rather than reseeding per run. The first probe
reseeded, got different numbers, and nearly reported the published table as unreproducible
when it was the probe's own stream that was wrong — the same trap as `seedFor` re-rolling a
measurement when a config is renamed.
And the removed-config test **passed for a bad reason**: `MIN_CONFIGS` is a floor of 14, and
seventeen minus one is sixteen, which clears it. The test was green and meaningless. That is
worse than an `assert.ok(… || true)`, which passes on anything and is visible on sight; this
one passed on the specific thing it was written to catch. A dropped-config check was added
and re-tested on a row that sits in no monotonic chain, so the failure could not be borrowed
from a neighbouring assertion.
*(Committed as a5c4378 under the subject "R-294", which was already taken by the derived
source. The number here is the correct one; the commit subject is wrong and is left alone
rather than rewritten.)*