Playtest LAST ADMISSION: five fixes, one new guard

Played it through in Foundry with the six on their civilian sheets. Five
defects, all of the house's favourite kind — a number written down that nothing
reads.

  1. Pollard and Agyeman were armed and armoured as CIVILIANS. The police trade
     kit carries a revolver and a stab vest, which is right for a serving
     officer and wrong for a British civilian, and it ended the scenario's only
     fight in a single round. expandFromRegister's civilian mode now strips
     firearms and body armour from trade kit as well as induction and standing
     issue, and the build throws if one gets through. Wren Finch keeps her
     knife — a knife is not an issued weapon.

  2. Old Marrow's shears were a utility knife. The page said 1d8+1; the actor
     in the pack held 1d4+2, so a GM running off the token had a different
     fight from the one written down. He now carries a billhook — an actual
     garden tool that is already in the catalogue — and the page says 1d8+2,
     which is what a billhook does.

  3. He was too soft to be the fight the scenario promises. At the original
     numbers he died in an average of 2.4 rounds and in 6 runs of 20 he was
     dead before he ever swung. Retuned over thirty runs to HP 20, armour 2:
     about four and a half rounds, somebody hurt in 28 of 30, somebody dropped
     in 9 of 30. The verification run took four rounds and left Pollard on
     eight hit points.

  4. Two stat lines disagreed with the generated sheets — Marrow 16 against 15,
     Enderby 13 against 12.

  5. Two rolls had no failure written: the body, and Sammy's ankle pull. The
     body is now marked "no roll" outright, because there is no better answer
     to buy. The pull has a fumble result.

