diff --git a/docs/VERIFY_GENERATORS.md b/docs/VERIFY_GENERATORS.md new file mode 100644 index 0000000..2ac9e7a --- /dev/null +++ b/docs/VERIFY_GENERATORS.md @@ -0,0 +1,85 @@ +# 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.*