Files
code_of_conquest_dnd/content/roadmap.md
Phillip Tarrant c3e02c7f7d docs(roadmap): currency landed; M4 is next
Both roadmaps still described the copper currency change as pending. It is
merged. The marker moves to M4, M8's line now says what it still owes (the
price table — nothing is priced yet), and a "Landed out of band" section
records the two items that shipped outside a milestone: the currency value
type, and the once-per-reply move cap its review turned up.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QYa9u7Kdxv5gX4AnwWexy8
2026-07-12 19:25:22 -05:00

184 lines
9.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Content Roadmap
The world's answer to [`docs/roadmap.md`](../docs/roadmap.md). That doc sequences
**systems**; this one sequences **content** — lore, the economy, items, quests, the
map — and makes it **countable rather than open-ended**.
Source of truth is `content/lore/*.md`; `content/world` + `content/server` are
BUILT from it (`python3 -m content_build`). Realizes the
[content-track design](../docs/superpowers/specs/2026-07-12-content-track-design.md).
Three sections. **Only one of them is ever the work.**
1. **[Spine](#1-the-spine)** — the slice's world. Authored once; gates everything downstream.
2. **[Bill of Materials](#2-bill-of-materials)** — a countable checklist, per milestone. Numbers, not vibes.
3. **[Backlog](#3-backlog)** — everything the slice does not need. Named so it is not lost; parked so it is not looming.
> ## The rule
>
> **Never author anything that is not in the Bill of Materials.**
>
> An idea that arrives goes to the Backlog, and is then no longer carried. The
> Backlog is not a debt. It is where ideas go to be safe.
---
## 1. The Spine
**Greywater Docks and one dungeon** — the smallest thing that is a *game*. Every
system (creation, combat, dialogue, inventory, shop, quest log, map) is exercised
exactly once, against real content. The cosmology touching ground for the first
time.
- **The town — Greywater Docks.** A rot-black wharf where the river meets the sea
trade; everyone owes someone. **~6 NPCs:** Fenn (promoted from M2 test fixture to
real NPC), the harbourmaster, a fence, an innkeeper, a dock rough, one more.
- **The chain — "The Missing Ledger,"** extended from the existing hook. Town → road
→ dungeon → back. **Four objectives.**
- **The turn.** The debt Fenn cannot cover is a **blood** debt. The harbourmaster is
named in the ledger because he is the one *collecting*. The dungeon is the harvest
site.
- **The patron — Ghaul the Yoke.** Already, by name, the king of debt and bondage; a
ledger of what men owe is his liturgy. This makes the quest chain and the cosmology
**the same object** rather than two things bolted together, and gives
`rule.blood-price` its first concrete instance.
- **The dungeon** — the harvest site. One enemy family (the yoked) + a boss.
**Adopting Greywater, not replacing it.** Fenn is the NPC the aliveness question was
actually answered with (M2, live-proven). The slice's job is to make Greywater
*deep*, not *new*.
Breadth afterwards is **repetition of a proven shape**, not invention.
### Already authored (status: canon)
- **`lore/cosmology.md`** — the overarching theme: the Warden (distant good god), the
Sent (his angels), the Seven (demonic host), and the two economies + possession
(`rule.the-pact`, `rule.blood-price`, `rule.possession`). The backdrop every future
piece of content reconciles against.
- **`lore/the-seven.md`** — the seven demon kings, one `person.*` each: Kareth (Red
King), Vael (Quiet Knife), Morren (Grey Mother), Ghaul (the Yoke), Ishri (Open
Mouth), Nuun (Hollow Choir), Draeth (Crowned Worm).
- **FTH-axis callings** (folded into the cosmology, from the races/classes spec): the
Bonesetter channels the Warden, the **Bloodsworn** pacts one of the Seven.
- **`lore/mechanics.md`** — hosts `rule.disposition-ladder` (the required-once gate
vocabulary).
- **`lore/specimen.md`** — a synthetic `status: candidate` disposition-gate specimen
(validated by `--check`, emitted nowhere); the world-building skill's structure
example. **Not game canon.**
### Still to author for the slice
Greywater itself — the town, its ~6 NPCs, the ledger chain's four objectives, and
Ghaul's harvest site — as `content/lore/greywater.md`. The hand-written JSON under
`content/world/{locations,quests,npcs,items}` gets **authored upward** into that
bible, and `python3 -m content_build` emits `world/` from it.
Per-town knowledge that grounds the cosmology (possessed NPCs, blood-harvest sites,
shrine fronts) is authored as gated `rumor`/`fact`/`secret`.
---
## 2. Bill of Materials
Countable. This is the anti-overwhelm device.
The **Fixed/Variable** column is the [seven-campaign
saga](../docs/superpowers/specs/2026-07-12-character-reuse-seven-arc-design.md)'s only
ask of this table. **Fixed substrate** is identical in every campaign of every saga —
authored once, reused verbatim. **Variable** is per-campaign: the part a second town
would have to re-author, and the part v2 generation would produce. The column costs
nothing and tells you exactly what town #2 does *not* pay for.
| Milestone | Content it consumes | Count | Fixed / Variable |
|---|---|---|---|
| **M4** creation | Calling blurbs; the Bloodsworn's patron choice | ~2 | **Fixed** |
| **M4** creation | Origins (they reference world ids) | ~2 | **Variable** |
| **M5** combat | Abilities for the 3 POC classes | ~10 | **Fixed** |
| **M5** combat | 1 enemy family (4 units) + boss — **tier 1** | ~5 | **Variable** (per tier) |
| **M6** dialogue | 6 NPCs — persona + `knowledge[]` + gated topics (§6) | ~6 | **Variable** |
| **M7** inventory | 6 weapons, 4 armour, 3 consumables, **1 cursed item** (+STR / LCK — §7 says day-one) | ~14 | **Fixed** |
| **M8** world | The **price table in copper** | ~1 | **Fixed** |
| **M8** world | 3 map locations + the road; shop stock; the quest chain | ~7 | **Variable** |
| **M9** flavour | Authored fallback per AI surface (§13); shrine + Luck-drift events; humiliation seeds | ~10 | **Fixed** |
**≈57 discrete authored pieces for a complete, playable game.** An estimate, and
likely optimistic — but an estimate with an end, which is the entire point.
Roughly **37 fixed / 20 variable**: a second town costs the ~20, not the ~57.
Explicitly **not** in the slice: rings, amulets, trinkets. A second town. The other
six kings and their cults. All parked in the Backlog.
### The economy is two systems (§18)
- **The loop is code** (§2: state) — purse, buy/sell, the ~40% fence rate, gritty
disabled-CTA reasons. Sequenced as M8's *Shop economy*.
- **The numbers are content** — what a shortsword costs, a night at the inn, an ale,
the quest's purse. The **price table**, above.
**Currency model:**
```
1 gold = 100 silver = 10,000 copper
1 silver = 100 copper
```
**Gold is scary.** A peasant's whole life is copper, a mercenary's fee is silver, and
a gold coin is a plot point. The party counting coppers for an inn bed is §3 grit,
and Brannoc has an opinion about it.
**The value type landed ✅** ahead of M7, as its own item
([spec](../docs/superpowers/specs/2026-07-12-currency-copper-design.md), merged to
`dev`): a `Currency` value type storing **everything in copper** and formatting only
at the display edge; `coin.json` replaced by `copper`/`silver`/`gold`; the purse as a
single `GameState.purse_copper` int; the shell's command bar reading `◈ 3s 47c`.
Money is **not** an inventory item. `give_item`/`accept_item` carry no quantity and
`gifts_given` is a global one-shot, so a lone `copper` id would be givable *once, for
one copper, per campaign*. The denominations are **move tokens** instead —
`give_item(gold)` is +10,000c — and currency routes to the purse, never the
`inventory` dict, so it cannot surface in an inventory grid by construction.
**What is left is the numbers.** The **price table** (above) is content and belongs to
M8's BOM. Nothing is priced yet.
*§2: state · done · goal: money that means something.*
---
## 3. Backlog
Not a debt. Where ideas go to be safe.
- **Items:** rings, amulets, trinkets.
- **Places:** a second town. Regions of the Margreave beyond the slice.
- **The saga (tiers 27)** — from the [character-reuse
spec](../docs/superpowers/specs/2026-07-12-character-reuse-seven-arc-design.md): the
other six kings as campaign patrons; tiered enemy families (proximity to a king *is*
the power scale); the three story-shapes (cult cell → cult that owns a city → the
king himself).
- **The Barbarian ⚔ calling name** (`[CANON-TBD]`).
- **AI-generated worlds** (v2, charter §17). The saga spec guarantees the `Saga`
object is what will feed it. Nothing else about it is decided.
---
## Notes for whoever authors next
- Each BOM line is authored through the **`/world-building` skill** — it reconciles
against existing canon, writes the build tool's source format, and verifies the
build stays green.
- **The build tool needs two new namespaces: `item` and `quest`.** Its legal
namespaces today (`tools/content_build/model.py`) are `town`, `place`, `region`,
`faction`, `person`, `rule`, `rumor`, `fact`, `secret`, `npc` — so **locations are
already modeled** (`town`/`place`/`region`) and only items and quests fall outside
it. Adding those two (model, emit, resolve) is a prerequisite of the M7 and M8 BOM
lines. **Add `tier: 1..7` to the entry envelope at the same moment** — the saga
spec's only schema ask, free while the model is already open.
- **Moving or deleting generated content is a client change.** `content/world/**` has
a client consumer: `client/scripts/content/content_db.gd` (via
`client/scripts/harness/npc_harness.gd`) and its GUT tests in
`client/tests/unit/test_content_db.gd`. That is the Duncarrow lesson — check
`client/` before any content move.