diff --git a/docs/scenarios/CLEAN_GROUND.md b/docs/scenarios/CLEAN_GROUND.md index 1d1f4fe..5a5cf65 100644 --- a/docs/scenarios/CLEAN_GROUND.md +++ b/docs/scenarios/CLEAN_GROUND.md @@ -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. | | **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. | | **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. | @@ -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. 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. -3. **The lethal encounter is the column, in Act Two** — not the monster in Act Four, which - cannot hurt anybody. EXPOSURE has the measured figures and the reason. +3. **The lethal encounter is the column, not the monster in Act Four**, which cannot hurt + 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 @@ -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. 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. - **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. @@ -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 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 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 @@ -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)* > ⏱ **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 -> peg, and it says in terms that *a table will spend twenty minutes on 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. +> fumbles **`[CUS: Anomaly Lore — what a peg is, and what losing one does]`** — the third +> beat below, **not** the depot entry, which is a *Research* roll — the text sends them +> chasing the re-cut peg, and it says in terms that *a table will spend twenty minutes on +> 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 > 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. > -> **The arithmetic is the reason, not a playtest.** Desk pass 4 originally reported hitting -> this fumble; re-checking its rolls against the real sheets showed the roll was a plain -> failure, not a fumble — 98 against Anomaly Lore 63, and 96–99 never succeed. So nobody has -> yet played the twenty minutes. The warning stands on its own: the text predicts the cost, -> the budget does not carry it, and nothing connected the two. +> **Desk pass 6 played the twenty minutes and they cost what the text says.** The fumble +> was forced onto a seeded stream rather than waited for, the agent concluded with complete +> confidence that the peg could be re-cut, and *let them try it exactly once* proved to be +> the right instruction — the silence at the end of it teaches more than the depot's +> 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** - **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. *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 - 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 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. @@ -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 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 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 has replaced a scenario about classification with a scenario about a monster, and the case stops meaning anything. -2. **Adding hollow men buys rounds, not danger.** Six of them still wipe nobody — and - take a **median thirteen rounds** to resolve. In a 45-minute act that is the whole act, - and the Close is what pays for it. If Act Four feels thin, the answer is more doubt, - not more bodies. +2. **Adding hollow men buys rounds, not danger — at six players, with the column standing + off, and nowhere else.** Six of them wipe nobody and take a **median thirteen rounds** + to resolve. In a 45-minute act that is the whole act, and the Close is what pays for it. + 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.** 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 @@ -897,9 +962,22 @@ losing. Both of the first two are live in this scenario. | 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 | | 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 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 @@ -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 of that line and a quarter of the cut. **This is a property of the cut, not of the 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 `check-firstblood`; read it with `node tools/first-blood.mjs`. Earlier drafts of this diff --git a/docs/scenarios/CLEAN_GROUND_PLAYTEST_4.md b/docs/scenarios/CLEAN_GROUND_PLAYTEST_4.md index f2a7f0b..530eb61 100644 --- a/docs/scenarios/CLEAN_GROUND_PLAYTEST_4.md +++ b/docs/scenarios/CLEAN_GROUND_PLAYTEST_4.md @@ -343,6 +343,16 @@ they were compared against. 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 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* 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. diff --git a/docs/scenarios/CLEAN_GROUND_PLAYTEST_6.md b/docs/scenarios/CLEAN_GROUND_PLAYTEST_6.md index 7320a4e..4b6bca7 100644 --- a/docs/scenarios/CLEAN_GROUND_PLAYTEST_6.md +++ b/docs/scenarios/CLEAN_GROUND_PLAYTEST_6.md @@ -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". +**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: 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 diff --git a/tools/simulate.mjs b/tools/simulate.mjs index 4b60539..0865901 100644 --- a/tools/simulate.mjs +++ b/tools/simulate.mjs @@ -554,6 +554,19 @@ for (const k of creatureKeys) { if (!spec) { console.error(`no such creature "${k}" — try --list`); process.exit(1); } 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)); if (count > 0) { const one = enemySpecs[0]; @@ -625,7 +638,7 @@ if (has("--spread")) { }).sort((a, b) => a.delta - b.delta); 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} 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)}%`; 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(", ")} ${result.runs} runs, seed ${result.seed}