32eaee1eb047c7b77eef654c19d6a234c1f5a2c5
15
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
c0d33ee81d |
Hide 9, grounded 4, vital exempt — the borough is worth 56 points again
R-254 shipped the belly rule and called +6.4 points "modest on purpose". That read the
wrong statistic. +6.4 measured whether grounding helps; the question was whether the
borough still matters, and the gap between fighting the supporter on borough ground and
off it had fallen from 60.6 points to 44.9. Half damage from every departmental weapon is
meant to be the fight's central problem, and I had quietly taken sixteen points off it
while reporting a small number about something else. Same error as R-251.
Three changes that only work together:
- hide 7 -> 9, restoring the weight on the axis that should hurt
- grounded still halves it, 9 -> 4, which an ordinary round beats
- exposedHideFor now takes the location's kind and leaves `vital` unhalved: a beast on
its belly is not presenting its chest to the floor
Measured: 28.4% on borough ground flying, 68.4% grounded, 84.6% off it — a 56.2 point gap
against 44.9 before. Predicted 28.4 / 84.3 / 55.9 before building.
The composition of the three hide functions lives in prepareDerivedData where no test
could reach it, and check-anatomy's guard 6 is deliberately one-sided so it would not
have caught the vital losing its exemption. check-behaviour now composes the same
expression from the real supporter spec and the real tables. Negative-tested four ways:
removing the exemption, un-baring the wings, removing the halving, and inflating the hide
past what a round can beat each fail it with the right message.
Cost: the supporter goes from fifth to second deadliest creature in the book (2.84 -> 3.38
down, 46.8% -> 69.3% wiped). check-lethality refused the build until that row was
deliberately re-recorded.
BESTIARY.md printed the new hide and said nothing about it halving, because the body-plan
blurb predates the rule. The README said "eight guards" in three sentences above a
generated block listing nine. Both are the signature defect in prose: a number written
down that nothing reads. Both now generate.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|
|
e5dc9b5299 |
Hide does not grow on membrane (R-96)
Option H, measured before it was built. Losing a wing already mattered
once it happened — a grounded supporter was 40.5% to be killed against
9.3% for one still flying, a swing of thirty points. It almost never
happened: the wings carried the creature's own six points of heraldic
hide, so folding one meant beating armour six eight times over, and it
occurred in 9% of fights. The rule was reachable, not weak, and every
option that made grounding HURT more moved the win rate by under five
points because you cannot spend a state you never reach.
So the lever is the wing, not the consequence. A location may now be
`bare`: worn armour still covers it — barding a wing works exactly as
before — but the animal's own hide stops at the edge of the membrane.
The supporter's wings are bare, and it gets the toughness back where a
six-hundred-year-old record should carry it: hide 6 -> 7, CON 20 -> 36,
so 22 hit points become 30. STR and SIZ are untouched, so the damage
modifier stays +2d6.
Measured over 20,000 fights against the same four agents:
grounded on borough off borough
before 9% 12.5% win 85.6% win / 14.4% wiped
after 67% 22.1% win 83.5% win / 16.5% wiped
The wing shot becomes the play. Fighting it on borough ground stays a
losing proposition, so ARGENT AND GULES is still the real answer and
grounding improves a bad fight rather than replacing the solution — and
the fight off borough ground keeps its teeth, marginally more lethal
than before rather than less. Bare wings ALONE was the trap: it made
grounding routine and turned the off-ground fight into a 96% walkover
with a 3.8% wipe rate, buying the text at the cost of the encounter.
check-anatomy gains the property this whole thread was about: a plan
whose behaviour turns on losing a wing must not armour that wing with
the creature's own hide, or the rule is decoration. Negative-tested by
putting the hide back.
Also re-records the lethality baseline, which was ALREADY stale: HEAD's
own code reproduced 27 of its 47 entries differently, because the
supporter joined NPCS in
|
||
|
|
ddc4f99ff4 |
Hit locations reach ordinary combat, and creatures get a body
THE DEFECT. locationFor had ONE caller in the engine, hitLocationRoll, and hitLocationRoll was called from fall, burn, detonate and burstAttack. Falling, fire, explosions and automatic fire. Nothing else. rollWeaponDamage rolled dice, printed a number and returned it, so the chat Damage button, the character sheet's damage button and the item sheet's all stopped there. A grenade knew which arm it took off. A sword did not. Every individual piece was already correct - the tables, per-location armour and coverage, disable and destroy thresholds, Major Wound, dying, death, the figure on the sheet. They simply were not joined up, which is why this reads as a wiring change rather than a new subsystem. - rollWeaponDamage now carries through to hitLocationRoll: it rolls the location, applies that location's armour, applies the wound, and handles the rest through the machinery that already owned it. Nothing here re-implements any of that - locationModeFor picks the melee or ranged column from the weapon's class. The two columns have always differed and nothing was choosing between them - with no target it does exactly what it did before and SAYS SO on a card, rather than failing quietly - burstAttack opts out with locate:false - it rolls its own location per round, and letting both fire would have applied every round of a burst twice BODY PLANS. Two new tables: quadruped (four legs, fore/hindquarters, neck, a head that is hard to reach) and winged (that, plus wings). Forequarters are the vital. DISABLE EITHER WING AND IT CANNOT FLY, which is the fight a party can win. Barghest, Kelpie and Church grim were all species "baseline" - a black dog, a horse and a grave-hound, each hit-located with two arms and a chest. Fixed. Added "The supporter", a winged heraldic beast, so the new table is exercised by real content instead of existing unused. Body plan is a NEW FIELD, not a species. A bear is not a playable people with characteristic dice and talents, so creature specs take bodyPlan and the playable species list is untouched. THE NPC SHEET had no hit locations at all - 102 lines against the character sheet's 627 - while every NPC in the game had them derived and wired to consequences. It now carries the body-plan selector, the figure, the per-location table, the condition and a GROUNDED flag. The sheet class already extended the character sheet, so it already HAD the context; the template never used it. FOUND IN PASSING, by the new guard: kind "body" - the abdomen, the trunk, the hindquarters - did nothing whatever. Its printed effect has always promised "-30% to all Physical actions and bleeding 1 hit point per round until First Aid" and the code delivered none of it, on every body plan including the humanoid default. It now bleeds 1, or 2 destroyed, exactly as bodyX says. NEW GUARD: check-anatomy. Every body plan must cover 1-20 exactly once in BOTH modes, every location must be drawn and every drawn shape must be a location, and every kind must be one locationEffectsFor acts on, has effect text for, and has a destruction outcome. Verified it fails on a d20 gap, a shapeless limb and an unhandled kind before wiring it in. Ninth guard. VERIFIED IN A RUNNING FOUNDRY, not just unit-tested: melee bar reads the Melee column and the rifle reads Ranged on the same creature; forequarters graded as a vital hit; a maxed wing set flightLost and the sheet said GROUNDED; the real chat Damage button rolled 1D20 15, found the right foreleg, applied 12 through armour, disabled the leg and took the dog from 16 to 4; and with nothing targeted nothing was touched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
322389bc8a |
A bestiary a GM can actually read, and the defect it found immediately
Forty-six creatures and no way to look at them. They live in content.mjs, which is source code, and in the compendium, which shows one actor at a time behind two clicks. A GM prepping a case can browse neither, so in practice the bestiary was whatever the GM happened to remember writing. docs/BESTIARY.md is generated, never hand-written, for the reason the rules journal is generated from rules.mjs: a reference that can disagree with the thing it references is worse than no reference. It opens with a one-page table sorted by how much of a party each creature puts on the floor - the part that gets printed - then an entry each with characteristics, attack, the POWER line pulled out of the tactics, and the measured figure read straight from the lethality baseline. Every number is derived, so the document cannot drift, and check-lethality already refuses the build if the measurements move. IT FOUND SOMETHING IN ITS FIRST RUN. The generic heavy natural attack is keyed `grasp` and was NAMED "Vesh grasp limb". Twenty-two creatures carry it and five are Vesh, so the at-a-glance table cheerfully printed "Vesh grasp limb" against a black dog, a kelpie, a church grim and an apple tree. Renamed to "Grasping limb"; the key is untouched, so every kit reference and every built pack still resolves. That defect was invisible for as long as nobody could see the bestiary in one place, which is the argument for the document. The caveats are given more room than the numbers, deliberately. The measured column is SOLO against ONE frozen party, and the document says so three times: encounter lethality moves with how many there are and, much harder, with who the players brought - the same fight runs 0% to 100% across party choice. It points at --spread rather than pretending a single figure is an answer. Also records the real remaining gap: 21 creatures fight with nothing but their own bodies and still carry human anatomy, so the barghest can be shot in the left arm. The machinery to fix that is built and measured; what is missing is anatomy tables for the shapes they actually are - a quadruped, an immobile object, a swarm. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
2d4f7f18be |
Twenty-four new creatures, and the anatomies finally get used
The bestiary goes 22 to 46: eight more FOLKLORE, eight more HORROR, eight more FORWARD. Ten of the forty-six are now Vesh or Cadence, up from two. That ratio is the point. Both anatomies have had complete hit-location tables, body geometry, species talents and location effects for the whole life of this project and nothing used either, so none of it ran outside the character generator. They are now written to be WORTH the anatomy rather than to wear it: - The relay is five Cadence bodies holding a crossing open, and the crossing closes as they are destroyed. No vital, no head, 10% off everything per body lost - it cannot be dropped and cannot be ignored, which is the species argument entire. - The courier is a Vesh that fights at half rating while its one grasp limb is full. Disable the limb and it drops the consignment and fights properly. The whole encounter turns on a trade the party has to work out. - The census cannot be usefully fought at all: no head means no killing shot, so the fight lasts until somebody opens the ridge, by which time it has counted everyone. - Knockers are the only folklore Cadence, and the committee is a Cadence because a committee IS several bodies and one decision. The rest is written to the house line that most of these are arrangements rather than fights, because a bestiary where every answer is a gun has one page. The washer at the ford will not fight and cannot be made to; the apple tree man wants a drink it has been owed since 1961; the waiting room's exit was never locked and nobody stands up. Measured, 250 runs against four duty-roster agents, seed 11. Nothing accidental turned up: the non-combat entries sit at 0.0-0.1 agents hurt, the fighters at 1.4-2.3, and the only creature over a 10% solo wipe is the stanchion at 14.4% - which is a fixed object with 12 armour whose own tactics say it is a demolition problem and not a fight. The harness can only force a fight, so read that number as "the party punched the pillar". Art regenerated: 24 new portraits, and the eight new non-humans verified to draw exactly as many body parts as their location tables have entries. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
f88c31649c |
The bestiary's first non-human creatures
vesh and cadence have had complete hit-location tables, body geometry, species talents and location effects since they were written, and no creature had ever used either. So none of that had run outside the character generator, and the whole bestiary was hit-located as a person - including a black dog and a stack of paper. THE CHOIR IS A CADENCE. It always was: its tactics say "run them as ELEVEN separate bodies with one initiative between them", which is Distributed and Quorum described in prose because the species that models it had no users. Retagged, and given the two talents. No scenario prose refers to it, so nothing else moves. PRECEDENT is new, and is a Vesh - the first. Built to exercise what makes the species different rather than to be another sack of hit points: no head, so no fight against one ends on a lucky roll, and a sensory ridge for a vital that runs the length of its back and is correspondingly easy to hit. It is also not hostile, which is the point; the encounter is a conversation with something that answers questions about an event that has not happened yet. Two things left deliberately unfixed and written down rather than fudged: - The choir is eleven in the fiction and five in the location table. Reconciling it properly means giving cadence a per-creature body count, which stops the table being a constant and makes the paper doll follow it. That is the right fix and it is not a small one. A note on the spec says so. - Precedent gets unblinking but not out_of_step, though SPECIES.vesh grants both. An npc actor has no Coherence track, and out_of_step costs 1 to use. Also corrects a comment in creature-schema.mjs claiming Out of Step is vesh-locked. It is not - five postings and a roster agent offer it to humans, and locking it would take it off all six. SPECIES[x].talents is what a species is GRANTED; TALENTS[].species is what only that species may HAVE. Two different fields, and only the second locks. Simulated: Precedent 0.68 of 4 hurt over 3 rounds, no wipes. The choir alone is trivial; at the eleven its own tactics call for, 3.05 of 4 hurt, median 18 rounds, 0.3% wipes. Read both as floors - the harness does not model hit locations, so a Cadence's entire mechanical identity is exactly what it cannot yet measure. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
c3002e93c9 |
check-creatures: validate every actor spec, and fix the vesh talents it found
Nothing validated creature specs. check-kits validates postings and check-scenarios validates prose; buildActor throws on an unknown skill or item key and is silent about everything else, so species, marksmanship style, characteristic blocks, species-locked talents and misspelt field names could all be wrong and still build, pack and play. Every packed actor once shipped as species "hominid" and the whole cast was hit-located as something the rules do not contain. tools/creature-schema.mjs derives every allowed value from the catalogues rather than retyping them: skills from SKILL_CATALOGUE, kit from the item catalogues, species from SPECIES, stats from CHARACTERISTIC_DICE, and the two marksmanship styles out of the language file. It reports every problem with a spec rather than dying on the first, and names the nearest real key. It also reports fields buildActor never reads, because "armours:" is not an error, it is an actor that silently equips nothing. On its first run it found six baseline humans carrying vesh biology. "unblinking" is cat: species, species: vesh, and its own rule text reads "A Vesh has no face to read". Out of Step is reclassified as anomalous with a Coherence cost, which is what every talent in that category has and what the Anchor who is three years older than his birthday says always wanted to be; the other five are swapped to agency and field talents that fit them. Not fixed here: the root cause is upstream in postings.mjs, where twelve posting talent pools still offer unblinking, distributed or quorum to any agent. Picking replacements across those is a design decision, not a mechanical one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
cbad87ba98 |
Add Occult, Religion and Psychology, and the Panic track
From the first game's list. The three skills are not decoration — they are the
levers on the new track, which is why they arrived together.
PANIC, 0 to 5, up. It is the other half of Coherence and the rules page says so
in the first line, because a table that confuses them will make the wrong call
at the worst moment:
Coherence what knowing has cost you weeks 10-0, down
Panic what is happening to you NOW minutes 0-5, up
A trigger gives a point with NO ROLL. Asking for a die to find out whether you
are frightened slows the scene and tells the player how to feel; the die is for
getting rid of it, which is the interesting direction.
0 steady · 1 rattled · 2 shaken -5% · 3 losing it -10%
4 overwhelmed -20% · 5 broken
The first point is free on purpose, so the opening shock of a scene costs the
table nothing. At 5 you break — freeze, flee or fixate, choose fast — and come
back at 3, not at 0, because breaking is not a rest.
Relief is where the skills come in. A success takes one point, a special takes
two. Psychology is the only thing that steadies somebody who is NOT you.
Religion steadies you alone and does not care whether you are right. Occult is
the odd one: naming a thing correctly, out loud, helps everybody who can hear —
the department's actual work, and the only relief that reaches a room. Plus
POW×5 to steady yourself, and your anchor object once per case, which is what
that briefing scene was for.
The three skills are placed in six registers rather than left floating: Occult
to the professor and to Registry, Psychology to the doctor and to Interview,
Religion to Antiquities and Pathology.
Guards, because a track nothing reads is this project's oldest failure: the five
new rules carry spot-checks in check-rules, and check-behaviour gains nine tests
— the free first point, monotonic penalties, only 5 breaking, clamping at both
ends, breaking not clearing the track, special taking two, every band/trigger/
relief having a label, and every relief naming a skill the catalogue actually
has.
Verified in a live game: penalty reaches the roll (58 → 58 → 53 → 48 → 38 for
panic 0-4, criticals and specials recomputed with it), the full arc runs 0 → 2 →
4 → eased to 2 → pushed to 5 → breaks → 3 with no errors, the sheet shows the
band, and the rules journal has a Panic page generated from the same tables.
Version 1.1.0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |
||
|
|
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> |