R-280: the band replaced by the test it was standing in for

MEASURABLE = [15,85] proxied for "can this fight move at all". The direct form,
in the units the guard already uses: the spread rate must stand clear of both
ends by more than its own noise. Deliberately blind to the gain -- admitting the
sizes where focus fire clears its noise would make the guard's claim true by
construction. Size is still picked on nearest-an-even-fight.

31 measurable became 38. the_arrears returns at 6.3, and switchboard arrives at
8.1 -- the second largest gain in the artifact, thrown away for being one point
past a round number. Four of the eight carry effects larger than most rows the
band already admitted.

Two of them do not clear their own noise: the_choir has 0.7 points of headroom
and used 0.2, the_stanchion has six and used 0.2. Above-noise falls 31/31 to
36/38 and the bestiary prints 36. That is two measurements reporting no
detectable effect, which the band suppressed by refusing to take them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
slaguru666
2026-09-13 14:27:13 +01:00
co-authored by Claude Opus 5
parent 23262855b4
commit 3d83fbde93
5 changed files with 118 additions and 33 deletions
+4 -4
View File
@@ -187,17 +187,17 @@ check-kits: OK — 25 roles, 10 trades, 218 catalogue items, every kit key resol
check-lang: OK — en.json, 1018 keys, no leaf/branch collisions
check-templates: OK — 19 templates compile
check-behaviour: OK — 76 behavioural tests
check-scenarios: OK — 13 scenario files, 83 mechanic tags, every skill named resolves against 62 catalogue entries
check-rollable: OK — 82 rolls across 13 scenario files, every one reachable at 25% or better by somebody present
check-scenarios: OK — 14 scenario files, 83 mechanic tags, every skill named resolves against 62 catalogue entries
check-rollable: OK — 82 rolls across 14 scenario files, every one reachable at 25% or better by somebody present
check-creatures: OK — 102 actor specs across 8 sources, every characteristic, skill, kit key, talent, species and style resolves, no duplicate keys
check-powers: OK — 41 powers classified, 2 wired and each one measurably changes its fight, 14 recorded as beyond the harness with a reason, 25 not fight rules
check-anatomy: OK — 5 body plans, 36 locations, d20 complete in both modes, every location drawn, every kind handled and destructible, 20 plan changes carried 432 wounds with their severity intact, 1 flyer(s) with a survivable landing
check-lethality: OK — 47 creatures, every one fighting exactly as recorded against the frozen party
check-focus: OK — focus fire measured against 30 packs, helps in all of them, 30 of them by more than their own noise
check-focus: OK — focus fire measured against 38 packs, helps in all of them, 36 of them by more than their own noise
check-firstblood: OK — the first disabling blow is worth 40 points of wipe rate in the four-player cut, 15.4 in the six-a-side line
check-attackers: OK — three of the four-player cut disable on 11.1% of their attacks or better, and one of them on 0.1%
check-fight-tail: OK — a fight past 15 rounds wipes the party 1.4x as often in the four-player cut and 2.4x at six a side, and nothing was truncated
check-cited: OK — 25 cited figures across 13 scenario files resolve against 3 baselines
check-cited: OK — 25 cited figures across 14 scenario files resolve against 3 baselines
check-handouts: OK — 4 handouts, the two almanac pages identical in structure and columns, every line 41 miles from clean ground, nothing under 11pt
check-bestiary: OK — 47 creatures, the document matches the game
```
+5 -5
View File
@@ -87,11 +87,11 @@ rule for holding an action. Arranging the party so its best weapon fires last wa
measured in the simulator and came to nothing distinguishable from noise.
**What you can do is kill them one at a time.** Against a pack, every agent putting
their attacks into the same creature beats spreading them — in **every one** of the
30 fights in this book whose outcome was ever in doubt, without exception, and by more
than the measurement’s own noise each time. It is worth about
**8 points** of win rate against a pair and
**11 points** against three or more; the best case in the book is
their attacks into the same creature beats spreading them — in 38 of the
38 fights in this book whose outcome was ever in doubt, and by more
than the measurement’s own noise in 36 of them. It is worth about
**6 points** of win rate against a pair and
**10 points** against three or more; the best case in the book is
3 × Kelpie, which goes 52.0% to 67.1%. Most of that is not the ladder
above: a creature that is dead stops attacking, and one on half its hit points does not
attack any less. Held at a fixed pack size the dodge ladder is worth a point or two.
+47
View File
@@ -6492,3 +6492,50 @@ unasked.
**Nothing published quoted the lost row.** The bestiary prints the above-noise count from
the artifact, so it moved 31 to 30 on its own and says nothing that is now false.
## R-280 — the band replaced by the test it was standing in for
`MEASURABLE = [15, 85]` was a proxy. The question it answered is *can this fight move at
all* — a rate pinned at 0 or 100 cannot show an effect of any size — and it answered with
two round numbers. R-279 found it excluding the_arrears by three tenths of a point while
that row carried a gain of 6.2 at 2.4x its own noise.
**The direct form, in the units this guard already uses:** a fight is measurable if its
spread-fire rate stands clear of both ends by more than its own seed-to-seed noise.
**It deliberately does not look at the gain.** Admitting the sizes where focus fire happens
to clear its noise would make this guard's own claim true by construction, which is the
worst thing a guard can be. Size is still chosen on nearest-an-even-fight, and admission is
still decided without reference to the effect being measured. The order changed — the row
is measured first and admitted second, because the noise the test needs is a product of the
measurement rather than of the scan.
**31 measurable became 38.** the_arrears is back at gain 6.3, and seven others arrive:
| | n | spread | gain | noise |
|---|---|---|---|---|
| switchboard | 6 | 86.3% | **8.1** | 1.4 |
| the_arrears | 2 | 14.7% | **6.3** | 1.5 |
| nuckelavee | 2 | 8.2% | **5.9** | 0.5 |
| hollow_man | 6 | 92.2% | **4.6** | 0.8 |
| supporter | 2 | 4.5% | 2.6 | 0.8 |
| hedley_kow | 6 | 97.7% | 1.6 | 0.6 |
| the_stanchion | 2 | 6.0% | 0.2 | 0.9 |
| the_choir | 6 | 99.3% | 0.2 | 0.4 |
Four of the eight were carrying effects larger than most of the rows the band already
admitted. **switchboard at 8.1 is the second largest gain in the artifact and the band was
throwing it away**, because an 86.3% fight is one point past a round number.
**And the honest part: the last two do not clear their own noise.** the_choir has 0.7 points
of headroom at 99.3% and used 0.2 of it; the_stanchion has six points of room and used 0.2.
The above-noise count falls 31 of 31 to 36 of 38, and the bestiary now prints 36. That is
not a regression — it is two measurements saying *no detectable effect*, which is a result
the band suppressed by refusing to take it. A guard that only records the cases where
something happens is not measuring, it is confirming.
**What is now weaker, and worth watching.** The hard claim — focus fire helps in every
measurable pack — is satisfied by gains of 0.2, so it is a weaker sentence than it was when
the band admitted only contested fights. If it should be a stronger claim, the place to
strengthen it is the claim, not the admission rule; tightening admission to protect a claim
is how the band got here.
+27 -10
View File
@@ -58,9 +58,23 @@ const SIZES = [2, 3, 4, 5, 6];
unstable at 3000 and at 4000, and stable across twenty seeds at 6000. This is --update
only, so the build pays nothing; re-recording pays about half a minute. */
const SCAN_RUNS = 6000;
/* A pack whose spread-fire rate falls outside this cannot move enough to measure, and a
row that cannot move is a row that would pass this guard whatever happened to it. */
const MEASURABLE = [15, 85];
/* R-280. This was a band, [15, 85], and it was a PROXY for the question that matters:
can this fight move at all? A rate pinned at 0 or 100 cannot show an effect of any size,
so measuring one is pointless. The band answered that with two round numbers, and
the_arrears — 14.2% at the only size worth fighting — was excluded by three tenths of a
point while carrying a gain of 6.2 at 2.4x its own noise. A proxy that disagrees with
the thing it proxies for is worth replacing rather than tuning.
So the test is now direct and expressed in the same units as everything else here: a
fight is measurable if its spread-fire rate stands clear of BOTH ends by more than its
own seed-to-seed noise. That is the actual condition for an effect to be visible.
IT DELIBERATELY DOES NOT LOOK AT THE GAIN. Selecting the sizes where focus fire happens
to clear its noise would make this guard's own claim — that focus fire helps in every
measurable pack — true by construction, which is the worst thing a guard can be. Size is
still chosen on nearest-an-even-fight, and admission is still decided without reference
to the effect being measured. */
const measurable = row => row.spread - row.noise > 0 && row.spread + row.noise < 100;
const party = PARTY_KEYS.map(k => {
const found = ROSTER.find(r => r.key === k);
@@ -117,22 +131,25 @@ const pickSize = spec => {
if (UPDATE) {
const creatures = {};
let measurable = 0;
let measurableCount = 0;
for (const spec of NPCS) {
const pick = pickSize(spec);
if (pick.w < MEASURABLE[0] || pick.w > MEASURABLE[1]) {
creatures[spec.key] = { n: pick.n, pinned: Number(pick.w.toFixed(1)) };
/* Measured first, then admitted or not: the noise this test needs is a product of the
measurement, so unlike the band it cannot be decided from the scan alone. */
const row = measureAt(spec, pick.n);
if (!measurable(row)) {
creatures[spec.key] = { n: pick.n, pinned: row.spread };
continue;
}
creatures[spec.key] = measureAt(spec, pick.n);
measurable++;
creatures[spec.key] = row;
measurableCount++;
}
await writeFile(BASELINE, JSON.stringify({
note: "Generated by tools/check-focus.mjs --update. Do not edit by hand.",
party: PARTY_KEYS, runs: RUNS, seeds: SEEDS, seedMode: SEED_MODE,
measurableBand: MEASURABLE, creatures
admission: "spread clear of 0 and 100 by more than its own noise", creatures
}, null, 2) + "\n", "utf8");
console.log(`check-focus: baseline recorded — ${measurable} of ${NPCS.length} creatures measurable, `
console.log(`check-focus: baseline recorded — ${measurableCount} of ${NPCS.length} creatures measurable, `
+ `${RUNS} runs x ${SEEDS.length} seeds, seed ${SEEDS[0]} ${SEED_MODE}`);
process.exit(0);
}
+35 -14
View File
@@ -13,10 +13,7 @@
90210
],
"seedMode": "per-creature",
"measurableBand": [
15,
85
],
"admission": "spread clear of 0 and 100 by more than its own noise",
"creatures": {
"quiet_neighbours_npc": {
"n": 6,
@@ -94,11 +91,17 @@
},
"supporter": {
"n": 2,
"pinned": 4.7
"spread": 4.5,
"focus": 7,
"gain": 2.6,
"noise": 0.8
},
"hollow_man": {
"n": 6,
"pinned": 92.3
"spread": 92.2,
"focus": 96.8,
"gain": 4.6,
"noise": 0.8
},
"the_tenant": {
"n": 2,
@@ -106,7 +109,10 @@
},
"the_choir": {
"n": 6,
"pinned": 99
"spread": 99.3,
"focus": 99.5,
"gain": 0.2,
"noise": 0.4
},
"precedent": {
"n": 3,
@@ -149,7 +155,7 @@
},
"long_walker": {
"n": 2,
"pinned": 0.6
"pinned": 0.4
},
"auditor": {
"n": 4,
@@ -186,11 +192,17 @@
},
"nuckelavee": {
"n": 2,
"pinned": 8.5
"spread": 8.2,
"focus": 14.2,
"gain": 5.9,
"noise": 0.5
},
"hedley_kow": {
"n": 6,
"pinned": 97.3
"spread": 97.7,
"focus": 99.2,
"gain": 1.6,
"noise": 0.6
},
"apple_man": {
"n": 2,
@@ -201,7 +213,7 @@
},
"the_committee": {
"n": 6,
"pinned": 99.9
"pinned": 100
},
"night_registry": {
"n": 4,
@@ -244,7 +256,10 @@
},
"switchboard": {
"n": 6,
"pinned": 85.9
"spread": 86.3,
"focus": 94.4,
"gain": 8.1,
"noise": 1.4
},
"the_census": {
"n": 3,
@@ -269,7 +284,10 @@
},
"the_stanchion": {
"n": 2,
"pinned": 5.2
"spread": 6,
"focus": 6.3,
"gain": 0.2,
"noise": 0.9
},
"the_yield": {
"n": 2,
@@ -287,7 +305,10 @@
},
"the_arrears": {
"n": 2,
"pinned": 14.4
"spread": 14.7,
"focus": 21,
"gain": 6.3,
"noise": 1.5
},
"the_margin": {
"n": 5,