Commit Graph
40 Commits
Author SHA1 Message Date
slaguru666andClaude Opus 5 5bc46879c7 THROUGH TRAIN: put the gunfight inside the loop
The loop is no longer just a train going round. It is FOUR MINUTES with a
gunfight in it, and those four minutes have run about two million times.

Two sides, and neither is the villain. Cass Merritt and three hired men have a
signed letter of engagement from the company telling them to surrender the
payroll to nobody "upon any pretext whatsoever, including the presentation of
any paper". Josiah Ambrose and four Cordera miners have a sealed writ of
attachment from a territorial judge naming that same payroll against eleven
weeks of unpaid wages. Both documents are genuine. Neither man has seen the
other's. The company sold the same money twice and is not aboard. Both are
handouts now, and they only mean anything held in the same hand.

The mission is restated everywhere it appears — briefing page, case brief, GM
essentials: CLOSE IT. Closing the crossing does not kill anybody, it lets them
go. The loop ends, 3 November 1881 resumes from 11:44, and everyone aboard walks
forward into the life they would have had — including Ambrose and a miner named
Doyle, who did not survive the real four minutes. The agents are not choosing
who lives; they are choosing to stop holding history still, having met the
people it lands on.

The standing order is louder in three places: NOTHING MODERN GOES THROUGH.

Two things the playtest found, both now written into the text:

  - THE FIGHT WAS A TPK GENERATOR. Modelled with all nine shooters firing at the
    party it wiped them 171 times in 200. The model was wrong — the two sides
    are shooting at EACH OTHER — so the scenario now carries a measured exposure
    table: head down draws nothing, acting from cover costs half a party member
    and no wipes over 300 runs, moving in the open costs one, and going for the
    payroll box wipes more than half of all parties. The GM is told to say that
    last row out loud BEFORE anybody commits to it.

  - THE LOOP RESETS AND THE AGENTS DO NOT. Everyone who belongs to 1881 is back
    up unhurt on the next pass. The agents keep their wounds. Nothing said so,
    and a player who assumes otherwise takes risks that kill them. It is now
    stated in capitals in both documents, with the played pass that prompted it
    — two of four down at 0 hit points, one untouched because he stayed on the
    floor.

Nine cast members, eight handouts, ten plates.

Version 1.4.0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 22:20:00 +01:00
slaguru666andClaude Opus 5 774e95dea8 THROUGH TRAIN — the crossing starter, and two more playtest fixes
A train has been running the same four miles of track since 3 November 1881. It
has never stopped. Sixty-one people are aboard and all of them are alive.

The supernatural is science fiction underneath, which is the point. A railway
company laid track to a filed survey instead of to the ground, then described the
line as being where it was not — ten thousand times, in timetables and waybills
and telegraph orders, for six months, at a constant speed. Reality keeps a record
of what belongs where, and that is the most patient argument there is. The record
gave way with No. 9 inside it, and the RUNNING is what holds the crossing open: a
standing wave sustained by its own motion the way a bow sustains a note.

So the players must board a train that cannot stop, and then find that sixty-one
people at six passes is four hours they do not have. The ending is what they
choose to do about arithmetic they cannot beat, in front of a conductor holding
the manifest. No roll resolves it.

It is also the case that teaches Standing Order 9: NOTHING MODERN GOES THROUGH.
Using a modern object across costs a Coherence and moves the clock; carrying it
costs nothing; anchors are exempt. The catalogue already had the 1881 issue —
Webley, Martini-Henry, oil lantern, brass compass, pocket watch, buff coat,
laudanum — so the constraint needed no new content and gives the table something
to feel in the first twenty minutes.

Ships as docs/scenarios/THROUGH_TRAIN.md and a Foundry Adventure: 7 GM pages, 6
handouts including the survey that started it and a manifest deliberately held
back to Act Three, the case file at Containment 6 / Resources 5 / Clearance 4
with its four legs loaded, four of the people aboard, and 7 plates to show.

Two fixes from playing it:

  - Bhattacharya's RESEARCH was 1%. Placing the new skills last night I swapped
    Occult into Registry's core and took Research out — a records office that
    cannot look anything up. Research is back in core; Antiquities gets its
    Knowledge back the same way.

  - The boarding was unrunnable. At halved skill the set-piece put four agents on
    12–31% and all four missed, which stalls the one scene the scenario is built
    around. It is an average roll now and only a fumble is a fall, with the
    reason written into the text so nobody "fixes" it back. Re-run: 3 of 4 aboard
    on the first pass and one waiting for the next, which is the shape it wanted.

Version 1.3.0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 00:25:19 +01:00
slaguru666andClaude Opus 5 ab619f4b73 Remove the dice textures and the whole Dice So Nice path
Deleted: the seven PNGs in dice/, tools/make-dice-textures.mjs, the `npm run
dice` script, the RB_DICE colourset and texture tables, diceSetFor, the
diceSoNiceReady hook, and rbDressDice — which was tagging ten roll sites with
coloursets that no longer existed. 99 lines of module, plus the assets.
README and DEPLOY updated; they still advertised all of it.

Recoverable with `git revert` if it is ever wanted back.

This also explains the 01-that-was-12. The RESULT was never wrong: skillRoll
rolls one 1d100 and grades on roll.total, and the chat card derives the tens and
units it prints from that same total. Checked all 100 values of percentileFaces
and 60 live rolls — the printed faces reconstruct the graded number every time,
with no mismatches.

What disagreed was the ANIMATION. The custom addDicePreset labels registered for
d100 and d10 remapped which physical face means what, so Dice So Nice could land
showing 01 while the roll behind it was 12. Nothing downstream ever read the
animated faces, so no roll was ever adjudicated on the wrong number — but a
table watching the dice had every reason to believe otherwise, which is its own
kind of wrong. Disabling the skins in 1.0.6 already removed it; deleting them
makes it permanent.

Verified in a running Foundry after removal: skill roll, weapon damage, hit
location, major wound and Coherence all resolve and post their cards, no errors,
and game.ringbrp.diceSetFor is gone from the API.

