Files
RingBRP/docs/scenarios/CLEAN_GROUND_HANDOUTS.html
T
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

372 lines
16 KiB
HTML

<!DOCTYPE html>
<html lang="en-GB">
<head>
<meta charset="utf-8">
<title>CLEAN GROUND — handout pack</title>
<style>
/* ─────────────────────────────────────────────────────────────────────────
CLEAN GROUND — print-ready handout pack. A4, four sheets, one per page.
Print from a browser with BACKGROUND GRAPHICS ON, scale 100%, margins
"default". The cream of H02 and the ruled paper of H03 are backgrounds; with
them off, H02 prints on white and the almanac loses its rules, which does not
destroy either handout but does cost most of the effect.
THE ONE RULE THIS FILE EXISTS TO ENFORCE. H03a and H03b must be
indistinguishable except for their dates and figures — that is the entire
trick, and it dies the moment one of them is styled a hair differently from
the other. So they are not two designs that happen to match: they share one
class, `.almanac`, and every dimension they use comes from a variable defined
once below. There is deliberately no `.almanac-a` or `#h03b` anywhere in this
file. If you want to change the look of the almanac, change the variable and
both move together; if you find yourself adding a selector that names only one
of them, that is the bug, and `check-handouts` will fail the build for it.
───────────────────────────────────────────────────────────────────────── */
:root {
/* Body copy never goes below 11pt — convention halls are dim and eyes are
tired. Everything here is at or above that. */
--body: 11.5pt;
--lead: 1.45;
/* The almanac's entire appearance, in one place, used by both pages. Swap the
face here if a handwriting font is installed — it changes BOTH, which is the
point. Keep it monospaced-by-metrics or the columns stop aligning, and the
columns aligning IS the reveal. */
--almanac-font: "Courier New", Courier, monospace;
--almanac-size: 11.5pt;
--almanac-lead: 26px; /* also the ruled-line pitch — one value, both uses */
--almanac-ink: #1a2a4a; /* fountain-pen blue-black */
--almanac-paper: #fbfaf3;
--almanac-rule: #b9c6d8;
--almanac-margin-rule: #d4a8a8;
/* Where the red margin rule sits, measured from the sheet edge, and therefore
where the writing has to start. Used by both the rule and the indent so they
cannot drift apart. Sheet padding is 16mm, so the indent makes up the rest. */
--almanac-margin-x: 26mm;
}
@page { size: A4 portrait; margin: 16mm 15mm; }
html, body { margin: 0; padding: 0; background: #6e6e6e; }
body {
font-family: Georgia, "Times New Roman", serif;
font-size: var(--body);
line-height: var(--lead);
color: #111;
}
/* One sheet = one A4 page. On screen they float on grey; in print they are the
page itself. */
.sheet {
box-sizing: border-box;
width: 210mm;
min-height: 297mm;
margin: 10mm auto;
padding: 18mm 16mm;
background: #fff;
box-shadow: 0 2px 14px rgba(0,0,0,.45);
page-break-after: always;
position: relative;
}
.sheet:last-of-type { page-break-after: auto; }
/* The slug is for the GM's pile, not the players. It is small, grey, and sits
outside the fiction — every sheet says what it is and when it is given. */
.slug {
position: absolute; top: 6mm; right: 16mm;
font-family: -apple-system, "Segoe UI", Helvetica, Arial, sans-serif;
font-size: 8pt; letter-spacing: .09em; text-transform: uppercase;
color: #8b8b8b;
}
.slug b { color: #5a5a5a; letter-spacing: .12em; }
/* ── CG-H01 — coroner's note. White, official, dull on purpose. ───────────── */
.official {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: var(--body);
line-height: 1.5;
}
.official .letterhead {
border-bottom: 2.5pt solid #000;
padding-bottom: 3mm; margin-bottom: 2mm;
display: flex; justify-content: space-between; align-items: baseline;
font-weight: 700; letter-spacing: .04em; font-size: 11.5pt;
}
.official .letterhead .doctype { font-weight: 700; font-size: 11pt; }
.official .refline {
display: flex; justify-content: space-between;
font-size: 11pt; color: #333;
border-bottom: .75pt solid #666;
padding-bottom: 4mm; margin-bottom: 6mm;
}
.official dl { display: grid; grid-template-columns: 30mm 1fr; gap: 1.5mm 4mm; margin: 0 0 7mm; }
.official dt { font-weight: 700; letter-spacing: .05em; font-size: 11pt; }
.official dd { margin: 0; }
.official p { margin: 0 0 4.5mm; max-width: 155mm; }
.official .signoff { margin-top: 12mm; padding-left: 95mm; line-height: 1.35; }
.official .signoff .name { font-family: Georgia, serif; font-style: italic; font-size: 14pt; }
.official .signoff .role { font-size: 11pt; color: #333; }
/* ── CG-H02 — 1962 committee minute. Cream, typewriter, twice-copied. ─────── */
.minute {
font-family: "Courier New", Courier, monospace;
font-size: 11.5pt;
line-height: 1.62;
color: #241f1a;
}
/* The cream is on the SHEET so it reaches the paper edge in print. */
.sheet--cream { background: #f3ecd9; }
/* Photocopy grain: faint, uneven, and cheap. Two overlapping gradients rather
than an image, so this file stays self-contained and prints the same anywhere. */
.sheet--cream::before {
content: ""; position: absolute; inset: 0; pointer-events: none;
background:
repeating-linear-gradient(92deg, rgba(0,0,0,.035) 0 1px, transparent 1px 4px),
radial-gradient(120% 80% at 8% 4%, rgba(0,0,0,.07), transparent 55%),
radial-gradient(90% 70% at 96% 98%, rgba(0,0,0,.05), transparent 60%);
mix-blend-mode: multiply;
}
.minute > * { position: relative; }
.minute .head {
display: flex; justify-content: space-between;
font-weight: 700; letter-spacing: .05em;
}
.minute .head .classification { letter-spacing: .3em; }
.minute .subhead {
display: flex; justify-content: space-between;
border-bottom: 1pt solid #4a4038;
padding-bottom: 3mm; margin-bottom: 7mm;
}
.minute h2 {
font-family: inherit; font-size: 12.5pt; font-weight: 700;
letter-spacing: .12em; text-align: center;
margin: 0 0 9mm; text-decoration: underline;
}
.minute ol { margin: 0; padding: 0; list-style: none; counter-reset: para; }
.minute ol li {
counter-increment: para;
display: grid; grid-template-columns: 9mm 1fr; gap: 3mm;
margin-bottom: 6mm;
}
.minute ol li::before { content: counter(para) "."; font-weight: 700; }
.minute .signoff {
margin-top: 12mm; padding-left: 68mm;
display: grid; grid-template-columns: 26mm 1fr; gap: 1mm 3mm;
}
.minute .signoff .lab { color: #3b332c; }
/* ── CG-H03a / CG-H03b — Ivy's almanac. ONE class, used twice. ────────────
Every value comes from the variables above. Nothing below names a or b. */
.sheet--almanac { background: var(--almanac-paper); }
.almanac {
font-family: var(--almanac-font);
font-size: var(--almanac-size);
color: var(--almanac-ink);
line-height: var(--almanac-lead);
/* Ruled paper: the pitch IS the line-height, so writing sits on the rules. */
background:
linear-gradient(to bottom, transparent calc(var(--almanac-lead) - 1px),
var(--almanac-rule) calc(var(--almanac-lead) - 1px), var(--almanac-rule) var(--almanac-lead));
background-size: 100% var(--almanac-lead);
padding-top: 2px;
/* 16mm of that is the sheet's own padding; this is the remainder. */
padding-left: calc(var(--almanac-margin-x) - 16mm);
}
/* The red margin rule, down the left of the sheet, both pages alike. */
.sheet--almanac::before {
content: ""; position: absolute; top: 0; bottom: 0; left: var(--almanac-margin-x);
border-left: 1pt solid var(--almanac-margin-rule);
}
.almanac table { width: 100%; border-collapse: collapse; table-layout: fixed; }
.almanac th, .almanac td {
text-align: left; font-weight: 400; padding: 0;
line-height: var(--almanac-lead); height: var(--almanac-lead);
white-space: nowrap; overflow: hidden;
}
.almanac th { border-bottom: 1px solid var(--almanac-ink); }
/* Fixed columns so both pages align to the millimetre — the identical "41 mi"
column is the reveal and it only lands if it lines up across two sheets. */
.almanac col.day { width: 10%; }
.almanac col.weather { width: 22%; }
.almanac col.walked { width: 12%; }
.almanac col.clean { width: 24%; }
.almanac col.notes { width: 32%; }
.almanac .count { margin-top: calc(var(--almanac-lead) * 2); }
@media print {
html, body { background: #fff; }
.sheet { margin: 0; box-shadow: none; width: auto; min-height: 0; padding: 0; }
.sheet--cream, .sheet--almanac { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
.screen-only { display: none !important; }
}
.screen-only {
max-width: 210mm; margin: 10mm auto 0; padding: 6mm 8mm;
background: #fffbe6; border: 1pt solid #d8cf9a;
font-family: -apple-system, "Segoe UI", Helvetica, Arial, sans-serif; font-size: 11pt;
}
.screen-only h1 { font-size: 12pt; margin: 0 0 3mm; letter-spacing: .05em; }
.screen-only li { margin-bottom: 2mm; }
</style>
</head>
<body>
<div class="screen-only">
<h1>CLEAN GROUND — handout pack · print instructions</h1>
<ul>
<li><b>A4 portrait, scale 100%, background graphics ON.</b> Without backgrounds, H02 prints white and the almanac loses its rules.</li>
<li><b>Four sheets, one per page</b>, in handing order: H01 (Act One), H03a (Act Two), H02 (Act Three, depot), H03b (Act Three, laid beside H03a).</li>
<li><b>H03a and H03b must come off the same printer, same tray, same session.</b> Two different papers and the trick dies before anyone reads a word.</li>
<li><b>Staging:</b> H03a is given in Act Two and nothing is said about it. H03b goes down <i>flat on the table beside it</i> in Act Three. Do not explain. The table will do it out loud.</li>
<li>Body text is 11.5pt throughout. Do not scale below 100% to fit.</li>
</ul>
</div>
<!-- ══ CG-H01 ══ Act One, once Braithwaite has looked ═══════════════════════ -->
<section class="sheet">
<div class="slug"><b>CG-H01</b> · Act One</div>
<div class="official">
<div class="letterhead">
<span>HM CORONER — NORTH NORTHUMBERLAND</span>
<span class="doctype">PRELIMINARY NOTE</span>
</div>
<div class="refline">
<span>Ref: NN/1174/26</span>
<span>Not for release</span>
</div>
<dl>
<dt>DECEASED</dt><dd>Unidentified male</dd>
<dt>FOUND</dt><dd>29 August, stone sheep pen, Sike Head march</dd>
<dt>BY</dt><dd>Mrs M. Swinburne, of Sike Head</dd>
</dl>
<p>Estimated age at death, from dentition and general condition: forty to forty-five
years.</p>
<p>Bone density, joint surfaces and vascular condition are those of a man in his
ninetieth year. I have written that sentence three times and I am content with it.</p>
<p>No dental record answers to this mouth. No fingerprint record answers to these
hands. Enquiries with the National Insurance index return nothing. He is not a missing
person anywhere I can reach.</p>
<p>Dressed in wool and cotton of good but old manufacture, mended repeatedly and
competently by hand. The boots have been resoled, by my count, nine times, and not by
a tradesman.</p>
<p>Lungs, turn-ups and hair carry a fine grey particulate which I am not equipped to
identify and have sent onward.</p>
<p>Cause of death: exhaustion, on a body that had no reserve left to draw on. There is
no injury. Nobody did this to him.</p>
<p>I would be glad to be told what this was, in due course, if anyone is ever able to
tell me.</p>
<div class="signoff">
<div class="name">J. A. Corbridge</div>
<div class="role">Assistant Pathologist</div>
</div>
</div>
</section>
<!-- ══ CG-H03a ══ Act Two, when she decides to trust them ═══════════════════ -->
<section class="sheet sheet--almanac">
<div class="slug"><b>CG-H03a</b> · Act Two</div>
<div class="almanac">
<table>
<colgroup>
<col class="day"><col class="weather"><col class="walked"><col class="clean"><col class="notes">
</colgroup>
<thead>
<tr><th>DAY</th><th>WEATHER</th><th>WALKED</th><th>TO CLEAN GROUND</th><th>NOTES</th></tr>
</thead>
<tbody>
<tr><td>Mon</td><td>low cloud</td><td>7 mi</td><td>41 mi</td><td>Ground softer.</td></tr>
<tr><td>Tue</td><td>dry, cold</td><td>8 mi</td><td>41 mi</td><td>Passed the lorry.</td></tr>
<tr><td>Wed</td><td>rain</td><td>5 mi</td><td>41 mi</td><td>Rested at noon.</td></tr>
<tr><td>Thu</td><td>dry</td><td>8 mi</td><td>41 mi</td><td>Thursday again.</td></tr>
<tr><td>Fri</td><td>low cloud</td><td>7 mi</td><td>41 mi</td><td>Alec is tired.</td></tr>
<tr><td>Sat</td><td>rain</td><td>6 mi</td><td>41 mi</td><td>Passed the lorry.</td></tr>
<tr><td>Sun</td><td>dry, bright</td><td>9 mi</td><td>41 mi</td><td>Good day. Sang.</td></tr>
</tbody>
</table>
<div class="count">Counted this morning: forty-one.</div>
</div>
</section>
<!-- ══ CG-H02 ══ Act Three, in the buried depot ═════════════════════════════ -->
<section class="sheet sheet--cream">
<div class="slug"><b>CG-H02</b> · Act Three</div>
<div class="minute">
<div class="head">
<span>COMMITTEE ON CONTINGENT ARRANGEMENTS</span>
<span class="classification">SECRET</span>
</div>
<div class="subhead">
<span>Minute of the meeting of 26 October 1962</span>
<span>Copy 3 of 4</span>
</div>
<h2>RESERVE ENTRY (NORTHERN) — AUTHORISED</h2>
<ol>
<li>The Committee approved the entry of a reserve holding of ground in the northern
march, of eleven miles and a fraction, to be recorded twice in order that one record
may be drawn upon without disturbance to the other.</li>
<li>The purpose of the reserve is to hold persons displaced by a general exchange, in
a place which is not on any list that an adversary may obtain. Members were reminded
that an unrecorded place cannot be targeted and cannot be requisitioned.</li>
<li>The entry is pegged to the standing boundary oak at Sike Head, being the feature
to which the march was recorded before the survey of 1861 and therefore the older of
the two authorities. The Committee was satisfied that the tree is in good health.</li>
<li>The Registrar drew the Committee's attention to the consequence of paragraph 2.
A place recorded as the place to which the displaced go is a place the record must
afterwards furnish with displaced persons. The Committee noted this and did not
regard it as an obstacle.</li>
<li>The entry is to be reviewed at the rising of the emergency, and cancelled if it
is found not to have been drawn upon.</li>
</ol>
<div class="signoff">
<span class="lab">Signed</span><span>(illegible)<br>Chairman</span>
<span class="lab">Minuted by</span><span>A.E.W.<br>Clerk (Junior)</span>
</div>
</div>
</section>
<!-- ══ CG-H03b ══ Act Three, and not before ═════════════════════════════════ -->
<section class="sheet sheet--almanac">
<div class="slug"><b>CG-H03b</b> · Act Three</div>
<div class="almanac">
<table>
<colgroup>
<col class="day"><col class="weather"><col class="walked"><col class="clean"><col class="notes">
</colgroup>
<thead>
<tr><th>DAY</th><th>WEATHER</th><th>WALKED</th><th>TO CLEAN GROUND</th><th>NOTES</th></tr>
</thead>
<tbody>
<tr><td>Mon</td><td>dry</td><td>8 mi</td><td>41 mi</td><td>Passed the lorry.</td></tr>
<tr><td>Tue</td><td>rain</td><td>6 mi</td><td>41 mi</td><td>Ada's chest again.</td></tr>
<tr><td>Wed</td><td>low cloud</td><td>7 mi</td><td>41 mi</td><td>Ground softer.</td></tr>
<tr><td>Thu</td><td>dry, cold</td><td>8 mi</td><td>41 mi</td><td>Thursday again.</td></tr>
<tr><td>Fri</td><td>dry</td><td>7 mi</td><td>41 mi</td><td>Passed the lorry.</td></tr>
<tr><td>Sat</td><td>low cloud</td><td>6 mi</td><td>41 mi</td><td>Rested at noon.</td></tr>
<tr><td>Sun</td><td>rain</td><td>5 mi</td><td>41 mi</td><td>Nobody sang.</td></tr>
</tbody>
</table>
<div class="count">Counted this morning: fifty-three.</div>
</div>
</section>
</body>
</html>