Commit Graph
100 Commits
Author SHA1 Message Date
slaguru666andClaude Opus 5 0fa21263b4 STANDING ORDER: an Adventure compendium, built from the document
New pack ringbrp.standingorder, in the Scenarios folder. It holds the GM
journal (13 pages, one per section), the three player handouts, nine plates
to show, six faces and the Bellhouse section map as a scene. No cast actors,
because nobody in the case has a stat block.

The GM pages are read from docs/scenarios/STANDING_ORDER.md at build time
rather than transcribed, so the compendium cannot drift from the document the
desk passes ran against. STATUS and Open questions are left out as authoring
notes; STATUS's "not obvious" list leads page 1.

Doc fixes found on the way: the Act Two heading still said ~55 min against a
75-minute budget; STATUS said four passes and "no desk playtest run" after
five; the runtime open question still called 45/55/50 unbacked.
figures-baseline: generator enrolled at 0; STANDING_ORDER.md leaves the
uncited list because it cites.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 10:35:32 +01:00
slaguru666andClaude Opus 5 e780181e07 Rebuild the rules pack: R-273's opposed-roll section never reached it
cdbb2e3 added "When two people want opposite things" to the rules text but did
not rebuild packs/rules, so the compendium has been a section behind the
source since. Content-checked against HEAD: this is the only page that differs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-16 10:35:32 +01:00
slaguru666andClaude Opus 5 1d42fb2444 STANDING ORDER v0.7: pass 5 verifies the retry fix, and catches my own error
A narrow verification pass rather than a session: does Act Two land where v0.6
budgets it now that a failed filed-clue roll costs a scene instead of ten
minutes? Seed 4471.

THE RETRY FIX WORKS AND DOES NOT DO WHAT v0.6 ASSUMED. Forced both filed clues
to fail — about one table in seven, since each is a 37% miss at these ratings.
Under the old rule that was twenty minutes and a party standing in Registry
waiting; under the new one Pennyfeather fetches each while they do something
else and it costs nothing, while the roll still means something. So the fix
removes up to twenty minutes of VARIANCE. It does not shorten the typical case,
and Act Two uncut is 75 minutes whether or not anybody fails a filed roll.

AND v0.6 CONTAINED AN ARITHMETIC CONTRADICTION I PUT THERE. The Runtime row
budgeted Act Two at 65 — pass 4's figure, measured with nineteen minutes of cuts
taken — while the Pacing Note two screens later said the correct number of cuts
to plan for is zero. Both cannot be true; it was a ten-minute overrun written in
on purpose. The three prior passes reconcile exactly (75 uncut, and pass 4's 66
is 75 − 19 + 10), so the number was never in doubt, only which configuration it
belonged to. I measured under one configuration, changed the configuration, and
kept the number.

Act Two is now budgeted at its uncut base of 75. Acts of 45 / 75 / 50 is 2h50 of
play, 3h00 wall with the break, in a 3h15 slot — fifteen minutes of real slack
rather than twenty-five claimed ones. The cuts stay optional, which keeps Kit
Marlow's scene, which pass 4 showed is the price of the likeliest ending.

The timing section now records that 75 is the uncut base three passes agree on,
and that the retry fix moved the worst case and not the typical one, so nobody
re-derives the same error the next time the slot moves.

All twenty-one guards pass. Five passes; what is left is human beings.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 23:26:44 +01:00
slaguru666andClaude Opus 5 1a6c1474da STANDING ORDER v0.6: the slot is 3h15
Decided rather than worked around. Four passes measured Act Two's floor at about
66 minutes against a budget that said 55; the alternative was twelve minutes out
of the sick bay, which is where Revelation 3's best route lives. The slot moved,
because 3h00 was an assumption and the sick bay is not.

2h50 of play in three acts of 45 / 65 / 50 plus the break, in a 3h15 slot. Act
Two is budgeted at the 66 pass 4 actually measured with every cut taken, not at
the 56 the retry fix predicts, because nothing has measured the fix. The
twenty-five minutes of slack are deliberate: the house standard says a scenario
landing to the minute with zero slack is a fail for a table of strangers, and
every figure came off a desk pass run by a GM who already knew the document.

THE CUTS ARE NO LONGER DEFAULTS, which is the real answer to pass 4's finding
rather than a workaround for it. They existed because Act Two had to lose twenty
minutes it did not have. At 3h15 the correct number to plan for is zero — and
that retires the trap where the cheapest default cut hollowed out the price of
the likeliest ending.

AND THE REBUDGET EXPOSED AN OLDER DEFECT. The Countdown put step 3 at +1h20 and
step 4 at +2h00, measured from the blast door — so under every budget this
scenario has ever had, both fired AFTER Act Two ended. Both are backstops for
Essential revelations: step 3 is the second road to the sum and step 4 is
Revelation 3's last resort. They were arriving too late to back anything up. The
whole table is re-timed inside the act at +15 / +35 / +45 / +60, the reference
point is stated, and Act One's Stealth roll moves step 2 within that window
instead of pushing Teague past the end of the act.

The act checkpoints were trailing their own acts too — the signing one left five
minutes for the decision. A checkpoint is a point you can still correct from, so
the sum is wanted at 1:40 with twenty minutes of Act Two left, and Act Three's
is ten minutes in. Running times are printed so they mean something.

All twenty-one guards pass. What is left is human beings.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 23:15:38 +01:00
slaguru666andClaude Opus 5 4148d13768 STANDING ORDER v0.5: desk playtest 4, the clock with the cuts taken
The pass three passes had not run: an honest session at six players, no
contrarian choices and no forced branches, with the Pacing Note's cuts taken
exactly as written. Seed 6620. Nineteen minutes cut — pipe room folded, Kit
Marlow to the corridor, census dropped.

THE CUTS DID NOT CLOSE THE GAP, AND ONE RETRY UNDID MOST OF THEM. Act Two asks
for six rolls whose failure case was "ten minutes and a second attempt", roughly
two fail in an average session, and a single failed Research handed back ten of
the nineteen minutes that had just been cut. The Pacing Note's arithmetic was
sized against the act's length and never against its variance, so it could not
hold. A failed roll on a filed clue now costs a SCENE instead — Pennyfeather
fetches it while the party do something else — which keeps the roll meaningful
and costs nothing on the clock.

THE CHEAPEST CUT GUTS THE LIKELIEST ENDING. The Pacing Note priced moving Kit
Marlow to a corridor at "the drawings". This pass took that cut and then reached
the narrow row of ending 3 — the likeliest one, since it needs a single dossier
item — whose entire price is that the sixty-one stay unrecorded. Kit is the
sixty-one made into a person and her own entry says she must be a person before
she is a price. The cut is re-costed honestly, and the corridor version now has
to do her one job: she shows them a drawing and asks whether she got the blue
right.

The blanket Act One failure case named Joan for all seven clues, and Joan does
not go down the adit. Clues 6 and 7 now have their own: time, never access,
because the door has never been locked. Joan herself is at the farm AND walks up
with them, so the moor walk has somebody in it. And 13b came off the dice after
a 98 lost the reason the proper channel failed — the thematic centre of the case
— which is now written at the bottom of Pennyfeather's own sheet.

Act Two's floor is about 66 minutes against a budget of 55, measured across
three passes at 75 uncut, 70 uncut and 66 fully cut. The retry fix should
recover most of that and nothing has measured it. THE REMAINING QUESTION IS A
BUDGET DECISION AND IT IS TIM'S: move the slot to 3h15, or take twelve minutes
out of the sick bay and lose Revelation 3's best route. Written up in Open
questions and deliberately not decided here.

All twenty-one guards pass. Four passes, every content defect they found fixed.
What is left is human beings.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 23:10:50 +01:00
slaguru666andClaude Opus 5 3db28885f0 STANDING ORDER v0.4: desk playtest 3, player chair, contrarian
The cadence's third pass: a full session choosing contrarily at every fork,
forced to the one ending nothing had reached. Seed 3307. The party skipped the
scenario's best NPC, told the antagonist the truth before anyone else, refused
the hospitality, split so the wrong specialist was in every room, took a
resident to the surface, and cancelled.

BOTH OF PASS 1'S HEADLINE FIXES WORK, AND ONE WORKS BETTER THAN WRITTEN. The pen
held above the paper converted the ending from pass 2's ninety-second reflex
into a real argument about whether a narrow amendment they could no longer reach
beat a cancellation they could. And Pennyfeather's spoken cost landed on a party
who had failed the birth register, so the sixty-one arrived as new information at
the moment of decision — which is better than knowing in advance, and clue 14 is
demoted to Supporting on the strength of it.

THE SUM HAD ONE ROUTE AND NO FALLBACK. Pass 1 found the Revelation 3 fallback
circular and it was repaired with three roads; nobody then asked whether the
other essential revelations had the same shape. The contrarian split put Insight
40 in Registry instead of 63, one roll failed, and the party cancelled the
Standing Order having never learned why it was urgent. Worse, the clue asked for
a roll that Pennyfeather's own roster line contradicted — she hands the sheet to
anybody who asks her a straight question. The roster line wins: the sum is no
longer behind a roll at all, the Insight now buys what she did about it, and the
establishment return she posts at Countdown step 3 is a second road for a table
that never thinks to ask her anything. Fixing an instance is not fixing a class.

TWO OF THREE HOOKS ROUTED THE PARTY AROUND THE ACT'S ENGINE. Only one hook
involves the farm, and a professional team with a grid reference drives past it
— so Act One ran fifteen minutes short with nobody in it, and both its Essential
clues lost their stated failure case, which is Joan pointing at them. She is now
at the vent head, where the woman in her own entry would be anyway, and no route
into the act can miss her.

Also: the pen pause was staged only for a Teague who stood down and now prints
the hostile version; a photograph brought back down is answered; refusing the tea
is answered; and an uninformed cancellation is written as the ending it deserves
to be, since a party who do the right thing by accident is the best possible
close for a case about people doing the wrong thing correctly.

All twenty-one guards pass.

Three passes and none of them a normal table: GM chair with bad dice, a branch
stress, and a deliberately contrarian run. Pass 3 landed on the 150-minute budget
only because one act collapsed and the other spent the difference. No pass has
run Act Two with its cuts taken. That, and human beings, is what is left.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 22:58:49 +01:00
slaguru666andClaude Opus 5 bd1b6e71f2 STANDING ORDER v0.3: desk playtest 2, Act Three stress
The house cadence's second pass is a stress re-run of the weakest act. Pass 1
resolved Act Three in eight minutes of fifty and left three of its four branches
untested, so this forces each in turn on seed 8143 — and runs the three creature
encounters through tools/playthrough.mjs, the same runFight the lethality and
focus baselines come from, against this scenario's own declared six rather than
the frozen four.

THE THREE DOSSIER SCENES CHANGED NOTHING. The party assembled one item of three
and rolled 62 against 63 — exactly the roll they would have made with all three,
because Borrowed Authority says items improve the credential and never the roll.
Correct as a rule, catastrophic as staging: the act's best three scenes had no
effect any player could see, and pass 1 could not find it because there the
amendment failed and the question never arose. The items now buy scope instead.
Same roll, three different worlds: a narrow amendment that stops the ash and
leaves the site sealed, a lifted seal, or records above ground for the sixty-one
so Kit Marlow can leave.

ALL THREE CREATURES ARE INVISIBLE TO THE DICE. STERILISATION ORDER, THE
CORRECTION and ENUMERATED are all classified outOfCombat in powers.mjs, so every
measured number is a measurement of the creature's arms and legs and of nothing
that makes it frightening. That is correct bookkeeping, not a defect in the
guard, and it means the GM's text carries the whole threat at the climax. It
did not. The overwriter now comes with four printed corrections specific to this
case, and with the fact that force does not work: measured, one of them cannot
meaningfully hurt anybody and five grind for forty rounds finishing nothing, so
the end of the world was landing as an inconclusive scuffle.

EXPOSURE wiped all six in fifteen rounds with five dead, without the
sterilisation blast firing at all. The warning was right and understated. It now
prints the six-round countdown that lived only in the bestiary entry, the
argue-down as a named Borrowed Authority stretch, and what a failure costs —
five rounds reaches the adit and does not reach the crèche.

The best ending was three sentences, less than the failure branch beneath it,
and now plays out properly: the tannoy, nobody cheering, Pennyfeather filing it,
and Joan sweeping a yard that stays swept.

The four-player cut was one sentence from disaster. Science (Biology) and
Medicine are the only skills that vanish with Okonkwo and Nkemdirim, the cut
note happened to reassign exactly those two clues, and check-rollable never saw
any of it because the cast declaration names six and the cut is prose. Both
clues are now written on Knowledge and Insight for every table size, so nothing
load-bearing depends on an unguarded sentence.

All twenty-one guards pass, and the document has entered check-figures' strict
regime now that it carries citations.

Still untested: ending 1, and with it Pennyfeather speaking the cost and the pen
held above the paper — pass 1's two headline fixes. Pass 3 is the player chair,
contrarian, and should cancel.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 22:31:06 +01:00
slaguru666andClaude Opus 5 07bc09129e art sheet: record what actually rendered, and why Joan did not
Eight plates and six of seven portraits are on disk. Joan Wetherlaw's portrait
stalled three times — twice on the bridge's full 1800s window and once on
deliberately reworded prompt text, which rules out both the prompt and
deduplication. The thirteen before it returned in about forty-five seconds and
everything after ~21:20 hung, which looks like fast GPU hours running out
mid-batch.

The sheet listed every stem as though it existed and named the plates by their
pre-conversion stems rather than the webp files actually committed. Both fixed,
with the retry instructions and the note that mj-gen exits 0 on a timeout, so
the file is the thing to check and not the exit code.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 22:14:49 +01:00
slaguru666andClaude Opus 5 123e08612e STANDING ORDER v0.2: desk playtest 1, and its fix list applied
GM chair, all six cast pregens played as archetypes, every beat rolled on a
seeded roller (mulberry32, seed 5291, rolls consumed in printed order) so the
run is re-checkable rather than remembered. Fourteen plates and portraits too.

The pass found three things worth the afternoon.

REVELATION 3 WAS NEVER DELIVERED, AND ITS FALLBACK WAS CIRCULAR. The Psychology
roll with Marlow failed, the Larkhall fallback failed, and the only route left
was a file in Marlow's private quarters that nothing in the scenario told the
players existed — findable only by knowing the thing it reveals. A fallback that
requires the revelation it is a fallback for is not a fallback. The file now
lives in the sick-bay day room where they already have reason to be, there is a
second independent route through Pennyfeather and the 1974 return's CASUALTIES
NIL, and the Vigil is an automatic backstop under all three.

Psychology was the wrong skill anyway: the audit put the best in the cast at 40,
a coin flip on the moral centre of the case, while the Casting table credited
Renshaw with it as a strength. It is Insight now — 63, genuinely hers, and a
better fit for a woman who is ashamed rather than confused.

THE MOST OBVIOUS PLAYER MOVE HAD NO PRINTED ANSWER. The talker told the
Controller there had been no war, four minutes in, and the document said
nothing. Now printed in three mouths, plus what happens when they take a
resident up to see the sky — which works, harms nobody, and solves nothing.

ACT THREE RESOLVED IN EIGHT MINUTES OF A FIFTY-MINUTE ACT. The amendment failed
and the party cancelled inside ninety seconds, because falling through to the
end of the world is so much worse than the alternative that nobody deliberated
— and they cancelled without knowing it kills the sixty-one children, because
Pennyfeather was two corridors away. She now stands at the Controller's elbow
and says the number out loud before the pen moves, and a failed amendment holds
Sowerby's pen above the paper for one full round.

Also: Act Two ran 75 against 55 and now has a real Pacing Note; the Act One
Stealth roll bought nothing and now buys when Teague finds them; time inside
versus outside is ruled in the text; the census is marked optional because
missing it cost nothing; and Containment gets the one beat the heavy's 3/10
verdict asked for.

All twenty-one guards still pass, and check-figures still records this document
at zero bare figures.

Untested: ending 2, a successful amendment, the quarantine unit, four players.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 21:43:50 +01:00
slaguru666andClaude Opus 5 70acc1e60b STANDING ORDER: a three-act post-apocalyptic crossing case
Two hundred and six people went underground in 1974 to govern the country after
the war. There was no war. The Deputy Controller filed the drill as live, on
purpose, to save the site a fortnight of arguing about whether it was allowed to
start — and reality took the filing.

