Files
code_of_conquest_dnd/docs/superpowers/specs/2026-07-11-races-and-classes-design.md
Phillip Tarrant ef335a93c3 docs: land the saga guardrails on the milestones they constrain
Applies the seven-campaign saga direction spec (021c248) to the docs it
was written to protect. No new milestone, no new content, no BOM line.

docs/roadmap.md — a "Guarded direction" section, and a ⛨ saga note on the
four milestones that would otherwise foreclose the shape:
  M3  don't hardcode the title flow so a saga entry path can't be added
  M4  keep construct()'s `creation` a plain Dictionary; the scene must not
      become its only producer
  M5  the level curve is no longer open — L20 across 7 tiers; enemy stat
      blocks carry tier; no scaling multiplier, ever
  M9  the save is two objects (Saga + Campaign); humiliations move to the
      Saga or they die with the campaign

races-and-classes spec — the deferred "XP curve → M5" line now inherits the
ceiling rather than choosing one.

canon-roadmap — what the saga asks of content: a tier field when the
item/quest namespaces land, and a fixed-vs-variable mark on each BOM line
when the BOM is written. Tiers 2-7 and the other six kings go to the
Backlog.

Content build --check green; no generated content touched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 17:23:26 -05:00

13 KiB
Raw Blame History

Races & Classes — mechanical design

Date: 2026-07-11 Status: Approved (design). Feeds M4 (character creation); combat kit hands off to M5. Charter refs: §7 (Luck), §8 (stats & classes), §10 (combat), §11 (canon log), §16/§17 (mockups + the flagged reconciles).

