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
184 lines
9.1 KiB
Markdown
184 lines
9.1 KiB
Markdown
# 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 2–7)** — 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.
|