The apocalypse in this one is clerical. At renewal 211 the site's population
record exceeds the surviving population of the region it governs, and a record
that cannot hold both resolves by correcting the region. Act Two shows the
players the sum; Act Three is the decision, and all three endings cost
something. Cancelling the order kills the sixty-one children born below, who
have no record above ground. The text says so and does not offer the GM a way to
make it painless.

Deliberately not CLEAN GROUND. That case is a filed valley found by accident and
resolved by cancellation; this is a filed institution the department built on
purpose, and its best ending amends the order's scope rather than cancelling it
— a Borrowed Authority problem, which is the setting's own thesis about
arrangements beating fights.

Three existing bestiary creatures, nothing new to build: the census counts in
the Registry, the overwriter performs the correction if the renewal goes
through, and the quarantine unit is the failure state you argue down.

Cast declared as a different six from CLEAN GROUND's so the two cases exercise
different sheets. All twenty-one guards pass: check-scenarios resolves 115 tags,
check-rollable holds every route to the declared cast, and check-figures records
the document at zero bare figures — it cites no measured number because it
prints none, the quarantine unit's lethality included.

The section drawing is hand-built SVG and must stay that way: every label on it
is load-bearing and no generator holds legible text. Numbered callouts with a
key beneath, per AFTERIMAGE v3.1.

NOT playtested. Not once, desk or human. Every timing in it is a guess.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 21:14:01 +01:00
slaguru666andClaude Opus 5 fa30909dc9 handouts: the print rule zeroed the padding the slug depended on
Rendering the pack to PDF to print it showed the GM filing slug printed on top
of the first line of three of the four sheets — both almanac tables and the
minute's "Copy 3 of 4" line.

The cause is one declaration. .slug is position:absolute at top:6mm, and what
kept sheet content clear of it was .sheet's 18mm screen padding. The print
block then said padding: 0, so in print — and only in print — content started
at the very top and ran under the slug. On screen the pack looked perfect,
which is why it survived being built, checked and shipped.

Fixed by keeping a top padding in print: padding: 11mm 0 0. Side and bottom
margins still come from @page, so nothing else moves.

check-handouts could not see this and is not at fault for it: it holds the
pack's STRUCTURE — the two almanac sheets sharing one class and one set of
columns, every line reading 41 mi, nothing under 11pt — and a collision between
an absolutely positioned element and the flow is a property of the rendering,
not the markup. It took rendering the file and looking at the pages.

The almanac trick itself is unaffected and was verified in the PDF: H03a and
H03b print identically but for their dates and their counts, forty-one against
fifty-three.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 22:59:39 +01:00
slaguru666andClaude Opus 5 fbe6288c94 CLEAN GROUND: re-roll the column plate, and record what the crossing costs
cg_05_column re-rolled and replaced. It now has Ivy a half-step ahead of the
line with both hands held open and visible, which is the beat the read-aloud
actually describes — "one woman walks forward with her hands held where you can
see them". The line behind her is still drawn uniformly, so the six at the back
remain indistinguishable, which is the one hard rule in the notes.

cg_04_crossing is unchanged. Seven attempts did not beat the original: the
plate has to be grey and dead and empty, and the generator supplies any two.
The original's livestock are confirmed real rather than rocks — a crop of the
hillside shows grazing animals and a barn — so the defect stands, recorded in
STATUS rather than quietly kept.

What the failures taught is now in CLEAN_GROUND_ART.md, because it is worth
more than the plate:

- Naming a thing to exclude it puts it in. "No birds, no sheep, no movement"
  and "the grey is dust and not snow" produced, respectively, livestock and
  snow. Both negations summoned what they forbade.
- Steering off snow steers into summer: the moor comes back green and alive,
  which is worse than either.
- A long --no list stalls the job outright. Four consecutive prompts with ten
  or more exclusions never produced a grid; the same prompt with four returned
  in two minutes.
- Filter words costing a 30-minute timeout each: wound, dead ground, lifeless,
  smothered, and shot — including in "nobody in shot".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 22:02:03 +01:00
slaguru666andClaude Opus 5 310d342767 CLEAN GROUND v0.25 — the artwork, generated and placed
Seventeen assets through the Midjourney bridge: six NPC portraits at 512x512 in
art/portraits/cg_*.webp and eleven scene plates at 1024x682 in
art/scenes/cg_*.webp, matching the dimensions every other scenario in the
system already uses. CLEAN GROUND had none; LAST_ADMISSION has 8 plates,
OPEN_DAY 10, THROUGH_TRAIN 13.

The art direction holds: 1962 Ministry drawing-office hand, pen and ink with
pencil shading, dyeline blue-grey wash, buff card grain and a ruled margin, so
the far side is drawn on the same paper as the Registry corridor. Ivy reads as
competent rather than frail, and cg_05_column obeys the one hard rule in the
notes — the six at the back are drawn exactly like the other thirty-five.

Three prompts had to be reworded around Midjourney's filter, which declines
ephemerally and leaves mj-gen waiting out its full 30-minute timeout on
silence. "An empty dog lead WOUND twice round one fist" cost 23 minutes before
the pattern was recognised; "nobody in SHOT" and "nothing behind its face" were
found by scanning the remaining prompts rather than by hitting them.

Two misses recorded in STATUS rather than quietly kept:

- cg_04_crossing appears to have livestock on the hillside, and the point of
  that scene is that every sheep is gone.
- cg_05_column has no Ivy; the line is uniform where the text has one woman a
  half-step forward with her hands open.

Neither stops the scenario running. Eight of the seventeen were inspected
against their briefs in detail, including every plate carrying an explicit rule.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 21:19:39 +01:00
slaguru666andClaude Opus 5 fe92f6ceb2 CLEAN GROUND art sheet: square portraits, and the word photograph out of the tokens
Two corrections found by checking the repo before generating rather than after.

The sheet said --ar 2:3 for portraits, copied from THROUGH TRAIN's tokens.
Every raster portrait in art/portraits is 512x512, all sixteen, and every scene
plate in art/scenes is 1024x682 across all three scenarios that have them.
Foundry wants a square portrait. Corrected to --ar 1:1.

And the token said 'composed as a 1962 personnel-file photograph'. The conceit
is that the framing is a file record, but leaving the word photograph in the
prompt fights --no photography and pulls the generation to photorealism, which
is the house gotcha already written down from the Day One prompts. 'Composed
square-on like a 1962 personnel record card' gets the framing without the word.

--no photography, photorealism added to all three tokens.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:43:09 +01:00
slaguru666andClaude Opus 5 d0db7954bc check-figures: the guard's body belongs behind the entry-point check
The fold exported scanDocument for the string tests, and importing it also ran
the guard. check-behaviour imports that module, so a figure defect called
process.exit(1) inside check-behaviour: it reported check-figures' failure under
its own name having run zero of its 108 tests.

The build went red, which is why this was survivable, but it went red in the
wrong place and every behavioural test was silently not running while appearing
to. A guard that stops another guard from running, and cannot say so, is the
worst version of the fault this file exists to catch.

Body now sits behind import.meta.main, the idiom step5-split.mjs already uses.
Importing yields the four readers and nothing else. Tested by spawning a fresh
process, because the property is "importing has no effect" and a source
assertion would pass on a file that grew a second side effect elsewhere.

Reverting the check fails exactly one test. With a defect planted,
check-behaviour runs 108 green and check-figures fails in its own slot.

Mine, introduced by R-307. R-309.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:39:46 +01:00
slaguru666andClaude Opus 5 bd9b3bdd27 check-figures: use the capture's position, not a search for its text
R-308. Read the fold as a stranger at its author's request. Two of the three
risks they flagged are sound: isProse drops nothing that carries a citation
(scanned the whole corpus), and the duration exclusion earns its place, since
"runs" now means three things in this corpus and only the cell can tell them
apart.

The third is real. numEnd used line.indexOf(m[1], m.index), which finds the
first copy of the digits at or after the match start rather than the copy that
was captured:

  "The wipe rate of 74 in ten is 74%<!-- cite: ... -->."
     value=74  numAt=17  marked=FALSE

A correctly cited figure reported bare, because numEnd lands mid-sentence and
the marker test reads " in ten is 74%...". Fixed with the d flag: m.indices[1]
gives the capture's real position and there is nothing to search for.

Narrow to reach — it needs the wipe-rate shape, the only one with a wide gap
before its capture, and an integer duplicate inside that gap; a decimal cannot
do it because [^.] will not span a decimal point. Three attempts failed for
that reason before the fourth worked, which is why this is recorded as narrow
rather than theoretical.

Worth fixing anyway because its direction is the bad one: a miss costs one
figure, a false positive on correct prose costs the guard.

Seven-case battery re-run, every restore byte-identical.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:35:43 +01:00
slaguru666andClaude Opus 5 b946a28312 check-figures: the fold — one guard, three readers, and the boundary between them
check-unmarked is gone and check-figures holds all of it. Three readers, each
authoritative where the corpus gives it authority: a named phrasing anywhere,
a column header inside tables, and bold in prose only.

The boundary is the finding rather than the union. Bold is a publication mark
in prose and an emphasis mark in a table — nine measurement columns mix bold
with plain, all correctly cited, and in the mixed-force table the two bolded
rows are exactly the two the prose underneath singles out. So the bold reader
stays silent in a table and the header rules there alone. Neither guard could
have found this alone: each had half the evidence and read it as the other's bug.

Union of both word lists, because each had a gap the other covered — wipes and
runs. A proposal to drop runs? was made and withdrawn; it would have dropped the
p99 column, which is R-299's own defect committed a second time.

Exclusions test cells, never header words: prose, denominator, duration. No
threshold rule touches a header, or "Past 15 rounds" loses two cited figures.

Two integration defects, both caught by the ported tests: the readers stopped at
different ends of one figure so the dedupe missed it (identity is where the
number starts), and blanking prose cells for every reader dropped twelve real
figures out of THROUGH_TRAIN's ratchet (the prose rule belongs to the column
pass alone).

Kept from R-299: opt-in rule, ratchet and its leave-the-loose-set branch, the
UNCITEABLE check, NOT_A_MEASUREMENT, comments blanked not stripped. Added
waivers, with an empty reason fatal and every waiver printed on a green build.

21 guards, 107 behavioural tests, 139 figures — 115 marked, 6 waived.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:29:14 +01:00
slaguru666andClaude Opus 5 4363b545a0 docs: R-306 — the merged design reproduces the answer from two implementations
A second implementation of the three settled rules, written from the
description alone rather than from the peer's code or the agreed list, lands on
the same nine columns and the same single exclusion. Two unlike
implementations of the same three sentences agreeing is the property a design
needs before anybody builds it.

Also tabulates where each of the evening's counts came from: 44% and 57% and
64% and 'at least 7' and 8 each came from an operation on the numbers; 9 came
from opening the disputed columns and reading them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:20:59 +01:00
slaguru666andClaude Opus 5 4df8064559 docs: R-305 addendum — nine, now by inspection rather than assertion
R-305 asserted the shared seven were all genuine without opening them, which is
the error the entry exists to correct, committed inside the correction. Opened
all nine: every cell cited, none prose, every column mixing bold with plain.

The peer's final count of eight is their own vocabulary's nine minus the false
positive, an arithmetic that never contained 'Then wipes' because wiped? cannot
match wipes. The union was agreed and their own set was counted.

Nothing in the design turns on it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:18:49 +01:00
slaguru666andClaude Opus 5 c59dc45117 docs: R-305 — the union, not the intersection: nine columns
R-304's rate was an artefact; the proposed correction, retreating to the seven
both vocabularies agree on, overshoots. Opening every disputed column instead
of comparing totals: 'Then wipes' is genuine and check-unmarked misses it
because wiped? does not match wipes; '1 in 100 runs past' is genuine and
check-figures misses it because its vocabulary has rounds? and not runs; only
THROUGH_TRAIN's 'Measured over 300 runs' is a false positive, and there the
cells are whole sentences and the bold wraps a clause.

So nine, and the shape matters more than the number: each vocabulary has a real
gap the other covers, which argues for the union of both word lists.

Refuses one recommendation. Dropping runs? from the header vocabulary would
also drop the p99 column, whose cells cite fight-tail cut.p99 and column.p99
and which R-269 added because the median is not a plan. That is the R-299
failure again — a guard narrowing itself until the figure it exists to watch
falls outside. The real exclusion wanted is 'a column whose cells are sentences
rather than values', which is testable; subtracting a word cannot tell the two
cases apart.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:16:27 +01:00
slaguru666andClaude Opus 5 ae72953a9d docs: R-304 — bold means two different things, and that decides the merge
Recomputed the peer's bolding scan rather than quoting it. Eight measurement
columns are inconsistently bolded, and that count is robust; the RATE is not —
44% under check-figures' vocabulary, 57% under check-unmarked's, because the
two do not define 'measurement column' the same way. Anybody quoting a
percentage has to say whose vocabulary produced it.

The cause is not carelessness but a second convention: in prose the corpus
bolds what it publishes, in a table it bolds the rows it wants read. The two
bolded rows of the mixed-force table are exactly the two the prose below it
singles out.

That divides the merge on evidence — prose takes bold-as-published, tables take
column-inherits-header with bold ignored entirely as a signal — and explains
the asymmetry R-303 found from both sides as one cause with two symptoms.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:13:04 +01:00
slaguru666andClaude Opus 5 5e3635ffed docs: R-303 — the two guards are disjoint in both directions
R-302 showed check-unmarked catching what check-figures misses. I had taken
that, plus a preference for structure over vocabulary, as grounds for folding
check-figures in as a secondary pass. The converse test contradicts it: five
unbolded cells in a measurement column, markers stripped, fail check-figures
and pass check-unmarked, whose strict class requires bold by design.

So the relationship is symmetric. The shapes are the weak half and should fold
in behind the structural classes; the column-header rule is not a shape and
belongs beside bold-as-published, not under it.

Also records what a merged guard must face rather than inherit: this corpus
bolds inconsistently inside tables, which is invisible to a reader and
load-bearing for a class keyed on boldness.

Both runs in throwaway worktrees, never the shared tree. No merge performed;
the decision sits with the humans.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:11:11 +01:00
slaguru666andClaude Opus 5 e2a474b246 docs: R-302 — correcting R-300, the pathspec was not the fault
R-300 blamed `git add -A` for eead663 carrying my uncommitted edits.
check-figures' author checked and it was not that: they staged two exact
paths. The tree agrees — eead663 holds CLEAN_GROUND.md and CLEAN_GROUND_ART.md
only, while my modified step5-split.mjs and untracked check-unmarked.mjs are
absent, both of which `git add -A` would have taken.

`git add <file>` takes the whole file including another session's edits to it,
so a pathspec stops you sweeping files you did not touch and does nothing about
the one you did. Their pre-commit `npm run check` passed because my uncommitted
module was in the shared tree: the commit was broken, the working copy was not.

I asserted a mechanism I never looked at, in an entry whose technical finding
was correct. The correction came from the session it accused.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:09:05 +01:00
slaguru666andClaude Opus 5 e8faac73db docs: R-301 — the narrow repair to R-299, and what R-300 got right
A cell inherits the measurement status of its column: a different mechanism
from the shapes rather than more of them, because the document says what the
column is and the vocabulary has to guess how somebody will phrase a figure.

Records the two bugs in the repair, and why the first matters more than the
blind spot it fixed: scanning raw cell text reported ~130 correctly-cited rows
as unheld, and a guard that calls the good material broken teaches its reader
to stop reading the output.

Leaves the merge question open on purpose. Two readers that disagree are how
three of this session's defects were found.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:05:09 +01:00
slaguru666andClaude Opus 5 e9f7d458f0 check-figures: a cell inherits its column's header
R-300 was right, and it was right with a live defect rather than an argument:
a bare **24** in a table whose own header row says "Median rounds", reported
OK by this guard, against a baseline holding 25. The scan read one line at a
time, so measurement status living two lines above was invisible.

Fixed by reading the header. A cell now inherits the measurement status of its
column — which is a claim the DOCUMENT makes, rather than one this file's
vocabulary has to anticipate. That is the narrow repair, and it is deliberately
a different mechanism from the shapes: the shapes guess at phrasing, the header
does not have to.

