From c2f7249d4d60e49626cf48991b54c830b039de3f Mon Sep 17 00:00:00 2001 From: slaguru666 <111923774+slaguru666@users.noreply.github.com> Date: Sun, 13 Sep 2026 16:32:46 +0100 Subject: [PATCH] R-295: derive the counterfactual too, and name it hadHeRefused Matching the step-5 prose against the derived source before placing markers left five figures unmatched: 21.9, 74.3 and 3.8, twice each. They are the thing against Ashcroft's undiminished 85 -- the contest that never happens, which Act Four prints on purpose to price what THE OFFER sold. Derived now as hadHeRefused, so the counterfactual is held to the rule like everything else and carries a name that cannot be mistaken for an event. Quoting those three as odds a GM meets is what went wrong in two sentences and a table. Markers not placed: CLEAN_GROUND.md is c0's and they are in it. Co-Authored-By: Claude Opus 5 --- docs/REVIEW_LOG.md | 19 +++++++++++++++++++ tools/step5-split.mjs | 24 ++++++++++++++++-------- 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/docs/REVIEW_LOG.md b/docs/REVIEW_LOG.md index 2528662..3aff032 100644 --- a/docs/REVIEW_LOG.md +++ b/docs/REVIEW_LOG.md @@ -6976,3 +6976,22 @@ was right and the test was wrong. **Landed unused, deliberately.** No citation markers were placed, because `CLEAN_GROUND.md` is c0's and the markers are theirs to place. The mechanism is what this commit is. + +## R-295 — the counterfactual is derived too, and named as one + +Preparing to place citation markers on the step-5 figures, five of them matched nothing in +the derived source: 21.9%, 74.3% and 3.8%, each appearing twice. They are the thing against +Ashcroft's undiminished POW×5 of 85 — the contest that never happens, because a refusing +Ashcroft is never the one it reaches for. + +Act Four prints that pair deliberately and correctly, with a warning, because it is what THE +OFFER sold and without it a reader cannot see the size of the trade. So it is now derived as +well, under the name `hadHeRefused`: the document's counterfactual is held to the rule like +every other figure, and the name says what it is. Quoting these three as odds a GM meets is +precisely what went wrong in two sentences and a table, and a path called `hadHeRefused` is +harder to misread than a bare 74.3. + +Everything in the step-5 prose now resolves to a derived value: `refused.*`, `cut.*`, +`accepted.*`, `hadHeRefused.*`, `blended.*`, the shares, the targets and the thing's own 75. +The markers themselves are not placed yet — `CLEAN_GROUND.md` is c0's and they are in it, +placing 91 `packs` citations of their own. diff --git a/tools/step5-split.mjs b/tools/step5-split.mjs index b480fe4..575d04a 100644 --- a/tools/step5-split.mjs +++ b/tools/step5-split.mjs @@ -115,12 +115,20 @@ export function step5Split() { const insight = (expandFromRegister(spec).skills ?? []) .find(s => s.fam === "insight")?.val ?? 0; + /* THE CONTEST THAT NEVER HAPPENS, derived on purpose. If Ashcroft refuses, the countdown + does not reach for him at all — it reaches for the lowest POW in the room — so the thing + never faces his undiminished 85. Act Four nevertheless prints that pair, correctly and + with a warning: it is what THE OFFER sold, and without it the reader cannot see the size + of the trade. It is citable here so the document's counterfactual is held to the rule + like everything else, and named `hadHeRefused` so nobody mistakes it for an event. It is + what quoting these numbers as odds a GM meets did to two sentences and a table. */ const rows = { - refused: { ...six, target: six.rating, who: six.who }, - cut: { ...four, target: four.rating, who: four.who }, - accepted: { ...accepted, target: accepted.rating, who: accepted.who } + refused: { ...six, target: six.rating, who: six.who }, + cut: { ...four, target: four.rating, who: four.who }, + accepted: { ...accepted, target: accepted.rating, who: accepted.who }, + hadHeRefused: { who: ash.who, target: ash.rating } }; - for (const k of ["refused", "cut", "accepted"]) { + for (const k of ["refused", "cut", "accepted", "hadHeRefused"]) { Object.assign(rows[k], split(THING_RATING, rows[k].target)); } @@ -138,13 +146,13 @@ if (import.meta.main || process.argv[1]?.endsWith("step5-split.mjs")) { const s = step5Split(); console.log(`\n The thing reaches at ${s.thing}. Ashcroft refuses on Insight, so ` + `${s.refusedShare}% of tables are in the first row and ${s.acceptedShare}% the second.\n`); - console.log(" case resists taken held unsettled"); - for (const k of ["refused", "cut", "accepted"]) { + console.log(" case resists taken held unsettled"); + for (const k of ["refused", "cut", "accepted", "hadHeRefused"]) { const r = s[k]; - console.log(` ${k.padEnd(9)} ${(r.who + " " + r.target).padEnd(18)} ` + console.log(` ${k.padEnd(13)} ${(r.who + " " + r.target).padEnd(18)} ` + `${String(r.taken).padStart(5)} ${String(r.held).padStart(6)} ${String(r.unsettled).padStart(9)}`); } const b = s.blended; - console.log(` ${"blended".padEnd(9)} ${"across all games".padEnd(18)} ` + console.log(` ${"blended".padEnd(13)} ${"across all games".padEnd(18)} ` + `${String(b.taken).padStart(5)} ${String(b.held).padStart(6)} ${String(b.unsettled).padStart(9)}\n`); }