Version 1.0.7.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 22:45:52 +01:00
slaguru666andClaude Opus 5 53481bdfc1 Ship the LAST ADMISSION plates as showable images
A third journal in the adventure — LAST ADMISSION — Show the players — holding
the seven scene plates and the floor plan as eight image pages at player
visibility. Right-click, Show Players, done.

title.show is false and there is no caption, on purpose: the table gets the
picture and nothing else. No heading telling them which room this is, no label
naming the thing on the stairs. The page NAMES exist only for the GM's sidebar
so the right one can be found in a hurry under pressure, and the players never
see them.

Ordered by when each comes up, not by asset number, for the same reason.

The builder throws if a plate is missing from disk, because a missing image is
a blank frame on a projector in front of six people.

Verified in Foundry: eight pages import at OBSERVER, the image loads, and the
rendered page contains no headings, no figcaption and no text at all.

Version 1.0.3.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 19:12:35 +01:00
slaguru666andClaude Opus 5 51bd8e618a Audit every remaining sheet and dialog; add the Culland Hall scene
Opened all of it this time, rather than driving the system through its API.

Two more defects of the same family as the NPC sheet, and in the same place —
the types added last:

  - Talent and Art had no TYPES.Item.* label, so their sheets printed the raw
    key "TYPES.Item.talent" under the name.
  - Neither had a branch in item-sheet.hbs or an isTalent/isPower flag, so the
    Detail tab rendered EMPTY over a document holding category, rule, uses per
    case, Coherence cost, push cost and origin. Eleven of thirteen types were
    handled, which is exactly the shape an eye skips.

