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:
co-authored by
Claude Opus 5
parent
23262855b4
commit
3d83fbde93
+27
-10
@@ -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
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user