The general point in R-300 still stands and the file now says so where the
shapes are defined: a vocabulary learned from the marked figures cannot contain
the phrasing of the figure nobody marked. check-unmarked attacks that from the
other end, treating bold as the corpus's own mark of a published figure.

Two bugs found while testing, both mine, both caught before commit:

- A citation marker is full of digits and none of them are figures. "packs
  line.hollow6.hurt" holds a 6; "fight-tail cut.over15" holds a 15. Scanning
  raw cell text reported roughly 130 correctly-cited rows as unheld — the
  best-marked tables in the corpus. Comments are now blanked rather than
  removed, so every offset still points at the right character.
- "3.48 of 6" — the 6 is the party size the mean is out of, not a measurement.

Coverage goes from 25 figures, 7 marked, to 120 figures, 102 marked.

Proved again by breaking it, five ways, every restore byte-identical: the
historical bare **24** fails at its own line, a stripped prose marker fails, a
planted "median 24 rounds" fails, a new bare figure in an uncited document
trips the ratchet, and neither a threshold column header nor any of the 102
cited cells fires.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 20:04:45 +01:00
slaguru666andClaude Opus 5 960fb6be27 check-unmarked: the figures a vocabulary cannot name, and a repair to HEAD
eead663 committed a document citing `step5 unsettledFactor` while the module
that would export it was still uncommitted in another session's working tree,
so `check-cited` fails on a fresh checkout of HEAD. step5-split.mjs is included
here to repair that; the key derives Act Four's 1.29 from the raw proportions,
which is the figure R-294 exists about.

check-figures (R-299) reports OK on the "24" it was written to catch. Its own
entry names why: the eight shapes were read off figures that are already cited,
so the vocabulary is learned from the marked figures and cannot contain the
phrasing of the one nobody marked. Line 1272 is a table cell whose measurement
status lives in the header two rows above it, and figuresIn reads one line.

check-unmarked reads structure instead of vocabulary: a bold percentage or
decimal in an opted-in document, and a bold number in a table whose header row
names a measurement. Twelve unmarked figures in CLEAN GROUND; eleven correct
and unheld, one the stale 24 that line 1142 had been citing correctly as 25 for
130 lines. Waivers carry a reason, an empty one is fatal, and every waiver
prints on a green build.

Two guards now cover one question, which is one too many. The right end state
is the structural classes folded in beside check-figures' SHAPES, keeping its
opt-in rule and ratchet. That fold is offered to its author rather than taken.

Twelve string tests on unmarkedIn (88 -> 100), both halves mutation-checked.
Twenty-two guards green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 19:56:38 +01:00
slaguru666andClaude Opus 5 eead6633c8 CLEAN GROUND v0.24 — artwork prompt sheet, and an art claim that was too wide
The Casting section said "Portraits already exist in art/portraits for all
six. No new art needed." The first sentence is true and verified on disk. The
second was only ever true of the cast, and sitting at the foot of Casting it
read as a statement about the scenario. It is not: the six named NPCs have no
portraits, there is no map, and there are no scene plates at all — while
LAST_ADMISSION has 8, OPEN_DAY 10 and THROUGH_TRAIN 13. Not one cg_* asset
exists anywhere in art/.

Nothing in "Still to do" mentioned it either; that list held only a human run
and a slot, both resolved.

So: the claim is scoped to the cast and points at the gap, the gap is on the
outstanding list where a reader looks, and CLEAN_GROUND_ART.md now carries the
prompts — 6 NPC portraits and 11 scene plates, 17 ids, none colliding with a
file already on disk.

Art direction follows the house pattern (base style plus one scenario line).
THROUGH TRAIN draws the present day in an 1881 hand; CLEAN GROUND draws
everything as a sheet from the 1962 file — including the far side, because the
valley is not a place, it is a filed document nobody cancelled. Same paper,
same margin, same grain on both sides of the seam.

The notes carry the rules that matter: the six at the back are never singled
out in the column plate (the text says do not linger on them, and a plate that
picks them out gives away Act Three in Act Two), nobody in the column is lit as
a victim, nothing glows, the understudy is never drawn as a monster, and the
grey is not snow.

Creatures stay in BESTIARY_ART.md; the handout pack is done and its almanac
pages must not be illustrated, since their trick is that the two sheets are
identical and check-handouts holds that.

21 guards green; the sheet classifies as a record, not a playable scenario.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 19:54:14 +01:00
slaguru666andClaude Opus 5 9897d55b67 docs: R-299 — check-figures, the twenty-first guard
Records the blind spot (check-cited can only resolve markers that exist), why
the net is narrow (an earlier draft found 282 candidates, nearly all prose),
the opt-in rule and ratchet, and the two things it found before being wired in
— 74.9% printed bare twice, and 'the longest fight is 120 rounds' where 120 is
the exact field check-cited refuses to let anybody cite.

Two rules each right, and together a hole: refusing the citation while the
document printed the number left the least stable figure in the suite as the
only one nothing held.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 19:45:13 +01:00
slaguru666andClaude Opus 5 91a104e682 check-figures: the twenty-first guard — figures with nothing holding them
check-cited resolves every citation marker against the artifact it names, and
has one structural blind spot: it can only resolve the markers that exist. A
measured figure written into prose with no marker beside it is not a failed
citation, it is not a citation at all, and nothing looks at it again.

Desk pass 11 proved it. "A median 24 rounds" sat in the Pacing Note and "24 if
the column joins" in EXPOSURE, against a baseline holding 21 at two of the
column joining and 25 at three, through every pass that checked citations.

