# Roadmap Source of truth for scope is [`CLAUDE.md`](../CLAUDE.md). This tracks sequencing. ## POC — the one question (charter §17) > **Does bounded AI dialogue feel alive, or does it feel like a chatbot in a costume?** Test that before building anything else. ~30 minutes of play. ### POC scope - One town, **two NPCs** with authored knowledge lists - One dungeon: **three fights, one boss** - **Two companions:** Cadwyn, Brannoc - **Three playable classes:** Sellsword, Assassin, Priest - Luck fully wired: generation, drift, one shrine, one cursed item - Full proxy, full role split, full canon log - Authored fallback text for every AI surface ### Out of scope (charter §17) AI-generated story skeletons · multiplayer (never) · mobile · credits/payments/auth · companions leaving · positional combat · more than three classes. ## Sequencing Status: ✅ done · ▶ next · ○ planned. Each item is its own spec → plan → implementation cycle. ### Foundations — contract + engines - ✅ **Canon log + origin JSON-Schema contract**, api validation, unified 422 envelope (Plan A). - ✅ **Client canon log engine** — typed GDScript model (invariants in the model), new-game construction (origin + world + creation → canon log), turn-to-turn maintenance mutators, pure `[FACT]`/`[MOVE]`/`[ADJUST_DISPOSITION]` tag extractor (Plan B). ### Proving the loop — the POC's one question - ✅ **Narrator / Ollama pipeline (server)** — the shared server-side model-call pipeline (Ollama httpx client, role→model routing config, prompt loader + canon-log digest renderer, §10 call logging, single-retry → typed 502) wired through `/dm/narrate`. Non-streaming. Both phases landed: **(1) pipeline foundation** (`config`/`routing`/`prompts`/`ollama_client`/`call_log`), **(2) Narrator online** (authored `narrator.md` body + `narrate` service + gated live smoke). Server returns raw prose; the client extracts tags. The other four roles become thin drop-ins on this pipeline. Live wire proven against qwen3.5; 49 tests. Merged to `dev` (`ddc00d4`). - ▶ **Client HTTP loop** — client posts its canon log to `/dm/narrate`, displays the prose, harvests `[FACT]` via its `TagExtractor` into its own log, and shows the degraded-DM authored fallback (§13) on any non-200. Closes the first end-to-end Narrator scene. - ○ **Bounded NPC conversation** — `/npc/speak` with persona + `knowledge[]` + `available_moves[]`; client validates and applies moves, silently drops the invalid, keeps the prose (§6). **The core experiment.** ### Fills out the POC (charter §17) - ○ **Streaming** (§14) — server streams Ollama → client, landed with/after the client HTTP loop. - ○ **Adjudicator** (free text → legal action, strict JSON), **Improviser** (§7 sandbox, whitelisted changes), **Banter** (§9 humiliation log). - ○ **Luck fully wired** — drift events, one shrine, one cursed item. - ○ **Combat** — deterministic, seeded; the dungeon (three fights, one boss). - ○ **Authored fallback text** for every AI surface (§13). ### Deferred beyond POC Replicate provider (prod) · auth · metering · credits/payments (§4) — retrofit onto the pipeline later, the game doesn't notice.