The three sidebar buttons build actors through Actor.create, compendium reads and a dialog, and check-behaviour says in its own header that it cannot reach any of that. The derivations are covered by 450 forged combinations and 210 posting × tier pairs; the glue is covered by nothing, and no world was running to exercise it. So this is the shortest path from a launched world to knowing. Every expected value in it was derived by running the code — drawKitFor for the kit rows, forgeCreature at seed 7 for the forge rows — rather than written from memory. It also says what a failure means: a wrong number points at the derivation and should reproduce from the CLI, while a missing item or a dialog that does not open points at the glue and will not. One figure in the first draft — "476 guarded combinations" — was invented. Replaced with the two the guards actually print. A verification document that carries a made-up number is worse than none, because it is read as the authority on what to expect. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
86 lines
4.3 KiB
Markdown
86 lines
4.3 KiB
Markdown
# Verifying the generators in a live world
|
||
|
||
The three Actors-sidebar buttons build actors through `Actor.create`, compendium reads and
|
||
a dialog. `tools/check-behaviour.mjs` says in its own header that it cannot reach any of
|
||
that, so none of it has been exercised — the derivations behind it are covered by
|
||
`check-forge` (450 creatures derived across every role, size, tier and species) and
|
||
`check-generator` (210 posting × tier pairs), and the Foundry glue is covered by nothing.
|
||
|
||
This is the shortest path to knowing whether it works. Every expected value below was
|
||
derived by running the code, not remembered.
|
||
|
||
**Before starting:** the system must be redeployed and **the world relaunched**. Foundry
|
||
builds its package list at world launch, so a world launched before the deploy is running
|
||
the old code and will show none of this.
|
||
|
||
---
|
||
|
||
## 1 · New NPC · Trained · Containment
|
||
|
||
Actors sidebar → **New NPC** → Species baseline, Role *Containment*, Threat *Trained*, Count 1.
|
||
|
||
| Expect | Why |
|
||
|---|---|
|
||
| A **Marksman rifle**, equipped | the posting's first weapon; `draw.weapons` is 1 at this tier |
|
||
| **Firearm (rifle)** at 30–45% | the rifle names its own skill, granted at the tier band |
|
||
| A **Breaching suit**, equipped | `draw.armour` is 1 |
|
||
| **3 gear items**, drawn at random from the posting's nine | `draw.gear` is 3 |
|
||
| **Natural armour 0** | the number used to stand in for armour; the suit is a real item now |
|
||
| **62 skills** on the sheet, untrained ones at their printed base | every other actor in the game has them |
|
||
| A chat card naming the rifle and `armour 7 — Breaching suit 7` | the card printed neither before |
|
||
|
||
**The one that matters:** before this work the actor got a *utility knife* while the dialog's
|
||
role card promised nine items. If you see a knife, the deploy did not take.
|
||
|
||
## 2 · New NPC · Apex · Containment — the balance case
|
||
|
||
Same dialog, Threat *Apex*.
|
||
|
||
| Expect | Why |
|
||
|---|---|
|
||
| **Marksman rifle** and **Entry bar** | `draw.weapons` is 2, taken in the order the posting lists them |
|
||
| **Breaching suit** and **Riot shield** | `draw.armour` is 2 |
|
||
| **Grasping limb** and **Unmaker** as well | creature tiers keep their natural attacks on top of what they drew |
|
||
| **Natural armour 7**, and the card reading **armour 17** | hide 7 + suit 7 + shield 3, which stack per location |
|
||
| Skills at 65–85% | the tier band |
|
||
|
||
**Read the number before using one at a table.** Measured against the four agents
|
||
`check-lethality` freezes, this wipes the party **88.5%** of the time, up from 68.2%. An
|
||
*Anomalous* Containment officer went from 0.3% to 19.2%. R-310 has the table and the
|
||
reason.
|
||
|
||
## 3 · Forge creature — the new button
|
||
|
||
Actors sidebar → **Forge creature** → role *Brute*, size *Large*, tier *Apex*, Seed 7.
|
||
|
||
| Expect | Why |
|
||
|---|---|
|
||
| The card describes it **before** you press Forge | it forges a throwaway at those settings rather than describing one |
|
||
| Body **quadruped**, though species is baseline | a brute is an animal; the role picks the body |
|
||
| **Horn / tusk** and **Trample** | what a quadruped can do, in the role's preference order |
|
||
| SIZ 17, STR 21, hide 7 | seed 7 exactly — a different seed gives a different animal |
|
||
| Token **2×2** on the map | SIZ ≥ 21 is 2 squares, ≥ 30 is 3 |
|
||
| The line under the tier: *"kills about one agent…"* | measured, not an adjective |
|
||
|
||
Then `node tools/forge.mjs explain --role brute --size large --tier 4 --seed 7` should name
|
||
the rule behind every one of those numbers, and match what the sheet shows. **If the sheet
|
||
and the CLI disagree, that is the failure this design exists to prevent** — say so rather
|
||
than picking one.
|
||
|
||
## 4 · Count 4
|
||
|
||
Any of the three, Count 4. Four *different* actors, not four copies: gear is drawn at
|
||
random per actor and the forge walks its seed. Four identical sheets means the randomness
|
||
is resolved once and reused, which is a defect this generator has had before.
|
||
|
||
---
|
||
|
||
## What a failure here means
|
||
|
||
The derivations are guarded and measured; what is unproven is `Actor.create`, the pack
|
||
reads and the dialog wiring. So a wrong **number** points at the derivation and should be
|
||
reproducible from the CLI, while a **missing item, an empty sheet or a dialog that does not
|
||
open** points at the glue and will not be.
|
||
|
||
*Private convention play materials — not for sale or distribution.*
|