Files
RingBRP/docs/VERIFY_GENERATORS.md
slaguru666andClaude Opus 5 3e915b6bfd A checklist for verifying the generators in a live world
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>
2026-09-23 01:23:15 +01:00

86 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.*