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>
372 lines
16 KiB
HTML
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>
|