Skip to content

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 classclass.cartographer authored (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 + streakGET /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 commits f922aef..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 commits fad0a9a..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 004 Poł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.ts Zod schema (bilingual, 8-stat block bit-identical to simulator’s EnemySnapshot), opponent.frost-thing-slow-vent first content (ADR-0008 §3.1 canonical numbers), QuestStepBeatSchema migrated to discriminatedUnion("kind", [narrative, encounter]) — all 13 existing beats migrated to kind: "narrative", Quest 002 step 3 rewritten as beat-3-frost-thing-at-the-slow-vent with encounter beat. ADR-0008 flipped Proposed→Accepted (97a2041). Backend (cf4e6ab, a7a4c67, f992f3a): Prisma combat_encounters table (inline JSONB replayLog) + EncounterState/EncounterOutcome enums + adapter mirror for opponents + QuestStepBeat union + full backend/src/combat/ module (4 endpoints — POST /combat/encounter, /turn, /resolve, /retreat) + 42 tests. Simulator-as-hard-import honored — backend imports simulateEncounter/makePrng from @walkrpg/data/sim, NO re-implementation. D-016 separation visible on wire (treePointsDelta: 0 literal). D-010 non-punitive defeat enforced (hp clamps to 1). Backend test count 169 → 211 (+42). W-level decisions: replay strategy + seed generation + dropped standalone kind: "factionRep" variant (3 logs under ops/decisions/2026-05-20-13-7-*).
  • 13-8 Combat UI on Android — mobile-developer single-lead. Full Compose CombatScreen per wireframe 11e-1 (6 UI states). 4-endpoint CombatApi against ADR-0008 §3. CombatRepository + CombatViewModel — server-canonical state, strict turn-order. Nav route combat/{questId}/{stepIndex}/{opponentTemplateId} from QuestDetailScreen. 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 commits 4831d49..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 matrix wiki/.../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.override SharedPreferences 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 label healthy/warning/critical based on fraction, StreakRibbon liveRegion Polite, TreeViewer available-points counter liveRegion comment; 200% font-scale tab-bar fontScale >= 1.8f icon-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> resources quest_count + step_count with 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/build in this session — no Gradle binary in sub-agent env + gradlew wrapper JAR not committed (gradle-wrapper.properties requires gradle wrapper --gradle-version 8.7 setup). 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-timestary-marno-niedoczas) for lint compliance — matches brodek-spozniony / pan-bezelec convention. 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 = 1 against tab-switch timing — chosen over caller-driven), b833aaf (D-006 cosmos hook UX: snackbar with “Open Quest Log” action on TreeViewer, HiddenCountHint composable on QuestLog with liveRegion = 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 from game-content.ts quest array (silent gap — no test referenced it pre-13-10); Quest 005 added with keystoneRequirement: { 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); onNavigateToQuests callback 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 (currentHp Int? nullable; compose lives in data layer; full /resolve enrichment). Mechanics (eb14862): composeWalkerStats pure function in data/src/sim/compose.ts with sorted-id traversal + per-node add-then-mul bucketing + throws on unknown nodes; ClassSchema extended to full 10-field combatStats block (snake_case mirrors WalkerSnapshot); NodeSchema gains optional combatModifiers (typed add/mul ops on stat enum); Cartographer migrated; baseHp/baseEnergy deleted. +15 data tests (14 → 29). Backend (3bb9fe0): Prisma add_walker_current_hp migration (current_hp Int? nullable, no backfill); game-content.ts adapter mirror updated (Class with combatStats, NEW Node mirror, Cartographer literal verbatim); buildWalkerSnapshot rewritten async — fetches allocations, calls composeWalkerStats, substitutes walker.currentHp clamped to hp_max; resolveEncounter + retreatEncounter persist currentHp inside $transaction (D-010 defeat=1 clamp honored); /resolve+/retreat DTOs enriched (walkerProgression all-zero block as D-016 invariant; factionRepDeltas with reputationBefore/After + tierBefore/After; encounterSummary.walkerHpStart+walkerHpDelta; loreUnlocked[]; questStateAfter.previousStepIndex); /walker/profile returns currentHp+currentHpMax. +25 backend tests (211 → 236). Mobile — walkrpg-mobile 3 SHAs: 7ce5d91 (sim: bit-identical Kotlin Xorshift32 + CombatMath prediction-only subset), fd75fe9 (features: CombatViewModel prediction layer + spinner removal + reconciliation via draw-count advance since nextPrngState NOT on wire; DTOs + domain types updated; HP/tier-promotion/lore-unlock animations with content descriptions; WalkerHpHud on Home; +5 bilingual strings; versionName 0.1.0-13-8 → 0.1.0-13-9), 17da80c (tests: +49 Android tests, 169 → 218 — Xorshift32Test draws 9-18 corrected from wrong placeholders to verified node.js output before CI would have caught it; CombatMathTest; CombatPredictionTest; CombatDtoTest; CombatWorkedExampleTest accuracy 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 under ops/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 test ground 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

#PhaseLead(s)StatusCommits
1Bootstrap monorepo (phases 1-4 of original plan)tech-architectdonedae0d18
2Language policy enforcement + reviewer hooktech-architectdone3de4766
3Tag taxonomy + lint + find:tag helpertech-architectdone611941e
4Walkrpg-start tmux launcher + safety fixestech-architectdone968865a, 6db40ae, 45979c4
5aLore round 1 — four pillars ratified (D-006)game-director + CEOdonec677bf2
5bLore round 2 — regions, factions, NPCs, Quest 001narrative-designerdonec3cf3c1
5cData content layer bootstrap (17 typed instances)tech-architectdone04f1a71
5dnarrative-designer v2 skill + auto-commit policyclaude (root)done74458a2, 303b08e
6Content-layer rename to ENG handles (bilingual rule applied retroactively)narrative-designer → tech-architectdone115d73c
7Starter tree — Plenny cluster + keystone Krok Niezachwianymechanics-designerdone41d6de8
8aBackend spec — ADRs (5) + Prisma schema v0 + API contracts (4) + tech wiki bootstraptech-architectdone7f08683
8bBackend implementation — local + Cloudflare Tunnel test backend (mock auth, light validation, ~20 users, 5 endpoints)backend-engineerdone0f9b573, 0d1ee27
9UI wireframes — design system + onboarding + home + tree viewer + post-walk syncui-designerdone521850d, d181ccb
10Mobile stack decision (re-opens D-005)game-director + CEOdoneD-008 (no code commit)
11a-1Frostlands lore page (PL, MDX)narrative-designerdonedd03015
11a-22 NPCs for Frostlands (bilingual data)narrative-designerdone4b8c40c
11a-3Quest 002 — Frostlands hooknarrative-designerdoneddb5ed1
11b-1Combat formulas — damage, defense, energy cost (math, no code)mechanics-designerdone43b8efc
11b-2Combat simulator — TS test runner against the formulasmechanics-designerdone8856366
11c-1Faction rep schema (Zod)mechanics-designerdone8938a28
11c-2Unfinished Guild rep tiers (worked example)mechanics-designerdonef8cbc8b
11d-1Backend endpoint — quest-progress (start/complete)backend-engineerdone308eccb
11d-2Backend endpoint — faction-rep (read/delta)backend-engineerdonec742609
11e-1UI wireframe — combat screenui-designerdone62001db
11e-2UI wireframe — faction screen + quest logui-designerdone1aff7bb
12aCrafting + materials schematech-architectdone8cfbf11
12b-12 consumable recipes (worked content)narrative-designer + mechanics-designerdonefd17283
12b-23 equipment recipes (worked content)narrative-designer + mechanics-designerdone6713220
12cLeak harvesting mechanic spec (region-bound)mechanics-designerdonefa0308d
12dCrafting UI wireframeui-designerdoneb1c30eb
13Backend + 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
14VPS 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-architecttodo (per D-015, post-13)
15iOS app (native Swift) — HealthKit, Apple DeviceCheck, App Store Sign-In Apple compliance. Reaches Android parity by shipmobile-developertodo (per D-015, post-14)
16Watch-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” sentinelmobile-developer + ui-designertodo (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.
  • Status values: todoin-progressdone. A phase blocked on an external thing carries blocked: <reason>.
  • Commits lists 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 done commit.

How to start a new phase

CEO types /work <topic> and the orchestrator:

  1. Reads this file’s “Current phase” line.
  2. If the topic matches, marks the phase in-progress and dispatches the lead.
  3. If the topic does NOT match, asks the CEO whether to re-prioritize the roadmap or treat this as ad-hoc.
  4. 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.