Roadmap
Roadmap
Single ordered plan. After each phase ships, the orchestrator updates the row (todo → in-progress → done + commit SHAs) and commits the diff per the auto-commit policy. CEO can re-prioritize by editing the table directly.
Current phase
Phase 13 active — 12 sub-phases landed (13-1..13-12) + Thread D ADR-0007 backend deliverables + B-level adapter mirror + 4 lore parallel increments 2026-05-20. Phases 11+12 done. D-015 ratified — 4-phase sequence (13 Backend+Android → 14 VPS → 15 iOS → 16 Watch). Phase 13 plan ratified (7eb1bd4) — 5 detailed sub-phases + 8 skeletal, 51 feature checklist items, 15-step exit-scenario walkthrough. Parallelism rule: Phase 13 sub-phases run parallel with lore work.
Canon expansion 2026-05-21 → 2026-05-22 (D-018..D-027): Ten new D-decisions ratified across two CEO sessions covering Energy economy (D-018), 5-class roster (D-019), combat encounter trigger model (D-020), daily loop (D-021), Map as gameplay (D-022), endgame Atlas of rejestry (D-023), quest structure (D-024), multiplayer M1 package (D-025), notifications (D-026), onboarding (D-027). All ten compose with Phase 13 forward (no in-flight code-layer regressions) — Phase 13 plan cross-references documented per sub-phase. Naming discipline closure (SF-2 sweep + rule 4 ERROR gating) shipped 2026-05-21/22. Fleet refactor (CLAUDE.md L1/L2/L3 framework + per-decision canon files + pnpm lint:canon gate) landed 2026-05-22; obsolete wiki/src/content/docs/canon/decisions.md stub removed (283783c); 27 D-files live under wiki/src/content/docs/canon/decisions/. D-019 followup landed today 2026-05-22 — 4 new classes (class.pieczetarz / class.pielgrzym / class.komiwojazer / class.tropiciel) + 4 starting clusters (cluster.first-seal / first-lantern / first-route / first-sign) with 32 nodes + 4 keystones authored data-layer-only (commits c6c722e, 06d75b5, 83b5451); backend adapter mirror for the 4 new classes is intentional Phase 13 scope and tracked in ops/escalations.md Q8 FYI.
Landed today:
- 13-1 Android bootstrap — ADR-0007 Android network layer (
e260ead) + walkrpg-mobile Kotlin/Compose bootstrap (4 commits in sibling repo). - 13-2 D-016 progression spec — Model A + keystone 1pt + ~20% inaccessibility gap RATIFIED (
60781da). D-006 §Pillar 3 amended ~70 → ~75%. - 13-3 Walker creation + 1 class —
class.cartographerauthored (bdf9f51), Quest 001/002 retrofit (9304f10), progression.md draft (7a5ec02), Prisma migration +POST /walker/class(a476ec8,0b6eba7,089294c), Android class-pick screen + walker-creation flow (3 + 1 reconciliation commits in walkrpg-mobile). - 13-4 Home + step ingest + streak —
GET /walker/streak(ec74aed) + health-connect-contract.mdx draft (e825290) + Android Home rewrite + Health Connect + PostWalkSync + 14 bilingual strings + 8 a11y items + 29 new tests (5 walkrpg-mobile commitsf922aef..cbc0b9d); ui-designer wireframe pass D-016 progression element + pisarska linijka spec (fad3f5a). - Thread D — ADR-0007 §Backend deliverables (parallel non-13-4) — HttpExceptionFilter (
cfbc450), X-Request-Id middleware (c82d293), CORS bootstrap (8f7efc6), ADR-0007 backend deliverables marked shipped (cea5e41). +14 tests. - 13-5 Quest log + Quest 001 e2e + tree allocation — backend
GET /quest/available+POST /quest/:id/step/:n/advance+ gate evaluator (04a0122,c57a674); QuestSchema gate fields + per-step beats on Quest 001/002 (8f40e35,6e247e0); Android QuestLog + QuestDetail + TreeViewer + Room offline queue + 7-day cap per D-009 (6 walkrpg-mobile commitsfad0a9a..e394a23); plan update (de3d495). +27 backend tests, +38 Android tests. Lore parallel: Plenny Quest 003 “Dzwoniący magazyn” + Pan Bezelec NPC (df17a2b,021eb09). - 13-6 Faction screen + faction-rep visible on Android — Android FactionsScreen + FactionDetailScreen + bundled 5 factions + 5-tier ladder + GET /faction-rep read-only (4 walkrpg-mobile commits
bb7e654..fa68cd0). +28 Android tests. Parallel (13-7 prep): ADR-0008 combat encounter API drafted (358b123) — 10 sections, 4-endpoint family, simulator integration hard rule. Parallel (B-level): Quest adapter mirror for keystoneRequirement + factionRepRequirement (014cc6a). Lore parallel: Plenny Quest 004Połowa rejestru(8a6ae87) + Wnęt Sosnowy-Półwiek smolarz NPC (d6cf0bd). - 13-7 Combat encounter API + Quest 002 trigger plumbing — paired mechanics-designer + backend-engineer. Mechanics (
b8847e5,d461894):data/src/schemas/opponent.tsZod schema (bilingual, 8-stat block bit-identical to simulator’sEnemySnapshot),opponent.frost-thing-slow-ventfirst content (ADR-0008 §3.1 canonical numbers),QuestStepBeatSchemamigrated todiscriminatedUnion("kind", [narrative, encounter])— all 13 existing beats migrated tokind: "narrative", Quest 002 step 3 rewritten asbeat-3-frost-thing-at-the-slow-ventwith encounter beat. ADR-0008 flipped Proposed→Accepted (97a2041). Backend (cf4e6ab,a7a4c67,f992f3a): Prismacombat_encounterstable (inline JSONB replayLog) +EncounterState/EncounterOutcomeenums + adapter mirror for opponents +QuestStepBeatunion + fullbackend/src/combat/module (4 endpoints —POST /combat/encounter,/turn,/resolve,/retreat) + 42 tests. Simulator-as-hard-import honored — backend importssimulateEncounter/makePrngfrom@walkrpg/data/sim, NO re-implementation. D-016 separation visible on wire (treePointsDelta: 0literal). D-010 non-punitive defeat enforced (hp clamps to 1). Backend test count 169 → 211 (+42). W-level decisions: replay strategy + seed generation + dropped standalonekind: "factionRep"variant (3 logs underops/decisions/2026-05-20-13-7-*). - 13-8 Combat UI on Android — mobile-developer single-lead. Full Compose
CombatScreenper wireframe 11e-1 (6 UI states). 4-endpointCombatApiagainst ADR-0008 §3.CombatRepository+CombatViewModel— server-canonical state, strict turn-order. Nav routecombat/{questId}/{stepIndex}/{opponentTemplateId}fromQuestDetailScreen. Deterministic worked-example replay test — formulas.md §10 byte-for-byte against seed 92 fixture (Cartographer + frost-thing-slow-vent, 2-turn fight, hp=47 energy=10 outcome=victory). Action set Attack+Retreat per ADR-0008 §8.3. Bilingual strings + 8+ a11y items (live regions on turn outcomes). versionName 0.1.0-13-6 → 0.1.0-13-8. +53 Android tests (116 → 169). walkrpg-mobile commits4831d49..b7fbcf0(5 commits). W-level log:ops/decisions/2026-05-20-13-8-combat-ui-android-w-level.md. Deferred to 13-9: client-side xorshift32 for animation prediction, haptics on crit/victory/defeat, opponent localized name endpoint. - 13-11 Bilingual UI polish + a11y full pass — ui-designer + mobile-developer sequential. UI (
1b94be6): acceptance matrixwiki/.../ui/phase-13-11-acceptance.md— 7 sections, per-screen a11y checklist for 9 Android screens, TalkBack + bilingual + 200% font-scale criteria, test surface (+25-40), explicit defer list. W-lock: Settings screen for EN/PL switcher (gear icon Home top-bar, SegmentedButton,walkrpg.locale.overrideSharedPreferences key). Mobile — walkrpg-mobile 4 commits:09431cb(Settings screen + LocaleStore factory pattern + LocaleViewModel + LocaleProvider with CompositionLocal — zero-restart locale switching via Compose CompositionLocalProvider over AppCompatDelegate; LocaleOverrideProvider rebuilds Configuration + locale-configured Context; MainActivity wraps AppNavigation, AppNavigation gains SETTINGS route),e97ad13(a11y audit fixes: settings gear contentDescription, WalkerHpHud health-state labelhealthy/warning/criticalbased on fraction, StreakRibbon liveRegion Polite, TreeViewer available-points counter liveRegion comment; 200% font-scale tab-barfontScale >= 1.8ficon-only fallback with full label as contentDescription; @Preview(fontScale=2f) on HomeScreen/SettingsScreen/Factions/FactionDetail/QuestLog/QuestDetail/PostWalkSync; ProgressionCard hardcoded string extracted to R.string.progression_allocated; Polish<plurals>resourcesquest_count+step_countwith zero/one/few/many/other forms upgrading from 13-10 template-string workaround),cbf21c3(+53 tests across 9 files: Phase1311A11yTest, Phase1311FontScaleTest, Phase1311ClassPickScreenFontScaleTest, Phase1311QuestLogFontScaleTest, Phase1311FactionFontScaleTest, Phase1311CombatScreenA11yTest, Phase1311LocaleTest LocaleStore persistence + effectiveLocale logic, Phase1311PluralsTest 13 tests covering PL quest_count[0,1,2,5,21] + step_count[0,1,3,7] + EN forms, Phase1311SettingsScreenTest),1a4bd3b(versionName 0.1.0-13-10 → 0.1.0-13-11, versionCode 3 → 4). Caveat: mobile-developer authored tests but could NOT run./gradlew test/lint/buildin this session — no Gradle binary in sub-agent env +gradlewwrapper JAR not committed (gradle-wrapper.propertiesrequiresgradle wrapper --gradle-version 8.7setup). Verification deferred to CI image or local Gradle bootstrap; flag for next-session audit. W-level:ops/decisions/2026-05-20-13-11-ui-locale-switcher-placement.md+ops/decisions/2026-05-20-13-11-mobile-locale-propagation.md. - 13-10 Keystone-unlock-as-quest-reveal (D-006 Pillar 3 cosmos hook) — narrative-designer + mobile-developer parallel, then backend-engineer integration test. Plumbing was all already live from 13-5 (KEYSTONE_GATE evaluator + hiddenCount); 13-10 lands first actual content + Android UX + e2e verification. Narrative (
351a7de,e0fc772): Quest 005 „Niemilknący kurier” — first keystone-gated hidden quest, 5-beat companion-walk in Plenny with new NPC Stary Marno Niedoczas (kurier of a courier-house dissolved 112 years ago; condition literalizes the keystone’s removal of idle regen). PL slug rename mid-flight (old-marno-out-of-time→stary-marno-niedoczas) for lint compliance — matchesbrodek-spozniony/pan-bezelecconvention. Forward hook: Marno carries sealed envelope of his own dissolved house (same house-mark as Wnęt’s Quest 004 pinewood slip); addressee identity reserved for Quest 006+. Pan Korytarz poziom-25+ reservation preserved. First Dziki Trakt rep accrual in a Plenny quest. Mobile — walkrpg-mobile 4 commits:2663044(QuestRefreshBus singleton SharedFlow,extraBufferCapacity = 1against tab-switch timing — chosen over caller-driven),b833aaf(D-006 cosmos hook UX: snackbar with “Open Quest Log” action on TreeViewer,HiddenCountHintcomposable on QuestLog withliveRegion = LiveRegionMode.Polite, 5 EN+5 PL strings, Polish plural via template string),b0c01e6(+29 tests above the +12-18 target — bus, delta detection, hiddenCount, a11y, filter preservation, offline failure path, Polish plural correctness, content-description assembly; 218 → 247),190d9e0(versionName 0.1.0-13-9 → 0.1.0-13-10, versionCode 2 → 3). Backend (a0a0f59): integration tests + adapter-mirror gap-fill. Quest 004 was missing fromgame-content.tsquest array (silent gap — no test referenced it pre-13-10); Quest 005 added withkeystoneRequirement: { keystoneId: "keystone.unshaken-step" }— first entry to activate KEYSTONE_GATE evaluator on real content. Stale 13-5 comment removed. +4 quest.service.spec.ts tests (hide-when-missing-keystone, reveal-when-both-gates-pass, hide-when-missing-prereq, hiddenCount transition proof). Backend 236 → 240. W-level log:ops/decisions/2026-05-20-quest-005-niemilknacy-kurier.md(narrative) +ops/decisions/2026-05-20-13-10-mobile-quest-unlock-arch.md(mobile). Deferred to later sub-phases (mobile-developer raised, defer-by-default in 13-10): haptic on new-quest unlock (per wireframe §4.4 heavy-impact + discovery tone — haptic infra not yet wired in Phase 13);onNavigateToQuestscallback wiring into nav graph (separate next nav increment); bus signal scope remains keystone-only as specified (regular node allocations don’t yet flip quest gates by current game logic). - 13-9 Combat outcome → quest/tree/rep deltas — tech-architect scope memo → mechanics-designer → backend-engineer → mobile-developer chain. Design memo (
384b562): cross-cutting spec for walker.currentHp persistence, composeWalkerStats in @walkrpg/data/sim, /resolve+/retreat enrichment, Kotlin xorshift32 prediction contract. 3 W-locks ratified by CEO (currentHpInt?nullable; compose lives in data layer; full /resolve enrichment). Mechanics (eb14862):composeWalkerStatspure function indata/src/sim/compose.tswith sorted-id traversal + per-node add-then-mul bucketing + throws on unknown nodes;ClassSchemaextended to full 10-field combatStats block (snake_case mirrorsWalkerSnapshot);NodeSchemagains optionalcombatModifiers(typedadd/mulops on stat enum); Cartographer migrated;baseHp/baseEnergydeleted. +15 data tests (14 → 29). Backend (3bb9fe0): Prismaadd_walker_current_hpmigration (current_hp Int?nullable, no backfill);game-content.tsadapter mirror updated (Class with combatStats, NEW Node mirror, Cartographer literal verbatim);buildWalkerSnapshotrewritten async — fetches allocations, callscomposeWalkerStats, substituteswalker.currentHpclamped to hp_max;resolveEncounter+retreatEncounterpersistcurrentHpinside$transaction(D-010 defeat=1 clamp honored); /resolve+/retreat DTOs enriched (walkerProgressionall-zero block as D-016 invariant;factionRepDeltaswithreputationBefore/After+tierBefore/After;encounterSummary.walkerHpStart+walkerHpDelta;loreUnlocked[];questStateAfter.previousStepIndex); /walker/profile returnscurrentHp+currentHpMax. +25 backend tests (211 → 236). Mobile — walkrpg-mobile 3 SHAs:7ce5d91(sim: bit-identical KotlinXorshift32+CombatMathprediction-only subset),fd75fe9(features: CombatViewModel prediction layer + spinner removal + reconciliation via draw-count advance sincenextPrngStateNOT on wire; DTOs + domain types updated; HP/tier-promotion/lore-unlock animations with content descriptions;WalkerHpHudon Home; +5 bilingual strings; versionName 0.1.0-13-8 → 0.1.0-13-9),17da80c(tests: +49 Android tests, 169 → 218 —Xorshift32Testdraws 9-18 corrected from wrong placeholders to verified node.js output before CI would have caught it;CombatMathTest;CombatPredictionTest;CombatDtoTest;CombatWorkedExampleTestaccuracy fixture re-derived 0.80 → 0.82 to match new cartographer combatStats). B-level finding: cartographer accuracy 0.82 (mechanics-designer’s chosen default), worked example regenerated. W-level logs underops/decisions/2026-05-20-13-9-*(4 logs).
Lore parallel: Plenny deep lore page (1ef35a4); Quest 003 + Pan Bezelec NPC (df17a2b, 021eb09); Quest 004 + Pan Pine-Half-Century NPC (8a6ae87, d6cf0bd); Quest 005 + Stary Marno Niedoczas NPC (351a7de, e0fc772); Quest 006 + Pan Kępka NPC (d7dc383, 60d9b06); Cech Niedokończonych Wypraw faction deep-dive + lint regex fix (9c9549d); cosmos-hook visual spec for D-006 Pillar 3 polish target (efeb63c).
Test counts (combined sessions): Backend 103 → 240 (+137; +42 from 13-7 combat module, +25 from 13-9 walker.hp + enrichment, +4 from 13-10 keystone-gate integration). Data 14 → 29 (+15 from 13-9 composeWalkerStats). Mobile 5 → 300 (+295; +53 from 13-8 combat UI, +49 from 13-9 xorshift32 + prediction + DTOs, +29 from 13-10 QuestRefreshBus + delta detection, +53 from 13-11 a11y + locale + plurals). All 300 mobile tests verified passing locally via ./gradlew testDebugUnitTest post-caveat-sweep + 13-11-followup (2026-05-20).
Note (2026-05-20): inbox handoff at session start showed backend test count 212 after 13-6; backend-engineer’s actual baseline run at start of 13-7 measured 169. Discrepancy unresolved — flagged for next session audit. Working number is
pnpm --filter backend testground truth = 211 post-13-7.
13-12 landed 2026-05-22 (core scope only per CEO triage): Tech-architect memo (wiki/.../tech/phase-13-12-design.md, ~480 lines) + W-lock A/A/A ratification (ops/decisions/2026-05-22-13-12-scope-locks.md). Backend 5 commits (9dd0bf8, 67544ef, 4ae7b2d, 96bb8f8, 4cd646b): Prisma idempotency_keys table (composite uniqueness on (walkerId, key, endpoint), 7d TTL match D-009 cap) + canonical-hash.ts (sha256 over key-ordered JSON.stringify, byte-identical determinism) + stale-action.guard.ts (7d + 6h grace, symmetric future-dated guard) + IdempotencyInterceptor + @Idempotent({ endpoint }) decorator + IdempotencyModule + @nestjs/schedule daily cron sweep at 03:00 + wired into tree.controller (allocate) + quest.controller (advance + complete) + Swagger header docs. +36 backend tests, +1 e2e suite (54 cases) — total backend 240 → 283 unit + 54 e2e. Mobile 4 commits walkrpg-mobile (108a1b4, cb4dd73, 6f5fb8e, 0ec386a): Room MIGRATION_1_2 with payload-JSON backfill (no destructive fallback) + OfflineAction.idempotency_key + OfflineAction.client_generated_at columns + unique index (action_type, idempotency_key) (single-wallet device, walker_id omitted as B-level) + OfflineQueueRepositoryImpl.enqueue signature with default UUIDv4 + clientGeneratedAt + 3 enqueue call-sites (TreeViewerViewModel + QuestDetailViewModel × 2) + OfflineQueueWorker.classifyResponse sealed-class result (Success / PermanentDrop(reason) / RebuildQueue / TransientRetry / AuthRefresh) + Retrofit @Header("Idempotency-Key") on all 3 decorated endpoints + ISO-8601 wire conversion + backoff/jitter (base 5s, factor 2.0, max 5min, ±25% jitter, 12 attempts cap) + STALE_ACTION semantics extended to OfflineActionExpired event. +42 Android tests (memo target +29 — stress test file produced 9 methods, classify response produced 16 cases vs memo’s 12 estimate) — total Android 300 → 342. versionName 0.1.0-13-11 → 0.1.0-13-12, versionCode 4 → 5. B-level decisions (3 logs at ops/decisions/2026-05-22-13-12-*): two-phase idempotency-write pattern (key insert AFTER $transaction to avoid forwarding tx through getState() across ~150 LOC; safe because DB unique constraints provide business-layer idempotency floor — qa-engineer follow-up required when Energy ledger ships, no unique constraint on balance debits); mobile migration backfill (explicit MIGRATION_1_2 vs destructive); RebuildQueue v1 (drops quest chain on STEP_OUT_OF_ORDER, full /quest/available reconciliation deferred). Deviations from memo (all defensible, logged): backend two-phase tx pattern; mobile TreeAllocateRequest vs TreeAllocateWireRequest split (Room internal stays epoch-ms, wire ISO-8601); mobile unique-index omits walker_id (single-wallet Room DB). Scope locks all honored: ORDERING_VIOLATION 422 reserved-not-thrown; /step/ingest grandfathered (body-key per ADR-0002); Energy ledger NOT shipped (Q3=A forward-reference); D-026 push + D-027 onboarding both out per CEO core-only triage.
13-13-prep landed 2026-05-22 (qa-engineer authored). Acceptance matrix wiki/.../qa/phase-13-13-acceptance.md (583 lines, commit ab67d44) — per-step pass/fail criteria for 15 §5 steps, D-021 pure-micro + pure-evening usage matrix, D-027 onboarding deferral explicit per §10.10 option (b) (current 13-3 class-pick = Phase 13 canonical onboarding; full Bertranda walkthrough defers to post-Phase-13), device-only items list, P0/P1/P2 bug triage queue ready for CEO entry, test environment setup checklist. JVM/Robolectric coverage expansion — 38 new tests across 7 files (Phase1313ColdStartTest, Phase1313FullColdStartTest, Phase1313QuestCombatNavigationTest, Phase1313CombatResolutionPersistenceTest, Phase1313StreakMicroPatternTest, Phase1313CapMathMicroPatternTest, Phase1313OfflineSyncDayCapTest), Android 342 → 380 (commits 699b289 + 95e244a versionName 0.1.0-13-13-prep). Orchestrator inline compile fixes (3ee51a6 mobile, b65a06d matrix baselines): missing OfflineQueueRepository import + actionType: String not ActionType + backtick test name colon. FLAG_LEAD logged to escalations.md: §5 step 14 retreat-vs-step-advance contract is implicit in D-010 + combat module code; qa-engineer inferred “retreat does NOT advance step”; B-level follow-up under tech-architect to make §5 step 14 explicit. No blocker for device run.
Next dispatch: CEO physical device walkthrough. Install APK on real Android, run all 15 §5 steps against acceptance matrix, fill in P0/P1/P2 triage queue, fix sweep. Phase 13 ships when matrix fully green. Caveat-sweep + 13-11-followup CLOSED 2026-05-20: orchestrator bootstrapped portable JDK 17 + Gradle 8.7 + Android cmdline-tools to ~/opt/, fixed pre-existing build blockers (libs.versions.toml hilt-work redef; Kotlin Compose plugin per K2.0; compileSdk 34→35; Compose UI test deps→testImplementation; manifest queries; theme + launcher stubs; FactionDef comment trap; unused imports; non-Composable stringResource; FactionDetailContent visibility; stale test fixtures). Then mobile-developer 13-11-followup landed 3 commits (36a1c20, 79b82b4, 6f58403): isReturnDefaultValues = true + isIncludeAndroidResources = true testOptions; @GraphicsMode(NATIVE) on all 7 Compose UI test classes + @Config(manifest = Config.NONE) REMOVED (was stripping manifest needed for createComposeRule); PluralsTest RuntimeEnvironment.setQualifiers("pl") per-test pattern; PostWalkSyncViewModel explicit sinceMs param (MockK $default overload limitation); QuestLogViewModel ACTIVE filter semantics fixed (status == "in_progress" only, not != "completed"); FontScaleTest assertIsDisplayed() → assertExists() for off-viewport-but-composed elements; CombatWorkedExampleTest fixed missing vm.resolve() after turn 2. Final result: 300/300 mobile tests passing. CRITICAL non-finding: CombatWorkedExampleTest failure was NOT a 13-9 sim port regression — pure test scaffolding bug (composable normally drives resolution, test forgot to call vm.resolve()). Kotlin Xorshift32 + CombatMath ports are byte-for-byte correct against TS reference. Open / deferred across Phase 13: haptics on crit/victory/defeat + unlock (13-8/13-10/13-11/13-x deferred; haptic infra not wired); opponent localized name endpoint (13-8 deferred); wiki /api/ reference docs for /walker/profile + /resolve + /retreat (no wiki/.../api/ dir exists yet — flagged 13-9 by backend-engineer); onNavigateToQuests callback nav-graph wiring (13-10 mobile — partial in 13-11 via SETTINGS route, quest-log nav still pending).
Phases 11 & 12 were decomposed on 2026-05-19 from 2 monoliths into 17 shippable sub-phases (1 commit each). “Full social” was removed from the 11 series — it stays in Deferred (paused per D-007/D-008/D-009 freeze).
Phase log
| # | Phase | Lead(s) | Status | Commits |
|---|---|---|---|---|
| 1 | Bootstrap monorepo (phases 1-4 of original plan) | tech-architect | done | dae0d18 |
| 2 | Language policy enforcement + reviewer hook | tech-architect | done | 3de4766 |
| 3 | Tag taxonomy + lint + find:tag helper | tech-architect | done | 611941e |
| 4 | Walkrpg-start tmux launcher + safety fixes | tech-architect | done | 968865a, 6db40ae, 45979c4 |
| 5a | Lore round 1 — four pillars ratified (D-006) | game-director + CEO | done | c677bf2 |
| 5b | Lore round 2 — regions, factions, NPCs, Quest 001 | narrative-designer | done | c3cf3c1 |
| 5c | Data content layer bootstrap (17 typed instances) | tech-architect | done | 04f1a71 |
| 5d | narrative-designer v2 skill + auto-commit policy | claude (root) | done | 74458a2, 303b08e |
| 6 | Content-layer rename to ENG handles (bilingual rule applied retroactively) | narrative-designer → tech-architect | done | 115d73c |
| 7 | Starter tree — Plenny cluster + keystone Krok Niezachwiany | mechanics-designer | done | 41d6de8 |
| 8a | Backend spec — ADRs (5) + Prisma schema v0 + API contracts (4) + tech wiki bootstrap | tech-architect | done | 7f08683 |
| 8b | Backend implementation — local + Cloudflare Tunnel test backend (mock auth, light validation, ~20 users, 5 endpoints) | backend-engineer | done | 0f9b573, 0d1ee27 |
| 9 | UI wireframes — design system + onboarding + home + tree viewer + post-walk sync | ui-designer | done | 521850d, d181ccb |
| 10 | Mobile stack decision (re-opens D-005) | game-director + CEO | done | D-008 (no code commit) |
| 11a-1 | Frostlands lore page (PL, MDX) | narrative-designer | done | dd03015 |
| 11a-2 | 2 NPCs for Frostlands (bilingual data) | narrative-designer | done | 4b8c40c |
| 11a-3 | Quest 002 — Frostlands hook | narrative-designer | done | ddb5ed1 |
| 11b-1 | Combat formulas — damage, defense, energy cost (math, no code) | mechanics-designer | done | 43b8efc |
| 11b-2 | Combat simulator — TS test runner against the formulas | mechanics-designer | done | 8856366 |
| 11c-1 | Faction rep schema (Zod) | mechanics-designer | done | 8938a28 |
| 11c-2 | Unfinished Guild rep tiers (worked example) | mechanics-designer | done | f8cbc8b |
| 11d-1 | Backend endpoint — quest-progress (start/complete) | backend-engineer | done | 308eccb |
| 11d-2 | Backend endpoint — faction-rep (read/delta) | backend-engineer | done | c742609 |
| 11e-1 | UI wireframe — combat screen | ui-designer | done | 62001db |
| 11e-2 | UI wireframe — faction screen + quest log | ui-designer | done | 1aff7bb |
| 12a | Crafting + materials schema | tech-architect | done | 8cfbf11 |
| 12b-1 | 2 consumable recipes (worked content) | narrative-designer + mechanics-designer | done | fd17283 |
| 12b-2 | 3 equipment recipes (worked content) | narrative-designer + mechanics-designer | done | 6713220 |
| 12c | Leak harvesting mechanic spec (region-bound) | mechanics-designer | done | fa0308d |
| 12d | Crafting UI wireframe | ui-designer | done | b1c30eb |
| 13 | Backend + Android (incremental parallel) — backend endpoints + Kotlin Android client grow together; no sharp “backend done” gate; ships when Android has feature set the closed-beta cohort needs. Decomposed sub-phase plan at tech/phase-13-plan.md (5 detailed + 8 skeletal; 51 feature checklist items + 15-step exit scenario). 13-1..13-12 landed + Thread D backend deliverables + B-level adapter mirror + 4 lore increments + Gradle bootstrap sweep + 13-11-followup test sweep + 3 parallel-narrative-and-UI commits (Quest 006, Cech deep-dive, cosmos-hook spec). ADR-0008 Accepted; combat loop functional end-to-end. 13-11 lands EN/PL switcher + a11y full pass + 200% font-scale + Polish <plurals>. 13-12 lands first anti-cheat surface: persistent idempotency-key table + D-009 7d cap server-side enforcement via clientGeneratedAt + per-walker FIFO ordering contract + hardened Room queue with backoff/jitter retry + ISO-8601 wire shape. Backend 240→283 unit + 54 e2e; Android 300→342. Next: 13-13 (exit-scenario integration test). | tech-architect + mobile-developer paired (+ mechanics-designer, narrative-designer, ui-designer, backend-engineer, game-director consulted) | in_progress (12/13 sub-phases done + 2 parallel threads + 4 lore increments) | 13-1..13-12 (walkrpg repo): e260ead, 60781da, bdf9f51, 9304f10, 7a5ec02, a476ec8, 0b6eba7, 089294c, ec74aed, e825290, fad3f5a, 04a0122, c57a674, 8f40e35, 6e247e0, df17a2b, 021eb09, de3d495, 358b123, 014cc6a, d6cf0bd, 8a6ae87, b8847e5, d461894, 97a2041, cf4e6ab, a7a4c67, f992f3a, 384b562, eb14862, 3bb9fe0, 351a7de, e0fc772, a0a0f59, 1b94be6 + Thread D cfbc450, c82d293, 8f7efc6, cea5e41 + walkrpg-mobile 8931019..1a4bd3b (13-8: 4831d49, 77092ce, f54aa7a, cb57928, b7fbcf0; 13-9: 7ce5d91, fd75fe9, 17da80c; 13-10: 2663044, b833aaf, b0c01e6, 190d9e0; 13-11: 09431cb, e97ad13, cbf21c3, 1a4bd3b; 13-12: 108a1b4, cb4dd73, 6f5fb8e, 0ec386a) + 13-12 walkrpg memo + W-lock + backend: 4102394, 9dd0bf8, 67544ef, 4ae7b2d, 96bb8f8, 4cd646b + walkrpg mobile-B-logs 4d30b2b |
| 14 | VPS migration — Hetzner CX22 (~€5/month) Docker Compose stack, public IP, no Cloudflare Tunnel; triggered when Phase 13 Android client is stable. ADR (next-free number) authored at trigger time — ADR-0007 was re-allocated to Android network layer in Phase 13, VPS ADR defers to ADR-0008+ at trigger. | tech-architect | todo (per D-015, post-13) | — |
| 15 | iOS app (native Swift) — HealthKit, Apple DeviceCheck, App Store Sign-In Apple compliance. Reaches Android parity by ship | mobile-developer | todo (per D-015, post-14) | — |
| 16 | Watch-native (Wear OS + WatchOS together) — internal staging 16a peripheral read-only → 16b peripheral light-write → 16c autonomous mode, per ops/research/2026-05-20-watch-native-stack.md. Resolves original “Phase 2” sentinel | mobile-developer + ui-designer | todo (per D-015, post-15) | — |
Deferred undertakings (not numbered phases)
These are committed-but-unscheduled migrations. They sit outside the phase log because their trigger is signal-based, not sequence-based. When a trigger fires, a new ADR is authored and the work lands as its own phase row.
- Production migration — full D-007/D-008/D-009 stack: GCP project + Cloud SQL
europe-central2-warsaw+ Firebase Auth Path B + Firebase App Check + restrictive anti-cheat (three-layer defense in depth per ADR-0004) + reconciliation worker + EU residency provisioning + realtime multiplayer (WebSocket gateway, presence, chat, co-op). Paused indefinitely per D-015. Re-designed AFTER Phase 16 ships and tester data tells us scale. ADRs 0001-0005 carry the production-target spec; they unfreeze when production planning unfreezes.
Note (2026-05-20): D-015 promoted VPS migration from a signal-based deferred undertaking into Phase 14 (explicit sequential phase) and re-numbered the original “Phase 13 Watch-native” to Phase 16 to make room for Backend+Android (Phase 13) and iOS (Phase 15) as their own phases. Supersedes D-009 §4 phasing.
Conventions
- One row per phase. New phases append. Phases may not be re-ordered without CEO consent.
Statusvalues:todo→in-progress→done. A phase blocked on an external thing carriesblocked: <reason>.Commitslists the SHA(s) that landed the phase. Auto-commit policy in CLAUDE.md says every phase ships at least one commit.- The “Current phase” line above the table is redundant with the table — kept for fast scanning.
- The roadmap file itself is updated by the orchestrator at phase boundaries. The phase update is folded into the phase’s own commit when feasible, otherwise a separate
docs(roadmap): mark phase N donecommit.
How to start a new phase
CEO types /work <topic> and the orchestrator:
- Reads this file’s “Current phase” line.
- If the topic matches, marks the phase
in-progressand dispatches the lead. - If the topic does NOT match, asks the CEO whether to re-prioritize the roadmap or treat this as ad-hoc.
- On lead return, commits the work, updates the roadmap row, commits the roadmap diff (or folds into the lead’s commit).
If no /work topic is supplied, the orchestrator reads Current phase and proposes the matching lead.