CLEAN GROUND v0.16 — the fight it was never measuring, and R-283

Applies desk pass 6's seven fixes.

1. EXPOSURE now measures the fight the table will have. Every row in the old
   table was one force fighting alone, and the six at the back are never
   alone — they walk inside forty-one refugees. Six hollow men wipe 0.0%;
   with two of the column joining, 7.8%; with three, 28.7%. Two is now the
   stated default, because two people out of forty-one losing their heads
   while their neighbours are shot is not a large number.
2. The four-player block has hollow-man rows: 0.3% at three, 58.7% at six,
   99.9% with two of the column. Its only hollow-man figure before was the
   six-player 0.0%, so a GM running the cut was reading somebody else's
   table — for the encounter the party is likeliest to choose, because the
   six at the back are the only figures the scenario says are not people.
   GM ESSENTIALS item 3 carries the same correction.
3. Act Three's warning named a roll that does not exist. Its twenty-minute
   bomb hangs off "Anomaly Lore — what a peg is"; the depot entry is a
   Research roll. Pass 4's post-pass inherited the conflation from this
   warning and is corrected too.
4. GM ESSENTIALS states the real fumble band. fumbleStart is
   101 - ceil((101-band)/20), tested before the 96-99 clause: 00 at 85,
   99-00 at 63, 98-00 at 53, 97-00 at 40. Four times what "00 always
   fumbles" implies, in a case that rolls Spot 40 across two acts. Pass 4's
   correction was right at 63 by luck and would have been wrong at 53.
5. Sixth EXPOSURE lesson: a fight costs the session. Median 13 rounds on the
   printed row, 24 mixed, 30 at four players — sixty to ninety minutes in an
   act budgeted at fifty. The Pacing Note now says what to do when one
   starts, and not to absorb a fight and the peg fumble in the same act.
6. The fumbled Xenology is written. At 53 it fumbles on 98-00 and Braithwaite
   puts his name to a baseline human in front of everybody. The un-gated tell
   still arrives; it now costs the party its expert.
7. R-283: simulate.mjs described a mixed force as N of whichever spec came
   first, so six hollow men and six of the column printed as "12 x Hollow
   man" — two fights 88 points of wipe rate apart under one label. The
   composition was always right and the report was not. Uniform and --spread
   output are byte-identical, so nothing already published goes stale.