This spec settles the mechanics of races and callings so M4 character creation has rules to read. It resolves the §17 class-name reconcile (charter §8 vs the mock's callings) and gives every race trait a concrete rule. Lore/flavor is deliberately out of scope — it lives in a separate canon/worldbuilding effort; placeholders here are marked [CANON-TBD].

Scope choice (agreed): full mechanical spec — everything creation + the character sheet read. The combat ability kit is deferred to M5 (the action economy, damage resolution, and DC bands aren't designed yet); this spec marks that seam everywhere it touches it.


1. Foundations (the resolution spine)

Attributes (6)

STR · DEX · CON · FTH · MAG · LCK. Modifier = floor((score 10) / 2) (matches the Character Sheet mock's "score N" + modifier display). FTH/MAG replace WIS/INT (§8).

Saving throws (5, not 6)

One save per attribute except LCK. LCK is never a save and never rolled — it is the borderline-selector (§7). Saves: STR · DEX · CON · FTH · MAG. This keeps §7 airtight: LCK cannot leak onto the character sheet as a number.

Resolution model — deterministic + Luck-selects-borderline

The check model §7 actually describes (chosen over a random d20, which would reintroduce the per-roll variance §7 exists to remove):

check value = ability_mod + (proficiency_bonus if proficient) + situational
compare to a DC:
  value  DC ≥ +band   → success   (deterministic, repeatable, plannable)
  value  DC ≤ band   → failure   (deterministic, repeatable)
  within the band      → LCK selects the branch (§7)

band size is M5 tuning. Consequences:

  • LCK is the only randomizer in the game. Every other number is reproducible.
  • Race/class features are flat modifiers that shift you across thresholds — never dice, never advantage/disadvantage. (Mock talents using "advantage" language, e.g. Reckless Swing, translate to flat mods.)
  • Death saves become the purest expression of the model: a downed character sits in the borderline band and LCK selects stabilize-vs-slip. No new system; reuses the band; delivers §7's whole "am I cursed?" thesis at the highest-stakes moment.

HP, MP, and the anti-spam gate

  • HP: L1 max HP = hit_die_max + CON_mod. Per-class hit die (§4). Level curve → M5.
  • MP: caster callings (FTH/MAG-primary) get an MP pool sized off their casting stat; martials have 0 MP. Pool formula + spell costs → M5.
  • The spam-gate is the action economy, not MP. One Action + one Bonus + one Move per turn (§10) caps everyone at one big thing per turn. On top of that:
    • Casters spend MP — a depleting reservoir (decision: attrition — dump or ration).
    • Martials use cooldowns — a recharging cadence (decision: rhythm — is it back yet?).
    • Basic attack is the free, repeatable option; signature abilities compete for the one Action.

This is why §10 says the tactics live "in the action economy and resources, not the map." With no grid, decisions live in what you spend your Action on and whether your good options are available (MP left / cooldown ready).

Proficiency bonus

+2 at level 1 (mock). Scales with level — curve deferred (creation is L1 only).


2. The six attributes — roles + skill map

Adopts the mock's 9 skills verbatim. LCK owns no save, no skill, no display.

Attr Save Skills Combat role Out-of-combat (§8)
STR STR Athletics, Intimidation Melee attack + damage Carry, forcing things
DEX DEX Stealth, Sleight of Hand, Acrobatics Initiative, finesse/ranged attack, light-armor AC Sleight, escape
CON CON Endurance HP pool Resist poison / exhaustion / infection (affliction track)
FTH FTH Perception, Faith-Lore Divine casting, spell DC Conviction in dialogue, awareness
MAG MAG Sorcery Arcane casting, spell DC Recall, deduction
LCK Selects borderline branches, crit thresholds Fires Improviser; boon vs humiliation
  • Perception under FTH (not a standalone WIS) honors §8's FTH/MAG-replace-WIS/INT — a Priest/Bonesetter is also the party's best lookout, giving FTH its out-of-combat teeth.
  • Death saves = LCK (see §1).

Flags (adopting the mock as-is, noting thinness — not expanding now):

  • MAG has only 1 skill (Sorcery), CON only 1 (Endurance). §8 says MAG governs recall/ deduction — an "Arcana/Lore" skill would fit. Deferred to a later content pass.
  • SPEED (mock's 30', "Old Knee 5") has no grid to matter on (§10) → treated as narrative-only flavor (chases/fleeing in prose), not a tactical value.

3. Races (4)

Under features only, no stat mods, and flat modifiers. Each race = one headline feature with real teeth + one minor feature. All upside; downsides live in flavor.

Nightsight ruling (resolves darkvision/low-light with no light grid): the character ignores darkness-based penalties on checks — a situational flat modifier (others take X in the dark, you take 0). Bites on the DM's exploration awareness checks.

Race Headline feature Minor feature Mock trait resolved
Human +1 to all 5 saves +1 skill proficiency of choice at creation "+1 to every save"
Elf Perception proficiency (+2) Nightsight "low-light sight · keen senses"
Dwarf +2 to CON saves vs poison & the infection/affliction track (may also halve duration) Nightsight "poison resist · darkvision"
Beastfolk Natural claws — innate unarmed attack (STR or DEX, light-weapon damage, always available even disarmed/grappled) Keen scent — flat situational bonus to detect hidden / track by smell "natural claws · keen scent"
  • Dwarf's resist maps onto the mock's own affliction track ("Infected Bite: CON save each dawn") — the character who shrugs off the rot the gritty tone (§3) inflicts.
  • Beastfolk is the only race with a combat-action feature (claws) — the aggressive pick.
  • No race touches an attribute score — keeps the point-buy pure.
  • Human's bonus skill is an addition beyond the mock's bare "+1 all saves" (agreed: keep it) so Human = "the adaptable one" with an actual creation choice.
  • Beastfolk's "taxed twice at every gate" (a mechanical shop/disposition downside) is deferred to the canon session + the shop economy (M8). Race mechanics stay upside-only for now.

4. Callings (7)

The full charter-7 (§8), gritty calling names (§17 reconcile resolved in favor of the mock's village-names, which honor §8's "named for the role in the world" better than §8's own list). Two need names from the canon session — marked [CANON-TBD].

Static kit only — the combat ability kit (the bar) is deferred to M5. This is what creation + the character sheet read.

Calling Archetype Primary Hit die Save profs Skill profs Resource Armor L1 talent (stub)
Sellsword Fighter STR d10 STR, CON 2 Cooldowns Heavy Second Wind — once/rest, claw back HP
[CANON-TBD] Barbarian STR d12 STR, CON 2 Cooldowns Medium Blood Fury — rage: soak + hit harder, per-encounter
Cutpurse Rogue DEX d8 DEX, MAG 4 Cooldowns Light Backstab — bonus dmg vs an unaware/first-strike target
Trapper Ranger DEX d10 DEX, CON 3 Cooldowns Light Set Snare — place a control trap, cooldown
Hedge-Mage Wizard MAG d6 MAG, FTH 2 MP (MAG) None Hexbolt — signature MP-free arcane basic
Bonesetter Cleric FTH d8 FTH, CON 2 MP (FTH) Medium Mend — heal HP, gritty field-medic
[CANON-TBD] 🔥 Warlock FTH d8 FTH, MAG 2 MP (FTH) Light Pact Mark — curse a target, FTH/MP
  • Two STR martials differentiated by shape, not stat: Sellsword = disciplined, heavy armor + d10 + sustain (Second Wind); the Barbarian-calling = reckless, d12 + medium armor + rage (soak via fury, not plate). Same primary, opposite feel.
  • Cutpurse gets 4 skills (breadth is the rogue's identity); Trapper 3; others 2. Drawn from the class's stat-appropriate slice of the 9-skill list, plus what race grants.
  • Casters (Hedge-Mage / Bonesetter / Warlock-calling) have MP; martials have 0 and live on cooldowns. MP pool formula → M5.
  • Backstab — the mock's "advantage" phrasing becomes a flat bonus vs an unaware/ first-strike target under the resolution model; no positioning needed, fits gridless (§10).
  • Trapper is a pure martial (traps = cooldown gadgets, no MP) — the D&D half-caster ranger is deliberately not ported, to keep spell math out of the POC.
  • Armor categories (Heavy/Medium/Light/None) are proficiency categories; specific gear comes from origin grants + the item system (M7).
  • L1 talents are stubs — full kit at M5.

5. Character-creation integration (M4) + canon-log contract

Folds into the proven point-buy model (rolled base + additive spend, LCK hidden).

Order of operations:

  1. Roll base attributes — 3d6 with floors per stat. LCK rolled hidden (avg of 5 + origin luck_modifier, §7) — never shown.
  2. Spend the +3 additive pool — additive only; LCK untouchable.
  3. Apply race — features only, no stat mods (saves / skill profs / Nightsight / claws).
  4. Apply calling — hit die → HP = hit_die_max + CON_mod; save profs; skill profs; MP pool if caster (from casting stat); armor category; L1 talent.
  5. Origin overlaysbuild_constraints.allowed_classes gates offered callings; luck_modifier → LCK; inventory/disposition grants.

Derived at creation (all deterministic): HP, MP, AC (base + armor + DEX), the 5 saves, 9 skills, initiative (DEX), spell DC for casters (8 + prof + casting_mod), prof bonus +2.

Two contract migrations this forces (flagged, do them at M4, not silently):

  • Canon log gains a race field. §11's player block is {name, class, luck_descriptor} today; the Narrator/NPC need race to describe the player. Small schema bump to the M0 contract (docs/schemas/canon-log.schema.json). The full mechanical sheet stays in client GameState — the canon log carries only what the AI narrates from (name, race, class, luck_descriptor).
  • The deserter origin is stale. content/origins/deserter.json has allowed_classes: ["sellsword","assassin","priest"] — old charter names. Migrate to the new calling ids (cutpurse/bonesetter/etc.) and the 7-calling roster. Origins gate races only if they choose to (allowed_races omitted = all).

Creation stays 100% deterministic except the hidden LCK roll — every derived number is reproducible from the choices, which is exactly what §10's per-encounter seeding needs. Character creation is the first place seeding matters.


6. Explicitly deferred (the seams)

Nothing here silently pre-empts a later brainstorm.

→ M5 (combat):

  • Full ability kits / the bar; MP pool formula + spell + cooldown costs.
  • The damage-determinism reconcile (§7/§10 vs the Combat HUD mock's ranges).
  • The borderline band size (DC bands).
  • Leveling — hit-die progression, prof-bonus scaling, talent tiers, XP curve. (Creation is L1.) The ceiling is no longer open: the seven-campaign saga (spec) fixes it at L20 across 7 tiers (tier N ≈ levels 3N2 … 3N). M5 designs the curve to that ceiling; it does not choose it. An open-ended curve is unsolvable and forecloses the saga.

→ Canon session (lore):

  • The two [CANON-TBD] calling names (Barbarian ⚔ / Warlock 🔥).
  • All race/calling flavor, descriptions, origin fragments.
  • The beastfolk social tax (mechanical downside, ties to M8 shop).

→ Later content pass:

  • MAG/CON skill thinness (an Arcana/Lore skill).
  • SPEED as narrative-only flavor.

§2 accounting

Every system here is state (code owns it). Races and callings are code-owned data the AI only narrates from — the canon log's new race field is the sole text-facing surface, and it carries a value code decided. No AI system mutates any of this. Consistent with §2.