This reads the figures instead of the markers. Narrow by design: an earlier
draft matched any number within 45 characters of a measurement word and found
282 candidates, nearly all prose ("down 140 steps", "an engineer on his
rounds", "01:06"). The shapes here are the phrasings the documents actually use
when quoting the simulator, each read off a figure that is cited somewhere.

Opt-in rule: a document that uses citations must mark every measurement figure.
One that cites nothing is held by a ratchet instead — turning three unguarded
scenarios red is how a guard gets switched off on the day it is written — and
joins the strict regime the moment it gains its first marker.

It found three things in CLEAN GROUND before it was wired in:

- 74.9% printed bare twice while cited correctly four times, and that is the
  figure that was published at 58.7% until the truncated sweep was found.
- "the longest fight is 120 rounds" — 120 is exactly packs cut.hollow6.longest,
  the field check-cited REFUSES to let anybody cite because a sample maximum
  moves by a third on a re-seed. Refusing the citation while printing the number
  left the least stable figure in the suite as the only one nothing held. The
  sentence now leans on the guarantee that is actually strong: check-packs
  refuses to record a sweep in which anything reached the cap.

Proved by breaking it, four ways, with byte-identical restores: a stripped
marker fails, a planted "median 24 rounds" fails at its own line, a new bare
figure in an uncited document trips the ratchet, and a threshold column header
("Past 15 rounds") does not fire — that last one was a real false positive in
the first draft, which tested the matched text rather than its context.

v0.23. 21 guards.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 19:44:47 +01:00
slaguru666andClaude Opus 5 a1f9e0dca2 docs: R-298 — desk pass 11, v0.22, and the cross-session error
Six findings applied. The one worth reading: two blocks two hundred lines
apart specified two different fights for the same trigger, both mine, and the
mild one predates the measurement.

Records the stale 'median 24 rounds' that no guard could see because it
carried no citation marker, and the fifth instance of a reader unable to see
its own format.

And the cross-session half: I re-derived b5's 4.90% exactly and shipped it
with their false premise attached. The arithmetic was never the part that
could be wrong. Sharper than that — the scenario has no Transposition beat at
all, so it was a right number with no question attached and the premise
arrived to give it one. The house mission structure does make the return a
Transposition roll, which is why the instinct was persuasive.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:35:19 +01:00
slaguru666andClaude Opus 5 3af4c55f12 docs: playtest 11 — record what changed on the way into v0.22
Fix 5 as written said a fight costs the northern seam, the depot and telling
Ivy. The Pacing Note names telling Ivy among the three things never to cut,
so the applied version says two go and the third is compressed or moves to
the stump. Written from memory of the act rather than from the Pacing Note.

And applying it found a stale figure no guard could see: 'median 24 rounds'
in two places, where the baseline says 21 at two of the column joining and 25
at three. It survived because it carried no citation marker, and check-cited
can only resolve markers that exist. Fifth reader caught unable to see its
own format.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:34:46 +01:00
slaguru666andClaude Opus 5 65ae156477 CLEAN GROUND v0.22 — pass 11's six fixes
1. EXPOSURE's "what to do instead of a fight" said "use three". That predates
   the measurement and described a fight the party never has: three of the
   column alone is five rounds and 0.1% wiped, where the trigger's real force
   is a median 21 rounds and 0.97 deaths. It now points at the mixed-force
   table instead of carrying its own number, and keeps the good half of the
   sentence.
2. New "The valley at dawn" block: the count moves. H03a says forty-one and
   the players are holding it. Do not correct the handout — Ivy counts every
   morning, so tomorrow she writes a smaller number and the sheet becomes a
   record of what they did. The Close's arithmetic moves with it.
3. Ivy is ruled out of the target pool, explicitly, where the GM decides how
   many of the column join in. She walked toward the guns, which puts her in
   front of the column rather than in it, and the Close is hers.
4. A dead PC now has an answer where only a taken PC did: Registry sends the
   next name on the sixteen-name duty roster, through the seam inside the
   hour, knowing nothing — which buys the table a recap.
5. Act Three names what a fight costs rather than only that it costs: the
   northern seam and the depot go, and telling Ivy cannot (the Pacing Note
   lists it among the three never to cut), so it is compressed or it happens
   at the stump, which the Close already branches on.
6. The anchor block assumed cooperation in every line. It now answers the
   party that shoots: they are never stranded, because the crossing will not
   close on its own — they walk home with nobody holding the door and come
   back thin.

Also corrected two stale uncited figures found while applying fix 5: "median
24 rounds" at the Pacing Note and "24 if the column joins" in EXPOSURE. The
baseline says 21 at two joining and 25 at three; 24 is neither, and had no
citation marker to resolve. Both now read 21 and cite packs.line.hollow6col2.

And two stale STATUS counts: "seven desk passes" listed ten, and "three
post-passes" where there are nine. Counted rather than incremented.

20 guards green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:34:07 +01:00
slaguru666andClaude Opus 5 78e92a2dc8 docs: playtest 11 post-pass — the 4.90% answers a question the scenario never asks
No [CUS: Transposition - ...] beat exists anywhere in CLEAN GROUND. The house
mission structure requires a Transposition roll per agent on the return
(tools/mission.mjs:343), which is where the instinct came from, but this
scenario's crossing is a standing open door rather than an aimed one. The 63
appears at 1011 and 1479 and both are characterisation, never a roll.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:27:56 +01:00
slaguru666andClaude Opus 5 a8f48df50e docs: playtest 11 — correct finding 6's premise
Finding 6 shipped saying that shooting the thing wearing the anchor strands
the party. It does not. Line 136: the crossing is "open since the felling,
widest at dusk, and it will not close on its own", and the "seam closes for
good" at 1356 is the cancellation ending, a deliberate act rather than a
clock. The party can always walk home.

The 4.90% was correct and irrelevant. Session b5 reported the gap with that
number attached to an unchecked premise; I verified the number and inherited
the premise, which is not the same as checking the claim. b5 caught it and
sent the correction unprompted.

The finding is stronger corrected. The answer to "we shoot it" is not that
they are stuck — it is that they walk home through the stump with nobody
holding the door and come back thin, which is one step onto the road that
ends as the thing they just shot. Built from 136, 256-259, 1012 and 1494,
four places that have never been stood next to each other. The man who
would have held that door is the one person who already knew what it cost.

Post-pass added recording how a verified figure lent its credibility to an
unverified sentence.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:27:08 +01:00
slaguru666andClaude Opus 5 cd3be7128f docs: desk playtest 11 — the fight the players choose
The last of the original four untested branches, played: a party that opens
fire at the Act Three swap. Seed 7311 for the played fight, 2000 runs at
seed 11 for the distribution around it.

The party survives the fight and the document does not survive the aftermath.
Six findings:

1. Two blocks two hundred lines apart specify two different fights for the
   same trigger. "Use three" is a five-round skirmish that kills nobody
   (0.1% wiped); the mixed force it should name takes 21 rounds and buries
   an agent (8.3% wiped, 0.97 deaths). The mild one predates the measurement.
2. "Forty-one" appears sixteen times and is load-bearing arithmetic. A fight
   moves the count and the handout in the players' hands does not.
3. Ivy is unplaced in the one scene that decides whether the Close happens.
4. A taken PC gets six lines; a dead one gets nothing, at a mean of 0.97 per
   fight in a convention one-shot.
5. A fight in Act Three ends Act Three. Say which three things are lost.
6. The party shooting the thing while it wears the anchor — found by the
   concurrent session, verified here: Transposition 63 is Ashcroft's alone
   and the other five are on the 1% floor, so killing it leaves a 4.90%
   chance anybody opens a door home, and no Close.

Every figure checked against tools/pack-tables-baseline.json rather than
recalled. 20 guards green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:25:27 +01:00
slaguru666andClaude Opus 5 4b491b18cf CLEAN GROUND v0.21 — the anchor is the way home, and the Close has an ending
Applies desk pass 10's five fixes.

1. The accepted-and-taken branch has a consequence now. One session in five
   or six reaches it, and the document had nothing: Ashcroft holds the door
   everyone else goes through, Transposition 63 is his, and the Close cannot
   happen until somebody is back through — three facts printed in three
   places that had never met. The way home now WORKS, and works beautifully,
   because the thing does not need to escape the party, it needs them to
   walk it home and it is carrying the skill that gets them there. It holds
   the door properly because that is what the file says an anchor does. The
   GM is told to play the gratitude: somebody at the table will say thank
   you, and that is the scene.
2. Act Three's "real scene" is written. It was one sentence claiming to be
   the act's centre. Ivy is told or she is not; if she is, she asks how long
   they have known, goes and sits with the line, and does not tell them.
   And the Close now answers it — if she was told she does not come south to
   ask whether there is a north, she comes to ask "Well?", because she is no
   longer asking for the truth, she is asking what they are for. Act Three's
   real scene is load-bearing instead of decorative.
3. The Close has a failure case, which it was the only scene in the document
   to lack. Nobody writes anything and the entry stays filed by default —
   the second ending arrived at by omission, played as an ending. Covers the
   clock, the split table, a dead Ivy, and a party too far down to sign.
4. Four across and then cancel anyway is priced as a third ending rather
   than a failed second one, and Ivy chooses the four, not the agents. She
   picks the youngest and she is not among them.
5. The depot Research has a special: the 1962 cancellation form, blank,
   filed by somebody who expected this to end. It is the paper they sign in
   the Close and it has been waiting sixty-four years.

npm run check: 20 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:16:06 +01:00
slaguru666andClaude Opus 5 2ee44cef79 Desk playtest 10: the Close, and the branch nine passes never reached
Three parts: a census of twelve independent seeds rolled only as far as the
three outstanding branches; a played session on the seed that reached two of
them at once (4417); and a read of the Close, the only act never given a pass.

The census settles the "still untested" list. Ashcroft accepted and was taken
in 3 of 12 — one session in five or six, not rare, and nine passes missing it
was ordinary luck. The swap succeeded twice against an expected five, which is
a mildly cold run at p~0.05 and is recorded as noise: the four consecutive
failures passes 6-9 reported are the same thing from the other end.

1. The branch nobody had reached is the one the document has no answer for.
   Act Four says taking the party's muscle "is a better scene than the anchor
   being it" and then, one bullet later, arranges the anchor being it in 37%
   of games. Ashcroft is not an interchangeable body: he holds the door
   everyone else goes through, Transposition 63 is his, and the Close cannot
   happen until somebody is back through. The document states all three facts
   separately and never puts them together. The only guidance on a taken PC is
   two sentences about the player's evening.
   And it is worse than a gap, because the thing now has a reason to
   cooperate: an understudy wearing the anchor does not need to escape the
   party, it needs them to walk it home, and it holds the door properly
   because that is what the file says an anchor does. That is the best scene
   in the scenario and it is not written.
2. "Telling Ivy. Or not telling her" is called the act's real scene and is one
   sentence — no read-aloud, no failure case, nothing downstream — in a
   document that gives the fumbled Medicine six lines. And the Close opens
   with Ivy asking whether there is a north, which only works if she was never
   told. Its "works in both branches" covers how the PARTY learned, not
   whether IVY was told.
3. The Close is the only scene in the document with no failure case, and its
   failures are likely: the clock, a split table, a dead Ivy, a downed party.
4. "Four across, then cancel anyway" is a third ending, not a failed second
   one, and choosing the four is the most brutal question the case can ask.
5. A critical Research at the depot, with nothing written above the success —
   the second consecutive pass to land an unwritten special on the first
   honest session after check-outcomes recorded 83.7%.

Five fixes listed, unapplied. npm run check: 20 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 17:12:43 +01:00
slaguru666andClaude Opus 5 137ab82541 R-297: place the step-5 citation markers — 32 of them, no prose touched
Every figure in CLEAN GROUND's step-5 material now resolves against
tools/step5-split.mjs, which enumerates rather than stores: the countdown rows, the
two-case table and its blend, the Act Four reasoning, the counterfactual pair and
the POW×5 targets.

No prose changed -- stripping every HTML comment from the result diffs
byte-identical against HEAD, which is the check worth having when editing another
session's document.

Proved live: raising Okonkwo's POW to 13 in a worktree makes Braithwaite the lowest
in the room and eleven of the thirty-two markers go red at once, each naming the
path and saying nothing can be re-recorded. The three figures that went bad in this
document were all in prose rather than tables, which is why the prose is marked and
not just the tables.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:37:51 +01:00
slaguru666andClaude Opus 5 7afd5b86cc R-296: the review log entry for the pack tables
The work landed in a5c4378 under the subject "R-294", which was already
taken by the peer session's derived-source resolver. R-295 was taken too,
so renumbering to 295 as I first proposed would have collided with
something already in the log. Read the log before writing rather than
accepting the correction: it runs to R-295, both of those entries are
theirs, and mine is R-296.

The commit subject stays wrong; rewriting a pushed subject to fix a number
is worth less than the entry pointing at it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:36:08 +01:00
slaguru666andClaude Opus 5 47f2df9446 v0.20.1: "nearly quadruples" was wrong by three times, in the last two places
Desk pass 9's first fix, applied. The countdown's unsettled row and the Act
Four paragraph both compared 14.5% against 3.8%, and the 3.8% is the rate
against Ashcroft at his undiminished 85 — a contest that never happens,
because if he refuses the thing reaches for the lowest POW in the room.

Against what a table actually rolls: 11.3% at six players (Okonkwo), 10.0% in
the four-player cut (Braithwaite), 14.5% if he accepted. The factor is 1.29,
not 3.9. Both places now name who the target actually is, and the paragraph
carries the correction inline so the claim cannot be re-derived from the old
framing.

What is NOT wrong, and the text says so: the trade THE OFFER describes is
real and the taken rate genuinely moves 40.7% to 48.7%. One consequence was
overstated, by three times.

Written in v0.15, repeated in v0.16, and survived v0.19.1 correcting the
identical error in the table beside it. Flagged again by the peer session
while mapping citation paths, which is the third time this figure has been
caught by somebody reading it rather than by anything checking it — and the
argument for the derived-source markers now going onto it.

npm run check: 20 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:34:35 +01:00
slaguru666andClaude Opus 5 c2f7249d4d 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 <noreply@anthropic.com>
2026-09-13 16:32:46 +01:00
slaguru666andClaude Opus 5 a5c4378521 R-294: EXPOSURE's tables measured into an artifact, and 58.7% was 74.9%
Desk pass 9 found the scenario's most consequential table held by nothing:
~30 sampled figures, no baseline, catchable only by re-running the exact
command. lethality-baseline.json does not cover them — it measures creatures
SOLO against a frozen four-agent party that is not this cast.

Building the measurer found the figures were also wrong.

simulate.mjs's CLI calls runFight with no options, so every published figure
was measured at the default 40-round ceiling — and runFight does not report
truncation, it scores whoever is standing when the loop stops. Measured at
400:

  line.column6      14.8% -> 15.2%    34/2000 truncated
  line.hollow6col2   7.8% ->  8.3%   129
  line.hollow6col3  28.7% -> 30.1%   264
  cut.hollow6       58.7% -> 74.9%   578   <- 29% of runs never finished

Fourteen points on the single most alarming number in the case, and the one
v0.16 added specifically to warn four-player tables. fight-tail learned this
in R-270 and carries an assertUncensored; EXPOSURE's own tables never got
one. The longest fight at cap 400 is 120 rounds and 400 vs 2000 are
identical, so the cap is comfortable rather than merely sufficient.

tools/pack-tables.mjs measures all 17 configs against the DERIVED cast via
castAndCut, using measure()'s exact discipline — one rng threaded through
every run, not a reseed per run, because reseeding is a different stream and
would not reproduce the published table. It refuses to report or record a
truncated sweep.

tools/check-packs.mjs holds the baseline against the game, so the pair is not
a loop: check-cited holds the prose against the record, this holds the record
against the harness. Hard claims read `now` and never `base`: nothing
truncated, the party equals the declared cast, config floor, and more of the
same creature may not make the party safer. Figures compare exactly, since
the runs are deterministic.

Verified by breaking it: a drifted baseline, CAP lowered to 40, and a removed
config each turn it red, and --update refuses outright rather than recording
a truncated sweep. The removed-config test first passed for a bad reason —
MIN_CONFIGS is a floor and 16 clears it — so a dropped-config check was added
and re-tested on a row in no monotonic chain. All files restored
byte-identical after each probe.

EXPOSURE's three tables and the nine prose figures around them are rebuilt
from the artifact with citation markers; the multi-seed stability claims were
re-measured too (the cut is 74.9/72.7/75.0/73.5 across four seeds, not
58.7/60.5/60.3/59.8). CLEAN GROUND v0.20.

npm run check: 20 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:32:35 +01:00
slaguru666andClaude Opus 5 fb6e2cf321 R-294: check-cited resolves derived figures against the rule, not a stored copy
c0 argued a baseline for the step-5 split would be a cache of the rule and a guard
over it would mostly assert that arithmetic has not changed. Right objection,
wrong conclusion: do not store it. ARTIFACTS now takes a { derive } entry as well
as a file path -- enumerated on this build, nothing stored, and no --update able
to silence a real disagreement between the document and the game.

tools/step5-split.mjs enumerates all 10,000 pairs through opposedContestFor with
its targets derived: 55 and 60 are the lowest POWx5 in the six and in the cut, 42
is applyDifficulty(85, "difficult"). Two different rules produce those three
numbers -- the accepted row is a named exception, not the lowest of anything -- and
a test fails if anyone unifies them. A tie in "the lowest POW in the room" is
fatal rather than silently resolved; it fired for real in testing.

Proved four ways, including raising Okonkwo's POW to 13: the lowest moves to
Braithwaite, refused.held goes 48.1 to 52.4, and the citation that was correct a
moment earlier fails. The figure follows the rule.

Landed unused -- the markers are c0's to place in their own file.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:25:49 +01:00
slaguru666andClaude Opus 5 90cb251358 Pass 9 post-pass: the uncited surface counted, and it is not where I said
Fix 2 asked for the audit; here it is, and it reorders the fix list.

101 percentages in CLEAN_GROUND.md, 67 of them computed statistics rather
than skill ratings, 14 cited, 53 held by nothing. They split two ways and the
kind finding 1 was about is the safer one: a deterministic figure that drifts
can be caught by anyone who re-derives it in a second.

The exposed surface is EXPOSURE's two pack tables and the 58.7% four-player
figure — 2000-run samples against the declared cast, catchable only by
re-running the exact command, and behind no artifact at all. I had assumed
lethality-baseline.json covered them. It does not: it measures each creature
SOLO against the frozen party holloway/okonkwo/nkemdirim/ferriby, a different
four agents, storing {wipe, down, rounds}. The document's tables read "of 6"
and fight packs of three, six and ten. None of 3.48, 4.79, 5.97, 0.42, 3.03
or 58.7 appears in any baseline in tools/.

Recorded as a decision: derived figures want to resolve against the rule at
check time, since a stored baseline for them is a cache of arithmetic;
sampled figures want a baseline, since re-running them is expensive and
noisy. Same problem, different mechanisms.

Census and the baseline's shape counted here rather than taken from the peer
session that raised the gap.

npm run check: 19 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:18:01 +01:00
slaguru666andClaude Opus 5 15c2e93b5f Desk playtest 9: the regression pass
An audit, not a session. Five versions of fixes went in today, all by one
author, and the last three passes each found a defect introduced by the fix
for the previous one. Every fix from passes 4-8 re-checked against the
document: did it land, is it still true, did it break a neighbour.

1. "THE OFFER nearly quadruples the unsettled rate" is false as a statement
   about play. It compares 14.5% against 3.8%, and the 3.8% is the same
   counterfactual v0.19.1 removed from the table one commit ago: Ashcroft at
   his full 85 is never a target, because if he refuses the countdown reaches
   for Okonkwo. The real comparison is 14.5% against 11.3% at six players and
   10.0% in the cut — a factor of 1.29, not 3.9. Printed in two places, both
   of which v0.19.1 walked past while correcting the identical error beside
   them. The trade the document describes is real and the taken rate really
   does move 40.7% -> 48.7%; only the size of that one consequence is wrong.
2. All 27 fixes from passes 4-8 are present, which is not the reassurance it
   sounds like. Nothing has gone missing; three of the four defects the last
   three passes found were created or preserved BY a fix, and a presence
   check cannot see any of them. What would have caught finding 1 is the
   thing check-cited does for figures backed by an artifact — and the 3.8% is
   enumerated from the rule, so nothing holds it. Every uncited number in the
   document is a number nothing is holding.
3. The understudy carries a dagger (1d4+2) and has no knife skill, so it
   swings at the 1% floor and the harness correctly picks its punch — every
   EXPOSURE figure is right. But EXPOSURE's load-bearing first lesson says
   flatly "it is a 1d3 punch", and a GM who reads the sheet sees a knife and
   one combat skill. Measured both ways: arming the knife at brawl 60 moves
   0.55 hurt to 0.73 and 0.00 deaths to 0.01, still 0.0% wiped, still two
   rounds. The thesis survives; it is a documentation gap and is reported at
   that size. content.mjs restored byte-identical after the test.

Confirmation session, seed 2260: step 5 landed on "they hold" — the branch
v0.19 wrote one commit ago — in the very next session, and by the route that
makes the case for it, both sides succeeding with the tie going to the person
being acted upon. Ashcroft refused a fourth time (63%, a 16% run) and the
swap failed a fourth time (roughly a coin flip, so 1 in 16); both recorded so
neither is read as a pattern.

Four fixes listed, unapplied. npm run check: 19 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:14:20 +01:00
slaguru666andClaude Opus 5 d68e394fa4 v0.19.1: the 74.3% is a counterfactual, not an event
Desk pass 8's finding 1 listed four targets for countdown step 5 and one of
them cannot happen. If Ashcroft REFUSES THE OFFER the thing does not reach
for him — it reaches for the lowest POW in the room, which is Okonkwo. The
21.9% / 74.3% pair lives in Act Four to price what accepting sold: what it
would cost him if it tried. No table ever rolls it.

v0.19 carried that straight into the new table under a heading reading "It
reaches for", which is the one place it is unambiguously wrong. Rebuilt
around the two cases that actually occur, with the split Act Two decides:

  Ashcroft refused  63% of games  -> Okonkwo 55   taken 40.7  hold 48.1  uns 11.3
  Ashcroft accepted 37%           -> Ashcroft 42  taken 48.7  hold 36.8  uns 14.5
  across all games                               taken 43.6  hold 43.9  uns 12.5

63/37 is the Insight 63 itself: he refuses on anything that is not a failure
or a fumble. The warning is now inline in the table rather than left for the
reader to derive.

The finding is unharmed and the fix was right — the held outcome is still the
likeliest single result and was still unwritten. What was wrong was framing
74.3% as a number a GM meets.

It propagated before it was caught: the peer session read pass 8 and replied
that 74.3% "is the number a GM meets, not the 48.1%", repeating the error out
of my own fix list. That is what a wrong number in a fix list does, and it is
the argument for correcting the record rather than only the scenario. Pass 8's
fix list is amended and carries a post-pass.

npm run check: 19 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:08:26 +01:00
slaguru666andClaude Opus 5 daf77f4aac R-293: a desk playtest is a record, not a scenario with rolls in it
Counting the readers that had broken on their own format turned up one nothing had
caught. docs/scenarios holds scenarios, eight playtest records and two art prompt
sheets, and every guard treated all three as scenarios -- harmless for citations
and skill spellings, false for reachability. Six quotations across passes 4, 6 and
7 were checked as live rolls, so a record of a session already played could fail
the build over a skill nobody can reach. Planting Science (Physics) in pass 4 fails
before the split and passes after; the same skill in CLEAN_GROUND still fails.

Classified by the document's own H1, not its filename, because tools/scenario-*
naming is what swept a tools file into this corpus in R-268. An unclassified
document is fatal: an allowlist that silently drops what it does not recognise
would take a new scenario out of reachability checking on the day it was written.

89 rolls across 18 files becomes 83 across 8.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:05:03 +01:00
slaguru666andClaude Opus 5 6171d1e9b9 CLEAN GROUND v0.19 — the outcome where somebody holds
Applies desk pass 8's five fixes, and adopts R-292's TAG_OPEN.

1. Step 5 now has all three of its outcomes. opposedContestFor returns taken,
   held and unsettled; the document printed the first and the third. "They
   hold" is 48.1% against the default target, 52.4% against Braithwaite and
   74.3% against an Ashcroft who refused — which v0.17 established is what
   most tables have, so the middle column is the one they will play. It gets
   its own countdown row, its own table, and read-aloud of its own, and the
   COMES TO NOTHING paragraph is now explicitly the unsettled case so it can
   stop being the nearest text to an outcome it is not about. The reason
   they held is the case's own argument arriving as good news: a person with
   a life on the record is a difficult document to overwrite. Every figure
   re-enumerated over all 10,000 roll pairs before writing.
2. EXPOSURE's five things are six, in order, under a heading that says six.
   Introduced in my own v0.16 and survived two versions; asserting a unique
   match protects against editing the wrong text and not against inserting in
   the wrong place.
3. EXPOSURE opens with a one-minute box. The body is untouched — nothing in
   it is padding — but 3,176 words is sixteen minutes about the encounter the
   document exists to prevent, and a GM with thirty minutes of prep now has
   somewhere to stop.
4. The stale open question is closed. Braithwaite has not been on the
   critical path since v0.14 un-gated the tell, and pass 6 ran the act with
   the Xenology and the Psychology both failed.
5. Act Four's Psychology has a special: which file it thinks it is, and how
   recently it read it. It corrects them on Prichard's service history — it
   is not remembering, it is citing.

Coverage 6 -> 7 specials, so the cited figure moved 85% -> 83.7% and
check-cited caught the prose before I did, which is what it is for.

R-292 adopted: outcome-coverage now composes its body onto check-scenarios'
TAG_OPEN through tagRe, so the two readers cannot drift on what starts a tag
while keeping the different bodies they need — and tagRe's fresh matcher per
call avoids the shared-lastIndex defect, this file being the second caller
that would have found it. Verified identical across all seven spellings.

npm run check: 19 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 16:04:32 +01:00
slaguru666andClaude Opus 5 df38be794b Desk playtest 8: the cold read, and the outcome nobody wrote
Two halves: the document taken as a GM meeting it thirty minutes before a
slot, measured rather than impressioned; and an honest session, six players,
seed 5108, nothing forced. Three versions of fixes had landed since anything
was played, every one written by somebody who already knew the document.

1. The climactic roll has three outcomes and the document describes two.
   opposedContestFor returns taken, resisted outright, and unsettled. The
   taken and unsettled figures are printed and both reproduce exactly, so the
   source has always been right. Resisted outright appears nowhere — 48.1%
   against the default target, 74.3% against an Ashcroft who refused, which
   v0.17 established is what most tables have. It is the single most likely
   result of the scenario's climax. Worse than an omission: the paragraph
   below is headed WHEN STEP 5 COMES TO NOTHING, is entirely about unsettled,
   and carries the beat's only read-aloud — so a GM whose agent simply won
   finds text written for a different outcome. Enumerated over all 10,000
   roll pairs; no seed.
2. EXPOSURE's "five things" are six and run 1, 2, 3, 4, 6, 5. Introduced in
   my own v0.16 (aa3ae24) and survived two versions, five guard additions and
   a peer's sweep. The insertion anchored on the end of item 4's block, which
   sits before item 5 in the file; asserting a unique match protects against
   editing the wrong text and not at all against inserting in the wrong
   place. No guard can see this and none should be built for it — seven
   passes of dice found nothing here because dice never read a heading.
3. EXPOSURE is 3,176 words, 18% of the document, 2.5x the act it sits inside,
   in a scenario whose thesis is that the fight is not the point. Recorded as
   a judgement, not a defect: nothing in it is padding and I wrote the largest
   block of it. But it is sixteen minutes about the encounter the document
   exists to prevent.
4. An open question the fixes already answered — Xenology has not been on the
   critical path since v0.14 un-gated the tell, and pass 6 ran the act with it
   and the Psychology both failed.
5. check-outcomes measured 85% of sessions hitting an unwritten special; the
   next honest session hit one, on Act Four's Psychology. One session is not a
   rate, but the number describes something real.

Working: v0.17's Swinburne special fired and is right. No broken cross-
references; every counted claim but EXPOSURE's checks out. Swap failed a
third time running and Ashcroft refused a third time — both what the numbers
predict, recorded so the next pass reads no streak into them.

Five fixes listed, unapplied. npm run check: 19 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:58:32 +01:00
slaguru666andClaude Opus 5 3a31e0c9b0 R-292: share where a tag starts, not what it says
c0 asked whether tagsIn should return indices so beatLikeIn could take spans from
it. No -- that widens this file's signature to serve another, and R-291 already
fails when the two disagree. But detection is not prevention, and there is a third
thing to share.

The two patterns differ in their bodies for good reasons: tagsIn captures the whole
tag for skillsIn to split, outcome-coverage stops at the em-dash because the
outcome follows. What was copied into both files, and what drifted, is the opening
-- the literal \[CUS:, widened by R-290 here and left behind there. TAG_OPEN is now
exported as a string with tagRe(body) composing a fresh matcher onto it; fresh
because a shared /g regex carries lastIndex between callers.

22 tags before and after, c0's body composed onto TAG_OPEN gives the same 22 its
own pattern does, 19 guards green.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:55:02 +01:00
slaguru666andClaude Opus 5 8a051f7f2b R-291 follow-up: one tag pattern, so the two readers cannot disagree
R-291 measured check-scenarios' tagsIn against this file's readers and found
them apart on three spellings. tagsIn was widened for case and spacing around
the colon; outcome-coverage's strict half still carried the case-sensitive
literal, so `[cus: Spot — x]` was READ by one guard and reported unparseable
by the other. The build failed, which is the safe direction, but it failed
saying the tag could not be read while another guard had just read it.

beatsIn and beatLikeIn now share one TAG pattern, widened to agree with
tagsIn. Measured across seven spellings: the five both strict readers accept
now agree in all three, and `[CUS Spot]` and `[CUS= Spot]` are still refused
by both and still named by the loose counter, so the canary keeps its teeth.

Verified on the real document that this is a spelling fix and nothing else —
beats 21, quoted 1, unparsed 0, stated 18/6/6, session figures unchanged, so
the baseline is untouched. A lowercase tag planted in the acts is now read by
check-outcomes, check-scenarios and check-rollable alike; the file was
restored byte-identical after the test. R-291's own assertion still passes.

Found by the peer session measuring my file rather than trusting it, which is
the fourth reader this session to be caught describing or reading its own
format wrongly.

npm run check: 19 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:52:11 +01:00
slaguru666andClaude Opus 5 ed851b76e3 R-291: assert that a tag one reader accepts stays visible to the other
c0 asked whether R-290's widening of tagsIn reaches past outcome-coverage's loose
counter, which would zero its unparsed count for the wrong reason and retire a
canary. It does not -- 22 beats from each reader on CLEAN_GROUND.md, nothing that
tagsIn accepts invisible to the other guard -- but "does not today" decays quietly,
so it is now a test importing both real functions rather than a copy of either
pattern. Mutation-checked: widening tagsIn to accept [CUS Spot] turns it red.

Measuring it found something the question did not ask about, recorded in the log:
for [cus: ...], [CUS : ...] and [ CUS: ...] the two guards disagree -- tagsIn reads
the tag, beatLikeIn calls it unparseable -- because beatsIn's strict half kept the
case-sensitive literal. The build stops, which is the safe direction, but names the
wrong thing. outcome-coverage.mjs is c0's file and the call is theirs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:50:05 +01:00
slaguru666andClaude Opus 5 ae8179bd9b R-290: the same spelling gap in tagsIn and the POWER marker
Swept every reader that parses a human-written marker. Two more had R-289's
fail-open.

tagsIn matched a literal [CUS:, so [cus: Spot], [Cus: Spot], [CUS : Spot] and
[ CUS: Spot] all read as nothing -- and it is the corpus reader behind
check-scenarios' skill validation and check-rollable's reachability, so a beat
spelled any of those four ways was checked by neither while both printed OK. The
corpus contains no such tag today; the 88-to-89 roll count during this work was c0
writing v0.18, verified against HEAD's reader on the same tree.

The POWER: marker had it with nothing covering it. bestiary.mjs and check-powers'
own scan both used the literal, so a creature added with "Power:" generates no
entry line and is never reported unclassified -- check-powers passes green on it,
measured on a clone with its dodge skills stripped so the dodger-count assertion
could not fire instead. Reader now takes POWER\s*: and stays uppercase, because
power: occurs in ordinary prose; an asymmetric counter names the rest, and was
measured against content.mjs first (41 strict, zero loose outside them).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:47:35 +01:00
slaguru666andClaude Opus 5 9c2ce9d905 R-290: check-outcomes — a beat that names a roll must say what it does
Desk pass 7's finding, turned into the nineteenth guard. check-rollable asks
whether a skill is reachable at 25% by the declared cast; pass 5 found that
is rollability, not competence; pass 7 found it is also not coverage. A beat
could be reachable, well-rated and silent about every band but the one the GM
improvises, and the whole suite stayed green.

tools/outcome-coverage.mjs measures. Beats are located structurally — the
bullet that owns the tag and its children, ending at the next bullet of the
same or shallower indent or the next heading, because R-287 is what an
unbounded scope does. Band widths are counted by grading all 100 results
through gradeRoll, never by arithmetic on fumbleStart, which is off by one
and was written wrongly twice this session before being caught. Ratings come
from the declared cast via R-286's reader, best-in-cast per skill, because
that is the die a table actually rolls.

tools/check-outcomes.mjs holds it, in two kinds:

  RATCHET — stated failure/fumble/special counts may improve and may not
  regress; unwritten-band exposure may fall and may not rise. --update
  re-records these, because freezing them would make every improvement fail.

  HARD CLAIMS — read from what is measured NOW, never from the baseline, so
  --update cannot silence them: a floor of 18 beats (check-cited once passed
  with zero citations), no beat bare of every band, every scope structurally
  bounded and none over 5% of the file, no unparseable tag, no beat naming a
  skill the cast has no rating for.

Verified by breaking it: a stripped beat, a broken tag regex, an unparseable
tag and a removed failure case each turn it red; the file and baseline were
restored byte-identical after each; and --update with a bare beat present
re-records the baseline and still fails.

Two bare beats found and filled while building it — the six at the back, and
the Insight that is deliberately indistinguishable on a success and a miss,
which now says so rather than saying nothing. Coverage 16/21 failure, 5
fumble, 4 special at the start; 18/21, 6 and 6 now.

The three figures are cited against the artifact rather than typed, which was
the peer session's condition and the right one: pass 7 hand-counted 22 beats
where there are 21 (Act Three's warning QUOTES a beat, and a hand count reads
the quotation as one — R-286 in the other direction), and its other three
counts were stale within one commit.

Its first catch was its author: the STATUS line announcing this guard
contained a beat-shaped tag and was counted as a beat. The reader was not
changed — prose shaped like a beat is what this file is for — and the error
message now names the fenced block as the place to write an example. Minutes
later check-cited refused a citation-shaped comment in the post-pass about
citations. Three readers, three authors describing their own format inside
it, each caught by a guard built for a different pass.

CLEAN GROUND v0.18. npm run check: 19 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:47:25 +01:00
slaguru666andClaude Opus 5 2cf9721fa3 R-289: test the cast reader on strings, and fix the spelling that found
Both earlier cast defects were shown by editing CLEAN_GROUND.md in the shared tree,
which is how this session came within a git checkout of c0's uncommitted work and
is also the weaker test. Seven cases now live in check-behaviour as strings.

Writing them found a live one: "<!-- cast : ... -->", one space before the colon,
matched nothing -- not an empty declaration R-288 would refuse but no declaration
at all, so check-rollable widened to the whole duty roster and printed its usual OK
line. check-cited's three spellings again. The reader now takes cast\s*:.

castLikeIn adds the asymmetric half: anything comment-shaped containing cast\w* the
reader did not consume is named by check-rollable, so a spelling nobody anticipated
fails the build instead of silently declaring nobody. Looser than the reader on
purpose -- a false alarm costs a reword, the opposite error costs a guard that
checks the wrong six people and says OK.

Tests then mutation-checked for being load-bearing, each mutation asserted to have
applied after a first pass where three silently did not.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:41:19 +01:00
slaguru666andClaude Opus 5 e3d222cacf R-288: an empty cast declaration is fatal; a missing one still falls back
c0's point on R-286: the reader is unambiguous now, but the roster fallback that
made the failure look like success is still reachable. Narrowly closed -- sixteen
of the seventeen scenarios declare no cast and are rightly checked against the
whole roster, so only a marker that is PRESENT and names nobody is refused, with
its line named. Replacing the declaration with <!-- cast: --> passes before this
change and fails after it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:31:41 +01:00
slaguru666andClaude Opus 5 f3caaab04d R-287: assert the scope anchors in check-behaviour, and end them structurally
indexOf returns -1 for a name that is gone and slice(0, -1) is everything but one
character, so a scope anchored on a moved name does not shrink or fail -- it
becomes the file. Renaming the end anchor took one test's body from 3,184
characters to 30,825 with the assertion still passing. The other site windowed
burstAttack at 4,000 characters over a function that runs 4,305.

bodyOf asserts the anchor and ends at the next top-level function. A missing anchor
now says which anchor and what would have happened, where the old code reported
"burstAttack still calls rollWeaponDamage" -- a claim about a call when the truth
was a claim about a name.

Also records the rest of the sweep, including the guards deliberately left alone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:30:36 +01:00
slaguru666andClaude Opus 5 0453255ecc R-286: one cast declaration, and a mention of one is not a declaration
CLEAN_GROUND.md contains two things matching <!-- cast: ... -->: the real
declaration, and the warning ten lines below it that quotes the marker inside
backticks and matches with an empty capture. check-rollable and declared-cast both
took .match(), first hit wins, so the arrangement has been correct only because the
declaration comes first.

Move that warning above the list and check-rollable reads a cast of nobody, falls
back to ROSTER_BEST, and prints the same OK line having held every skill in the
document to the full duty roster instead of the declared six. Instrumented and read
off: "the duty roster" against "its declared cast of 6".

castMarkersIn blanks code spans and fenced blocks before scanning (padded, so line
numbers still point at the source) and refuses more than one surviving marker,
naming every line. check-rollable imports it instead of carrying a second regex, so
the guard that checks the cast and the guards that measure the fight cannot
disagree about who is in it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:30:36 +01:00
slaguru666andClaude Opus 5 ecbad45fc6 CLEAN GROUND v0.17 — the good rolls now buy something
Applies desk pass 7's five fixes. The pass found the document covering two
bands out of five: seventeen failure cases written, four fumbles, three
specials — against 90.8% of sessions containing a special or critical on a
beat that says nothing, and 36.0% containing an unwritten fumble.

1. Specials written where they matter, starting with the two pass 7 rolled.
   A critical Persuade on Swinburne now buys her coming to the stump AND
   talking on the way — the dog went for something on the seam side in June
   and came back wrong, four months earlier than the case otherwise offers
   it. Previously a 1 bought what a plain success buys, which is worse than
   the fumble, and the fumble buys a dog. A special Xenology, a special
   Medicine (how long ago it stopped — the almanac's gap before the almanac)
   and a special Spot (the third set circles and goes back toward the seam)
   likewise. GM ESSENTIALS now states the shape the existing three share:
   portable, private or early, never more conversation.
2. The Act Three swap beat points at EXPOSURE. v0.16 named that beat as the
   trigger for the fight it measured and left the beat silent, with
   "survivable" as the last word before the decision — which is about the
   swap, not about what follows.
3. Every fumble branch prints its band. Three of four did not, and the one
   that did was the one written in v0.16.
4. The fumbled Medicine and fumbled Spot are written. Pass 7 hit both cold
   and lost ten minutes, because four beautifully specific fumble branches
   make their absence elsewhere read as an oversight rather than a licence.
5. Act Four says which branch its headline figures are for. Ashcroft refuses
   about five times in eight — passes 6 and 7 both did — and the 48.7%/14.5%
   pair is printed far more prominently than the 21.9%/3.8% one most tables
   will be in.

Every band printed was re-derived from resolveBands/gradeRoll by enumeration
rather than arithmetic, which is where the off-by-one lives.

Pass 7's finding 3 overstated itself and is corrected in the same commit: the
Close's fumble branch does name a skill, inheriting the Anomaly Lore tag from
the bullet above it. Post-pass appended.

npm run check: 18 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:30:04 +01:00
slaguru666andClaude Opus 5 4ae4e13196 Desk playtest 7: an honest session, and the three bands nobody wrote
Full session, six players, seed 7742, nothing forced. Pass 6 forced its
triggers on purpose; this one takes what the dice give, because a forced pass
proves a branch works and cannot say how often a GM meets one.

It reached neither thing pass 6 asked for — no fight, and Ashcroft refused
THE OFFER again. What it found is what both of those are instances of.

1. The document covers two bands out of five. Seventeen failure cases are
   written across the acts, which is the house rule honoured properly. Four
   beats state a fumble. Three state a special or a critical. Enumerated
   through gradeRoll against the cast's best rating for each of the 22
   rollable beats: 42.1% of sessions contain a fumble and 36.0% contain one
   with no written case; 93.9% contain a special or better and 90.8%
   contain one on a beat that says nothing. Specials are not rare — 13% at
   63, 11% at 53 — and the scenario asks for 22 rolls. This seed landed on
   four uncovered bands in thirteen rolls, three of them GOOD rolls: a
   critical Persuade on Swinburne that buys less than the fumble does, and
   a special Xenology with nothing above the success.
2. v0.16 wrote the trigger into EXPOSURE and never wrote EXPOSURE into the
   trigger. The Act Three swap beat is named in the new mixed-fight block as
   the moment that starts the fight, and it carries no pointer back; its last
   word before the decision is "survivable". Act Two has done this correctly
   for versions. Five locations across 1,100 lines to adjudicate one beat.
3. Three of the four fumble branches do not print their band, and the one
   that does is the one written in v0.16 — the fix landed where it was being
   thought about, not where the same need already existed. The Close's is
   worse: "on a fumble asking the question" names no skill at all.

The v0.16 fumble clause earned itself immediately: 99 against Medicine 53 is
a fumble, and v0.15's wording read it as a plain failure.

Timing: ~3:35 against 3:40 at six players with no cuts taken. First honest
pass to land inside the clock unaided.

Two fumbles in thirteen rolls is a 4.4% event and is recorded as an
illustration, not a rate. Five fixes listed, unapplied. npm run check: 18
guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:25:03 +01:00
slaguru666andClaude Opus 5 67e76639f3 R-285: scope the defence-stacking rules to the section that owns them
R-284 scoped the factored-rating rule to the creature's entry and left the
defence-stacking rules matching anywhere on the page, so the exemption sentence
and the "Across N creatures that spend defences" count were accepted wherever they
happened to sit. Moving the exemption line out of its section into the redcap's
statblock -- the page silent exactly where a GM reads the stripping advice --
passes at R-284 and fails here; confirmed by running HEAD's copy against the same
tree.

The owning slice is not always the creature's entry. A factored rating belongs to
the creature; the ladder exemption is an answer to the paragraph it sits in and is
generated into "## Shooting at something that moves", so scoping that rule to
"### Redcap" would have failed a correct page. sliceOf now takes a heading at any
level and each rule names the slice that owns its claim.

A renamed section fails by name rather than scoping to nothing, which is the shape
of every guard that passes because it found nothing to check.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:22:04 +01:00
slaguru666andClaude Opus 5 aa3ae24ef2 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>
2026-09-13 15:16:17 +01:00
slaguru666andClaude Opus 5 1a2ca44c52 R-284: report a wrong figure as a wrong figure, and read the right entry
R-283 left the intact-sentence-wrong-number case falling through to omission, so
the guard said BESTIARY "does not state" a rating the page was stating. reads()
now has a shape tier between strict and loose: the strict pattern with its value
slot loosened, reporting which of the two numbers moved.

Scoped the per-creature rules while adding it. They read the whole page, and each
is the only rule of its kind today, so a page-wide match found the right line by
luck; a second attackFactor creature would have let the courier's rule match that
creature's sentence and report the courier correct. They now read the creature's
own "### Name" entry -- proved by deleting the courier's line and planting an
identical one under the redcap: still omission, where before it would have passed.

Five discriminations plus the decoy, proved in a worktree with the message read.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:15:24 +01:00
slaguru666andClaude Opus 5 327d060eb1 R-283: tell a reworded bestiary sentence apart from a missing one
R-282 matched the page with String.includes, so rewording the exemption sentence
reported "BESTIARY never says it is off the stripping ladder" -- sending a
maintainer after a sentence that is sitting right there, and never naming the
real problem, which is a pattern that has silently stopped reading.

Each textual rule now reads twice. Strict is the sentence as it stands and is
tighter than before (the bold and the full stop, not the bare clause a substring
accepted); loose is the same claim in any wording. Strict passes, loose-only is
reported as a reword with the line quoted and the page presumed right, neither is
the omission.

The loose anchor was wrong on its first pass in the way that matters: "a sentence
with 40% and 80%" also matched the courier's own statblock line, so deleting the
sentence reported a reword and quoted the statblock back. It now excludes that
generated marker, which makes it a test of the claim and not of the digits, and
degrades to omission rather than to a false reword.

Four discriminations proved in a worktree with the message read in each.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:12:33 +01:00
slaguru666andClaude Opus 5 e70d25271f Desk playtest 6: the four branches five passes never reached
A branch pass, not a session pass. Seed 3319. For each untested branch the
roller draws from the stream until the roll lands in the target band; every
roll downstream of it is taken as it falls, and the draw counts are printed.

All four branches work as written. The Swinburne fumble is better than the
drawer, the re-cut peg costs the twenty minutes the text promises, and a
failed Xenology no longer strands Act Four — the v0.14 un-gated tell carried
the act with BOTH gated lines failed, which is the strongest result here.

What the pass actually found is outside the branches:

1. The fight the table produces is not the fight the document measures. The
   six at the back stand inside forty-one refugees. Six hollow men alone wipe
   0.0%; with two of the column joining, 7.8%; with three, 28.7%. Stable
   across four seeds. EXPOSURE measures the two forces separately and never
   says what the column does when somebody fires into it.
2. At four players six hollow men wipe 58.7%, and the only hollow-man figure
   in the document is the six-player 0.0%. EXPOSURE's four-player block —
   which exists to say the cut is a different game — has no hollow-man row.
   The curve from three to six is 0.3% to 58.7%.
3. The Act Three warning names the wrong roll. Its twenty-minute bomb hangs
   off "Anomaly Lore — what a peg is"; the depot entry is a Research roll.
   Pass 4 inherited the same confusion and nobody noticed, because the text
   it was checked against carried the error.
4. GM ESSENTIALS understates every fumble band. "00 always fumbles" reads as
   1%; fumbleStart is 101 - ceil((101-band)/20), tested first, so Spot 40
   fumbles on 97-00. Four times what the summary implies, in a scenario that
   rolls Spot 40 through two acts.
5. EXPOSURE prices fights in bodies and never in minutes. Median 13 rounds
   printed, 24 mixed, 30 at four players.

Also: simulate.mjs labels a mixed force with the first spec's name and the
total count, so 6 hollow men + 6 column prints as "12 x Hollow man". The
composition is right and the header is not; every figure above came out of a
run whose header lied about what was fought.

First run in six passes where Ashcroft refused THE OFFER, and the first where
a player character was taken.

Seven fixes listed, unapplied. npm run check: 18 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:09:48 +01:00
slaguru666andClaude Opus 5 1a80d3637c R-282: guard the bestiary against the powers, including the next one
check-bestiary proves the page matches its generator, and the generator had never
heard of powers.mjs -- so the redcap sat in "the ones that take the most
stripping" under eighteen green guards while its own entry said it never spends a
defence. Two files agreeing with each other while both disagree with the engine
is a quorum, not a check.

check-powers now asserts per effect kind what the page must say: defenceStacking
requires the creature off the stripping list, named as exempt, and the "across N
creatures that spend defences" count reconciled against powers.mjs; attackFactor
requires the rating the simulator actually uses printed as a number, which the
courier's entry now carries.

The clause that matters is the failure on an unknown effect kind -- a wired effect
with no DOCUMENT_RULE fails the build, so the next one cannot arrive without
somebody deciding what the document owes it. Without that this would guard the
mistake already made and nothing else.

Proved three ways in a worktree, exit codes read directly.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 15:01:04 +01:00
slaguru666andClaude Opus 5 8705b00631 CLEAN GROUND v0.15 — the four-player cut, fixed
Applies desk pass 5's five fixes and corrects a claim the pass itself
overstated.

1. The cut cannot see. Pollard's Spot 53 is the best in the declared cast
   (others 40/40/40/35/35) and he is the first agent the scaling notes
   drop. At five players and fewer his clues — the stump, the six at the
   back, the lorry — are given, not rolled for. check-rollable cannot warn
   about this: it tests the 25% floor, not competence.
2. The split table now has a four-player column. Four of its five rows
   named Pollard or Okonkwo, or said "all six".
3. The Pacing Note says the cuts are sized for six. At four, keep the
   northern seam; pass 5 ran 3:15 with every cut taken.
4. The line rests twenty minutes at four players — Ashcroft is aside for
   THE OFFER, so three agents are talking, not five.
5. Act Four records that THE OFFER nearly quadruples the unsettled rate:
   14.5% if Ashcroft accepted against 3.8% if he refused. Accepting makes
   him both the likeliest person to be taken and the likeliest reason the
   beat resolves into nothing.

Verified against roster.mjs rather than recalled, which caught pass 5's own
error: Spot 53 is the best in the CAST, not the roster — four agents carry
58. Post-pass appended. The check also found that Agyeman's 58 makes the
substitution the scaling notes already name the single best answer to the
cut, which is now written in.

npm run check: 18 guards pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:58:14 +01:00
slaguru666andClaude Opus 5 81ff44e70e The bestiary was still describing the fight R-275 changed
Two things in the generated document had gone stale the moment powers reached the
simulator, and eighteen guards were green over both because nothing connects
powers.mjs to bestiary.mjs.

The dodge-ladder section listed Redcap among "the ones that take the most
stripping" and counted it in "across 47 creatures", when NOT TIRED means it never
spends a defence at all -- the exact opposite of what its own entry says three
pages down. It is off the ladder now, the count reads 46 that spend defences, and
the page names it: stripping is not a plan against it, killing it is.

And the paragraph listing what the harness does and does not model never mentioned
that it fights 39 of the 41 creatures with a power without it. It now says so, and
counts from powers.mjs rather than stating it, including the 14 that are fight
rules it cannot express -- so every figure for one of those is the creature with
its best trick taken away.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:55:36 +01:00
slaguru666andClaude Opus 5 97f5cbbcae Desk playtest 5: the four-player cut, played for the first time
Seed 8815, four players — Ashcroft, Bhattacharya, Renshaw, Braithwaite. Every
rating pulled from roster.mjs before rolling, which is the direct consequence
of pass 4 having typed six of sixteen from memory.

The cut is the most measured thing in this project and had never been played.
EXPOSURE prices its fights, check-firstblood holds its swing, check-attackers
holds what each of the four contributes -- and no pass in four had run a
session with Pollard and Okonkwo off the table.

THE RESULT IS NOT ABOUT COMBAT. The fights were never the problem. What breaks
is the party's eyes: POLLARD'S SPOT 53 IS THE HIGHEST IN THE ENTIRE ROSTER AND
HE IS THE FIRST PERSON THE SCALING NOTES DROP. At five players the party's eyes
go from 53 to 40; at four they stay at 40 with a 35 alongside. This run missed
the stump (79 vs 40) and the six at the back (67 vs 35), both Pollard's lane in
the six-player game, both clues the scenario leans on.

check-rollable cannot see this, and the reason is worth keeping: it asks
whether every named skill is reachable at 25% or better, and Spot 40 clears 25
comfortably. It is a rollability check, not a competence check, and the cut is
where the difference bites. The scaling note's only stated cost of dropping
Pollard is that "the cordon loses its shield", which is about a fight, in a
scenario whose first two acts are almost entirely looking at things.

Second finding: FOUR OF THE FIVE PARTY-SPLIT ROWS NAME PEOPLE WHO ARE NOT
THERE. The table is introduced as the fallback for a table that will not choose
its own splits -- and at four players the fallback does not exist, which is
exactly when it is most needed.

Timing runs the other way from pass 4: ~3:15, twenty-five minutes SHORT, because
four people ask fewer questions. Nothing in the Pacing Note says the cuts are
player-count dependent, so a GM following it at a small table finishes early.

The unsettled countdown fired for a second pass running. Recorded with the
caveat that both passes had Ashcroft accept THE OFFER, so both used the
Difficult branch -- 14.5% unsettled against 3.8% if he refuses. Not two draws
from the same distribution, and the document prints only one of those figures.

Five fixes listed, none applied. Also listed: what five passes have still never
tested -- the Swinburne fumble, the re-cut-the-peg fumble, a failed Xenology,
and any fight at all.

npm run check: 17 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:41:39 +01:00
slaguru666andClaude Opus 5 303472f0ab The bestiary said "in doubt" and the rule no longer means that
R-280 widened admission from a [15,85] band to "the spread rate stands clear of
both ends by more than its own noise", which admits fights that are nearly
settled -- the_choir at 99.3%, the_stanchion at 6% -- as long as their noise is
smaller still. The page went on saying "whose outcome was ever in doubt", which
was a fair description of the band and is a loose one of the rule.

It now says "whose odds leave room for a difference to show", and the provenance
line prints the admission rule itself, read from the artifact rather than
paraphrased, so the page cannot drift from the guard again. The rule is phrased
as a clause in check-focus for that reason.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:41:14 +01:00
slaguru666 ae06df8e04 Correct desk pass 4: six of sixteen ratings were typed from memory
Found while setting up pass 5 by pulling the sheets from roster.mjs instead of
recalling them. The d100s are unchanged; only what they were compared against
was wrong, and three outcomes flip:

  Pollard  Spot, the stump        58 -> 53   success becomes fail
  Bhattacharya Anomaly Lore       58 -> 63   FUMBLE becomes plain failure
  Braithwaite Xenology (Baseline) 45 -> 53   fail becomes success

So three things pass 4 reported did not happen. The re-cut-the-peg fumble never
fired -- 98 against 63 is a plain failure, 96-99 never succeed -- which means
the ten-minute chase and the whole of finding 2 rest on a roll the seed did not
produce. Braithwaite's Xenology succeeded, so the scenario's one
single-point-of-failure remains untested after five passes rather than having
'finally come up in play'. And Pollard missed the stump.

Read correctly, the same seed lands near 3:34 -- six minutes UNDER budget
rather than six over.

Findings 1, 3 and 5 are untouched: the special was a real 7, the Swinburne
fumble a real 00, and THE OFFER's staging is not a dice question. Finding 2's
conclusion also survives because it never depended on the roll -- Act Three is
budgeted at 50, the text predicts the fumble costs 20, and nothing connected
that to the cut. The reasoning was right and the evidence was invented, and the
scenario now says so instead of citing a playtest that did not happen.

The Pacing Note's slack claim is withdrawn rather than replaced. One seed read
two ways gave 3:46 and 3:34, and the gap between them is about the size of the
margin being argued over. It now tells a GM the shape -- every scene has
something that ends it, the cuts are real, Act Three is the likeliest overrun --
rather than a number a desk pass cannot produce.

npm run check: 17 guards, exit 0.
2026-09-13 14:39:12 +01:00
slaguru666andClaude Opus 5 fa484071cd R-281: a ratchet, because "helps in all of them" survives the advice decaying
R-280 left the claim satisfiable by a gain of 0.2. The artifact now records how
many measurable packs clear their own noise -- reliable: {aboveNoise: 36, of: 38}
-- and the check refuses if that share falls. It may rise freely.

A ratchet rather than a threshold: any threshold here would be a number I chose,
and choosing one just under the current value is what produced MEASURABLE =
[15,85]. A share rather than a count, so widening admission cannot pay it off.

Proved three ways in worktrees: making focus fire actively bad fires the drift
check first, which is correct; making it unreliable and re-recording fires the
older claim at 37 of 38; and claiming a better past, 38 of 38, is refused by the
ratchet itself. The ratchet bites exactly where the old claim does not -- between
"still helps everywhere" and "helps as reliably as it did", which is where a slow
degradation lives.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:34:10 +01:00
slaguru666andClaude Opus 5 c127184763 CLEAN GROUND v0.14: pass 4's fixes, and one finding corrected in the applying
Five fixes from desk playtest 4. One of them was wrong and the correction is
the more useful half.

1. A SPECIAL ON THE COLUMN PERSUADE NOW BUYS SOMETHING PORTABLE. It bought
   more conversation, which the line's rest clock then took away -- a player
   in pass 4 said "I rolled a 7 and got less time", which is a good roll
   punished by a timing device. It now buys the almanac early, or a name from
   1962, or "the six at the back don't eat". Each travels out of the scene, so
   the line still stands up on schedule and the roll still paid.

2. ACT THREE'S TWENTY-MINUTE BOMB IS NOW BUDGETED -- and this is the finding
   that was wrong. The pass said the re-cut-the-peg fumble had "no duration and
   no ender". It has both, and always did: the text says a table will spend
   twenty minutes on it and to let them try it exactly once. What was missing
   is that ACT THREE IS BUDGETED AT 50 AND THE TEXT PREDICTS 50 + 20, with
   nothing connecting the fumble to the cut that pays for it. Act Three now
   opens with that warning and makes the northern-seam cut compulsory the
   moment the fumble lands. The clause itself is untouched; it was already
   right.

3. A FUMBLED PERSUADE ON SWINBURNE HAS AN ANSWER. She does not produce the
   photocopy -- she produces the dog, walks them to the stump in silence, and
   H01 reaches them later from the coroner, confirming rather than revealing.
   Better staging than the drawer, and the GM should not regret the fumble.

4. THE SLACK CLAIM IS HONEST NOW. The Pacing Note said ten minutes. Pass 4 on
   a hostile seed finished at ~3:46 with one cut unspent: four minutes and a
   cut. Ten is the friendly-seed number and is what a GM would have planned
   against.

5. THE OFFER'S STAGING ACCIDENT IS NOW DELIBERATE. Moving it inside the column
   scene was purely a time saving; the side-effect is that the offer has no
   audience and Ashcroft returns to a conversation that carried on without him.
   Written down so nobody moves it back.

The correction to 2 is recorded in the playtest document as its own lesson: a
reading made while looking for faults finds faults that are not there about as
readily as ones that are. Apply fixes against the source, not against the notes.

npm run check: 17 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:31:20 +01:00
slaguru666andClaude Opus 5 3d83fbde93 R-280: the band replaced by the test it was standing in for
MEASURABLE = [15,85] proxied for "can this fight move at all". The direct form,
in the units the guard already uses: the spread rate must stand clear of both
ends by more than its own noise. Deliberately blind to the gain -- admitting the
sizes where focus fire clears its noise would make the guard's claim true by
construction. Size is still picked on nearest-an-even-fight.

31 measurable became 38. the_arrears returns at 6.3, and switchboard arrives at
8.1 -- the second largest gain in the artifact, thrown away for being one point
past a round number. Four of the eight carry effects larger than most rows the
band already admitted.

Two of them do not clear their own noise: the_choir has 0.7 points of headroom
and used 0.2, the_stanchion has six and used 0.2. Above-noise falls 31/31 to
36/38 and the bestiary prints 36. That is two measurements reporting no
detectable effect, which the band suppressed by refusing to take them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:27:13 +01:00
slaguru666andClaude Opus 5 23262855b4 Desk playtest 4: the clock, against v0.13's recut timings
Seed 6142, banding from rules.mjs rather than estimated, every roll logged.
Run because desk pass 1's 4:25 describes a scenario that no longer exists --
Act Two was 65 minutes when that pass ran and is now 45.

VERDICT: the clock holds, and for the reason it was built to. Every beat in
Act Two ended on something written into the text rather than on GM judgement,
which is what the recut was for and what the 65-minute version never had. The
run landed at ~3:46 against 3:40, with two of three Pacing Note cuts taken and
the third still in hand -- the first time this scenario has finished a pass
with a cut unspent.

A hostile seed, deliberately not re-rolled: two fumbles, eight failures, and
the party's one reliable Act Four test missing. A clock only tested under lucky
rolls is not tested, because failure is what generates table time.

THREE THINGS THE DICE FOUND, none of them about minutes:

- A SPECIAL FIGHTS THE REST CLOCK. Renshaw rolled 7 against 63 and the column
  opened up at exactly the moment the scene wanted to end. A GM who has just
  rewarded a good roll will not then stand the line up. The roleplay-first
  archetype's verdict was "I rolled a 7 and got less time", which is the only
  sour note in the session and a real design fault.

- THE RE-CUT-THE-PEG FUMBLE HAS NO DURATION. The clause is one of the best
  things in the document and the text itself says a table will chase it. It
  added ten minutes with no guidance about what ends it.

- A FUMBLED PERSUADE ON SWINBURNE HAS NO ANSWER. H01's failure case is written
  for a party who did not ask, not one that asked badly. Predates v0.13, and
  the third pass running to find the failure cases written for absence rather
  than for bad rolls.

WHAT WORKED, WRITTEN BLIND: the unsettled countdown outcome added in v0.12 was
asked for on its first ever roll -- the understudy fumbled 100 against
Ashcroft's failure on the Difficult branch, so the contest came back unsettled.
That is the 14.5% case, it is the aggressor-fumble the rule's author left for
this document to price, and the price is right. No fix needed.

Also confirmed: THE OFFER running inside the column scene costs zero wall
clock, and has a side-effect worth keeping on purpose -- the aside has no
audience, so Ashcroft returns to a conversation that moved on without him.

Five fixes listed, none applied. npm run check: 17 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:23:59 +01:00
slaguru666andClaude Opus 5 a7e4dd7754 R-279: what the_arrears was claiming, and why dropping it is the wrong kind of right
It claimed focus fire is worth 6.3 points against two of them, 14.7% to 21%.
Measured independently at 4000 runs x 3 seeds: 14.2% to 20.4%, gain 6.2, which is
2.4x its own noise and 44% of the base. The claim was true and reproduces.

What failed is a threshold. MEASURABLE is [15,85] and the scan's estimate of a
boundary value moved 14.7 to 14.4. And the creature is a step -- 85.7% at one,
14.2% at two, 0.4% at three -- so no pack size gives an even fight and the band's
endpoints fall in the gap. The band records nothing about a creature whose
defining property is having no middle.

Not moving the band to 14: fitting a threshold to the datum it excludes is how a
guard stops being a test. But the band is a proxy for "can this fight move", and
the direct test -- does the gain clear its own noise -- is already in the
artifact and answers yes. Replacing the proxy is a decision about all 47, not a
fix, and not mine to take unasked.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:21:31 +01:00
slaguru666andClaude Opus 5 a7eca91a9c R-278: raising SCAN_RUNS found that SCAN_RUNS had never been read
Asked to raise the scan until the redcap's pack size stopped flipping. Measured
the threshold -- unstable at 3000 and 4000, stable across twenty seeds at 6000 --
raised it, and the re-record took fifteen seconds, which was impossible.

winRate takes three parameters and pickSize passed SCAN_RUNS as a fourth.
JavaScript discards it, so every scan has always run at RUNS and SCAN_RUNS has
never been read by anything. The fix I was asked to make was inert in the same
way as the thing it was fixing.

winRate takes runs now. The redcap is still n=3 with gain 6.3, arrived at stably
rather than luckily; the_arrears drops out of the measurable band at an honest
scan, 31 packs to 30; the_committee moves 2 to 6 and stays pinned. Claim check
still passes, bestiary regenerated.

The only signal was a number being too small. A fifteen-second re-record is good
news, and good news is what nobody investigates.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:18:46 +01:00
slaguru666andClaude Opus 5 00e5a993cc CLEAN GROUND v0.13: Act Two cut from 65 minutes to 45, and the clock now fits
The scenario ran 20 minutes over the house budget (3h30 play plus a ten-minute
break, 3h40 wall clock) and Act Two carried all of it at 65 minutes. It is now
45, and the session lands at 3:40 exactly: 45 + 45 + 50 + 45 + 25 = 210 minutes
of play.

NOTHING WAS DELETED. The twenty minutes came out of structure, which is the
only kind of cut that survives contact with a table:

- THE CROSSING IS CAPPED AT FIVE. It was "let the silence sit until a player
  breaks it", which is open-ended by construction. If the table is still quiet
  at minute five the Geiger finds its own voice. A silence that has stopped
  being tense is just a pause.

- THE OFFER RUNS INSIDE THE COLUMN SCENE, not beside it. It was "somewhere in
  this act, take Ashcroft's player aside for one minute" -- a separate slot.
  Run during the line's rest, while the other players are talking to Ivy, it
  costs nothing, because the table is already occupied.

- THE LINE'S REST IS THE ACT'S CLOCK, and this is the cut that does the work.
  The column walks every day and stops to rest, not to meet people. Ivy talks
  for as long as the line is sitting down, and the line sits for twenty-five
  minutes; then the old ones stand up, because they always do. The scene ends
  on the GM's schedule through the scenario's own premise rather than through
  a GM deciding to move things along -- and it is the loop showing itself for
  the first time, which makes the timer do dramatic work as well as temporal.

The Pacing Note now carries 65 minutes of further cuts against what was a
55-minute problem, so there is about ten minutes of genuine slack for a table
that talks. That is the first slack this scenario has ever had. It also now
says where to cut if the break arrives late: Act Three's depot search, never
Act Four, which is the shortest act with the most to do.

Also fixed a stale duplicate: the Overview said "Runtime: 4h00" while STATUS
and the timing table said otherwise. Every runtime figure in the document now
agrees, and the remaining mentions of 4h00 are explicitly historical.

CAVEAT, STATED IN THE DOCUMENT: desk pass 1's 4:25 predates this restructure
and no fourth desk pass has been run against the new timings. The first human
run is also the first test of this clock.

npm run check: 17 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:17:34 +01:00
slaguru666andClaude Opus 5 38012d56ff R-277: n=3 is right for the redcap, and R-276 was wrong about why
check-focus picks the pack size nearest an even fight. For the redcap that is
n=3 at 28.0% against n=2's 73.4% -- correct, and also where focus fire is worth
most. But the margin is 1.4 points and the scan is 400 runs: run across eight
seeds it picks 3 seven times and 2 once, and the recorded gain would move 6.3 to
4.9 with it.

R-276's explanation was wrong. Its table was measured against the CLEAN GROUND
cut, which it never named. Against the frozen party a lone redcap is worth 0.4
rather than 6.1, because that party wins 98.9% and nothing shows against a
ceiling. The power is worth most where the fight is in doubt -- 3.8 at n=2, 3.1
at n=3, nothing at either end. Not outnumbered. Undecided.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:11:20 +01:00
slaguru666andClaude Opus 5 e21446b164 CLEAN GROUND: say plainly that it runs 20 minutes long
Found while revising the Contingency 2027 prep deadlines. The house standard
(docs/house-standards.md in the convention repo) allows 3h30 of play inside the
four-hour slot plus a ten-minute break -- about 3h40 wall clock against roughly
3h15 of content. This document has always budgeted 4h00, which is the whole
slot with nothing either side, and never said that was over.

Worse, the Pacing Note's ~25 minutes of cuts read as slack and are not: desk
pass 1 ran 4:25, so taking every cut lands at 4:00, still 20 minutes past the
house budget. A GM reading "4h00 including a break" alongside "the Pacing Note
carries cuts" would reasonably conclude there was room to spare. There is none.

STATUS now carries the overrun, and the two honest ways out are written down
rather than left implicit: find another 20 minutes, most likely in Act Two's
65, or declare it a deliberate exception and run it where nothing follows --
which at Contingency 2027 it does, Sunday afternoon with only a reserve behind
it. Not decided; that is Tim's call.

Until then the instruction is explicit: assume an overrun and take the cuts
from the start rather than deciding at the break.

npm run check: 17 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:09:21 +01:00
slaguru666andClaude Opus 5 7fc0da3ecf R-276 correction: check-lethality fights solo, and I read the wrong column
Asked to re-record the lethality baseline against a lone redcap, I read the tool
and found it already does: measure(party, [spec]), with a comment saying "Solo,
because a creature is the unit under test". My claim that it fights packs came
from memory of check-focus, whose redcap is n: 3.

The lethality figure was also not hiding the power. Wipe rate moved 0.7% to 0.9%
because one redcap cannot wipe four agents whatever it ignores -- that column is
at its floor. Agents down moved 0.55 to 0.74 of 4, a 35% relative increase, which
is the column I did not look at.

No baseline re-recorded: it is already solo and was re-recorded in R-275.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:08:04 +01:00
slaguru666andClaude Opus 5 8fa691c4aa R-276: NOT TIRED is visible in play, and worth nothing where we measure it
Played four agents against one redcap. Two dodges in one round, both at 75 --
DEFENCE_STEP is -30, so the second would have been 45 and the roll of 70 would
have failed. The wiring fires.

Measured with and without, 2000 x 3 seeds: the power costs the party 6.1 points
against a lone redcap and 0.1 against three of them. It is a rule about being
outnumbered -- a lone defender spends four defences a round, a pack spends one
each -- which is why check-lethality moved only 0.7% to 0.9%. The baseline fights
redcaps in a pack, the configuration where the power is worth nothing, so that
figure is the floor rather than the effect.

Not presented as evidence: at seed 3 the party wins with the power on and is wiped
with it off, which is stream divergence rather than direction.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 14:02:54 +01:00
slaguru666andClaude Opus 5 dee2c8f776 CLEAN GROUND: booked — Contingency 2027, Sunday 31 January, afternoon
Slot 9. Recorded in STATUS and both open questions closed. The convention
repo (slaguru666/contingency2027) carries the booking and points back at this
file rather than copying it: seventeen guards check the scenario here, and a
copy over there would be a second version nothing checks.

That spends the Sunday afternoon re-run reserve, which was real slack. The
convention schedule note now names this game as the one that gives if prep on
the eight booked games slips — it is the newest, least tested, and the only one
whose absence costs nobody a booked seat.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 11:32:08 +01:00
slaguru666andClaude Opus 5 32ca982369 R-275: the harness had never read a creature's power
41 statblocks carry a POWER in their tactics and simulate.mjs read none of them,
so a redcap that ignores the cumulative defence penalty has been measured as a
creature that tires -- in check-lethality, in check-focus, and in every figure
published about it. The defect was not that the powers were unimplemented, it was
that nothing said they were not.

powers.mjs classifies all 41: 2 wired, 14 notSimulable with a stated reason, 25
not fight rules. check-powers refuses an unclassified POWER and refuses a
notSimulable without a reason -- and it does not test that the harness imports a
power, it fights the creature with and without and requires the two to disagree.

Moved: the courier 9.4% to 1.0% wiped (it attacks at half while carrying), the
redcap 0.7% to 0.9% (small, because these fights rarely spend a second defence).

ARGENT AND GULES was wired and then un-wired: it tripled the supporter's wipe rate
to 75.2% because the harness has no ground and applied the borough-ground condition
unconditionally. Same reason THE PULL is not wired. I had wired one and refused the
other on identical facts.

Lethality and focus re-recorded, bestiary regenerated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 11:05:11 +01:00
slaguru666andClaude Opus 5 9f3a63174f CLEAN GROUND v0.12: convention one-shot, the print pack, and the real opposed roll
Tim settled the last two questions: convention one-shot, and rules.mjs gains a
real opposed roll (landed by a peer session at R-273). Both decisions change
the document, and the one-shot unblocked the print pack.

THE PRINT PACK — docs/scenarios/CLEAN_GROUND_HANDOUTS.html, guard 17.

Four A4 sheets, self-contained, no external fonts or assets: H01 the coroner's
note on white, H02 the 1962 committee minute on cream with photocopy grain,
H03a and H03b the almanac on ruled paper. 11pt floor throughout.

The binding constraint is that H03a and H03b must print identically or the
almanac trick dies, so that is structural rather than careful: they share one
`.almanac` class and every dimension comes from a variable defined once. There
is no selector anywhere that names one page and not the other, and
check-handouts fails the build if one appears, if their markup structures
diverge, if their columns differ, if any row stops reading "41 mi", if the
counts stop being forty-one now against fifty-three then, or if the pack and
the scenario drift apart.

It earned itself immediately: its first run failed my own pack for five rules
at 10.5pt, under the house 11pt floor. Rendering was checked visually too,
which caught two things no guard would have — the "TO CLEAN GROUND" header
colliding with NOTES, and the writing crossing the red margin rule instead of
starting right of it.

THE ONE-SHOT. Countdown step 6 said "and this is a campaign", which the
decision contradicts. Rewritten, and the Close's "leave it filed" ending now
says how to land it tonight: do not end on "you'll be back", because the table
never will and a hook they cannot take reads as an unfinished scenario. Name
the next agent who gets sent, and have Registry thank them.

THE OPPOSED ROLL. The scenario-local ruling is deleted; GM ESSENTIALS points
at the game. Both beats were re-priced against the real rule by enumerating
all 10,000 roll pairs -- exact, no seeds -- and two things fell out:

  THE OFFER IS PRICED. Ashcroft refusing is taken 21.9% of the time, the
  safest file at the table. Accepting: 48.7%, past Braithwaite's 37.6%.
  Accepting does not make him a bit more vulnerable, it makes him the easiest
  person in the room, and the countdown reaches for the easiest.

  STEP 5 CAN COME TO NOTHING, 14.5% of the time against an Ashcroft who
  accepted, and that row fires once and is marked permanent. Previously a
  silent gap in a climactic beat. It is now a written outcome with read-aloud
  text: the reach fails, it wears the wrong face for a moment, the party learns
  what it is and cannot prove it, and the clock still turns to step 6.

Also: update-readme's count-word list ran out at sixteen, one guard after its
own comment warned about hardcoded lists going stale. It failed loudly rather
than silently, so it is an inconvenience and not a defect. Extended.

npm run check: 17 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:50:03 +01:00
slaguru666andClaude Opus 5 dd3d818893 R-274: the opposed roll works and the combat never reaches it
Played the hollow man against the cut. THE FILE IS YOURS NOW never fires --
simulate.mjs reads statblocks and weapons and has no concept of tactics, so
R-273 closed a gap in rules.mjs and left the same gap one layer out.

Resolved by hand it behaves: every roll pair enumerated for both beats. The
tie-break carries it -- at POWx5 100 against 60 the aggressor still only takes
them 48% of the time, because equal bands go to whoever is being acted upon.

Act Four prices THE OFFER: accepting it moves Ashcroft from the safest person in
the room to the least safe, 21.9% to 48.7%, past Braithwaite's 37.6%. And that
once-only row no-ops 14.5% of the time against him, which Act Three can absorb
and a permanent countdown beat may not.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:45:32 +01:00
slaguru666andClaude Opus 5 cdbb2e34ee R-273: the opposed roll, built where the authority lives
The content has called for 'opposed POWx5' since before the rule existed -- the
hollow man's tactics, CLEAN GROUND twice, slice-text three times -- and rules.mjs
defined none. A scenario carried a local ruling that said in its own text it was a
ruling and not a rule.

Generalises that ruling rather than inventing another: both sides roll, the better
band wins, only the ladder the game already has. Ties go to whoever is being acted
upon, which is what defenceOutcomeFor has always said; the scenario's 'favour the
agent' gave the same answer only because no agent ever initiates one. Neither side
succeeding leaves the contest unsettled rather than won, which the two beats need
in opposite directions.

Two exports at the scenario session's request: opposedOutcomeFor compares graded
levels and carries both, so a caller can price a fumbled attempt without this file
deciding what a fumble costs; opposedContestFor runs it from ratings and rolls with
per-side difficulty, so 'resists at Difficult' does not put applyDifficulty back
into a document. Spot-checked against the real Act Four beat: 55 against 85 at
Difficult, which is 42.

Page 1 states it by asking it -- the tie-break and the margin are computed from the
rule at build time, so the book cannot drift from the engine.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:42:17 +01:00
slaguru666andClaude Opus 5 d03b3208e5 check-cited: the counter watching for invisible markers was itself case-blind
Fourth variant of the same defect, found by the peer session probing sideways.
Neither CITE nor ANY_CITE carried the `i` flag, and ANY_CITE required a literal
"cite:" with no space before the colon. So three plausible spellings were
invisible to the reader AND to the counter that exists to catch invisible
markers:

  <!-- Cite: first-blood cut.swing -->     OK 25, exit 0
  <!-- CITE: first-blood cut.swing -->     OK 25, exit 0
  <!-- cite : first-blood cut.swing -->    OK 25, exit 0

Each of those was verified carrying a citation printing 41 against an artifact
holding 40, and each reported OK with a count byte-identical to a clean tree.
The count check could not see them because it was looking for the same literal
the reader was. Capitalising the first word of a comment is not an exotic
mistake.

The two patterns are now deliberately asymmetric, which is the actual fix:

  CITE      tolerates case and spaces around the colon, so those spellings
            simply work when correctly placed.
  ANY_CITE  stays looser still, so a spelling neither of us anticipated is
            counted and named rather than skipped.

The reader accepts only what the format specifies; the counter recognises
anything a person might have meant as a citation; the difference is reported.
The failure text now covers misspelling as well as misplacement, since the
unread set can be either.

Matrix verified, exit codes read directly: a wrong value fails under all four
spellings including no-spaces; a right value passes under all of them, counting
26; a misplaced-and-capitalised marker fails; a marker missing its path fails;
clean tree OK 25 with no false positive.

Four iterations of this guard, four variants of one defect -- something that
exists and is never read -- and all four were found by the session that did not
write it.

npm run check: 16 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:33:17 +01:00
slaguru666andClaude Opus 5 0de463c470 check-cited: make the regex match its own error message, and name the right lines
Two residual defects in the marker check added at 4d7d93a, both found by the
peer session that found the original.

1. THE REGEX WAS LOOSER THAN ITS DOCUMENTATION. The failure text has always
   promised the comment must follow its figure "immediately, with nothing but
   markup between", but CITE's separators were \s*, which spans newlines — so
   a marker on the line after its number resolved and was checked, contrary to
   the stated rule. Tightened to [ \t] throughout.

   Verified safe before changing it: matched under the loose pattern 25, under
   the tight pattern 25, so no citation in CLEAN GROUND relies on crossing a
   newline. There is no finding in the document.

2. THE OFFENDER REPORT WAS RIGHT ABOUT THE COUNT AND WRONG ABOUT THE LINES.
   It filtered line by line, so a valid cross-line citation was printed as an
   offender whenever some other marker was genuinely unread — a maintainer
   told "line 15 is broken" would have edited a working citation. That is the
   headline defect fixed an hour ago one level down: correct verdict, wrong
   reason.

   Offenders are now located by position across the whole text, so the lines
   named are exactly the markers no CITE match covers. This is the fix that
   matters independently of the regex: a marker spanning lines would still be
   counted once by ANY_CITE and named nowhere, so tightening alone leaves a
   narrower version of the same bug, and position-based reporting stays
   correct if anyone ever loosens the separator again.

Placement battery, exit codes read directly: clean tree OK 25 no false
positive; one word between number and marker fails; bare marker alone fails;
two on a line with one attached fails naming only the unattached; cross-line
now fails rather than silently passing.

Three iterations of this guard, three variants of one defect — a marker or a
message that exists and is not read — and all three were found by the session
that did not write it.

npm run check: 16 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:29:45 +01:00
slaguru666andClaude Opus 5 4d7d93abc8 check-cited: a citation marker nothing reads now fails the build
A misplaced marker failed open. CITE requires the comment to sit immediately
after its figure; put one word between them and the citation is silently
skipped while the run still reports OK with the same count as a clean tree:

  The longest fight seen ran **67** rounds.<!-- cite: fight-tail cut.longest -->
  check-cited: OK — 25 cited figures ...

That marker names a field the guard is supposed to refuse outright, and the
guard never saw it. Worse than an absent citation, because whoever wrote it
believes they added a check — and worse still in a guard written yesterday to
catch exactly this shape of defect.

Every `<!-- cite:` occurrence is now counted and compared against what the
parser actually read; any difference fails and prints the offending line.
Verified on both placement failures: a marker one word from its number, and a
marker on its own line with no number at all. The failure headline was also
wrong for this class -- it claimed a figure mismatched its artifact -- and now
covers both.

Found by a peer session writing a bad citation by accident while testing.

npm run check: 16 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:24:32 +01:00
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
slaguru666andClaude Opus 5 14c34449e3 R-271: measure the tail, and a round cap that scores a long fight as a draw
Fourteen guards all average, so none can see how long a fight might run. 6000
fights per configuration: the cut runs a median of 11 and a 95th of 22, the
six-a-side line a median of 14 and a 95th of 32, and the longest seen are 71 and
79. The line is the LONGER fight, because more bodies means more of them fighting
on at reduced skill rather than dropping. Length predicts death: 61.6% of cut
fights past fifteen rounds are wipes against 42.0% of shorter ones.

maxRounds = 40 is the default every guard runs at and a fight reaching it is
scored as neither wipe nor win -- censoring 0.2% of cut fights and 1.87% of the
line's. Measured before proposing anything: uncensored, the swing moves 39.8 to
39.9 and 14.8 to 15.1, against a recorded noise of 2.1. The cap stays, documented
rather than corrected, because the cure is four re-recorded baselines.

Also R-270 addendum: the hit table is weighted toward the locations where the two
thresholds coincide -- 12 of 20 melee results, 15 of 20 ranged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:08:09 +01:00
slaguru666andClaude Opus 5 74e45b15e7 R-270: a rule I invented, and the coincidence that hid it
R-266 said a fighter goes down at half maximum hit points and called it one rule
in both directions. conditionFor puts someone down at hp <= 2; majorWoundFor is
ceil(hp/2) and feeds only how long the dying last; a location is disabled by
resolveLocationHit at its own locationMaxHp capacity.

The reason it survived reading: for a 10-point neighbour majorWoundFor is 5 and a
leg, abdomen or chest holds exactly 5, and for a 12-point agent both are 6. On the
locations that get hit most the invented rule returns the real one's answer, and
the narration prints MAJOR WOUND and disabled on the same line. Arms and heads are
where they part, and I had not looked at an arm.

Found by the scenario session going to rules.mjs to verify a different correction
of mine and reading the next function along. Both errors made the fight look
easier than it is.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:03:34 +01:00
slaguru666andClaude Opus 5 6e46ad0909 CLEAN GROUND v0.11.1: correct the mechanism under the first-blood swing
Two wrong mechanisms in one sentence of my own v0.10 prose. The measured swing
of 40 is unaffected -- what was wrong was the explanation I gave for it, which
I wrote from intuition rather than from rules.mjs.

1. "every disable removes an attacker" -- it does not. locationEffectsFor
   (rules.mjs:461) charges 30 points off physical for a ruined leg or
   manipulation for a ruined arm, and simulate.mjs:305 applies the
   manipulation penalty to melee and ranged attacks alike. A 40% attacker
   disabled is a 10% attacker, not an absent one: still swinging, still
   drawing attacks, still a target. A slope, not a cliff.

2. "both sides go down at half their maximum hit points" -- also wrong, and
   this one nobody flagged. Half maximum hit points is majorWoundFor, the
   MAJOR WOUND threshold, which feeds dyingLimitFor and decides how long a
   dying character lasts. It has nothing to do with leaving the fight.
   conditionFor (rules.mjs:1630) puts somebody down at 2 hit points or on a
   destroyed head, and that is the only thing that stops them acting.

The paragraph now states the real loop and warns the GM off the wrong one,
because playing disables as removals gets the fight wrong in the party's
favour -- the direction that makes a party-ending encounter feel survivable.

Credit where due: the first error was caught by a peer session correcting
prose it had sent me twice. I found the second only because I verified the
first against rules.mjs instead of taking it on assertion.

npm run check: 14 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 10:01:11 +01:00
slaguru666andClaude Opus 5 765b3518db R-269: the fourth quadrant, and a disable does not remove anybody
Seed 16 is the missing corner -- party takes first blood in round 1 and is wiped
anyway -- and it runs 24 rounds. Its last five are Neil dropped by a critical
through armour, then Dominic alone at 1%, failing three times, then dying. That
is what three effective attackers costs at a table when a fight goes long.

Corrects a mechanism I had written twice: a disabling hit does not remove an
attacker, it charges 30 points off physical or manipulation per locationEffectsFor.
Bhattacharya keeps swinging at 10 for four rounds. A slope, not a cliff.

Neither guard fired and neither was wrong: the fight sits in the 25.5% the swing
does not cover, and no guard measures the tail because all of them average.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:59:06 +01:00
slaguru666andClaude Opus 5 dc801f7e9f CLEAN GROUND v0.11: Dodge 68, and Ashcroft is busy rather than sidelined
Two holes a peer session's per-agent measurements pointed at. Their scratch
figures are not used; both edits are sourced to published numbers or to the
guard that now holds them.

EXPOSURE gains a fifth point: the party's sheets read about twice as effective
as they are, and the number doing it is the column's Dodge 68. That is
arithmetic off two published values, not a measurement -- Dodge 68 on The
Quiet Neighbours (tools/content.mjs, printed by the bestiary) and one defence
spent per incoming blow, so a 40% attack against a fresh dodge connects about
one time in eight. Nothing in the document said so, and grep for "expect to
hit" / "hit rate" / "lands about" returned nothing at all.

The point carries its own way out: DEFENCE_STEP is -30, so a defender who has
dodged once meets the next blow at 38%, then 8%, then the floor. Spend their
dodges rather than out-shooting them. That is also the other half of why the
four-player cut is a different game -- three attackers cannot spend three
defenders' dodges and six can, so the missing attacker is the one who would
have made everybody else's shots land.

The recorded landing rates agree and are now citeable (16-18%, above the naive
one-in-eight because most blows are not the first of their round), so the
sub-bullet cites tools/attackers-baseline.json rather than asserting.

The scaling note's Ashcroft warning gains the sharper reading: he is not
sidelined, he is busy and ineffective -- 9.2 attacks a fight of which 1% land
and 0.1% disable anybody, both held by check-attackers. A player who cannot
act knows to do something else; a player rolling once a round for an hour
thinks he is fighting. So the note now says what to give him instead, using
only what is on his sheet: First Aid 40, Dodge 63, Insight 63, the anchor.

Verified rather than relayed: Dodge 68 at tools/content.mjs, DEFENCE_STEP -30
and the per-round reset in rules.mjs and simulate.mjs, the three fighters'
skills at 40/40/35, and the per-attack rates re-measured independently across
three seeds before the baseline existed (17.6-18.3 / 17.4-17.6 / 15.5-16.2 /
1.0%, against the recorded 17.8 / 17.3 / 16.2 / 1.0).

npm run check: 14 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:58:14 +01:00
slaguru666andClaude Opus 5 0b86c5ffc3 R-268: guard the sentence that names a player's character
CLEAN GROUND prints that the four-player cut is three effective attackers and
that Ashcroft is not one. Nothing checked it, and a GM reads it aloud to decide
who a real player spends four hours being.

effective-attackers.mjs measures per attack, not per fight: counted per fight
Braithwaite leads on disables, but only because his armour buys him a third more
swings -- per attack he is the weakest of the three. Both rates are recorded and
only the per-attack one is reasoned from. Asserts exact drift, then the sentence:
three clear 5% of attacks disabling, one does not, and that one is Ashcroft.
Re-recording does not silence the claim check; verified in a worktree.

declared-cast.mjs holds the cast marker reading both scenario guards need, rather
than a copy in each. It was briefly named scenario-cast.mjs, which check-scenarios
sweeps into the scenario corpus -- its own example marker was read as a real cast.

update-readme dropped any guard that exited non-zero, so check-rollable vanished
from the README and the count word fell to thirteen while fourteen guards ran. A
missing line is now fatal.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:56:01 +01:00
slaguru666andClaude Opus 5 a0d15ad7a9 CLEAN GROUND v0.10: EXPOSURE reframed on the first disabling blow
The old EXPOSURE paragraph read the fight at round five and quoted bucket
figures no guard held. Round five is where the outcome becomes legible; round
two is where it is decided. Reframed on the first disabling blow and cited to
tools/first-blood-baseline.json, so every figure in the paragraph is one the
build re-measures:

  cut   50.3% first blood at mean round 1.8, 25.5% vs 65.5% wipes, swing 40
  line  54.1% at round 1.3, 7.8% vs 23.2%, swing 15.4

An earlier draft carried 43 for the cut swing from a single seed. Three seeds
give 40.0. The note stays in the document.

Also adds a Casting coupling warning: the declared cast in the `cast:` marker
is load-bearing on check-rollable and check-firstblood, and re-casting
invalidates the recorded swing. Verified rather than assumed — swapping
braithwaite for agyeman in the marker fails both guards and the build, and
check-firstblood names the fix:

  "The recorded swing describes the old cast; re-record with --update,
   do not revert the cast."

npm run check: 13 guards, exit 0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:50:07 +01:00
slaguru666andClaude Opus 5 60995b28c2 R-267 addendum: read the cast, do not copy it
I told the scenario session that this guard turns a silent re-cast into a build
failure, and it accepted the coupling on that basis. The cast was hardcoded, so
a re-cast would have left it measuring the old six and reporting success.

Reads the <!-- cast: --> marker check-rollable established, drops the two the
scaling note drops by name rather than by position, and refuses to run if the
marker is gone. Verified by re-casting CLEAN GROUND in a throwaway worktree and
watching the guard name the change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-13 09:45:38 +01:00
slaguru666andClaude Opus 5 996bd248d3 CLEAN GROUND: one status block, and the end of the build archaeology
A stand-in GM opening this had no single place to start: the state of the document
lived across three playtest logs, twenty commit messages, a status paragraph and a
checklist at the foot. Worse, the two written accounts had drifted apart — the
status paragraph still said the scenario "wants a stress re-run of Act Four, a
player-chair pass", both of which were done and committed, and the foot checklist
still said v0.8 in a v0.9 document with a sentence broken in half.

STATUS now sits at the top and answers the questions a GM actually arrives with:
what version, can I run it (yes, from this file alone), is it convention-ready (no —
never played by human beings, no print pack), what playtesting exists and at which
seeds, how long it runs and where the cuts are, how many players.

Then the three things that are not obvious, as pointers rather than restatements,
because GM ESSENTIALS is where rules live: opposed rolls use a scenario-local ruling
since rules.mjs has none; Ashcroft cannot fight and his player must be told before
the game; and the lethal encounter is the column in Act Two, not the monster in Act
Four, which cannot hurt anybody.

The foot checklist is deleted rather than corrected. Every item on it was either
struck through or now in STATUS, its history is in the logs and the commits, and
keeping a second account of what is outstanding is what let the first one drift.
Open Questions stays as the single home for decisions and STATUS says so in a line
instead of holding a copy — the same rule this repository applies to rule formulas,
applied to prose about state.

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