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`); }