Focus fire across all 47, and the same confound one turn later (R-260)

Measured in simulate.mjs. For each creature, the pack size whose spread-fire win rate
lands nearest 50% — a fight at 0% or 100% cannot show an effect, which is why R-259's
first sample was three-quarters useless — then focus versus spread, 2000 fights across
three seeds.

31 of 47 creatures had a pack size that could show anything. Focus fire helped 31 of 31,
by more than that row's own noise 31 of 31 times, mean +12.8 points. Best is 6x The
margin, 40.4% -> 61.1%. The other 16 are unmeasurable rather than unaffected: eleven are
trivial six at a time, five are hopeless in pairs.

R-259's decomposition was confounded, and I wrote it while correcting a confound. It
credited the defence ladder with 4-5 points by comparing dodge <=30% against dodge >=55%
— but the low-dodge samples were PAIRS and the high-dodge ones TRIOS. Held at a fixed
pack size, dodge is worth 1-2 points. Pack size is the driver: 8.0 points for a pair,
14-15 for three or more, then flat. What focus fire buys is that a dead creature stops
attacking and a half-dead one does not attack any less.

Two failures, one cause: comparing groups that differ in more than the thing being
measured. The control is cheap and I did not run it until the third time.

The bestiary advised concentrating fire and gave the ladder as the reason — right advice,
wrong reason. It now gives the reason that survives measurement.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
slaguru666
2026-09-13 00:03:02 +01:00
co-authored by Claude Opus 5
parent bf8db68383
commit 48216bae10
4 changed files with 63 additions and 11 deletions
+10 -5
View File
@@ -79,15 +79,20 @@ Two things follow:
party misses twice is one where the creature meets the third shot at full value.
- **Each landing hit makes the next one easier**, in the same round only. The second
agent to connect is worth more than the first, and against the heavy dodgers below
the third is worth more still. Commit a round’s attacks to one target; spreading
them lets every defence reset at full value.
the third is worth more still.
**What you cannot do is choose who goes first.** Reaction is re-rolled every round, so
over a fight every agent takes the opening slot about equally often, and there is no
rule for holding an action. Arranging the party so its best weapon fires last was
measured in the simulator over six independent seeds and came to nothing
distinguishable from noise. The ladder is a reason to commit a round to one target,
not a reason to choreograph the order.
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 fight 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 twice as much against three or
more enemies as against a pair. 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. The
dodge ladder adds a point or two on top of that.
The ones that take the most stripping:
+43
View File
@@ -5536,3 +5536,46 @@ settled it, and the first where the wrong explanation had already shipped to a d
GM would read. The rule I keep relearning: a measurement taken outside the guarded
pipeline is a hypothesis, not a result, and it does not go in a document until the
pipeline agrees.
## R-260 — focus fire, all 47, and the same confound one turn later
Focus fire measured across the whole bestiary in `simulate.mjs`. For each creature, the
pack size whose spread-fire win rate lands nearest 50% — a fight at 0% or 100% cannot show
an effect of any size, which is why R-259's first sample was three-quarters useless — then
focus versus spread at 2000 fights across three seeds.
**31 of 47 creatures had a pack size that could show anything at all.** Of those, focus
fire helped **31 of 31**, by more than that row's own seed-to-seed noise **31 of 31**
times. Mean gain **12.8 points** of win rate. Best: 6× The margin, 40.4% → 61.1%, +20.8.
The other 16 cannot be measured rather than being unaffected: eleven are trivial even six
at a time (the party wins ~100%) and five are hopeless in pairs — the supporter, the
quarantine unit and the long walker wipe the party at 0% before focus fire gets a vote.
**R-259's decomposition was confounded, and I wrote it while correcting a confound.**
It said the defence ladder was worth 4–5 of the gain, comparing dodge ≤30% against
dodge ≥55%. Those two groups were not the same fights: the low-dodge samples were PAIRS
and the high-dodge ones were TRIOS. Pack size is the real driver.
| enemies | mean gain | | dodge within that size |
|---|---|---|---|
| 2 | **8.0** | | ≤40%: 7.4 · >40%: 8.6 |
| 3 | 14.0 | | ≤40%: 13.3 · >40%: 14.2 |
| 4 | 13.9 | | ≤40%: 13.0 · >40%: 15.2 |
| 5 | 14.7 | | ≤40%: 14.7 · >40%: 14.8 |
| 6 | 15.4 | | ≤40%: 14.4 · >40%: 15.7 |
Held at a fixed pack size, dodge is worth **1–2 points**, not 4–5. The gain nearly doubles
from a pair to a trio and then flattens. What focus fire actually buys is that a dead
creature stops attacking and a half-dead one does not attack any less; the ladder is a
rounding error on top of that.
So R-259 corrected R-258's un-piped measurement and then made R-255's confound error in
the correction. Two different failures with one cause: comparing groups that differ in
more than the thing being measured. The control is cheap — hold the other variable fixed
and look within it — and I did not run it until the third time.
**The page says what is true now.** The bestiary advised concentrating fire and gave the
ladder as the reason, which was right for the wrong reason. It now gives the reason that
survives measurement, and states that the effect roughly doubles from two enemies to
three or more.
+1 -1
View File
@@ -2,7 +2,7 @@
"id": "ringbrp",
"title": "The Custodians",
"description": "A Basic Roleplaying game of agents who cross the crossing to contain what should not be there — and who come back a little less from here each time.",
"version": "1.7.14",
"version": "1.7.15",
"compatibility": {
"minimum": 13,
"verified": "14.364"
+9 -5
View File
@@ -173,14 +173,18 @@ md += `\n**V** = Vesh, **C** = Cadence. Everything else is baseline-human anatom
+ ` party misses twice is one where the creature meets the third shot at full value.\n`
+ `- **Each landing hit makes the next one easier**, in the same round only. The second\n`
+ ` agent to connect is worth more than the first, and against the heavy dodgers below\n`
+ ` the third is worth more still. Commit a round\u2019s attacks to one target; spreading\n`
+ ` them lets every defence reset at full value.\n\n`
+ ` the third is worth more still.\n\n`
+ `**What you cannot do is choose who goes first.** Reaction is re-rolled every round, so\n`
+ `over a fight every agent takes the opening slot about equally often, and there is no\n`
+ `rule for holding an action. Arranging the party so its best weapon fires last was\n`
+ `measured in the simulator over six independent seeds and came to nothing\n`
+ `distinguishable from noise. The ladder is a reason to commit a round to one target,\n`
+ `not a reason to choreograph the order.\n\n`
+ `measured in the simulator and came to nothing distinguishable from noise.\n\n`
+ `**What you can do is kill them one at a time.** Against a pack, every agent putting\n`
+ `their attacks into the same creature beats spreading them \u2014 in every fight in this\n`
+ `book whose outcome was ever in doubt, without exception, and by more than the\n`
+ `measurement\u2019s own noise each time. It is worth about twice as much against three or\n`
+ `more enemies as against a pair. Most of that is not the ladder above: a creature that\n`
+ `is dead stops attacking, and one on half its hit points does not attack any less. The\n`
+ `dodge ladder adds a point or two on top of that.\n\n`
+ `The ones that take the most stripping:\n\n`
+ hardest.map(x => `- **${esc(x.name)}** — dodge ${x.d}%, ${stripsIn(x.d)} landing hits to strip\n`).join("")
+ `\nIt runs the other way too: agents defend on the same ladder, which is why a second\n`