Play PAPER WINDOW with the shipped pregens; fix four silent defects
Ran the starter end to end. It closed, and it found four defects in what I shipped an hour earlier — all in the scenario data, all silent. R-247: the Borrowed Authority did not work. I wrote scope "operate", which is not one of the five scope tiers; an unrecognised scope ranks 0 and every action came back "impossible" with no error. The first scene of the starter is the Borrowed Authority tutorial. Fixed, guarded in check-kits, and covered by a test that documents the failure mode. R-248: the contact subsystem was unreachable in the scenario built around it. The case file carried a standing for the Returned Clerks and no GROUP ITEM; resolveContact returns null without one, so READ, SIGNAL and OFFER did nothing. Groups are data now, and a test asserts every standing on a shipped case file has a group behind it. R-249: legs wrote `kindId` where resolveLegDialog reads `leg.kind`. It worked only because the terrain text happens to begin with "Extraction". Not a defect: phase four went Difficult because Resources hit 0 and destitution makes every remaining phase Difficult. Best beat in the session. All four phases failed and the case still closed — Containment 8 to 2, Resources 8 to 0 — which is what the scenario is built to survive. Two of six closing requirements succeeded and the settlement still completed. The Cancellation Man opened with a critical against a raised riot shield and went through 10 points of armour, teaching the shield and graded-defence lessons in one roll. Also documented: nobody on the starter team can aim the return, because only the Anchor Officer trains Transposition. The extraction page now says to narrate it rather than roll six dice that will all fail. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
49c2e9fc7b
commit
4e28de2a64
@@ -183,6 +183,6 @@ The build runs all three guards before it writes anything:
|
||||
check-rules: OK — 87 rules, 16 files scanned, 3 aliases + 41 constant sets checked, 275 formulas verified
|
||||
check-kits: OK — 25 roles, 10 trades, 218 catalogue items, every kit key resolves, every posting can use what it carries, every loadout distinct
|
||||
check-lang: OK — en.json, 926 keys, no leaf/branch collisions
|
||||
check-behaviour: OK — 28 behavioural tests
|
||||
check-behaviour: OK — 36 behavioural tests
|
||||
```
|
||||
<!-- guards:end -->
|
||||
|
||||
@@ -4941,3 +4941,73 @@ stable keys after import (raw ids do not survive one), the handouts come in
|
||||
player-visible and the GM text does not, and **phase one runs straight out of the box** —
|
||||
Nia leading the cordon on Tradecraft 53. Then everything imported was deleted again,
|
||||
which the pack does not notice.
|
||||
|
||||
## PAPER WINDOW — played with the shipped pregens
|
||||
|
||||
Ran the starter end to end with the six pregens exactly as they import. It closed, and
|
||||
it found four defects in what I had shipped an hour earlier — all four in the scenario
|
||||
data rather than the engine, and every one of them silent.
|
||||
|
||||
**R-247. The Borrowed Authority did not work, and said nothing.** I wrote the
|
||||
credential's scope as `"operate"`, which is not one of the five scope tiers. An
|
||||
unrecognised scope ranks 0 — *nothing* — so `scopeStanceFor` returned "impossible" for
|
||||
a routine site inspection by a surveyor at a demolition site. No error, no warning: the
|
||||
credential was simply inert, and the first scene of the starter is the Borrowed
|
||||
Authority tutorial. Fixed to `"routine"`, guarded in check-kits, and covered by a test
|
||||
that asserts an unrecognised scope makes everything impossible so the failure mode is
|
||||
documented rather than rediscovered.
|
||||
|
||||
**R-248. The contact subsystem was unreachable — in the scenario built around it.** I
|
||||
gave the case file a standing record for the Returned Clerks and no group *item*.
|
||||
`resolveContact` looks up the group and returns null without one, so READ, SIGNAL and
|
||||
OFFER did nothing at all. PAPER WINDOW's central scene is a three-stage negotiation with
|
||||
those clerks. The group is now data in `scenario-starter.mjs`, consumed by the builder,
|
||||
and a test asserts every standing on a shipped case file has a group behind it.
|
||||
|
||||
**R-249. A phase kind written to the wrong field.** I wrote `kindId` on the legs;
|
||||
`resolveLegDialog` reads `leg.kind` and falls back to a regular expression on the terrain
|
||||
prose. It worked only because "Extraction — closing the register" happens to begin with
|
||||
the word. Rename a phase and the return clock stops moving.
|
||||
|
||||
**And one that was not a defect.** Phase four resolved as Difficult when the scenario
|
||||
table says Average — because Resources had reached 0 and destitution makes every
|
||||
remaining phase Difficult. That is the rule working, and it was the best beat in the
|
||||
session: they ran out of supplies and the way home doubled in difficulty.
|
||||
|
||||
### How it actually played
|
||||
|
||||
The credential carried them in and then the stretch for an asbestos exclusion spent it
|
||||
to **Trust 0** — two hours bought, and nothing left for later. Phases one, two, three and
|
||||
four **all failed**, which the scenario is explicitly built to survive: Containment 8 → 2,
|
||||
Resources 8 → 0, Clearance 6 → 5, and the case still closed.
|
||||
|
||||
The investigation split cleanly across four players and three of the four discoveries
|
||||
landed. Amira's READ turned up **both** taboos on one roll — Read the Room granting the
|
||||
extra fact — and Elin **criticalled on 01** for the desire. SIGNAL and OFFER at
|
||||
favourable took the clerks to **Standing 2**, which fired Evelyn's rewards automatically
|
||||
and put the clean settlement on the table.
|
||||
|
||||
The Cancellation Man opened with a **critical on 01** against Callum, whose riot shield
|
||||
was raised and whose arm therefore had 10 points of armour. A critical ignores armour
|
||||
entirely: 10 through, Major Wound, 15 → 5. That is the shield lesson and the graded
|
||||
defence lesson in a single roll, in round one, without any prompting from me.
|
||||
|
||||
Then the closing scene did the thing the scenario promises: **two of six requirements
|
||||
succeeded and the settlement still completed.** Nia's authority failed and spent the
|
||||
Clearance anyway; Callum's containment failed for a point; Elin certified them and is
|
||||
now personally responsible for reviewing all 317 cases; Owen's repair worked and took
|
||||
the last of the spare cells. Sennen's **special on 07** recovered the crown stamp with
|
||||
the procedure intact, using the +20% Evelyn had given him at Standing 2 — a reward
|
||||
granted by the contact engine, spent in the final scene. That chain is the whole design
|
||||
working unassisted.
|
||||
|
||||
### One thing the starter needs saying out loud
|
||||
|
||||
**Nobody on this team can aim the return.** Transposition is trained by exactly one
|
||||
posting in the register — the Anchor Officer — and none of the six has it, so all six
|
||||
roll the printed 1%. The rule that failure gets an agent home *near* the target and
|
||||
never strands them is what makes that survivable, but asking a GM to roll six dice that
|
||||
are all going to fail teaches nothing. The extraction page now says so: narrate it, roll
|
||||
only if somebody wants a clean arrival, and note at debrief that the department sent six
|
||||
people to a crossing and no anchor. That is the campaign rather than an oversight — but
|
||||
it is a deliberate choice a GM should be able to see, not a hole they fall into.
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
+1
-5
@@ -1,5 +1 @@
|
||||
2026/08/11-23:23:08.314417 1742cf000 Recovering log #3
|
||||
2026/08/11-23:23:08.314570 1742cf000 Level-0 table #5: started
|
||||
2026/08/11-23:23:08.314789 1742cf000 Level-0 table #5: 4591 bytes OK
|
||||
2026/08/11-23:23:08.315089 1742cf000 Delete type=0 #3
|
||||
2026/08/11-23:23:08.315117 1742cf000 Delete type=3 #2
|
||||
2026/08/11-23:39:03.882913 16f9c7000 Delete type=3 #1
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
2026/08/11-23:22:30.827615 17117f000 Delete type=3 #1
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
@@ -1,5 +1 @@
|
||||
2026/08/11-23:23:08.332681 174adb000 Recovering log #3
|
||||
2026/08/11-23:23:08.332779 174adb000 Level-0 table #5: started
|
||||
2026/08/11-23:23:08.332918 174adb000 Level-0 table #5: 4129 bytes OK
|
||||
2026/08/11-23:23:08.333190 174adb000 Delete type=0 #3
|
||||
2026/08/11-23:23:08.333236 174adb000 Delete type=3 #2
|
||||
2026/08/11-23:39:03.926223 1701d3000 Delete type=3 #1
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
2026/08/11-23:22:30.870148 17198b000 Delete type=3 #1
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
-1
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
+1
-5
@@ -1,5 +1 @@
|
||||
2026/08/11-23:23:08.316151 174adb000 Recovering log #3
|
||||
2026/08/11-23:23:08.316320 174adb000 Level-0 table #5: started
|
||||
2026/08/11-23:23:08.316628 174adb000 Level-0 table #5: 31614 bytes OK
|
||||
2026/08/11-23:23:08.316965 174adb000 Delete type=0 #3
|
||||
2026/08/11-23:23:08.317018 174adb000 Delete type=3 #2
|
||||
2026/08/11-23:39:03.885484 16e9af000 Delete type=3 #1
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
2026/08/11-23:22:30.829491 170973000 Delete type=3 #1
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
-1
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
+1
-5
@@ -1,5 +1 @@
|
||||
2026/08/11-23:23:08.298312 174adb000 Recovering log #3
|
||||
2026/08/11-23:23:08.300367 174adb000 Level-0 table #5: started
|
||||
2026/08/11-23:23:08.301985 174adb000 Level-0 table #5: 225945 bytes OK
|
||||
2026/08/11-23:23:08.302352 174adb000 Delete type=0 #3
|
||||
2026/08/11-23:23:08.302416 174adb000 Delete type=3 #2
|
||||
2026/08/11-23:39:03.901710 16f9c7000 Delete type=3 #1
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
2026/08/11-23:22:30.845061 17198b000 Delete type=3 #1
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
+1
-5
@@ -1,5 +1 @@
|
||||
2026/08/11-23:23:08.309911 1742cf000 Recovering log #3
|
||||
2026/08/11-23:23:08.310322 1742cf000 Level-0 table #5: started
|
||||
2026/08/11-23:23:08.310473 1742cf000 Level-0 table #5: 3295 bytes OK
|
||||
2026/08/11-23:23:08.310750 1742cf000 Delete type=0 #3
|
||||
2026/08/11-23:23:08.310794 1742cf000 Delete type=3 #2
|
||||
2026/08/11-23:39:03.919152 1701d3000 Delete type=3 #1
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
2026/08/11-23:22:30.862697 17198b000 Delete type=3 #1
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
+1
-5
@@ -1,5 +1 @@
|
||||
2026/08/11-23:23:08.294604 174adb000 Recovering log #3
|
||||
2026/08/11-23:23:08.295663 174adb000 Level-0 table #5: started
|
||||
2026/08/11-23:23:08.296163 174adb000 Level-0 table #5: 58792 bytes OK
|
||||
2026/08/11-23:23:08.296520 174adb000 Delete type=0 #3
|
||||
2026/08/11-23:23:08.296610 174adb000 Delete type=3 #2
|
||||
2026/08/11-23:39:03.892036 16e9af000 Delete type=3 #1
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
2026/08/11-23:22:30.835678 17198b000 Delete type=3 #1
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
-1
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
+1
-5
@@ -1,5 +1 @@
|
||||
2026/08/11-23:23:08.320015 175af3000 Recovering log #3
|
||||
2026/08/11-23:23:08.320173 175af3000 Level-0 table #5: started
|
||||
2026/08/11-23:23:08.320528 175af3000 Level-0 table #5: 33474 bytes OK
|
||||
2026/08/11-23:23:08.320923 175af3000 Delete type=0 #3
|
||||
2026/08/11-23:23:08.320978 175af3000 Delete type=3 #2
|
||||
2026/08/11-23:39:03.924025 1701d3000 Delete type=3 #1
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
2026/08/11-23:22:30.868156 17117f000 Delete type=3 #1
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
+1
-5
@@ -1,5 +1 @@
|
||||
2026/08/11-23:23:08.305494 1742cf000 Recovering log #3
|
||||
2026/08/11-23:23:08.305911 1742cf000 Level-0 table #5: started
|
||||
2026/08/11-23:23:08.306128 1742cf000 Level-0 table #5: 7590 bytes OK
|
||||
2026/08/11-23:23:08.306405 1742cf000 Delete type=0 #3
|
||||
2026/08/11-23:23:08.306467 1742cf000 Delete type=3 #2
|
||||
2026/08/11-23:39:03.875989 16f9c7000 Delete type=3 #1
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
2026/08/11-23:22:30.820649 172197000 Delete type=3 #1
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
-1
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
+1
-5
@@ -1,5 +1 @@
|
||||
2026/08/11-23:23:08.328983 1752e7000 Recovering log #3
|
||||
2026/08/11-23:23:08.329262 1752e7000 Level-0 table #5: started
|
||||
2026/08/11-23:23:08.329521 1752e7000 Level-0 table #5: 16892 bytes OK
|
||||
2026/08/11-23:23:08.329805 1752e7000 Delete type=0 #3
|
||||
2026/08/11-23:23:08.329838 1752e7000 Delete type=3 #2
|
||||
2026/08/11-23:39:03.917638 16f9c7000 Delete type=3 #1
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
2026/08/11-23:22:30.860796 17117f000 Delete type=3 #1
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
+1
-5
@@ -1,5 +1 @@
|
||||
2026/08/11-23:23:08.324024 1752e7000 Recovering log #3
|
||||
2026/08/11-23:23:08.325074 1752e7000 Level-0 table #5: started
|
||||
2026/08/11-23:23:08.325775 1752e7000 Level-0 table #5: 89206 bytes OK
|
||||
2026/08/11-23:23:08.326188 1752e7000 Delete type=0 #3
|
||||
2026/08/11-23:23:08.326248 1752e7000 Delete type=3 #2
|
||||
2026/08/11-23:39:03.913120 16f9c7000 Delete type=3 #1
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
2026/08/11-23:22:30.856844 17117f000 Delete type=3 #1
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
+1
-5
@@ -1,5 +1 @@
|
||||
2026/08/11-23:23:08.330955 1742cf000 Recovering log #3
|
||||
2026/08/11-23:23:08.331078 1742cf000 Level-0 table #5: started
|
||||
2026/08/11-23:23:08.331226 1742cf000 Level-0 table #5: 3739 bytes OK
|
||||
2026/08/11-23:23:08.331550 1742cf000 Delete type=0 #3
|
||||
2026/08/11-23:23:08.331583 1742cf000 Delete type=3 #2
|
||||
2026/08/11-23:39:03.906240 1701d3000 Delete type=3 #1
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
2026/08/11-23:22:30.849798 17117f000 Delete type=3 #1
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
MANIFEST-000004
|
||||
MANIFEST-000002
|
||||
|
||||
+1
-5
@@ -1,5 +1 @@
|
||||
2026/08/11-23:23:08.307829 174adb000 Recovering log #3
|
||||
2026/08/11-23:23:08.308163 174adb000 Level-0 table #5: started
|
||||
2026/08/11-23:23:08.308314 174adb000 Level-0 table #5: 5770 bytes OK
|
||||
2026/08/11-23:23:08.308647 174adb000 Delete type=0 #3
|
||||
2026/08/11-23:23:08.308699 174adb000 Delete type=3 #2
|
||||
2026/08/11-23:39:03.879030 16f1bb000 Delete type=3 #1
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
2026/08/11-23:22:30.823417 172197000 Delete type=3 #1
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user