From 7afd5b86cc886f8f1e40364a560f87783fdab833 Mon Sep 17 00:00:00 2001 From: slaguru666 <111923774+slaguru666@users.noreply.github.com> Date: Sun, 13 Sep 2026 16:36:08 +0100 Subject: [PATCH] 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 --- docs/REVIEW_LOG.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/docs/REVIEW_LOG.md b/docs/REVIEW_LOG.md index 3aff032..f53aa0d 100644 --- a/docs/REVIEW_LOG.md +++ b/docs/REVIEW_LOG.md @@ -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. 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. + +## 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.)*