Files
RingBRP/tools/fight-tail-baseline.json
T
slaguru666andClaude Opus 5 8279cdfda8 R-272: guard the tail, and stop prose drifting from its artifacts
Three things Tim asked for together: measure the long end of a fight, make the
swing check bite on stale prose, and record in rules.mjs the coincidence that
hid an invented rule from two readers.

GUARD 15 — check-fight-tail, on tools/fight-tail.mjs.

Fourteen guards measured this scenario's combat and none could see a long
fight, because every one of them averages. The cap is the measurement here, so
the tool passes its own (400, not runFight's default 40) and --update refuses
to record anything reaching it. Verified by lowering it back to 40: the cut
loses 20 fights to the ceiling, the six-a-side 117, 107 of those ending
neither won nor wiped, and the recorder stops.

Two claims, both read from a fresh measurement rather than the baseline, so
--update cannot silence them. "The long end is twice the median" was rejected
as a claim because it is true of both encounters and so distinguishes nothing.
Instead: a fight past 15 rounds wipes the party materially more often than a
short one, and the SIX-A-SIDE fight is the longer one (median 14 vs 10.7) --
R-270 showing up as duration, since a disabled fighter keeps fighting 30
points down. The cut is shorter because it is decisive, not safer.

GUARD 16 — check-cited, on tools/check-cited.mjs.

check-firstblood and check-attackers catch the game changing; neither reads
the document. Re-record after a re-cast and the artifact updates, the guard
goes green, and the prose keeps printing the old number under a citation
saying where the new one lives. So citations are now machine-readable --
**40**<!-- cite: first-blood cut.swing --> -- and resolved on every build. 25
of them. It failed three times on its first runs, all real: a config keyed
"column" that the prose called "line", two figures rounded 32.3 -> 32, and a
vacuous pass on zero citations, now fatal in its own right.

It also refuses citation of unstable fields. fight-tail.longest may not reach
prose: same party, same seeds, same runs, and renaming a config moved it 71 ->
90 rounds, because seedFor derives the stream from the id. Across seven
labels -- median spread 0, p95 1, p99 3, longest 21. A sample maximum reads
like a bound and is a property of the label. EXPOSURE states p99 instead.
Same discipline on the deadlier ratio: 2.42 with seed spread 1.1, so the
document gives its direction and declines to quote its size.

RULES.MJS — one comment, no rule change.

Over resolveLocationHit: its two thresholds are unrelated and usually agree.
disabled is a fraction of the pool per location; majorWound is ceil(hp/2) and
feeds only dyingLimitFor; neither removes anyone from a fight, which is
conditionFor at 2 hit points or a destroyed head. At 10 hp, leg/abdomen/chest
capacity is 5 and majorWoundFor is 5, and those locations take 12 of 20 melee
results and 15 of 20 ranged -- so two readers reconstructed a rule that does
not exist, checked it against the log, and were confirmed by it. The note
says to test an arm, the only place the difference shows.

Guards verified to bite, not assumed: drift, re-cast, censoring, the longest
refusal, the rounding catch and the vacuous-pass catch were each forced and
each failed the build with the right guidance, then restored.

npm run check: 16 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:20:25 +01:00

69 lines
1.4 KiB
JSON

{
"note": "Generated by tools/fight-tail.mjs --update. Do not edit by hand.",
"runs": 2000,
"seeds": [
11,
4242,
90210
],
"cap": 400,
"longRound": 15,
"deadlierBar": 1.15,
"configs": {
"cut": {
"label": "four of the roster vs three of the column",
"party": [
"ashcroft",
"bhattacharya",
"renshaw",
"braithwaite"
],
"creature": "quiet_neighbours_npc",
"count": 3,
"median": 10.7,
"p75": 14.3,
"p90": 19,
"p95": 22.3,
"p99": 32.3,
"longest": 67,
"over15": 19.9,
"over20": 7.3,
"over30": 1.3,
"wipeIfLong": 58.1,
"wipeIfShort": 42.5,
"longShare": 19.9,
"deadlierNoise": 0.1,
"capped": 0,
"undecided": 0
},
"column": {
"label": "six of the roster vs six of the column",
"party": [
"ashcroft",
"bhattacharya",
"renshaw",
"braithwaite",
"pollard",
"okonkwo"
],
"creature": "quiet_neighbours_npc",
"count": 6,
"median": 14,
"p75": 19.7,
"p90": 27,
"p95": 32.7,
"p99": 45.3,
"longest": 90,
"over15": 40.3,
"over20": 21.6,
"over30": 6.5,
"wipeIfLong": 23.2,
"wipeIfShort": 9.6,
"longShare": 40.3,
"deadlierNoise": 1.1,
"capped": 0,
"undecided": 0
}
}
}