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>
4.3 KiB
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.