Both now have a header statline and a full Detail section, and a guard walks
template.json: every declared type must have a label, a flag set in ringbrp.mjs,
and an {{#if isX}} section in the sheet.

One hardening fix: loseCoherence applies the cost and THEN announces it, so
anything that throws in between leaves the actor quietly poorer with no message.
localize() throws on a non-string, which an unrecognised reason key is.

Everything else came back clean, and it is worth recording what was checked so
the next audit knows what "checked" meant: 13 item types opened, all render; the
expedition sheet (4 tabs); all 7 chat cards driven through their real entry
points — roll, coherence, reaction via Combat.rollAll, hit location, weapon
damage, major wound, and contact through a case file that actually has a group;
all 3 dialogs opened by clicking the controls a player clicks. No errors, no raw
localisation keys anywhere.

Also: Culland Hall as a playable Scene. Drawn as SVG rather than generated,
because a room count, a door position and a label are all load-bearing here and
a generator cannot be trusted with any of them — three label-collision passes in
the browser before it was clean, which is the documented cost of doing it this
way. 2800x2000 at 100px to the square so the Foundry grid lands on the grid
drawn into the image; 5ft squares; no walls, because half-done walls are worse
than none and a GM who wants vision can add them in ten minutes.

Verified in Foundry: the scene imports, activates, and draws.

Version 1.0.2.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 19:02:18 +01:00
slaguru666andClaude Opus 5 1bf8d7f6fb 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>
2026-08-12 18:21:45 +01:00
slaguru666andClaude Opus 5 d063b3c016 Add LAST ADMISSION, a two-hour haunted-house prologue
OPEN DAY was too complex for a first night: a fixed timetable the GM narrates
minute by minute, three things that must be left unresolved, ten serial approach
scenes, and no combat. This is the replacement opener — same premise engine,
a third of the moving parts, and something to hit.

A cheap scare attraction on the last night of its six-week run, in a real empty
hall, with paying public still inside. Three of the ghosts on the poster were
invented in an afternoon by a marketing agency, printed on the tickets and the
wall panel and the call sheets, and performed forty times a night to twelve
thousand people who agreed to believe them for eighteen pounds each. They are
in the building now. They are not ghosts, they are entries, and they have
exactly as much inside them as was written down — a page each, which they do,
and nothing else. That makes them simple to run and simple to stop: hurt them,
or break the script. Both work; the script is faster and cheaper, and a table
that finds it should feel clever.

The fourth name on the panel was copied off a memorial in the parish church
because the layout needed four. Edith Crane was real, died in a real fire here
in 1963, and nobody wrote her a page because nobody had to. She never attacks,
cannot be hurt, and will not speak until she is asked her name. She wants her
name off a poster. The night ends on whether it comes down tonight or on Monday
— and Monday is two performances away.

Written for the second intake specifically, on their civilian sheets, with each
one's job as their way in: Renshaw is IN the show and knows the running order,
Ferriby wired it, Sharrock built the sets, Pollard is on the door, Braithwaite
and Ashcroft paid to get in. Each shortcuts a different part of the middle and
none of them is required.

Art: eight plates commissioned, seven kept. The wall panel plate was cut after
two attempts both produced three frames instead of four — a picture that
contradicts a count the scenario turns on is worse than no picture, so the panel
is a handout the GM shows rather than describes. The freed green-room plate went
onto the Act One page, where the call sheet is.

OPEN DAY stays in the repo as the longer, quieter alternative; both scenarios
say plainly which is which and that nothing depends on the choice.

Verified in Foundry: the adventure imports, six cast, seven GM pages, five
handouts, plates load.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 17:50:52 +01:00
slaguru666andClaude Opus 5 f185c92088 Add OPEN DAY, the recruitment prologue
Ten civilians, one decommissioned telephone exchange, and eleven minutes during
which the building went back to being on the street it was built on. Nothing
attacks anybody. Nothing wants anything. That is the horror, and it is the whole
design.

The premise was already in the pregens. Wren Finch's biography said she was
inside a building "on the night it stopped being on the street it was on", and
Soraya Rahimi's said she talked a caller down on air "for eleven minutes, and
the recording does not play back the same way twice". Those are two views of one
afternoon, so the scenario is built at the intersection and the other eight
"How they found her/him" lines are the same afternoon from eight more jobs.
Nothing in the prologue contradicts a sheet, because the sheets came first.

The reconciliation pass, which is most of the work:

  - Finch's line said "night". The open day is an afternoon. One word changed on
    the pregen, and both are true. Her line also says she was the only witness
    who could describe the inside, so she is the one who goes into number 11 —
    written into the location note rather than left to chance.
  - Rahimi's line says she was ON AIR. So the disconnected telephone that rings
    at 15:45 is patched through to her outside broadcast, which makes the canon
    line and the scene the same event instead of two coincidences.
  - Okonkwo carries two men out; Nkemdirim's patient has a forearm that healed
    crooked over a break he took six minutes ago. Both seams needed an injury in
    Act Two and there was none, so 15:50 and 15:51 now have one.
  - Sandoval's forty minutes of traffic sit inside an eleven-minute window. That
    is the anomaly, so it is on the handout in those words.
  - "Prine" collided with an NPC already in the world. The engineer is Kearsley.

Structure: 2h15 against the house 3h30, stated in the design intent, because a
prologue exists to make the first real case land. No combat, no antagonist, no
Coherence — the last one is thematic, not a simplification: Coherence is what it
costs to keep looking once you know what you are looking at, and these ten do
not know yet. The Briefing is the first time the word is said aloud.

Ships as docs/scenarios/OPEN_DAY.md (the full GM document) and a Foundry
Adventure in a new `prologue` pack: 8 GM pages, 7 handouts, 5 NPCs, and ten
generated plates. The PCs are the "(before)" pregens already in the Pregens
pack — a second copy here would give a GM two sets of the same ten people and
no way to know which one their notes were on.

Verified in Foundry: the adventure imports, both journals render branded, the
countdown table reads as a table, and all ten plates load.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 17:03:49 +01:00
slaguru666andClaude Opus 5 7f8355f0d0 Add the player primer and cheat sheet, and brand every journal
Ten pages a player reads before session one, in their own compendium at OBSERVER
ownership: nine of setting, one cheat sheet.

The draft called the organisation "the Bureau"; everything else in the game calls it
the department or the agency, so that is what it is called. Thin areas filled rather
than padded: the seven character principles as a list, the real Coherence band table
instead of a paragraph describing one, and "what continuity is not" pulled out of the
middle of a page because it is the most important sentence for a new player.

The cheat sheet's numbers are computed from rules.mjs and lang/en.json at build time.
A hand-typed one would have been the sixth time this project shipped a number that
disagreed with the code, and the one the players were holding.

R-250: the design tokens were never on :root. Journals rendered as default parchment,
and four things were wrong in sequence — v14's hook is renderJournalEntrySheet; its
`element` is the node, so `[0]` returns the first CHILD and put the class on a header
button; there is no .journal-page-content in v14; and then the real one: with the
selector matching, font-size, line-height and padding all applied while every colour
did not, because the palette is declared on .ringbrp-sheet/.ringbrp-chat/.ringbrp-window
and never on :root. A journal inherited no tokens, so every var() silently became
nothing. A rule that HALF applies is not a specificity problem — I spent three attempts
treating it as one, including a version bump on a cache theory that was wrong.

Branded: primer, rulebook, starter GM text and handouts. Scoped by flag, so other
modules' journals are untouched. Version 0.9.0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 10:19:41 +01:00
slaguru666andClaude Opus 5 d9bce12c27 Replace the starter with BLACK PLATFORM, and make the dialogs ask questions
The starter is now an action case: a train running through a station whose rails were
lifted in 1976, two engineers aboard, eleven minutes until it returns. Descend, take the
platform, board, rescue, fight forward along a moving train, stop it.

Simpler than PAPER WINDOW on purpose — one clue scene, no social subsystem — which also
means it cannot reproduce R-248, because there are no groups or standings to leave
unwired.

Every agent can fight, deliberately: floors of firearm 42%, melee 40%, Brawl 40%,
Dodge 40% so nobody is a spectator on their first evening. Floors only RAISE, so a
posting already better stays better — Callum's shield lands at 53, not the floor's 45.

The builder now handles combat floors, extra weapons issued for a case, and a scenario
with NO Borrowed Authority at all; the last was assumed to exist and would have thrown.
Two new tests: every floor names a real skill, and every agent clears the fighting
floors the handout promises.

Sixty-two dialog strings reworded. They were naming mechanics at people: "Situational
modifier %" is now "Anything else helping or hurting? (%)", "Target cover" is "Is the
target behind anything?", "Difficult (÷2)" is "Difficult — half your skill". Labels ask
the question; hints say what it does to the number; notifications say what to do next
rather than what went wrong.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-12 00:08:07 +01:00
slaguru666andClaude Opus 5 4e28de2a64 Play PAPER WINDOW with the shipped pregens; fix four silent defects
Ran the starter end to end. It closed, and it found four defects in what I shipped an
hour earlier — all in the scenario data, all silent.

R-247: the Borrowed Authority did not work. I wrote scope "operate", which is not one
of the five scope tiers; an unrecognised scope ranks 0 and every action came back
"impossible" with no error. The first scene of the starter is the Borrowed Authority
tutorial. Fixed, guarded in check-kits, and covered by a test that documents the
failure mode.

R-248: the contact subsystem was unreachable in the scenario built around it. The case
file carried a standing for the Returned Clerks and no GROUP ITEM; resolveContact
returns null without one, so READ, SIGNAL and OFFER did nothing. Groups are data now,
and a test asserts every standing on a shipped case file has a group behind it.

R-249: legs wrote `kindId` where resolveLegDialog reads `leg.kind`. It worked only
because the terrain text happens to begin with "Extraction".

Not a defect: phase four went Difficult because Resources hit 0 and destitution makes
every remaining phase Difficult. Best beat in the session.

All four phases failed and the case still closed — Containment 8 to 2, Resources 8 to
0 — which is what the scenario is built to survive. Two of six closing requirements
succeeded and the settlement still completed. The Cancellation Man opened with a
critical against a raised riot shield and went through 10 points of armour, teaching
the shield and graded-defence lessons in one roll.

Also documented: nobody on the starter team can aim the return, because only the Anchor
Officer trains Transposition. The extraction page now says to narrate it rather than
roll six dice that will all fail.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 23:39:43 +01:00
slaguru666andClaude Opus 5 49c2e9fc7b Add PAPER WINDOW as the starter scenario Adventure
The six-player introductory case ships as a Foundry Adventure in a new `starter` pack,
because a scenario that arrives as nine loose documents a GM has to assemble is a
scenario that gets read rather than run.

One import brings in: the GM scenario in twelve pages; the seven player handouts as
their own journal at OBSERVER ownership so they can be revealed one at a time without
the GM editing permissions first, while the GM text stays hidden; the six pregens built
through the same buildActor path the shipped pregens use, so they arrive with full skill
lists, kit, hit points and linked tokens; the cast, including the Cancellation Man; the
Borrowed Authority as a real credential with scope, Trust 2 and its three red flags; and
the case file already at Containment 8 / Resources 8 / Clearance 6 with its four phases
loaded at the stated difficulties and modifiers.

Pregen ratings are fixed at mid-band rather than rolled — a pregen that varies between
installs is not a pregen. The expansion from posting or trade into a sheet reuses the
register and the induction rule rather than restating them, so the starter cannot drift
from the generator.

Verified by importing it: no errors, the roster resolves through stable keys, handouts
arrive player-visible, Nia has the team's highest Tradecraft as the text requires,
Callum's shield is slung so raising it is still a decision, the three probationers show
the trade/induction split, and phase one runs out of the box.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 23:25:10 +01:00
slaguru666andClaude Opus 5 43508259ac Consolidation pass after a Codex review
Four real defects, each verified against the source before acting on it.

Trade expertise was coupled to agency rank. A probationary burglar came out at 35-50%
and a veteran at 65-80%, as though fifteen years of picking locks were something the
department conferred. TRADE_BANDS is now fixed at 50-65/30-50 at every rank, and
INDUCTION scales with service instead (20-32 probationary to 45-60 veteran) because
that half genuinely is the department's. The two axes were the wrong way round. This
is the thing I flagged myself after PAPER HARBOUR and then left alone — flagging a
defect is not the same as fixing it.

Bonus points were sprayed across every skill in the game. grantFullSkillList runs
immediately before the loop and puts all fifty-nine skills on the sheet, and the loop
picked from actor.items, so a veteran's ninety points landed anywhere. The comment two
hundred lines above has always said "over the core skills"; the code never did.

"Random species" passed "baseline" into generators that support random perfectly well.

No behavioural tests. The strongest point in the review: the three guards are static
and none of them can tell whether a rule is READ, which is the only kind of defect this
project has ever shipped. tools/check-behaviour.mjs now runs 28 deterministic tests,
gated into the build, covering R-231/232/243/245/246, graded defences and the lamp
rule. Proved it bites by re-breaking R-246.

The register moved to postings.mjs, a Foundry-neutral module the engine, rulebook,
guards and tests all import normally — they were previously pulled out of the engine
with a regex and eval, which worked and was a trap. My first version of that used
`export … from`, which re-exports without local bindings, so ROLES was undefined and
the system threw on init: node --check passes that, loading it in Foundry does not.

Also: the contact doc comment still said "only OFFER moves standing"; check-kits
accepted mas/app, which are the DISPLAY names of siz/cha, so a posting declaring one
would have passed and produced an undefined characteristic; package.json disagreed with
the manifest; README counts were three revisions stale and are now generated at build.

Deferred with reasons: splitting the 6,700-line engine into modules. Right, and a
multi-session refactor whose risk is exactly the silent breakage demonstrated above.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 22:57:20 +01:00
slaguru666andClaude Opus 5 c60485de72 Play PAPER HARBOUR with the criminal, and fix R-246
A pier that closed in 1974, a beacon still transmitting, and a probationer recruited
out of a city with a caution the department has quietly lost. The generator's gap —
somebody uses that agent's name before it is given — landed on him in phase 2, and he
held it on Fast Talk 14 against 48 while the Field Lead missed the read.

The case turned on a warrant card: the keepers of the ground want relieving by somebody
official enough to take the duty on, and every agent carries exactly that. Bargain 27,
favourable, rolled 33 — impression -1 to +1. The one unambiguously his moment was the
log the first team locked in behind them: 11 against Sleight of Hand 50.

R-246: a fumbled greeting cost nothing. contactOutcomes has said fumble/signal -1 since
the social pillar was built, and impression was adjusted only inside the `offer` branch
— so the -1 was computed on every botched greeting and thrown away. Impression now
falls on a fumble at any stage and still only rises on an offer; the narrower fix
matters because read's delta counts FACTS LEARNED, not standing, so applying the delta
always would have paid the team impression for doing research.

Also logged: a probationary criminal is out-sneaked by a career Field Lead (47 to 60)
because trade skills use the agency tier bands — defensible, flagged, not changed. And
one invented step of my own: I rolled Transposition to get them home after the
extraction phase had already put them out.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 22:35:37 +01:00
slaguru666andClaude Opus 5 b8430c284b Play PAPER MARGIN with a trade character
A farm in Angus, a person in two places, and a probationary doctor recruited from A&E
alongside two career officers. The generated case turned out to be its own best
argument for trades: the truth is that there is no original left, both are copies, and
telling two identical people apart is a medical question — Medicine on that team reads
42, 1 and 1.

Both halves of the trade design showed up. She was the only one carrying the
department's own vocabulary (Anomaly Lore 37 against 0 and 0, Tradecraft 31 against 5
and 5), and she was hopeless at closing: Persuade 23, rolled 95, read on Insight 60.

The examination failed by three and the bloods came back critical on 02 — both samples
are the same sample. Neither career officer could have found it.

R-226 fired visibly: trained Tradecraft 31 lost the phase lead to trained Navigate 34.
The riot shield issued to Containment two commits ago turned up unprompted and took
Kobe from 7 everywhere to 10 on torso and arms. Coverage applied to the opposition too
— the duplicate died through its bare leg.

One probe error recorded, not a defect: endOfCase returned nothing because my ad-hoc
rolls passed no skillFamilyId, so nothing ticked — the same omission R-222 found in
resolveLegDialog, reproduced by hand. Named properly, Medicine ticked and improved
42 -> 48%.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 21:55:36 +01:00
slaguru666andClaude Opus 5 79acc8227f Ten trades, an induction layer, and rolling the stats yourself
TRADES: ten ordinary jobs the department recruits from — construction worker, doctor,
professor, engineer, law enforcement, IT specialist, scientist, linguist, entertainer,
criminal. They are not postings. A posting is what the department made of you; a trade
is what you were before any of it.

A trade character is built in two halves. The trade is genuine expertise on the same
bands a posting's skills use — a doctor is a proper doctor. INDUCTION goes on top at
25-40%: Tradecraft, Anomaly Lore, First Aid, Firearm (Pistol), Dodge, plus a sidearm, a
vest, cordon kit, a cover identity and a ward. The band is low on purpose; six weeks is
not a career, and that gap is most of what it feels like to play one.

Induction never demotes: a former police officer keeps pistol 58 from the trade rather
than being re-taught it at 26.

The creation dialog gains a "Recruited as" switch with its own trade list and card
(which shows both halves), and check-kits now holds trades and induction to the same
standard as postings — both new guard paths verified by breaking them.

Rolling them yourself: a tickbox that walks the eight characteristics one at a time,
each roll announced to chat so the dice actually fall, "Take them" locked until all
eight are down. A hand-rolled character is taken exactly as it fell — no best-of-three
on the key stat, no species shift. Verified both ways.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 21:48:06 +01:00
slaguru666andClaude Opus 5 53eb72c100 Issue riot shields to Containment and the Night Warden
Both postings draw a riot shield, and both are trained to use it — issuing one without
the skill would have been R-212 again with a different item, the Antiquities Officer
who drew a flintlock and rolled 5% with it.

melee_weapon:shield is SWAPPED into each support list rather than added, so five core
and five support are preserved and the shield arrives without a free power bump.
Containment drops stealth (a posting whose job is being the thing in the doorway was
always the least stealthy in the department); the Night Warden drops navigate (they sit
with one site all night).

check-kits now requires the Shield skill for an issued shield, the same way it has
always required training for an issued weapon. Verified by removing the skill and
watching the build refuse.

Four generated agents: shield skill at 25-30%, nobody encumbered, though a Containment
officer lands at 32.9 of 33 kg. The shield ships slung — raising it is the choice, and
for the Warden it is the difference between 2 points of armour and 5.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 21:37:46 +01:00
slaguru666andClaude Opus 5 0c2636d543 Play the bell tower stair: shields, and what they cost
Two officers, identical kit — riot shield, stab vest, 12 hp, Shield 65% — and one
difference: one holds the shield up, one keeps it slung and shoots. Raised it is most
of their armour (torso 5, arms 3 against torso 2, arms 0 with it down).

Four ordinary blows turned aside cost the shield nothing, which is the right call: at a
point per parry a 5-wear riot shield would have been kindling before the fight started.
Round 8 a CRITICAL halberd was parried, dragged down one step, and the shield took 2
wear for absorbing it while the reduced blow still landed on the covered arm for 7.

Both officers were killed through the gaps a riot shield does not cover — one through
both legs, one through the head for 10 against a location maximum of 5, dead outright
rather than dying (R-227 holding).

The ranged penalty then decided it. Shield up, the survivor shot at 65% less 20% and
rolled 93, 89, 73, 65. That last number is the rule in one figure: 65 hits at 65% and
misses at 45%. The redcap was on 3 of 13 and walked away.

Nothing needed tuning. Full log in docs/REVIEW_LOG.md.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 21:08:12 +01:00
slaguru666andClaude Opus 5 c61700566c Shields: armour you raise, and the only armour you can defend with
A shield is the one piece of armour you hold, and it protects you exactly as much as
you are currently holding it up. Raised, its points apply to what it covers and it can
parry on a new Shield skill. Lowered, it is weight. The price of keeping it up is that
it occupies a hand and you are shooting around it: -20% to your own ranged attacks,
printed on the card like everything else. Only one shield goes up at a time.

Seven of them, 2-point buckler to 6-point ballistic shield; the pavise and barrier
plate cover legs too because they are walls you carry.

`degradation` finally does something — it has been on every armour item since the packs
were first built and was read by nothing. A blow costs the shield a point of wear for
every step it stood above an ordinary success, so an ordinary hit costs nothing, a
special 1 and a critical 2. At its limit it comes apart, drops, and will not be raised
again.

Two defects found by driving the real functions rather than reading the diff, both
introduced by this change:

- Every shield defence quietly rolled DODGE. "shield" passed through
  defenceTypeAllowed unchanged, so neither parry branch matched and it fell through.
  Invisible in the card; it showed up as eight rolls at a supposed 85% returning six
  failures. Taking a blow on the shield IS a parry, so it is now a flag on a parry
  rather than a defence type of its own.
- The wear rule was unreachable: it fired only on a clean stop, but under graded
  defences only a critical fully stops a critical, so a shield would never have taken
  a scratch. Wear is for what the shield ABSORBED — dragging a critical down to a
  special is exactly when shields splinter.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 18:25:30 +01:00
slaguru666andClaude Opus 5 016ea1c4ab Play the chantry ruin: coverage measured against points
Two officers from the same pregen, same hit points, same Sword and Dodge, armoured so
that the one carrying MORE points carried it in FEWER places: a breaching suit at 7
points on all seven locations against a cuirass and helmet at 9 points on three.
Against a redcap with an 80% halberd, where fourteen of twenty melee locations are
limbs.

The cuirass and helmet stopped fifteen points across three connecting blows and it did
not matter: the two hits that found a bare leg did every point they rolled, destroyed
the leg (12 against a maximum of 6), and started a six-round dying clock. Under the old
rule that leg carried 9 points and both blows would have done nothing.

The suited officer took the same weapon on a limb for zero and went nine rounds
untouched — then a CRITICAL halberd against a successful dodge landed one step down as
a special, halved the armour, and put 9 through a 7-point suit. Full coverage is
resilience, not immunity.

Full log in docs/REVIEW_LOG.md.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 10:56:31 +01:00
slaguru666andClaude Opus 5 6ed9ded362 Armour covers what it covers, and Coherence moves to the vitals
Asking for the type of armour per location turned out not to be a display request.
Every equipped piece added its points to EVERY location, so a Brodie helmet protected
your shins and a cuirass protected your skull — with a catalogue containing sallets,
lobster-tail helmets and three cuirasses, that could not be printed without the sheet
saying something visibly false.

Armour now declares coverage as a named set rather than a list of locations, because a
piece has to fit whatever body wears it: all, torso, torsoArms, torsoLimbs, head. The
sets expand to location KINDS, so a cuirass covers a baseline torso and a vesh trunk
and ridge without either knowing the other exists. Unstated coverage is `all`, so
anything that does not declare behaves as everything did before. Eighteen of the
twenty-five catalogue pieces are not whole-body and now say so.

The trap was double counting: hitLocationRoll subtracted the global worn total PLUS
the body's own armour at that location, which was right while armour was global and
becomes a double count the moment a location knows its own pieces. It reads the
location's total and nothing else, verified by firing fourteen hits of 10 damage
across every location and asserting damage applied == 10 - that location's armour.

A single ARMOUR number no longer exists, so the header shows the torso with "0-8 by
location" beside it when the rest of you is not that. This is a real difficulty
change: limbs are frequently bare and limbs are 12 of 20 on the melee table.

Coherence moves out of the derived strip into the vitals at hit-point size, with its
band under it and the box reddening as it falls.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 10:33:04 +01:00
slaguru666andClaude Opus 5 3421ed4a2e Reorder the combat tab, and make weapons readyable
There was no way to ready a weapon. The strip under the characteristics reads
`equipped`, and the only toggle-equipped control on the sheet was on the ARMOUR list —
a weapon could only be readied by opening its item sheet and finding the tickbox
there. The weapons table now carries the same toggle, the row is tinted when readied,
and a line above the table says what the control does.

The tab runs in the order it is used: weapons, armour, defend, reaction, body last.
Weapons lead with 40px art and a display-face name, having previously sat below two
screens of anatomy and reaction arithmetic.

The figure is a partial, drawn in three places — header thumbnail, combat tab, anatomy
tab. Three inline copies would have been the template-layer version of the defect
check-rules exists to prevent: a location present in one drawing and missing from
another.

The header carries a 34px figure and every location with its damage and the armour
over it, so "how much armour is on the part that just got hit" is answered on the main
page without changing tab.

Also fixed: `.ringbrp-sheet a` outranks a bare `.rb-equip`, so an unequipped toggle was
painted white and read as lit — true of the armour toggle too, since it was added.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 10:15:16 +01:00
slaguru666andClaude Opus 5 4bfa7110d0 A lamp lights the people standing in it
The goods yard fight made the case: three agents inside the same pool of light shot at
-50% while the fourth, four metres away, shot at -10%.

A lamp now has a reach, per item rather than global, because a weapon lamp and a
vehicle searchlight are not the same offer — 4 m for cold light strips, 6 m for a
weapon lamp, 10 m for the issue field lamp, 30 m for a roof searchlight. Anyone inside
it is in the light and the card names whose lamp it is, so both halves of the rule
travel together: the pool is one position and the whole group is standing in it.

Measured from the tokens. The shot that started this — no lamp of her own, four metres
from somebody else's, in pitch dark — goes from 20% to 60%, while an agent
twenty-five metres out still eats the full -50%.

An UNKNOWN distance is explicitly not lit: Number(null) is 0, so an unmeasured
distance would otherwise have read as standing on top of the lamp and lit any scene
with no tokens placed. The dialog carries a tick instead, pre-set when the canvas could
measure it and the GM's answer when it could not.

Note: template.json is read when Foundry loads the system, so a deployed server needs
a restart and not just a pull before the migration can stamp the new field.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 09:49:30 +01:00
slaguru666andClaude Opus 5 5c640d65cf Fix a fast action firing twice and paying once
Ammunition was charged once before the shot loop rather than once per shot, so the
Webley put two rounds out and the cylinder went down by one. That is the exact
dishonesty the burst rules exist to avoid, and it landed on the mode that is supposed
to cost the most. Charged per shot now, and the loop stops when the weapon runs dry
part way through the action.

Found by playing the four modes side by side in the goods yard — one agent per mode,
all four at 60%, so the fight read the mode and not the shooter. Full log in
docs/REVIEW_LOG.md, including two findings left open: burst options are close to
unselectable once the light is bad, and a lamp currently lights only its carrier while
three agents stand in the same pool of it at -50%.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 09:18:13 +01:00
slaguru666andClaude Opus 5 2e10ecced9 Fire modes, fitted sights and lamps, and a tab rail
Selectable fire, with the modifiers on the choice
  Every weapon has carried a fireMode since the packs were first built and nothing
  read it: a musket could rip a ten-round burst and "rapid" bought a weapon nothing.
  FIRE_MODE now gates the burst rules and carries its own attack modifier — slow +10%
  and then you work for the next one, fast a second shot at -20% to both, rapid
  bursts, beam +5% and it can be held on the target for damage instead of hits. The
  gate lives in burstAttack too, so no macro can route round it. `fast` was on five
  catalogue weapons and was not in the system's list of modes at all, so re-saving one
  of them silently blanked it; the list is derived from the rule now.

  burstAttack shipped complete and was reachable from nothing. It is the resolution
  path the selector chooses, and takes the dialog's whole stack rather than charging
  the player twice for the same burst.

Sights and lamps that apply themselves
  A sight is graded by range band, so a telescopic sight is a -10% liability inside
  ten metres and worth +20% at extreme, and it only counts if it fits. The band is
  already known when the modifier is wanted, so nothing is selected and nothing is
  forgotten. The dark costs something now; a carried lamp buys it back to dim, never
  to daylight, and the card says it shows them exactly where you are. A migration
  fits gear that predates the fields, matched on the stamped key rather than by name.

The damage card
  The last card still wearing Foundry's stock dice styling — it posted a bare Roll and
  let the core template dress it. It renders through the module's own card now, with
  the Roll still on the message so dice stay inspectable.

A rail instead of a strip
  Eight tabs across an 820px sheet compressed to 11px type. They run down the side
  now, one line each, with counts as badges; the sheet is 152px wider to pay for it.

Also fixed: any weapon with a Coherence cost could not be attacked with AT ALL — the
handler re-read the weapon after an await, when currentTarget is already null, and the
attack died on a TypeError with nothing shown. And the duplicate-rule guard failed an
honest table because FIRE_MODE and speedBands share two key names; it wants a majority
now, and prints partial overlaps rather than swallowing them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 08:56:04 +01:00
slaguru666andClaude Opus 5 d4442a55f0 Play SALT COUNTY with the new bestiary
A records office, a revenant as the briefed symptom, and the carrion file as the
cause "elsewhere in the same location". The revenant was resolved without a shot
off its own leverage line. AMENDMENT then removed two trained skills and a talent
permanently, with no roll offered — which is the whole point of that entry.

Burning the file exercised the fire rules on a thing rather than a person: armour
counted on the round it caught and never again. The team burned too.

Closed at Containment 8, Resources 1, Clearance 5; the failed extraction advanced
the window clock and every crossing took the -10%.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 08:17:16 +01:00
slaguru666andClaude Opus 5 ee9e1f5b73 Codex review pass: three real faults corrected
R-228: Ambidextrous was a compulsory build. 0/-20 gave a full-strength main hand
AND a cheap second attack. It now buys consistency, not a free attack: -20 in both
hands against -20/-40 untrained.

R-229: full auto was a firing squad. Ten independent hits off one critical, each
with its own damage, location and Major Wound check. Hits capped at 3/5/7, and a
burst is ONE wounding event however many rounds connect.

R-230: Engines deleted the pressure it existed to create. Guns +2 and Helm +1
against a vent of 3 made a fighting round heat-neutral, so Heat only mattered when
the engineer failed. Venting is now 2/3/4.

Also: falling halving no longer stacks (soft + controlled quartered the drop);
blast has one formula floored once, so the answer no longer depends on call order.

And the structural note — "giving everyone a roll is not the same as giving
everyone a decision". Sensors, Damage Control and Medical now have mutually
exclusive modes that bite in the engine: mark/spoof/read, patch/brace,
restore/steady.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 08:07:58 +01:00
slaguru666andClaude Opus 5 226f853ee6 Hazards, automatic fire, two weapons, a bestiary, and space combat
Stress test first: 150 characters across every posting, tier and species against
fourteen invariants each, then the edges (characteristics at 1/3/21, every
location destroyed, twelve pikes carried, hp set to -99).

R-227: a destroyed head was a nap. The printed effect has always read "For
anything that keeps its brain there, this is death" and the code set unconscious
and stopped. destructionOutcomeFor() now says what destruction means.

THE WORLD: falling (a die per 3 m, armour does not apply), drowning (CON rounds
then a point a round, straight past the Major Wound threshold), fire (a condition
with a size; armour helps on the round you catch and never after), explosives
(one roll at the centre, shared by band, cover beats armour).

AUTOMATIC FIRE: one roll, the success level says how much of the burst arrived,
and the rounds are spent either way. TWO WEAPONS: -20/-40, or 0/-20 with the new
Ambidextrous talent; the off hand takes the lighter weapon and nothing over 2 kg.

BESTIARY: 21 entries in three families — folklore, horror, and what comes back
from further along — each with characteristics, natural armour, tactics and a
POWER written as a rule with a cost.

SPACE: eight stations, each on a skill somebody already has, so the Physician has
a chair. Range is a band; the helm moves one a round, in or out. Heat is the
pressure and took two rounds of playtest tuning to stop being a countdown.

64 rules, 198 spot-checked formulas, a 12-page rulebook in reading order.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 08:02:21 +01:00
slaguru666andClaude Opus 5 79caf143bd R-226: "Tradecraft first" was too literal
My own R-221 fix overshot. A Containment Officer whose Tradecraft had caught a
stray bonus point sat at 12% against a base of 5 — technically trained — and led
every phase ahead of a Rigging Officer on 53% Navigate. Tradecraft still wins ties
and wins when genuinely better; it no longer wins when plainly worse. The
Containment phase went 6% -> 26% on the same team.

Found playing GLASS LANTERN with the historical gear: salvaged polearms and
slings correctly arrive at 5% because nobody trains them, and maille over
brigandine (AR 8) reduced four utility-knife hits to zero damage each.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 23:11:21 +01:00
slaguru666andClaude Opus 5 e2d0ed5bb2 A player briefing, and the historical range
The generator was already writing the timeline, the cast and the texture and
filing all of it behind the GM screen. New PLAYERS page: a read-aloud opening,
what it is like there, what is known so far, who is there and what they want —
but never what they lie about. Page ownership is now declared by the page rather
than guessed from its index, which would have hidden any second player page.

Historical range: 38 weapons (from 6) and 14 armours (from 2), each with its
period stated, from arming swords and longbows through matchlocks and Brown Bess
to the Lee-Enfield and a trench club. Five new skills to hang them on, including
Firearm (Muzzle-loader), because a muzzle-loader is not a rifle.

275 icons; every weapon maps to a real skill and every item has art. Catalogue is
206 items across four eras.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 23:02:20 +01:00
slaguru666andClaude Opus 5 22a5067153 R-225: the extraction spends the way home, not hit points
Every case carries a "window closes" clock whose stated cost is THE WAY HOME and
whose steps are "the margin narrows / the return is Difficult / the return is
aimed at -30%". Nothing ever read it, so the phase whose job is getting out had
no consequence of its own and the GM had to invent one.

Extraction now advances that clock: failure and fumble narrow the window, a
critical opens it back up, and returnCrossing() applies the penalty alongside the
classification modifier and the Coherence band. 0/-10/-20/-30, Difficult from two
steps.

Also: legs now store their `kind`. The extraction check matched on the terrain
prose and worked only because the string begins "Extraction —".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 22:33:49 +01:00
slaguru666andClaude Opus 5 2d0f70329e Play IRON MARGIN: closed socially, no casualties
Four phases, no weapon drawn. The arrangement with the quiet neighbours (standing
0 -> 2) is the win condition on this case. Nobody lost a hit point. A fumbled
Transposition on 99 cost 3 Coherence and delivered an Art, which is the only way
one ever arrives.

Together with LOW VERGE this brackets the death rules honestly: they bite when
the fiction has already gone badly, not by default.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 22:28:23 +01:00
slaguru666andClaude Opus 5 5c114601a9 R-224: a body at zero absorbed damage for free
Hit points clamp at zero, so further damage to somebody already there changed
nothing — and a STABILISED agent absorbed it forever, because the count was held
and there was nothing else left to move. You could empty a magazine into someone
bleeding out and the system would not notice.

Damage at zero now breaks the stabilisation and costs a round of the count, and
hitLocationRoll calls died() when that meets the limit.

Found by playing LOW VERGE until it killed somebody: two agents who were
medically stable died in the water on a failed tidal extraction.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 22:24:55 +01:00
slaguru666andClaude Opus 5 89ce557355 Death at zero, and a case brief that answers the useful questions
R-223: nothing happened at 0 hit points. An agent was marked down and lay there
forever; the only mention of death in the system was flavour text on a destroyed
head. Zero now starts a clock whose length is the agent's own Major Wound
threshold, ticked from the same hook that charges blood loss. First Aid or
Medicine stabilises and stops the count; healing above zero clears it; heal()
refuses the dead. On death, Coherence decides what the record says — from a
proper death in service down to not being recorded as dead at all.

Case generator: four phases instead of five (the arc drew two interchangeable
middles that read as padding). The brief now leads with Where / When /
Classification / Phases, states the opposition in full, and has a "How you get
back" section. place and duration were generated and never printed. The same
facts are on the case file itself. 300 seeds checked for object leaks; one found
and fixed (group taboo/desire are objects with .text).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 22:13:21 +01:00
slaguru666andClaude Opus 5 a360d77b83 Play SHORT ORCHARD on the retuned ramp
Phases read 41/36/31 before the fumble; the fight with the rival desk cost two
agents; the last two phases resolved at 11% and 1% and the card says why —
Wounded: -20%. The wound pipeline reaches case phases, which is correct and now
legible. Closed at Containment 6, Resources 3, Clearance 5.

Confirms R-222: every agent finished with experience ticks from phase and combat
work, where before the fix a case produced none.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 21:17:32 +01:00
slaguru666andClaude Opus 5 1b44fccb79 Retune the case ramp, and let leading a phase earn experience
The ramp made every phase after the first Difficult (halving the lead's skill) and
stacked a cumulative -5% on top. Separated in phaseRampFor() in rules.mjs:
difficulty belongs to the phase (only Containment is Difficult, and it does not
also ramp), the modifier is attrition (-5 a phase, capped at -15).

  lead 55%   was 55 -> 22 -> 17 -> 12 -> 7      now 55 -> 50 -> 45 -> 27 -> 40

Over 20,000 simulated cases with destitution modelled, phases passed roughly
double and destitution incidence roughly halves.

R-222: resolveLegDialog passed no skillFamilyId, so the choke point could not
resolve the skill item and leading a phase never earned a tick — Tradecraft, the
skill the job most uses, could never improve.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 21:12:04 +01:00
slaguru666andClaude Opus 5 1a0bdbd2df R-221: the phase-lead fallback could never fire
bestIn("tradecraft") ?? bestIn("navigate") never reached Navigate, because every
character carries every skill and skillRating() returns the printed base rather
than null — so the first lookup always found somebody. A team of postings that
train Navigate and not Tradecraft was led by whoever had the highest UNTRAINED
Tradecraft, which is 5%, putting phase three at 1%.

TRAINED now means above the printed base. Measured on a Pathology / Overwatch /
Warden / Materials team: lead 5% -> 34%.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 20:44:03 +01:00
slaguru666andClaude Opus 5 cc23fdb7bd Rulebook and compendium refresh
Audited every exported rule in rules.mjs against what the rulebook says and closed
the gaps:

- Dodge starts at DEX x 2 — newly evaluated, and stated nowhere until now
- Encumbrance: free carry, and which skill categories it actually penalises
- Bleeding rates and what stops each kind
- The merge ladder for Borrowed Authority, as a table
- A new page listing all 25 postings, generated from ROLES

The rulebook is now 9 pages and every one is generated from the code it documents.
All packs, 231 icons and the dice textures rebuilt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 20:31:01 +01:00
slaguru666andClaude Opus 5 1734612c06 v0.7.0 — vehicles, Borrowed Authority, and a door for the case generator
Since 0.6.1:

- VEHICLES as their own Item type: crew, seats, cargo, hull, armour, range,
  terrain and the skill that works them, with speed as a band. 14 of them, from
  the pool car and the Custodian van to a sealed crawler and the carriage that is
  already parked outside wherever you were going to go.
- STORES roughly doubled to 118 gear items across four eras — standing issue and
  paperwork, transport stores, and the forward stores Registry will not hand a
  probationary officer. Catalogue now 175 items, 231 icons.
- Agents leave creation properly equipped: standing issue, the posting's kit,
  what seniority adds, and one personal effect that is theirs and not the
  department's.
- All 25 postings now describe themselves in the creation dialog.
- BORROWED AUTHORITY, the access subsystem. No hacking skill and nothing to break
  into: access is a named credential with a scope, a Trust that erodes, and red
  flags describing how its real owner behaves. Inside scope there is no roll. Two
  tiers beyond is impossible at any skill. Coherence widens a record, and pushing
  one past what its Trust will carry merges your file with theirs.
- Defences graded by level, and damage now rolls at the level a blow landed at.
- Dodge's DEX x 2 base is finally evaluated; it read 0% for most postings.
- Brawl is a fallback rather than a peer of the weapon in hand.
- check-lang guard: one key that was both a value and a branch silently
  un-localised the entire system.
- The case generator is reachable from the Actor Directory, and no longer puts
  every character in the world on a new case.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 20:23:52 +01:00
slaguru666andClaude Opus 5 d0144f744e The Custodians v0.6.1 — full system
A Foundry VTT game system: Basic Roleplaying d100 in a drab British agency that
deals with crossings, where reality keeps a record of what belongs where and can be
made to get it wrong.

Contents:
- rules.mjs as the single authority for every rule formula, with 40 rules and 132
  spot-checked values. Nothing may restate a formula it defines.
- 25 postings, each with a key characteristic, trained skills, talents and its own
  kit; a 175-item catalogue across four eras; 231 generated icons.
- Reaction Lanes initiative, re-rolled every round including the first.
- Coherence, and the Quiet Arts, which only ever arrive from a crossing gone wrong.
- Graded defences: only a critical stops a critical.
- Borrowed Authority — access as a record rather than a hacking roll.
- A case generator, and a rules journal generated from rules.mjs so the book cannot
  drift from the code.

Built compendia are committed so a remote Foundry needs only the files.
node_modules is not; `npm install` restores it for rebuilding content.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-10 18:09:07 +01:00