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
+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,