New guard: check-behaviour parses the scenario's own fight line out of the page
HTML and compares it to the actor the build will generate — hit points against
hitPoints(CON,SIZ), armour against naturalArmour, and shear damage against the
catalogue entry for whatever he is actually holding. Verified it bites by
reverting the damage to 1d8+1.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
slaguru666
2026-08-12 18:21:45 +01:00
co-authored by Claude Opus 5
parent d063b3c016
commit 1bf8d7f6fb
141 changed files with 153 additions and 146 deletions
+1 -1
View File
@@ -183,6 +183,6 @@ The build runs all three guards before it writes anything:
check-rules: OK — 87 rules, 20 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, 927 keys, no leaf/branch collisions
check-behaviour: OK — 42 behavioural tests
check-behaviour: OK — 43 behavioural tests
```
<!-- guards:end -->
+44 -9
View File
@@ -221,8 +221,9 @@ not orderly. Roughly **thirty people are still inside**: cast in costume, crew,
party who went the wrong way, and three things that are not any of those.
**Josh Pardoe is dead.** He is in the east corridor, behind the false wall, and he has
been for half an hour. He is not marked. `[CUS: Medicine or First Aid — nothing killed
him that leaves a sign; Braithwaite will say cold, and will not be able to say why]`
been for half an hour. He is not marked. **No roll:** nothing killed him that leaves a
sign. Anyone with Medicine or First Aid says cold and cannot say why, and a good roll
does not buy a better answer, because there is not one.
### The three
@@ -237,7 +238,7 @@ it right."*
- **Does:** counts people. Out loud. In a group of six she will say *six*, and then she
will say *five*, and then she will go and make it true.
- **Fight:** cold, strong, ignores pain. **HP 13, armour 0, Brawl 55%, 1d6 damage.** She
- **Fight:** cold, strong, ignores pain. **HP 12, armour 0, Brawl 55%, 1d6 damage.** She
does not defend herself. She counts while you hit her.
- **Script break:** she stops the moment the count is right. Put a person back in the
room and she is finished with it. *This is the cheapest kill in the scenario and the
@@ -251,7 +252,9 @@ come in and hide with him."*
- **Does:** laughs, moves inside the walls, and takes hold of ankles. He does not hurt
anybody. He pulls, and he is very strong, and the hole is nine inches across.
- **Fight:** you cannot hit him. He is in the wall. **Athletics or Brawl vs STR 17 to get
a leg back**, or somebody else pulls with you for an automatic success.
a leg back**, or somebody else pulls with you for an automatic success. **On a fumble**
they go over on their face and lose whatever was in their hands under the floorboards.
He does not get to keep the leg.
- **Script break:** he is hiding, so he stops when he is *found*. Say his name and open
the panel and he is not there any more.
@@ -262,9 +265,10 @@ coming in now, but he will see you off it."*
- **Does:** carries the shears, moves at a walk, and will not enter the building. He is
the reason nobody gets to the car park.
- **Fight:** **HP 16, armour 1 (coat), shears 1d8+1, Brawl/Melee 60%.** He is the actual
fight in this scenario. He is slow, he never runs, and he is between them and the way
out.
- **Fight:** **HP 20, armour 2, shears 1d8+2, Brawl/Melee 60%.** He is the actual fight
in this scenario. He is slow, he never runs, and he is between them and the way out.
Expect about four and a half rounds, and expect somebody to get hurt.
*(Tuned by playing it thirty times — see the playtest note at the foot of this file.)*
- **Script break:** *he will not come in the house.* Going inside is a complete answer
and it costs nothing. Reward it. He waits on the lawn.
@@ -275,8 +279,9 @@ Someone has to get thirty people across ninety feet of lawn past Old Marrow.
- **Three ways to run it:** fight him, distract him (he follows anyone off the grass), or
go back inside and out through the kitchens — Sharrock built the sets and knows there
is a door there; the plans are pinned in the green room for anyone else.
- **Rounds:** four is plenty. He closes at a walk, one attack a round, and he goes for
whoever is furthest from the house.
- **Rounds:** four or five. He closes at a walk, one attack a round, and he goes for
whoever is furthest from the house. He drops somebody in about one fight in three —
and *dropped* is dropped, not dying.
- **If it goes badly:** he does not pursue anyone indoors and he does not finish anybody
off. He sees them off the grass. That is his whole page.
- **Idle players:** hand them the hen party — six frightened people who need telling what
@@ -464,3 +469,33 @@ If there is time — and there usually is, because this ends early — she says
**OPEN DAY** is the longer, quieter one — 2h15, no combat, a fixed timetable — and it is
built for the ten-agent roster rather than these six. Run either. They are alternative
first nights and nothing in the campaign depends on which.
---
## Playtest note — one run, six characters, 12 August
Played through in Foundry with the six on their civilian sheets. Five things came out
of it, all now fixed:
1. **Pollard and Agyeman were armed.** The `police` trade kit contains a revolver and a
stab vest — right for a serving officer, wrong for a British civilian, and it ended
the only fight in one round. The civilian build now strips firearms and body armour
from trade kit, and the build throws if one gets through. Finch keeps her knife.
2. **Old Marrow's shears were a utility knife.** The page said 1d8+1; the actor in the
pack carried 1d4+2. He now carries a billhook — a real garden tool in the catalogue —
and the page says 1d8+2, which is what a billhook does.
3. **He was too soft.** At the original numbers he died in 2.4 rounds and in 6 runs of
20 he was dead before he swung. At **HP 20, armour 2** he lasts about four and a half
rounds, somebody is hurt in 28 runs of 30, and somebody goes down in 9.
4. **Two stat lines disagreed with the sheets** (Marrow 16 vs 15, Enderby 13 vs 12).
Both corrected, and `check-behaviour` now parses this document's fight line and
compares it to the actor the build generates.
5. **Two rolls had no failure written.** The body (now marked *no roll*) and Sammy's
ankle pull (now has a fumble result).
The run itself: Act One's optional Spot clues both missed and cost nothing, because the
essentials are automatic. Ashcroft found Edith Crane on Research. Braithwaite failed the
body twice, which no longer matters. Renshaw broke Sister Enderby by walking the sixth
person back into the room without a die being rolled. Braithwaite fumbled the ankle pull
on a 100 and Sharrock hauled him out. Marrow took four rounds and put Pollard on eight
hit points. Renshaw talked Tunnicliffe down on a Persuade success. Panel down at 23:40.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000004
MANIFEST-000002
+1 -5
View File
@@ -1,5 +1 @@
2026/08/12-17:49:53.368182 1740df000 Recovering log #3
2026/08/12-17:49:53.368621 1740df000 Level-0 table #5: started
2026/08/12-17:49:53.368768 1740df000 Level-0 table #5: 4591 bytes OK
2026/08/12-17:49:53.369101 1740df000 Delete type=0 #3
2026/08/12-17:49:53.369149 1740df000 Delete type=3 #2
2026/08/12-18:21:45.126312 1700b3000 Delete type=3 #1
-1
View File
@@ -1 +0,0 @@
2026/08/12-17:49:38.068944 170d6f000 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
View File
@@ -1 +1 @@
MANIFEST-000004
MANIFEST-000002
+1 -5
View File
@@ -1,5 +1 @@
2026/08/12-17:49:53.391934 1750f7000 Recovering log #3
2026/08/12-17:49:53.392050 1750f7000 Level-0 table #5: started
2026/08/12-17:49:53.392170 1750f7000 Level-0 table #5: 4129 bytes OK
2026/08/12-17:49:53.392389 1750f7000 Delete type=0 #3
2026/08/12-17:49:53.392428 1750f7000 Delete type=3 #2
2026/08/12-18:21:45.197775 16f09b000 Delete type=3 #1
-1
View File
@@ -1 +0,0 @@
2026/08/12-17:49:38.136741 17157b000 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
View File
@@ -1 +1 @@
MANIFEST-000004
MANIFEST-000002
+1 -5
View File
@@ -1,5 +1 @@
2026/08/12-17:49:53.370014 1748eb000 Recovering log #3
2026/08/12-17:49:53.370516 1748eb000 Level-0 table #5: started
2026/08/12-17:49:53.370852 1748eb000 Level-0 table #5: 31614 bytes OK
2026/08/12-17:49:53.371120 1748eb000 Delete type=0 #3
2026/08/12-17:49:53.371155 1748eb000 Delete type=3 #2
2026/08/12-18:21:45.128218 16f09b000 Delete type=3 #1
-1
View File
@@ -1 +0,0 @@
2026/08/12-17:49:38.070939 171d87000 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
View File
@@ -1 +1 @@
MANIFEST-000004
MANIFEST-000002
+1 -5
View File
@@ -1,5 +1 @@
2026/08/12-17:49:53.383707 1740df000 Recovering log #3
2026/08/12-17:49:53.384445 1740df000 Level-0 table #5: started
2026/08/12-17:49:53.384803 1740df000 Level-0 table #5: 44041 bytes OK
2026/08/12-17:49:53.385114 1740df000 Delete type=0 #3
2026/08/12-17:49:53.385152 1740df000 Delete type=3 #2
2026/08/12-18:21:45.182031 16e88f000 Delete type=3 #1
-1
View File
@@ -1 +0,0 @@
2026/08/12-17:49:38.120600 170563000 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
View File
@@ -1 +1 @@
MANIFEST-000004
MANIFEST-000002
+1 -5
View File
@@ -1,5 +1 @@
2026/08/12-17:49:53.355183 1748eb000 Recovering log #3
2026/08/12-17:49:53.357363 1748eb000 Level-0 table #5: started
2026/08/12-17:49:53.358793 1748eb000 Level-0 table #5: 225945 bytes OK
2026/08/12-17:49:53.359057 1748eb000 Delete type=0 #3
2026/08/12-17:49:53.359096 1748eb000 Delete type=3 #2
2026/08/12-18:21:45.164307 16e88f000 Delete type=3 #1
-1
View File
@@ -1 +0,0 @@
2026/08/12-17:49:38.104926 171d87000 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
View File
@@ -1 +1 @@
MANIFEST-000004
MANIFEST-000002
+1 -5
View File
@@ -1,5 +1 @@
2026/08/12-17:49:53.364381 175903000 Recovering log #3
2026/08/12-17:49:53.364910 175903000 Level-0 table #5: started
2026/08/12-17:49:53.365049 175903000 Level-0 table #5: 3295 bytes OK
2026/08/12-17:49:53.365394 175903000 Delete type=0 #3
2026/08/12-17:49:53.365437 175903000 Delete type=3 #2
2026/08/12-18:21:45.192532 16e88f000 Delete type=3 #1
-1
View File
@@ -1 +0,0 @@
2026/08/12-17:49:38.131380 17157b000 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
View File
@@ -1 +1 @@
MANIFEST-000004
MANIFEST-000002
+1 -5
View File
@@ -1,5 +1 @@
2026/08/12-17:49:53.343466 1740df000 Recovering log #3
2026/08/12-17:49:53.346354 1740df000 Level-0 table #5: started
2026/08/12-17:49:53.349680 1740df000 Level-0 table #5: 546705 bytes OK
2026/08/12-17:49:53.350185 1740df000 Delete type=0 #3
2026/08/12-17:49:53.350240 1740df000 Delete type=3 #2
2026/08/12-18:21:45.149192 16f09b000 Delete type=3 #1
-1
View File
@@ -1 +0,0 @@
2026/08/12-17:49:38.090847 170563000 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
View File
@@ -1 +1 @@
MANIFEST-000004
MANIFEST-000002
+1 -5
View File
@@ -1,5 +1 @@
2026/08/12-17:49:53.373813 1750f7000 Recovering log #3
2026/08/12-17:49:53.374272 1750f7000 Level-0 table #5: started
2026/08/12-17:49:53.374551 1750f7000 Level-0 table #5: 21613 bytes OK
2026/08/12-17:49:53.374779 1750f7000 Delete type=0 #3
2026/08/12-17:49:53.374812 1750f7000 Delete type=3 #2
2026/08/12-18:21:45.189595 1700b3000 Delete type=3 #1
-1
View File
@@ -1 +0,0 @@
2026/08/12-17:49:38.128383 170563000 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
View File
@@ -1 +1 @@
MANIFEST-000004
MANIFEST-000002
+1 -5
View File
@@ -1,5 +1 @@
2026/08/12-17:49:53.385969 1740df000 Recovering log #3
2026/08/12-17:49:53.386885 1740df000 Level-0 table #5: started
2026/08/12-17:49:53.387263 1740df000 Level-0 table #5: 43953 bytes OK
2026/08/12-17:49:53.387509 1740df000 Delete type=0 #3
2026/08/12-17:49:53.387539 1740df000 Delete type=3 #2
2026/08/12-18:21:45.186121 16f09b000 Delete type=3 #1
-1
View File
@@ -1 +0,0 @@
2026/08/12-17:49:38.124895 171d87000 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
View File
@@ -1 +1 @@
MANIFEST-000004
MANIFEST-000002
+1 -5
View File
@@ -1,5 +1 @@
2026/08/12-17:49:53.375753 175903000 Recovering log #3
2026/08/12-17:49:53.376385 175903000 Level-0 table #5: started
2026/08/12-17:49:53.376715 175903000 Level-0 table #5: 33484 bytes OK
2026/08/12-17:49:53.376959 175903000 Delete type=0 #3
2026/08/12-17:49:53.376987 175903000 Delete type=3 #2
2026/08/12-18:21:45.196269 16f09b000 Delete type=3 #1
-1
View File
@@ -1 +0,0 @@
2026/08/12-17:49:38.135361 17157b000 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
View File
@@ -1 +1 @@
MANIFEST-000004
MANIFEST-000002
+1 -5
View File
@@ -1,5 +1 @@
2026/08/12-17:49:53.361533 175903000 Recovering log #3
2026/08/12-17:49:53.361695 175903000 Level-0 table #5: started
2026/08/12-17:49:53.361841 175903000 Level-0 table #5: 7590 bytes OK
2026/08/12-17:49:53.362062 175903000 Delete type=0 #3
2026/08/12-17:49:53.362096 175903000 Delete type=3 #2
2026/08/12-18:21:45.120890 16e88f000 Delete type=3 #1
-1
View File
@@ -1 +0,0 @@
2026/08/12-17:49:38.062885 171d87000 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
View File
@@ -1 +1 @@
MANIFEST-000004
MANIFEST-000002
+1 -5
View File
@@ -1,5 +1 @@
2026/08/12-17:49:53.388330 1740df000 Recovering log #3
2026/08/12-17:49:53.388940 1740df000 Level-0 table #5: started
2026/08/12-17:49:53.389166 1740df000 Level-0 table #5: 16902 bytes OK
2026/08/12-17:49:53.389390 1740df000 Delete type=0 #3
2026/08/12-17:49:53.389423 1740df000 Delete type=3 #2
2026/08/12-18:21:45.191070 16f09b000 Delete type=3 #1
-1
View File
@@ -1 +0,0 @@
2026/08/12-17:49:38.129923 17157b000 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