Every figure re-run before writing rather than carried over. npm run check:
18 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
slaguru666
2026-09-13 15:16:17 +01:00
co-authored by Claude Opus 5
parent 1a2ca44c52
commit aa3ae24ef2
4 changed files with 141 additions and 20 deletions
+112 -18
View File
@@ -9,10 +9,10 @@
| | | | | |
|---|---| |---|---|
| **Version** | **v0.15**, 13 September 2026 | | **Version** | **v0.16**, 13 September 2026 |
| **Can it be run?** | **Yes, from this document alone.** A GM with this file and the compendium can run it end to end. | | **Can it be run?** | **Yes, from this document alone.** A GM with this file and the compendium can run it end to end. |
| **Is it convention-ready?** | **Nearly.** The print pack is built (`CLEAN_GROUND_HANDOUTS.html`, held by `check-handouts`). What is missing is a run with human beings, and a slot. | | **Is it convention-ready?** | **Nearly.** The print pack is built (`CLEAN_GROUND_HANDOUTS.html`, held by `check-handouts`). What is missing is a run with human beings, and a slot. |
| **Playtesting** | **Five desk passes, no human runs.** `_1.md` GM chair (seed 4271) · `_2.md` Act Four stress (9314) · `_3.md` player chair, contrarian (5580) · `_4.md` **the clock, against v0.13's recut timings** (6142) · `_5.md` **the four-player cut, played** (8815). Thirty-three fixes plus two post-passes. Passes 4–5 are the only ones that describe the current timings; 1–3 ran against a 65-minute Act Two. | | **Playtesting** | **Six desk passes, no human runs.** `_1.md` GM chair (seed 4271) · `_2.md` Act Four stress (9314) · `_3.md` player chair, contrarian (5580) · `_4.md` **the clock, against v0.13's recut timings** (6142) · `_5.md` **the four-player cut, played** (8815) · `_6.md` **the four untested branches, forced** (3319). Forty fixes plus two post-passes. Passes 4–6 describe the current timings; 1–3 ran against a 65-minute Act Two. |
| **What it is** | A **convention one-shot**, decided 13 September 2026. It ends in the slot; there is no second session and the text must not promise one. | | **What it is** | A **convention one-shot**, decided 13 September 2026. It ends in the slot; there is no second session and the text must not promise one. |
| **Where it runs** | **Contingency 2027 — Sunday 31 January 2027, afternoon** (slot 9), Searles Leisure Resort, Hunstanton. | | **Where it runs** | **Contingency 2027 — Sunday 31 January 2027, afternoon** (slot 9), Searles Leisure Resort, Hunstanton. |
| **Runtime** | **3h30 of play plus a 10-minute break — 3h40 wall clock**, which is the house budget. Act Two was cut from 65 minutes to 45 in v0.13 to get there. The **Pacing Note** carries a further 65 minutes of cuts; take them as the default. | | **Runtime** | **3h30 of play plus a 10-minute break — 3h40 wall clock**, which is the house budget. Act Two was cut from 65 minutes to 45 in v0.13 to get there. The **Pacing Note** carries a further 65 minutes of cuts; take them as the default. |
@@ -44,8 +44,11 @@ Read GM ESSENTIALS in full — this is only what a GM most often discovers too l
far stronger than the numbers look. GM ESSENTIALS has it. Two beats depend on it. far stronger than the numbers look. GM ESSENTIALS has it. Two beats depend on it.
2. **Ashcroft cannot fight** — no weapon, no unarmed skill, a 1% attack. That is deliberate 2. **Ashcroft cannot fight** — no weapon, no unarmed skill, a 1% attack. That is deliberate
and his player must be told before the game. See his entry in Casting. and his player must be told before the game. See his entry in Casting.
3. **The lethal encounter is the column, in Act Two** — not the monster in Act Four, which 3. **The lethal encounter is the column, not the monster in Act Four**, which cannot hurt
cannot hurt anybody. EXPOSURE has the measured figures and the reason. anybody — and **at four players the six at the back are lethal on their own** (58.7%
wiped, against 0.0% at six). The six at the back are also the encounter the party is
likeliest to choose, because they are the only figures the scenario says are not people.
EXPOSURE has the measured figures and the reason.
### Still to do ### Still to do
@@ -78,6 +81,11 @@ premise (a walk north that never arrives) and the predator's method (imitation).
- **System:** d100 roll-under. Special under a fifth, critical under a twentieth. - **System:** d100 roll-under. Special under a fifth, critical under a twentieth.
96–99 never succeed; 00 always fumbles. 96–99 never succeed; 00 always fumbles.
- ⚠ **A fumble is the top twentieth of the FAILURE range, not just 00** — and that band
widens as the skill falls. **00 at 85, 99–00 at 63, 98–00 at 53, and 97–00 at 40 or
below.** Desk pass 6 found this document implying 1% throughout; at Spot 40 it is **4%**,
and the cast rolls Spot 40 across two acts. Every fumble branch in this case is commoner
than it looks. (`resolveBands().fumbleStart`, tested *before* the 96–99 clause.)
- **Panic is live** — 0–5, up. Triggers marked per act. Act Four is where it bites. - **Panic is live** — 0–5, up. Triggers marked per act. Act Four is where it bites.
- **Coherence is the case.** The far side is a filed duplicate and it wants the agents - **Coherence is the case.** The far side is a filed duplicate and it wants the agents
written into it. Coherence loss is the clock on the whole scenario, not a side effect. written into it. Coherence loss is the clock on the whole scenario, not a side effect.
@@ -182,6 +190,13 @@ written.** See Act Two's budget table.
is ten minutes of slack. **Treat it as somewhere between zero and ten, and take the cuts is ten minutes of slack. **Treat it as somewhere between zero and ten, and take the cuts
early.** early.**
⚠ **If a fight starts, none of this is enough.** EXPOSURE's sixth lesson has the figures:
the encounter the party is likeliest to pick runs a median 24 rounds, which is the best
part of an act. **The moment dice come out against the column or the six at the back, take
every remaining cut immediately and tell the table the Close is fixed at 25 minutes.**
Do not try to absorb a fight and the re-cut-peg fumble in the same act — desk pass 6 had
both and Act Three ran ~115 against a budget of 50.
Desk pass 4 ran v0.13 on a hostile seed and estimated ~3:46 against 3:40; correcting six Desk pass 4 ran v0.13 on a hostile seed and estimated ~3:46 against 3:40; correcting six
misread skill ratings in that pass moved the same seed to ~3:34. **Neither figure is a misread skill ratings in that pass moved the same seed to ~3:34. **Neither figure is a
runtime.** They are two readings of one simulated table, ten minutes apart, and the runtime.** They are two readings of one simulated table, ten minutes apart, and the
@@ -698,20 +713,32 @@ carelessness — this column has done this before, and it has lost people doing
## Act Three — There is no north *(~50 min, and read the next line before you trust that)* ## Act Three — There is no north *(~50 min, and read the next line before you trust that)*
> ⏱ **This act has a twenty-minute bomb in it and the 50 does not include it.** If anybody > ⏱ **This act has a twenty-minute bomb in it and the 50 does not include it.** If anybody
> fumbles Anomaly Lore on the depot entry, the text below sends them chasing the re-cut > fumbles **`[CUS: Anomaly Lore — what a peg is, and what losing one does]`** — the third
> peg, and it says in terms that *a table will spend twenty minutes on it*. That is a real > beat below, **not** the depot entry, which is a *Research* roll — the text sends them
> instruction and it should be obeyed — the silence of that failure teaches more than a > chasing the re-cut peg, and it says in terms that *a table will spend twenty minutes on
> correct roll. But 50 + 20 is 70, and the act is budgeted at 50. > it*. That is a real instruction and it should be obeyed — the silence of that failure
> teaches more than a correct roll. But 50 + 20 is 70, and the act is budgeted at 50.
>
> **Watch the right die.** This warning used to say "Anomaly Lore on the depot entry",
> which fused two different beats and sent a GM watching a roll that cannot fire the bomb.
> Desk pass 4 inherited the error and its own correction reproduced it; desk pass 6 caught
> it. At Anomaly Lore 63 the band is **99–00** — see GM ESSENTIALS, because it is wider at
> lower ratings and Pollard, Braithwaite and Okonkwo are all in the thirties here.
> >
> **So if that fumble happens, the northern-seam cut is no longer optional.** Take it the > **So if that fumble happens, the northern-seam cut is no longer optional.** Take it the
> moment the fumble lands, not at the break. With the cut, a fumbled act runs ~55 and the > moment the fumble lands, not at the break. With the cut, a fumbled act runs ~55 and the
> session absorbs it. Without it, Act Three runs 70 and the Close pays. > session absorbs it. Without it, Act Three runs 70 and the Close pays.
> >
> **The arithmetic is the reason, not a playtest.** Desk pass 4 originally reported hitting > **Desk pass 6 played the twenty minutes and they cost what the text says.** The fumble
> this fumble; re-checking its rolls against the real sheets showed the roll was a plain > was forced onto a seeded stream rather than waited for, the agent concluded with complete
> failure, not a fumble — 98 against Anomaly Lore 63, and 96–99 never succeed. So nobody has > confidence that the peg could be re-cut, and *let them try it exactly once* proved to be
> yet played the twenty minutes. The warning stands on its own: the text predicts the cost, > the right instruction — the silence at the end of it teaches more than the depot's
> the budget does not carry it, and nothing connected the two. > paperwork does. **The act ran ~55 with the northern seam cut taken**, exactly as predicted
> above.
>
> *(Desk pass 4 reported hitting this and had not: 98 against 63 is a plain failure. Its
> correction was right about the band but reached the answer through the 96–99 clause rather
> than through `fumbleStart`, so at a rating of 53 the same reasoning would have been wrong.)*
**Beats** **Beats**
- **The evidence of the loop — three routes, with the almanac behind all of them.** - **The evidence of the loop — three routes, with the almanac behind all of them.**
@@ -798,7 +825,15 @@ them. **Anyone who examines him properly finds this, with no roll.**
GM's ear during beat 2 instead of a discovery in front of everybody at beat 3. GM's ear during beat 2 instead of a discovery in front of everybody at beat 3.
*Missed:* only the timing and the privacy — which is quite enough to be worth rolling *Missed:* only the timing and the privacy — which is quite enough to be worth rolling
for. **Desk pass 1 failed this roll and the act had no route left. That is what this fix for. **Desk pass 1 failed this roll and the act had no route left. That is what this fix
is: the roll no longer holds the only key.** is: the roll no longer holds the only key.** Desk pass 6 failed it *and* the Psychology
in the same run, and the act still worked — the un-gated tell in beat 3 carried it.
- **On a fumble (98–00 at his 53):** Braithwaite is certain, and says so in front of
everybody — ***this man is a baseline human, and I will put my name to it.*** He is
the party's only specialist and he has just vouched for it. Play the rest of the act
with that sentence sitting on the table: the tell in beat 3 still arrives un-gated,
and it now costs somebody their expert. **Do not soften it into a shrug.** A fumbled
specialism that produces a confident wrong answer is worth more than one that produces
nothing, and it is the only thing in Act Four that can make the party argue.
- If nobody examines him at all, **rehearsal step 5 arrives on schedule** and it reaches - If nobody examines him at all, **rehearsal step 5 arrives on schedule** and it reaches
for somebody in front of the whole cordon. The tell arrives as an event rather than a for somebody in front of the whole cordon. The tell arrives as an event rather than a
finding, which is worse for them and perfectly playable. finding, which is worse for them and perfectly playable.
@@ -872,6 +907,33 @@ node tools/simulate.mjs --creature the_understudy \
range bands or fire modes, and every one of those makes a fight worse for whoever is range bands or fire modes, and every one of those makes a fight worse for whoever is
losing. Both of the first two are live in this scenario. losing. Both of the first two are live in this scenario.
#### ⚠ The fight above is not the fight the table will have
**Every row in that table is one force fighting alone, and the six at the back are never
alone.** They walk in the middle of forty-one refugees. The trigger desk pass 6 reached is
the ordinary one — a hollow man tries the swap in Act Three, fails in front of everybody,
and the party fires into the column it is standing in. **The document's real question is
not how dangerous the hollow men are. It is how many of the column join in.**
| What they actually fight | Hurt | Down | Wiped | Deaths/run | Median rounds |
|---|---|---|---|---|---|
| Six hollow men, column stands off | 3.48 of 6 | 0.42 | **0.0%** | 0.04 | 13 |
| **+ two of the column** | 5.02 of 6 | 2.78 | **7.8%** | 0.98 | 21 |
| **+ three of the column** | 5.55 of 6 | 4.07 | **28.7%** | 1.56 | 24 |
| + six of the column | 5.99 of 6 | 5.88 | **92.0%** | 2.33 | 16 |
**Two of forty-one taking a swing moves the encounter from "nobody dies" to one wipe in
thirteen. Three takes it past one in four.** Measured the same way as the table above —
2000 runs, seed 11 — and stable across four seeds: 7.3–7.8% at two, 27.8–29.1% at three.
- **How many join in is the GM's call and it is the most consequential call in the case.**
Ivy holds the line by consent and will spend it to stop a firefight; she is one woman
against a column that has met armed men before. **Two is the honest default** — not
because the column is brave, but because two people out of forty-one losing their heads
while their neighbours are shot is not a large number.
- **Say the price out loud before dice are picked up.** That is not a warning against the
fight; it is the information the party's own briefing would have given them.
#### The five things a GM needs from that table #### The five things a GM needs from that table
1. **Do not fix the understudy.** It is a 1d3 punch with a 60% chance to land, and it goes 1. **Do not fix the understudy.** It is a 1d3 punch with a 60% chance to land, and it goes
@@ -879,10 +941,13 @@ losing. Both of the first two are live in this scenario.
every test the party had, not that it is hard to kill. A GM who buffs it into a threat every test the party had, not that it is hard to kill. A GM who buffs it into a threat
has replaced a scenario about classification with a scenario about a monster, and the has replaced a scenario about classification with a scenario about a monster, and the
case stops meaning anything. case stops meaning anything.
2. **Adding hollow men buys rounds, not danger.** Six of them still wipe nobody — and 2. **Adding hollow men buys rounds, not danger — at six players, with the column standing
take a **median thirteen rounds** to resolve. In a 45-minute act that is the whole act, off, and nowhere else.** Six of them wipe nobody and take a **median thirteen rounds**
and the Close is what pays for it. If Act Four feels thin, the answer is more doubt, to resolve. In a 45-minute act that is the whole act, and the Close is what pays for it.
not more bodies. If Act Four feels thin, the answer is more doubt, not more bodies.
**Both conditions on that sentence are load-bearing**: two of the column joining takes
it to 7.8%, and at four players six hollow men wipe **58.7%** on their own. See the two
blocks above and below.
3. **The column is the lethal encounter in this scenario, and it is not in Act Four.** 3. **The column is the lethal encounter in this scenario, and it is not in Act Four.**
Three of them is survivable, though somebody dies in about one run in six. **Six wipes Three of them is survivable, though somebody dies in about one run in six. **Six wipes
one party in seven. Ten wipes nine parties in ten.** The curve between six and ten is one party in seven. Ten wipes nine parties in ten.** The curve between six and ten is
@@ -897,9 +962,22 @@ losing. Both of the first two are live in this scenario.
| Four-player cut fights | Hurt | Down | Wiped | Deaths/run | | Four-player cut fights | Hurt | Down | Wiped | Deaths/run |
|---|---|---|---|---| |---|---|---|---|---|
| Three hollow men | 2.80 of 4 | 0.33 | **0.3%** | 0.03 |
| **Six hollow men** | 3.94 of 4 | 3.40 | **58.7%** | 0.42 |
| **Six hollow men + two of the column** | 4.00 of 4 | 4.00 | **99.9%** | 1.11 |
| Three of the column | 3.25 of 4 | 2.31 | **45.0%** | 0.98 | | Three of the column | 3.25 of 4 | 2.31 | **45.0%** | 0.98 |
| Six of the column | 4.00 of 4 | 3.99 | **99.8%** | 1.46 | | Six of the column | 4.00 of 4 | 3.99 | **99.8%** | 1.46 |
⚠ **Read the hollow-man rows first, because they are the ones the party will choose.**
The six at the back are the only figures in the valley the scenario tells the players
are not people, so they are the encounter with the lowest moral cost — **and at four
players they wipe better than half of all parties.** The main table's figure for them
is **0.0%**, and that figure is for six players. A GM running the cut who looks the
hollow men up and finds 0.0% is reading somebody else's table.
**The curve from three to six is 0.3% to 58.7%** — the same near-vertical step this
section warns about for the column between six and ten, one encounter earlier and at a
smaller table. Stable across four seeds (58.7 / 60.5 / 60.3 / 59.8%).
**It is not a hard fight. It is two different fights.** That mean of 2.31 down is the **It is not a hard fight. It is two different fights.** That mean of 2.31 down is the
average of a coin flip and describes about a tenth of outcomes: **23% of the time nobody average of a coin flip and describes about a tenth of outcomes: **23% of the time nobody
goes down at all, 45% of the time everybody does**, and the ground between is thin. Six goes down at all, 45% of the time everybody does**, and the ground between is thin. Six
@@ -927,6 +1005,22 @@ losing. Both of the first two are live in this scenario.
rate**. Against the full six it is worth a third of that, because one fighter is a sixth rate**. Against the full six it is worth a third of that, because one fighter is a sixth
of that line and a quarter of the cut. **This is a property of the cut, not of the of that line and a quarter of the cut. **This is a property of the cut, not of the
column.** column.**
6. ⚠ **A fight costs the session, and that is the better reason not to have one.**
Everything above prices fights in bodies. The cost that ends conventions is the clock:
| | Median rounds |
|---|---|
| Six hollow men, six players | **13** |
| Six of the column, six players | 14 |
| Six hollow men + three of the column | **24** |
| Six hollow men, four players | **30** |
A d100 round with six agents and nine opponents is not a fast round. **Assume three to
four minutes each** — an estimate, not a measurement — and the encounter this section
warns about is a **sixty-to-ninety-minute** encounter in an act budgeted at fifty.
A GM who has been told the party probably survives has been told the less important
half. **If a fight starts, the session is now the thing to protect**: see the Pacing
Note, which carries the instruction.
*Recorded in `tools/first-blood-baseline.json` and re-checked on every build by *Recorded in `tools/first-blood-baseline.json` and re-checked on every build by
`check-firstblood`; read it with `node tools/first-blood.mjs`. Earlier drafts of this `check-firstblood`; read it with `node tools/first-blood.mjs`. Earlier drafts of this
+10
View File
@@ -343,6 +343,16 @@ they were compared against.
failure; 96–99 never succeed and only 00 fumbles. So the ten minutes this pass spent failure; 96–99 never succeed and only 00 fumbles. So the ten minutes this pass spent
chasing the wrong idea, and the whole of finding 2, rest on a fumble the seed did not chasing the wrong idea, and the whole of finding 2, rest on a fumble the seed did not
produce. produce.
- **Right answer, wrong reasoning — see desk pass 6.** "Only 00 fumbles" is not the
rule. `fumbleStart = 101 - ceil((101 - band) / 20)` and it is tested *before* the
96–99 clause, so the band is 99–00 at a rating of 63 and 97–00 at 40. This correction
reached the right verdict through a clause that happens to agree at 63; at 53 the same
reasoning would have called a fumble a failure.
- **And the roll is misnamed here.** This pass logged it as *"Anomaly Lore — the depot
entry"*, which is a roll that does not exist: the depot entry is `[CUS: Research]`,
and the twenty-minute branch hangs off `[CUS: Anomaly Lore — what a peg is]`. The
error came out of the scenario's own Act Three warning, which carried the same
conflation until v0.16 and is now fixed.
2. **Braithwaite's Xenology succeeded.** The party's one reliable Act Four test did *not* 2. **Braithwaite's Xenology succeeded.** The party's one reliable Act Four test did *not*
miss. This pass's claim that the single-point-of-failure "finally came up in play" is miss. This pass's claim that the single-point-of-failure "finally came up in play" is
false, and it remains untested after five passes. false, and it remains untested after five passes.
@@ -323,6 +323,10 @@ supersedes them. These are branch costs, measured against v0.15's budgets:
7. **Minor: label mixed fights in `simulate.mjs`.** A run of `a,a,b` prints as "3 x A". 7. **Minor: label mixed fights in `simulate.mjs`.** A run of `a,a,b` prints as "3 x A".
**ALL SEVEN FIXES APPLIED in v0.16**, including the fumbled-Xenology branch this pass
asked for and the `simulate.mjs` label (R-283). Pass 4's post-pass corrected in the same
commit — it inherited the misnamed roll from the scenario's own warning.
**Still untested after six passes** — the list is finally shorter, and honest about why: **Still untested after six passes** — the list is finally shorter, and honest about why:
a fight that the *players choose* rather than one this pass reasoned them into; Act Four with a fight that the *players choose* rather than one this pass reasoned them into; Act Four with
a PC taken **and** Ashcroft having accepted, which is the pairing the countdown was written a PC taken **and** Ashcroft having accepted, which is the pairing the countdown was written
+15 -2
View File
@@ -554,6 +554,19 @@ for (const k of creatureKeys) {
if (!spec) { console.error(`no such creature "${k}" — try --list`); process.exit(1); } if (!spec) { console.error(`no such creature "${k}" — try --list`); process.exit(1); }
enemySpecs.push(spec); enemySpecs.push(spec);
} }
/* R-283. The header used to read `${enemySpecs.length} x ${enemySpecs[0].name}`, which is
only true when every enemy is the same spec. A mixed force — `--creature a,a,b` — was
built correctly and then DESCRIBED as N of whatever came first, so six hollow men and
six of the column printed as "12 x Hollow man". Two fights that differ by 88 points of
wipe rate shared a label. The composition was never wrong; the report was, which is the
defect this project keeps finding in itself, and desk pass 6 took every figure in its
two headline findings out of a run whose header lied about what was fought. */
const forceLabel = specs => {
const tally = new Map();
for (const sp of specs) tally.set(sp.name, (tally.get(sp.name) ?? 0) + 1);
return [...tally].map(([name, n]) => `${n} x ${name}`).join(" + ");
};
const count = Number(opt("--count", 0)); const count = Number(opt("--count", 0));
if (count > 0) { if (count > 0) {
const one = enemySpecs[0]; const one = enemySpecs[0];
@@ -625,7 +638,7 @@ if (has("--spread")) {
}).sort((a, b) => a.delta - b.delta); }).sort((a, b) => a.delta - b.delta);
console.log(` console.log(`
SPREAD — ${enemySpecs.length} x ${enemySpecs[0].name} SPREAD — ${forceLabel(enemySpecs)}
every party of ${size} the duty roster can field: ${rows.length} of them, ${runs} runs each, seed ${seed} every party of ${size} the duty roster can field: ${rows.length} of them, ${runs} runs each, seed ${seed}
safest ${pc(rows[0].wipe).padStart(6)} wiped ${name(rows[0].party)} safest ${pc(rows[0].wipe).padStart(6)} wiped ${name(rows[0].party)}
@@ -647,7 +660,7 @@ const result = measure(partySpecs, enemySpecs, {
const pct = x => `${(x * 100).toFixed(1)}%`; const pct = x => `${(x * 100).toFixed(1)}%`;
console.log(` console.log(`
${enemySpecs.length} x ${enemySpecs[0].name} vs ${partySpecs.length} duty-roster agents ${forceLabel(enemySpecs)} vs ${partySpecs.length} duty-roster agents
${partySpecs.map(p => p.name).join(", ")} ${partySpecs.map(p => p.name).join(", ")}
${result.runs} runs, seed ${result.seed} ${result.runs} runs, seed ${result.seed}