From 2fe49402de2f2bae1e770a93749fb0f98ac875b4 Mon Sep 17 00:00:00 2001 From: Natalie Date: Wed, 13 May 2026 15:30:51 -0700 Subject: [PATCH] =?UTF-8?q?fix(@projects/@magic-civilization):=20?= =?UTF-8?q?=F0=9F=90=9B=20update=20objective=20tracking=20stats=20and=20le?= =?UTF-8?q?gend?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- .project/objectives/README.md | 386 +++++++++++---- .../p2-58a-tilestate-fauna-fields.md | 2 +- .../p2-66-world-map-visual-proof.md | 2 +- .../p3-11-pioneer-engineer-action-points.md | 2 +- .../objectives/p3-13b-geological-events.md | 2 +- .../games/age-of-dwarves/data/objectives.json | 442 +++++++++++++++--- 6 files changed, 654 insertions(+), 182 deletions(-) diff --git a/.project/objectives/README.md b/.project/objectives/README.md index 58ee33b5..ecacdf38 100644 --- a/.project/objectives/README.md +++ b/.project/objectives/README.md @@ -1,10 +1,10 @@ # Objectives β€” Dashboard -> **Generated by `@lilith/mcp-objectives` β€” do not hand-edit.** Source of truth is per-file YAML frontmatter in this directory. Completed: [DASHBOARD_COMPLETED.md](DASHBOARD_COMPLETED.md) Β· By category: [DASHBOARD_CATEGORIES.md](DASHBOARD_CATEGORIES.md). +> **Generated by `tools/objectives-report.py` β€” do not hand-edit.** Source of truth is per-file YAML frontmatter in this directory. ## Legend -πŸ”΅ in-progress Β· 🟑 partial Β· πŸ”΄ stub Β· ❌ missing Β· ⚫ out-of-scope Β· βœ… done Β· ♻️ superseded +βœ… done Β· πŸ”΅ in-progress Β· 🟑 partial Β· πŸ”΄ stub Β· ❌ missing Β· ⚫ out-of-scope (Game 2 / Game 3) ## Totals @@ -12,13 +12,13 @@ **By Priority** -| Priority | πŸ”΅ | 🟑 | πŸ”΄ | ❌ | ⚫ | βœ… | Total | +| Priority | βœ… | πŸ”΅ | 🟑 | πŸ”΄ | ❌ | ⚫ | Total | |---|---|---|---|---|---|---|---| -| **P0** | 0 | 0 | 0 | 0 | 0 | 44 | 44 | -| **P1** | 1 | 14 | 1 | 5 | 1 | 55 | 77 | -| **P2** | 0 | 9 | 10 | 0 | 6 | 70 | 95 | -| **P3 (oos)** | 0 | 8 | 5 | 0 | 21 | 9 | 43 | -| **total** | **1** | **31** | **16** | **5** | **28** | **178** | **259** | +| **P0** | 44 | 0 | 0 | 0 | 0 | 0 | 44 | +| **P1** | 55 | 1 | 14 | 2 | 5 | 1 | 78 | +| **P2** | 79 | 0 | 11 | 15 | 0 | 6 | 111 | +| **P3 (oos)** | 12 | 0 | 5 | 5 | 0 | 21 | 43 | +| **total** | **190** | **1** | **30** | **22** | **5** | **28** | **276** | @@ -26,119 +26,301 @@ | Team Lead | Remaining | |---|---| -| [unassigned](../team-leads/unassigned.md) | 19 | -| [asset-sprite](../team-leads/asset-sprite.md) | 6 | +| [unassigned](../team-leads/unassigned.md) | 17 | +| [simulator-infra](../team-leads/simulator-infra.md) | 9 | | [combat-dev](../team-leads/combat-dev.md) | 6 | -| [shipwright](../team-leads/shipwright.md) | 5 | -| [testwright](../team-leads/testwright.md) | 3 | +| [asset-sprite](../team-leads/asset-sprite.md) | 6 | +| [shipwright](../team-leads/shipwright.md) | 4 | | [warcouncil](../team-leads/warcouncil.md) | 3 | +| [testwright](../team-leads/testwright.md) | 3 | | [asset-audio](../team-leads/asset-audio.md) | 1 | -| [simulator-infra](../team-leads/simulator-infra.md) | 1 | -## πŸ”΅ In Progress +## P0 β€” Blockers for "completely playable" -> Actively claimed by a team lead. Grouped by owner. - -### [asset-audio](../team-leads/asset-audio.md) - -| ID | Priority | Title | Updated | Blocked | +| ID | Status | Title | Owner | Updated | |---|---|---|---|---| -| [p2-16](p2-16-audio-assets.md) | P1 | Audio assets β€” in-theme OSS launch pack + source ledger | 2026-05-03 | 🟒 unblocked | +| [p0-01](p0-01-mcts-wiring.md) | βœ… done | Wire MCTS into gameplay AI | [warcouncil](../team-leads/warcouncil.md) | 2026-04-26 | +| [p0-02](p0-02-clan-personalities.md) | βœ… done | Five AI clan personalities drive distinct playstyles | [warcouncil](../team-leads/warcouncil.md) | 2026-04-26 | +| [p0-03](p0-03-pvp-in-turn.md) | βœ… done | PvP combat resolved inside the authoritative turn processor | β€” | 2026-04-17 | +| [p0-04](p0-04-wonder-tracking.md) | βœ… done | World wonder tracking in PlayerState and score victory | β€” | 2026-04-17 | +| [p0-05](p0-05-culture-and-borders.md) | βœ… done | Culture generation and border expansion | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p0-06](p0-06-economy-integration.md) | βœ… done | Fold gold income / upkeep / improvement yields into turn loop | β€” | 2026-04-17 | +| [p0-07](p0-07-tech-research-costs.md) | βœ… done | Tech research costs and science pool pacing | β€” | 2026-04-17 | +| [p0-08](p0-08-domination-victory.md) | βœ… done | Domination victory path in mc-turn::victory | [warcouncil](../team-leads/warcouncil.md) | 2026-04-18 | +| [p0-09](p0-09-ui-completeness.md) | βœ… done | City-screen UI completeness (citizen assign, queue controls, promotion picker) | β€” | 2026-04-16 | +| [p0-10](p0-10-completion-stability.md) | βœ… done | Game-completion stability β€” β‰₯7/10 seeds declare a winner | β€” | 2026-04-17 | +| [p0-11](p0-11-mystery-item-authoring.md) | βœ… done | Author the four T8–T10 mystery item drops | β€” | 2026-04-16 | +| [p0-12](p0-12-save-load-autosave.md) | βœ… done | Save / load + autosave on quit | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p0-13](p0-13-fog-of-war-exploration.md) | βœ… done | Fog of war and exploration / scout loop | β€” | 2026-04-17 | +| [p0-14](p0-14-map-generation-balanced-starts.md) | βœ… done | Map generation, resource placement, and balanced fair starts | [shipwright](../team-leads/shipwright.md) | 2026-04-16 | +| [p0-15](p0-15-happiness-golden-age.md) | βœ… done | Happiness pool and Golden Age mechanics end-to-end | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p0-16](p0-16-worker-improvement-loop.md) | βœ… done | Worker / tile-improvement build loop | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p0-17](p0-17-wild-creature-lair-loop.md) | βœ… done | Wild creature and lair clearing loop | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p0-18](p0-18-strategic-resource-gate.md) | βœ… done | Strategic resources gate unit production (empire ledger) | β€” | 2026-04-17 | +| [p0-19](p0-19-biome-economy-integration.md) | βœ… done | Biome-driven collectibles β†’ tile yields β†’ happiness end-to-end | β€” | 2026-04-16 | +| [p0-21](p0-21-audio-system-capability.md) | βœ… done | Audio system capability β€” manifest + autoload + EventBus wiring | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p0-22](p0-22-ultimate-ai-stress-test.md) | βœ… done | "Ultimate AI stress test β€” 5 clans, huge map, deep lookahead" | [warcouncil](../team-leads/warcouncil.md) | 2026-04-25 | +| [p0-23](p0-23-sprite-rendering-capability.md) | βœ… done | Sprite rendering capability β€” replace procedural draw_* with texture rendering | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p0-24](p0-24-difficulty-calibrated-ai-progression.md) | βœ… done | Difficulty-calibrated AI progression β€” Easy / Normal / Hard tier-peak distributions | [warcouncil](../team-leads/warcouncil.md) | 2026-04-19 | +| [p0-25](p0-25-game-quality-metrics-instrumentation.md) | βœ… done | Game-quality metrics instrumentation β€” tier_peak, peak_unit_tier, wonder_count | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p0-26](p0-26-ai-tactical-rust-port.md) | βœ… done | Port tactical AI from GDScript to mc-ai (Rail-1 compliance) | [warcouncil](../team-leads/warcouncil.md) | 2026-04-18 | +| [p0-27](p0-27-gd-culture-bridge.md) | βœ… done | GdCulture bridge β€” live game delegates culture to mc-culture | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p0-28](p0-28-gd-economy-bridge.md) | βœ… done | GdEconomy bridge β€” live game delegates gold/upkeep to mc-economy | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p0-29](p0-29-gd-tech-bridge.md) | βœ… done | GdTechWeb bridge β€” live game delegates research to mc-tech | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p0-30](p0-30-ecology-double-tick-fix.md) | βœ… done | Remove duplicate GDScript ecology tick (single Rust source) | [shipwright](../team-leads/shipwright.md) | 2026-04-18 | +| [p0-31](p0-31-climate-rust-path-restore.md) | βœ… done | Restore Rust ecology path β€” fix ClimateScript bugs + re-enable per-turn tick | [shipwright](../team-leads/shipwright.md) | 2026-04-18 | +| [p0-32](p0-32-weather-climate-effects-restore.md) | βœ… done | Restore WeatherScript + ClimateEffectsScript β€” per-turn weather and climate-effects | [shipwright](../team-leads/shipwright.md) | 2026-04-18 | +| [p0-33](p0-33-world-map-input-and-panel-wiring.md) | βœ… done | World-map input wiring β€” unit selection panel, city click, ESC/F10 menu, panel close | [wireguard](../team-leads/wireguard.md) | 2026-04-19 | +| [p0-34](p0-34-freepeople-tribe-founding.md) | βœ… done | Freepeople tribe-founding cinematic β€” turn -1 / 0 / 1 start sequence and Dwarf Tribe founder unit | [shipwright](../team-leads/shipwright.md) | 2026-04-18 | +| [p0-37](p0-37-personality-emergent-tactical-thresholds.md) | βœ… done | Personality-emergent tactical thresholds (lift 7 hardcoded constants into axis-derived functions) | [warcouncil](../team-leads/warcouncil.md) | 2026-04-18 | +| [p0-38](p0-38-mcts-personality-priors.md) | βœ… done | Inject personality-utility scores as MCTS UCB1 priors | [warcouncil](../team-leads/warcouncil.md) | 2026-04-24 | +| [p0-39](p0-39-ai-tier-progression-unit-selection.md) | βœ… done | AI tier-progression unit selection β€” production.rs picks tier-2+ units once tech unlocks | [warcouncil](../team-leads/warcouncil.md) | 2026-04-18 | +| [p0-40](p0-40-iron-ore-resource-density.md) | βœ… done | Iron-ore strategic resource density β€” unblock tier 3-6 unit chain | [shipwright](../team-leads/shipwright.md) | 2026-04-24 | +| [p0-41](p0-41.md) | βœ… done | Building rally points β€” produced units auto-deploy to a designated hex | [shipwright](../team-leads/shipwright.md) | 2026-04-24 | +| [p0-41a](p0-41a-rally-smoke.md) | βœ… done | Rally-point smoke β€” produced unit gets PatrolOrder toward rally hex | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | +| [p0-42](p0-42.md) | βœ… done | Formation aggregation β€” adjacent units link into a shaped formation with terrain reflow | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | +| [p0-42a](p0-42a-formation-smoke.md) | βœ… done | Formation aggregation smoke β€” formations form and evolve at runtime | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | +| [p0-43](p0-43.md) | βœ… done | "Formation AI β€” MCTS plans at formation level, not per-unit" | [warcouncil](../team-leads/warcouncil.md) | 2026-04-25 | +| [p0-44](p0-44-movement-mode-ux.md) | βœ… done | Movement mode UX β€” Move button, path preview, right-click confirm, fog-aware pathing | [wireguard](../team-leads/wireguard.md) | 2026-04-19 | +| [p0-45](p0-45-turn-processor-consolidation-regression.md) | βœ… done | Turn processor consolidation β€” entities/ duplicate caused T1 SCRIPT ERROR halt | [shipwright](../team-leads/shipwright.md) | 2026-05-04 | ## P1 β€” Ship-readiness -| ID | Status | Title | Tags | Owner | Updated | Blocked | -|---|---|---|---|---|---|---| -| [p1-05](p1-05-balance-tuning.md) | 🟑 partial | Balance tuning β€” pop_peak β‰₯30 median, worker improvements β‰₯8 min | β€” | [shipwright](../team-leads/shipwright.md) | 2026-05-01 | 🟒 unblocked | -| [p1-22](p1-22-mcts-wall-clock-budget.md) | 🟑 partial | MCTS per-decision wall-clock budget β€” bound per-turn cost on huge maps | β€” | [warcouncil](../team-leads/warcouncil.md) | 2026-05-05 | 🟒 unblocked | -| [p1-27](p1-27-mcts-service-extraction.md) | 🟑 partial | Extract GPU MCTS into a standalone service/client (model-boss-shaped, magic-civ-only) | β€” | [warcouncil](../team-leads/warcouncil.md) | 2026-05-03 | 🟒 unblocked | -| [p1-29](p1-29.md) | 🟑 partial | Anti-early-domination: lift game-balance gates that p0-01 v1 measured | balance, pacing | [combat-dev](../team-leads/combat-dev.md) | 2026-05-03 | 🟒 unblocked | -| [p1-29a](p1-29a-last-stand-defense.md) | 🟑 partial | Last-stand defense β€” combat-strength multiplier when defender is at last city | balance, combat, pacing | [combat-dev](../team-leads/combat-dev.md) | 2026-05-07 | 🟒 unblocked | -| [p1-38](p1-38-biome-economy-coupling.md) | 🟑 partial | Biome β†’ economy coupling β€” population & luxury driven by live ecology | β€” | [shipwright](../team-leads/shipwright.md) | 2026-05-04 | 🟒 unblocked | -| [p1-42](p1-42-ai-full-building-catalog.md) | 🟑 partial | AI must consider the full 155-building catalog, not the hardcoded 8-id ladder | β€” | β€” | 2026-05-07 | 🟒 unblocked | -| [p1-43](p1-43-building-stacking-upgrade.md) | 🟑 partial | Building stacking β€” per-category upgrade chains (military / science / culture / production / etc.) | β€” | β€” | 2026-05-07 | 🟒 unblocked | -| [p1-43c](p1-43c-chain-ladders-and-ui.md) | 🟑 partial | p1-43 follow-ups β€” chain ladder authoring, AI stack scoring, city UI upgrade surface, GUT bridge test | β€” | β€” | 2026-05-08 | 🟒 unblocked | -| [p1-44](p1-44-buildings-as-producers.md) | 🟑 partial | Buildings produce units, not the city center β€” per-building production queues | β€” | β€” | 2026-05-05 | 🟒 unblocked | -| [p1-44c](p1-44c-buildings-as-producers-followups.md) | 🟑 partial | p1-44 follow-ups β€” UI, AI per-building emission, themed roster, GUT, batch | β€” | β€” | 2026-05-07 | 🟒 unblocked | -| [p1-56](p1-56-civics-buildings-and-great-works.md) | 🟑 partial | Civics buildings, Great Works, Specialists, Great People β€” wire authored data into Rust + Godot | β€” | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-08 | 🟒 unblocked | -| [p1-57](p1-57-diplomacy-tribute-treaties.md) | 🟑 partial | Diplomacy: tribute, treaty lifecycle, magical-terrain episode gating | β€” | [unassigned](../team-leads/unassigned.md) | 2026-05-07 | 🟒 unblocked | -| [p2-22](p2-22-sprite-generation-pipeline.md) | 🟑 partial | Sprite generation pipeline β€” runnable end-to-end | β€” | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-25 | 🟒 unblocked | -| [p2-23](p2-23-unit-sprites-dwarf-roster.md) | ❌ missing | Unit sprites β€” Dwarf-racial roster (m/f variants) | β€” | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-17 | 🟒 unblocked | -| [p2-24](p2-24-unit-sprites-wild-creatures.md) | ❌ missing | Unit sprites β€” wild creatures & fauna (generic, no race/sex) | β€” | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-17 | 🟒 unblocked | -| [p2-25](p2-25-building-sprites-base-coverage.md) | ❌ missing | Building sprites β€” base game coverage (non-wonder) | β€” | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-17 | 🟒 unblocked | -| [p2-26](p2-26-mundane-wonder-sprites.md) | ❌ missing | Mundane-wonder sprites β€” 24 distinct, higher-fidelity art | β€” | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-17 | 🟒 unblocked | -| [p2-27](p2-27-city-population-tier-sprites.md) | ❌ missing | City population-tier sprites β€” city_q1 through city_q5 | β€” | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-17 | 🟒 unblocked | -| [p1-22a](p1-22a-huge-map-ai-quality.md) | πŸ”΄ stub | Huge-map AI quality β€” close the 4/10 β†’ β‰₯5/10 decisive-game gate | β€” | [warcouncil](../team-leads/warcouncil.md) | 2026-05-08 | πŸ”’ p1-22 | +| ID | Status | Title | Owner | Updated | +|---|---|---|---|---| +| [p0-20](p0-20-gpu-mcts-rollouts.md) | βœ… done | GPU-accelerated MCTS rollouts for look-ahead decision-making | [warcouncil](../team-leads/warcouncil.md) | 2026-05-05 | +| [p0-35](p0-35-ecology-telemetry-instrumentation.md) | βœ… done | Ecology telemetry instrumentation β€” flora canopy / undergrowth fields in turn_stats.jsonl | [shipwright](../team-leads/shipwright.md) | 2026-04-18 | +| [p0-36](p0-36-weather-event-telemetry.md) | βœ… done | Weather / climate-effects event telemetry β€” events.jsonl + turn_stats aggregates | [shipwright](../team-leads/shipwright.md) | 2026-04-18 | +| [p1-01](p1-01-diplomacy-lite.md) | βœ… done | Diplomacy-lite β€” peace/war toggle plus one trade action | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p1-02](p1-02-strategic-resource-yields.md) | βœ… done | Strategic resource yields feed into production bonuses | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p1-03](p1-03-tutorial-overlay.md) | βœ… done | First-run tutorial / onboarding overlay | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p1-05](p1-05-balance-tuning.md) | 🟑 partial | Balance tuning β€” pop_peak β‰₯30 median, worker improvements β‰₯8 min | [shipwright](../team-leads/shipwright.md) | 2026-05-01 | +| [p1-06](p1-06-options-polish.md) | βœ… done | Options screen polish | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p1-07](p1-07-chronicle-coverage.md) | βœ… done | Chronicle notifications coverage | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p1-08](p1-08-victory-screen-content.md) | βœ… done | Victory/defeat screen content β€” recap, banner, replay seed | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p1-09](p1-09-determinism-gate.md) | βœ… done | Determinism gate β€” same seed produces byte-identical runs | [testwright](../team-leads/testwright.md) | 2026-04-19 | +| [p1-10](p1-10-game-setup-ux.md) | βœ… done | Game setup UX β€” new-game dialog, difficulty, clan preview | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p1-11](p1-11-build-output-src-purge.md) | βœ… done | Purge build output from src/ β€” wasm-pack moves to .local/build/wasm/ | [tourguide](../team-leads/tourguide.md) | 2026-04-17 | +| [p1-12](p1-12-build-output-docs-alignment.md) | βœ… done | Align every doc reference to the relocated wasm-pack output | [tourguide](../team-leads/tourguide.md) | 2026-04-17 | +| [p1-13](p1-13-guide-dev-route-coverage.md) | βœ… done | Guide dev server boots on plum with zero-error route coverage | [tourguide](../team-leads/tourguide.md) | 2026-04-17 | +| [p1-15](p1-15-guide-next-deploy-infra.md) | βœ… done | Deploy dev guide to https://mc.next.black.local | [tourguide](../team-leads/tourguide.md) | 2026-04-17 | +| [p1-16](p1-16-guide-game1-scope-hygiene.md) | βœ… done | Purge Game 2/3 scope bleed from user-visible Game 1 guide copy | [tourguide](../team-leads/tourguide.md) | 2026-04-18 | +| [p1-17](p1-17-guide-next-auto-deploy.md) | βœ… done | Forgejo workflow auto-deploys dev guide on push to main | [tourguide](../team-leads/tourguide.md) | 2026-04-18 | +| [p1-18](p1-18-village-discovery-feedback.md) | βœ… done | Village discovery β€” world-map feedback (notification, reward popup, minimap ping) | [wireguard](../team-leads/wireguard.md) | 2026-04-19 | +| [p1-19](p1-19-tutorial-opt-in.md) | βœ… done | Tutorial opt-in β€” HUD button, disappears after turn 5, starts from Step 1 | [wireguard](../team-leads/wireguard.md) | 2026-04-19 | +| [p1-20](p1-20-unit-action-capability-registry.md) | βœ… done | Unit action capability registry β€” one source of truth for "what can this unit do right now?" | [wireguard](../team-leads/wireguard.md) | 2026-04-19 | +| [p1-21](p1-21-unit-patrol-orders.md) | βœ… done | Unit patrol orders β€” standing order to loop between waypoint tiles | [wireguard](../team-leads/wireguard.md) | 2026-04-19 | +| [p1-22](p1-22-mcts-wall-clock-budget.md) | 🟑 partial | MCTS per-decision wall-clock budget β€” bound per-turn cost on huge maps | [warcouncil](../team-leads/warcouncil.md) | 2026-05-05 | +| [p1-22a](p1-22a-huge-map-ai-quality.md) | πŸ”΄ stub | Huge-map AI quality β€” close the 4/10 β†’ β‰₯5/10 decisive-game gate | [warcouncil](../team-leads/warcouncil.md) | 2026-05-08 | +| [p1-23](p1-23-stats-tracker-restore.md) | βœ… done | Restore StatsTracker β€” demographics overview broken in shipped builds | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | +| [p1-24](p1-24-windows-path-separator.md) | βœ… done | ai_personalities.json fails to load from packed builds (all platforms) β€” pass JSON contents not path | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | +| [p1-25](p1-25-export-script-error-cleanup.md) | βœ… done | Eliminate parse-error spam in export logs (Unit dup decl + SaveManager stray) | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | +| [p1-26](p1-26-tile-placement-preview-ux.md) | βœ… done | "Tile-placement UX with effect preview β€” Civ7-style \\\"where does this go and what changes\\\"" | [shipwright](../team-leads/shipwright.md) | 2026-04-26 | +| [p1-27](p1-27-mcts-service-extraction.md) | 🟑 partial | Extract GPU MCTS into a standalone service/client (model-boss-shaped, magic-civ-only) | [warcouncil](../team-leads/warcouncil.md) | 2026-05-03 | +| [p1-28](p1-28-culture-research-tree.md) | βœ… done | "Culture research tree β€” real graph, bridge, UI" | [shipwright](../team-leads/shipwright.md) | 2026-04-26 | +| [p1-29](p1-29.md) | 🟑 partial | "Anti-early-domination: lift game-balance gates that p0-01 v1 measured" | [combat-dev](../team-leads/combat-dev.md) | 2026-05-13 | +| [p1-29a](p1-29a-last-stand-defense.md) | 🟑 partial | Last-stand defense β€” combat-strength multiplier when defender is at last city | [combat-dev](../team-leads/combat-dev.md) | 2026-05-13 | +| [p1-29b](p1-29b-tier-gap-ai-quality.md) | βœ… done | "AI tech tier gap β€” structural research path quality (low-pop AI fails to reach t1+)" | [warcouncil](../team-leads/warcouncil.md) | 2026-05-07 | +| [p1-29c](p1-29c-sole-city-research-path.md) | πŸ”΄ stub | "Sole-city research path β€” lift trailing AI from tier_peak=1 to β‰₯2" | [unassigned](../team-leads/unassigned.md) | 2026-05-13 | +| [p1-30](p1-30.md) | βœ… done | "Optimize `_build_tactical_state` β€” 8000-tile GDScript dict-build per AI turn blocks p1-22 huge-map gate" | [warcouncil](../team-leads/warcouncil.md) | 2026-05-04 | +| [p1-31](p1-31-split-bundled-building-resources.md) | βœ… done | Split bundled `resources/buildings/.json` into per-file pattern matching `resources/units/` | β€” | 2026-04-27 | +| [p1-32](p1-32-food-chain-buildings.md) | βœ… done | Author the two missing food/processing buildings (sawmill, herbalist) | β€” | 2026-05-03 | +| [p1-33](p1-33-naval-aerial-production-buildings.md) | βœ… done | Wire naval/aerial unit gates to the harbor and airfield buildings | β€” | 2026-05-03 | +| [p1-34](p1-34-unit-metadata-expansion.md) | βœ… done | "Unit metadata expansion β€” flavor, archetype, promotion_tree, clan_affinity fields" | [shipwright](../team-leads/shipwright.md) | 2026-04-27 | +| [p1-35](p1-35-unit-lore-paragraphs.md) | βœ… done | "Per-unit lore paragraphs β€” historical/cultural context for the dwarven roster" | [shipwright](../team-leads/shipwright.md) | 2026-04-27 | +| [p1-36](p1-36-ai-personalities-t1-t10-coverage.md) | βœ… done | "AI personalities β€” T1–T10 build order coverage + clan_affinity routing" | [warcouncil](../team-leads/warcouncil.md) | 2026-05-03 | +| [p1-37](p1-37-mc-ai-clan-affinity-routing.md) | βœ… done | "mc-ai clan_affinity routing β€” Rust AI reads unit clan_affinity at build-decision time" | [warcouncil](../team-leads/warcouncil.md) | 2026-05-01 | +| [p1-38](p1-38-biome-economy-coupling.md) | 🟑 partial | "Biome β†’ economy coupling β€” population & luxury driven by live ecology" | [shipwright](../team-leads/shipwright.md) | 2026-05-04 | +| [p1-39](p1-39.md) | βœ… done | Port per-yield difficulty multipliers from GDScript into Rust crates (Rail-1) β€” research + culture | [warcouncil](../team-leads/warcouncil.md) | 2026-05-05 | +| [p1-40](p1-40-single-source-of-truth-resources.md) | βœ… done | Collapse data// override layer into single source of truth at resources/ | β€” | 2026-04-29 | +| [p1-41](p1-41-game-pack-subscription-manifest.md) | βœ… done | Game-pack subscription manifest + loader filter (Phase B of resources/ unification) | β€” | 2026-04-29 | +| [p1-42](p1-42-ai-full-building-catalog.md) | 🟑 partial | "AI must consider the full 155-building catalog, not the hardcoded 8-id ladder" | β€” | 2026-05-13 | +| [p1-43](p1-43-building-stacking-upgrade.md) | 🟑 partial | Building stacking β€” per-category upgrade chains (military / science / culture / production / etc.) | β€” | 2026-05-07 | +| [p1-43b](p1-43b-deep-chain-authoring.md) | βœ… done | Deep chain authoring β€” fill T6/T7/T8/T9/T10 building tiers across the 5 short chains | β€” | 2026-05-05 | +| [p1-43c](p1-43c-chain-ladders-and-ui.md) | 🟑 partial | "p1-43 follow-ups β€” chain ladder authoring, AI stack scoring, city UI upgrade surface, GUT bridge test" | β€” | 2026-05-13 | +| [p1-44](p1-44-buildings-as-producers.md) | 🟑 partial | "Buildings produce units, not the city center β€” per-building production queues" | β€” | 2026-05-13 | +| [p1-44c](p1-44c-buildings-as-producers-followups.md) | 🟑 partial | "p1-44 follow-ups β€” UI, AI per-building emission, themed roster, GUT, batch" | β€” | 2026-05-07 | +| [p1-45](p1-45-batch-binary-freshness.md) | βœ… done | "Batch binary freshness: rebuild GDExt before every autoplay batch" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-03 | +| [p1-46](p1-46-design-lab-terrain-dimensions.md) | βœ… done | Terrain Dimensions Lab β€” fix ridginess, bind 149 flora species, add Whittaker plot | [terraformer](../team-leads/terraformer.md) | 2026-05-01 | +| [p1-47](p1-47-river-hydrology-network.md) | βœ… done | River hydrology β€” D6 flow analysis, hydraulic erosion, multi-hex lakes, cross-tile rivers | [terraformer](../team-leads/terraformer.md) | 2026-05-01 | +| [p1-48](p1-48-flora-species-renderer.md) | βœ… done | Flora species renderer β€” bind 149 species to world-map tile rendering (single source of truth) | [terraformer](../team-leads/terraformer.md) | 2026-05-01 | +| [p1-49](p1-49-fauna-species-renderer.md) | βœ… done | Fauna species renderer β€” 61 Game-1 species visible on encounter and lair tiles | [terraformer](../team-leads/terraformer.md) | 2026-05-01 | +| [p1-50](p1-50-tectonic-prepass.md) | βœ… done | Tectonic prepass β€” voronoi plates + boundary classification seeding elevation | [terraformer](../team-leads/terraformer.md) | 2026-05-01 | +| [p1-51](p1-51-worldgen-canonical-design-docs.md) | βœ… done | Worldgen canonical design docs β€” author the spec before any Rust | [terraformer](../team-leads/terraformer.md) | 2026-04-30 | +| [p1-52](p1-52-api-wasm-build-fix.md) | βœ… done | api-wasm build fix β€” unblock WASM bundle for design-lab WASM consumption | [terraformer](../team-leads/terraformer.md) | 2026-05-01 | +| [p1-53](p1-53-worldgen-layer-pages.md) | βœ… done | "Worldgen layer pages β€” one playground per canonical doc, mirroring the layered Earth model" | [terraformer](../team-leads/terraformer.md) | 2026-05-01 | +| [p1-54](p1-54-hex-direction-rust-ts-mapping.md) | βœ… done | Hex direction-index translation β€” Rust pointy-top axial vs design-app flat-top canvas | [terraformer](../team-leads/terraformer.md) | 2026-05-01 | +| [p1-55](p1-55-tech-culture-domain-propagation.md) | βœ… done | "Tech & Culture domain field β€” propagate categorization through Rust, Godot UI, and player analysis" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-07 | +| [p1-56](p1-56-civics-buildings-and-great-works.md) | 🟑 partial | "Civics buildings, Great Works, Specialists, Great People β€” wire authored data into Rust + Godot" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-13 | +| [p1-57](p1-57-diplomacy-tribute-treaties.md) | 🟑 partial | "Diplomacy: tribute, treaty lifecycle, magical-terrain episode gating" | [unassigned](../team-leads/unassigned.md) | 2026-05-13 | +| [p1-58](p1-58-ecology-cognitive-system.md) | βœ… done | "Ecology cognition: terrain affinity, food web, grudge memory, apex tier-10 fauna/flora" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-07 | +| [p1-59](p1-59-hybrid-merged-structures.md) | βœ… done | "Hybrid merged structures β€” war_academy, assault_citadel, cavalry_corps, gunnery_corps" | β€” | 2026-05-07 | +| [p2-06](p2-06-export-pipeline.md) | βœ… done | Export pipeline for Windows / macOS / Linux | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | +| [p2-16](p2-16-audio-assets.md) | πŸ”΅ in_progress | Audio assets β€” in-theme OSS launch pack + source ledger | [asset-audio](../team-leads/asset-audio.md) | 2026-05-03 | +| [p2-22](p2-22-sprite-generation-pipeline.md) | 🟑 partial | Sprite generation pipeline β€” runnable end-to-end | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-25 | +| [p2-23](p2-23-unit-sprites-dwarf-roster.md) | ❌ missing | Unit sprites β€” Dwarf-racial roster (m/f variants) | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-17 | +| [p2-24](p2-24-unit-sprites-wild-creatures.md) | ❌ missing | Unit sprites β€” wild creatures & fauna (generic, no race/sex) | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-17 | +| [p2-25](p2-25-building-sprites-base-coverage.md) | ❌ missing | Building sprites β€” base game coverage (non-wonder) | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-17 | +| [p2-26](p2-26-mundane-wonder-sprites.md) | ❌ missing | Mundane-wonder sprites β€” 24 distinct, higher-fidelity art | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-17 | +| [p2-27](p2-27-city-population-tier-sprites.md) | ❌ missing | City population-tier sprites β€” city_q1 through city_q5 | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-17 | +| [p2-28](p2-28-sprite-provenance-ledger.md) | βœ… done | Sprite provenance ledger β€” LICENSES.md per-file attribution | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-25 | +| [p2-33](p2-33-sound-system-extension.md) | βœ… done | "Sound system extension β€” categorical fallback, variant pools, per-entity routing" | [asset-audio](../team-leads/asset-audio.md) | 2026-04-27 | ## P2 β€” Polish -| ID | Status | Title | Tags | Owner | Updated | Blocked | -|---|---|---|---|---|---|---| -| [p2-10](p2-10-regression-ci-gate.md) | 🟑 partial | Automated regression CI gate on every push to main | β€” | [testwright](../team-leads/testwright.md) | 2026-05-07 | 🟒 unblocked | -| [p2-10k](p2-10k-gdlint-cleanup.md) | 🟑 partial | CI: fix 51 gdlint violations so Stage 3 is hard-green | β€” | [testwright](../team-leads/testwright.md) | 2026-05-07 | 🟒 unblocked | -| [p2-10l](p2-10l-gut-regression-triage.md) | 🟑 partial | CI: fix 15 GUT regressions so Stage 5 is hard-green | β€” | [testwright](../team-leads/testwright.md) | 2026-05-07 | 🟒 unblocked | -| [p2-18](p2-18-guide-public-deployment.md) | 🟑 partial | Guide web app β€” public hosting + deploy pipeline | β€” | β€” | 2026-04-17 | 🟒 unblocked | -| [p2-47](p2-47-in-game-statistics-screens.md) | 🟑 partial | In-game statistics screens β€” Civ-style 5-tab modal (Demographics / Graphs / Rankings / Replay / Histories) | β€” | [shipwright](../team-leads/shipwright.md) | 2026-05-07 (cycle-51) | 🟒 unblocked | -| [p2-48](p2-48-end-of-game-summary-screen.md) | 🟑 partial | End-of-game summary screen β€” outcome banner, standings, score graph, awards, timeline, footer actions | β€” | [shipwright](../team-leads/shipwright.md) | 2026-05-03 | 🟒 unblocked | -| [p2-55](p2-55-civilian-capture-system.md) | 🟑 partial | Civilian Capture / Destroy / Ransom | β€” | [combat-dev](../team-leads/combat-dev.md) | 2026-05-07 | 🟒 unblocked | -| [p2-56](p2-56-worker-categories-and-expertise-tiers.md) | 🟑 partial | Worker categories (Sustenance/Construction/Wealth) + 5-tier expertise + Master/Grandmaster auras + idle decay | β€” | [unassigned](../team-leads/unassigned.md) | 2026-05-07 | 🟒 unblocked | -| [p2-57](p2-57-production-chain-typed-resources.md) | 🟑 partial | Production-chain typed resources β€” raw β†’ processed pipelines wired into mc-city | β€” | [unassigned](../team-leads/unassigned.md) | 2026-05-03 | 🟒 unblocked | -| [p2-48a](p2-48a-end-game-summary-gut-and-proof.md) | πŸ”΄ stub | End-of-game summary β€” GUT tests + headless proof scene | β€” | [shipwright](../team-leads/shipwright.md) | 2026-05-08 | 🟒 unblocked | -| [p2-55d](p2-55d-ai-ransom-decision-hook.md) | πŸ”΄ stub | AI ransom accept/refuse hook in mc-turn start-of-turn | β€” | β€” | 2026-05-03 | 🟒 unblocked | -| [p2-57b](p2-57b-consume-produce-edges.md) | πŸ”΄ stub | Building consume/produce edges β€” stockpile coupled to unit quality | β€” | [unassigned](../team-leads/unassigned.md) | 2026-05-03 | 🟒 unblocked | -| [p2-59](p2-59-pioneer-escort-mechanic.md) | πŸ”΄ stub | Pioneer escort mechanic β€” protection rules vs ambient encounters | β€” | [unassigned](../team-leads/unassigned.md) | 2026-05-03 | 🟒 unblocked | -| [p2-60](p2-60-weather-lens-godot-ui.md) | πŸ”΄ stub | Weather / observation lens switcher in the Godot HUD | β€” | [unassigned](../team-leads/unassigned.md) | 2026-05-03 | 🟒 unblocked | -| [p2-61](p2-61-observation-recording-gates-from-tech.md) | πŸ”΄ stub | Bind mc-observation gate_bits to player tech state β€” recording gates per-field | β€” | [unassigned](../team-leads/unassigned.md) | 2026-05-03 | 🟒 unblocked | -| [p2-63](p2-63-mc-flora-biome-substrate-migration.md) | πŸ”΄ stub | mc-flora generation: migrate biome filter to substrate_climate-aware path | β€” | [unassigned](../team-leads/unassigned.md) | 2026-05-04 | 🟒 unblocked | -| [p2-55a](p2-55a-engineer-capture.md) | πŸ”΄ stub | Engineer (Great Person) capture mechanics | β€” | [combat-dev](../team-leads/combat-dev.md) | 2026-05-07 | πŸ”’ p2-55 | -| [p2-55b](p2-55b-caravan-master-capture.md) | πŸ”΄ stub | Caravan master capture mechanics | β€” | [combat-dev](../team-leads/combat-dev.md) | 2026-05-07 | πŸ”’ p2-55 | -| [p2-55c](p2-55c-freepeople-capture.md) | πŸ”΄ stub | Freepeople capture mechanics | β€” | [combat-dev](../team-leads/combat-dev.md) | 2026-05-07 | πŸ”’ p2-55 | +| ID | Status | Title | Owner | Updated | +|---|---|---|---|---| +| [p2-01](p2-01-minimap-improvements.md) | βœ… done | Minimap β€” fog reflection and unit markers | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p2-02](p2-02-hud-tooltips.md) | βœ… done | Tooltips on all HUD elements | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p2-03](p2-03-hotkey-cheat-sheet.md) | βœ… done | Hotkey cheat sheet (F1 / ?) | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p2-04](p2-04-localization-audit.md) | βœ… done | Localization audit β€” no hardcoded strings | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p2-05](p2-05-turn-latency.md) | βœ… done | Sub-second single-player turn latency | β€” | 2026-04-23 | +| [p2-06b](p2-06b-windows-runner.md) | βœ… done | Cross-compile Windows .exe + .dll from Linux via cargo-xwin (no Windows host) | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | +| [p2-07](p2-07-credits-screen.md) | βœ… done | Credits screen accessible from main menu | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p2-08](p2-08-accessibility.md) | βœ… done | Accessibility baseline β€” colorblind palette + keyboard navigation | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p2-09](p2-09-guide-web-deploy.md) | βœ… done | Player guide web app β€” builds clean from source | β€” | 2026-04-17 | +| [p2-10](p2-10-regression-ci-gate.md) | 🟑 partial | Automated regression CI gate on every push to main | [testwright](../team-leads/testwright.md) | 2026-05-07 | +| [p2-10a](p2-10a-gdlint-ungate.md) | βœ… done | "CI: gdlint stage un-gated" | [testwright](../team-leads/testwright.md) | 2026-04-25 | +| [p2-10b](p2-10b-gut-ungate.md) | βœ… done | "CI: headless GUT stage un-gated" | [testwright](../team-leads/testwright.md) | 2026-04-26 | +| [p2-10c](p2-10c-diplomacy-luxury-ids.md) | βœ… done | "Diplomacy: implement _collect_unique_luxury_ids() in happiness.gd" | β€” | 2026-04-26 | +| [p2-10d](p2-10d-legacy-unit-json.md) | βœ… done | "Data: strip legacy flags/can_found_city/can_build_improvements from unit JSON" | β€” | 2026-04-26 | +| [p2-10e](p2-10e-data-integrity.md) | βœ… done | "Data: resolve duplicate IDs and dangling unlock refs in game data" | β€” | 2026-04-26 | +| [p2-10f](p2-10f-save-manager-typed-arrays.md) | βœ… done | "SaveManager: fix typed array property assignment on Player/Unit deserialization" | β€” | 2026-04-26 | +| [p2-10g](p2-10g-city-bridge-production-cost.md) | βœ… done | "CityBridge: add production_cost field to items JSON fixture" | β€” | 2026-04-26 | +| [p2-10h](p2-10h-sprite-renderer-build-key.md) | βœ… done | "UnitRenderer: implement _build_sprite_key() helper and fix cache key test" | β€” | 2026-04-26 | +| [p2-10i](p2-10i-tile-tooltip-scene.md) | βœ… done | "TileTooltip: fix scene node name mismatches and collectibles text formatting" | β€” | 2026-04-26 | +| [p2-10j](p2-10j-fog-vision-scout-move.md) | βœ… done | "FogOfWar: fix recalculate_vision to not re-reveal already-seen tiles on move" | β€” | 2026-04-26 | +| [p2-10k](p2-10k-gdlint-cleanup.md) | 🟑 partial | "CI: fix 51 gdlint violations so Stage 3 is hard-green" | [testwright](../team-leads/testwright.md) | 2026-05-13 | +| [p2-10l](p2-10l-gut-regression-triage.md) | 🟑 partial | "CI: fix 15 GUT regressions so Stage 5 is hard-green" | [testwright](../team-leads/testwright.md) | 2026-05-13 | +| [p2-11](p2-11-version-about-screen.md) | βœ… done | Version string + About screen | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | +| [p2-11a](p2-11a.md) | βœ… done | "SaveManager: add Unit.serialize/deserialize and City.production_queue serialize path" | β€” | 2026-05-04 | +| [p2-12](p2-12-apricot-weston-install.md) | βœ… done | Install weston on apricot RUN host β€” unblock display-server smoke tests | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | +| [p2-18](p2-18-guide-public-deployment.md) | 🟑 partial | Guide web app β€” public hosting + deploy pipeline | β€” | 2026-04-17 | +| [p2-19](p2-19-guide-progress-report-page.md) | βœ… done | Guide progress report page β€” dynamic dashboard + missing assets | β€” | 2026-04-17 | +| [p2-20](p2-20-guide-sim-cache-pnpm-resolve.md) | βœ… done | Fix simCachePlugin pre-warm worker β€” tsx can't resolve @magic-civ/physics-rs through pnpm symlink | [tourguide](../team-leads/tourguide.md) | 2026-04-17 | +| [p2-21](p2-21-guide-simcache-static-bake.md) | βœ… done | Bake pre-computed sim-cache frames into the static build | [tourguide](../team-leads/tourguide.md) | 2026-04-18 | +| [p2-29](p2-29-guide-welcome-homepage-theme-alignment.md) | βœ… done | Welcome modal + HomePage lore + guide theme align to the player's chosen race/gender | [tourguide](../team-leads/tourguide.md) | 2026-04-18 | +| [p2-30](p2-30-guide-shared-primitives.md) | βœ… done | Consolidate duplicate page styled-components into shared PagePrimitives | [tourguide](../team-leads/tourguide.md) | 2026-04-18 | +| [p2-31](p2-31-guide-url-bound-state.md) | βœ… done | Migrate guide filter + tab state from useState to URL search params | [tourguide](../team-leads/tourguide.md) | 2026-04-18 | +| [p2-32](p2-32-guide-data-driven-enums.md) | βœ… done | Replace hardcoded page enums with JSON data reads | [tourguide](../team-leads/tourguide.md) | 2026-04-18 | +| [p2-35](p2-35-palace-evolution-system.md) | βœ… done | Palace evolution system β€” longhouse β†’ great_hall β†’ citadel β†’ grand_citadel + function-shedding | β€” | 2026-05-04 | +| [p2-36](p2-36-data-resources-building-duplicates.md) | βœ… done | Reconcile the 14 building IDs defined in both `resources/buildings/` and `data/buildings/` | β€” | 2026-04-29 | +| [p2-37](p2-37-react-calculator-metadata-surface.md) | βœ… done | "React calculator UI β€” surface flavor, lore, clan_affinity, archetype filter" | [tourguide](../team-leads/tourguide.md) | 2026-04-27 | +| [p2-38](p2-38-unit-audio-cues-stubs.md) | βœ… done | "Unit audio_cues stub strings β€” selection/move/attack lines for the dwarven roster" | [asset-audio](../team-leads/asset-audio.md) | 2026-04-27 | +| [p2-39](p2-39-chronicle-hall-phantom-unlock.md) | βœ… done | Resolve `chronicle_hall` phantom unlock in `chronicle_keeping` culture tech | β€” | 2026-04-27 | +| [p2-43](p2-43-culture-research-completion-event.md) | βœ… done | "Culture research live-game pipeline β€” per-turn GDExt bridge + `culture_researched` emit" | β€” | 2026-05-07 | +| [p2-44](p2-44-ai-promotion-selection.md) | βœ… done | AI promotion selection β€” auto-pick + emit unit_promoted for AI units | β€” | 2026-05-06 | +| [p2-44a](p2-44a-dataloader-promotion-trees-path.md) | βœ… done | "DataLoader path mismatch β€” `get_promotion(\"trees\")` returns empty" | [unassigned](../team-leads/unassigned.md) | 2026-05-06 | +| [p2-44b](p2-44b-promotion-dispatch-instrumentation.md) | βœ… done | AI promotion dispatch β€” instrumentation pass to identify the silent gate | [unassigned](../team-leads/unassigned.md) | 2026-05-06 | +| [p2-45](p2-45-elimination-reconciliation.md) | βœ… done | "Player elimination reconciliation β€” emit `player_eliminated` on every transition" | β€” | 2026-04-30 | +| [p2-46](p2-46-past-games-archive-replay-viewer.md) | βœ… done | "Past-games archive & replay viewer β€” `mc-replay` crate, on-disk archive, projection-based playback" | [shipwright](../team-leads/shipwright.md) | 2026-05-07 | +| [p2-47](p2-47-in-game-statistics-screens.md) | 🟑 partial | In-game statistics screens β€” Civ-style 5-tab modal (Demographics / Graphs / Rankings / Replay / Histories) | [shipwright](../team-leads/shipwright.md) | 2026-05-07 (cycle-51) | +| [p2-48](p2-48-end-of-game-summary-screen.md) | βœ… done | End-of-game summary screen β€” outcome banner, standings, score graph, awards, timeline, footer actions | [shipwright](../team-leads/shipwright.md) | 2026-05-13 | +| [p2-48a](p2-48a-end-game-summary-gut-and-proof.md) | πŸ”΄ stub | End-of-game summary β€” GUT tests + headless proof scene | [shipwright](../team-leads/shipwright.md) | 2026-05-08 | +| [p2-49](p2-49-climate-axes-latitude-continentality.md) | βœ… done | Climate axes refactor β€” latitude + continentality + zonal winds as first-class per-hex inputs | [terraformer](../team-leads/terraformer.md) | 2026-04-30 | +| [p2-50](p2-50-rng-determinism-pin.md) | βœ… done | Deterministic RNG + seed-derivation pin across mc-mapgen / mc-climate / mc-ecology | [terraformer](../team-leads/terraformer.md) | 2026-05-01 | +| [p2-51](p2-51-world-shape-knobs.md) | βœ… done | Player-facing world-shape parameters on new-game screen | [terraformer](../team-leads/terraformer.md) | 2026-05-01 | +| [p2-52](p2-52-substrate-flora-cover-ontology-split.md) | βœ… done | Split terrain enum into substrate Γ— flora-cover layers (resolve biome ontology) | [terraformer](../team-leads/terraformer.md) | 2026-05-01 | +| [p2-53](p2-53-action-vocabulary-design-game-gap.md) | βœ… done | Action vocabulary β€” gap analysis between design page and shipped Rust/Godot game | [wireguard](../team-leads/wireguard.md) | 2026-05-03 | +| [p2-53a](p2-53a-sentry-guard-action-kind.md) | βœ… done | Sentry/Guard ActionKind β€” add Sentry/Unsentry to mc-core with wake-on-vision | [wireguard](../team-leads/wireguard.md) | 2026-05-01 | +| [p2-53b](p2-53b-building-action-registry.md) | βœ… done | Building action registry β€” `BuildingActionKind`, `building_actions.json`, `GdBuildingActions` bridge | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-01 | +| [p2-53c](p2-53c-rally-vocabulary-expansion.md) | βœ… done | Rally vocabulary expansion β€” Hold / Fortify / JoinFormation + two-waypoint Patrol | [shipwright](../team-leads/shipwright.md) | 2026-05-01 | +| [p2-53d](p2-53d-building-specifics.md) | βœ… done | Building specifics β€” Garrison, Repair, Toggle Active + 18 archetype-specific actions | [shipwright](../team-leads/shipwright.md) | 2026-05-03 | +| [p2-53e](p2-53e-siege-pillage-embark.md) | βœ… done | Siege handlers (Pack/Deploy/Bombard) + Pillage UI wiring + Embark/Disembark handlers | [combat-dev](../team-leads/combat-dev.md) | 2026-05-03 | +| [p2-53f](p2-53f-infantry-specifics.md) | βœ… done | Infantry specifics β€” Shield Wall, Brace, Shove, Rage, Cleave, War Cry | [combat-dev](../team-leads/combat-dev.md) | 2026-05-01 | +| [p2-53g](p2-53g-ranged-specifics.md) | βœ… done | Ranged specifics β€” Volley, Aimed Shot, Fire Arrows | [combat-dev](../team-leads/combat-dev.md) | 2026-05-03 | +| [p2-53h](p2-53h-cavalry-specifics.md) | βœ… done | Cavalry specifics β€” Charge, Pursue, Wheel | [combat-dev](../team-leads/combat-dev.md) | 2026-05-03 | +| [p2-53i](p2-53i-engineer-pioneer-medic-scout.md) | βœ… done | Support specifics β€” Engineer, Pioneer, Medic, Scout | [shipwright](../team-leads/shipwright.md) | 2026-05-03 | +| [p2-54](p2-54-resource-visibility-three-axis.md) | βœ… done | Resource visibility β€” three-axis (visibility/yield_gate/improvement_gate) refactor | [terraformer](../team-leads/terraformer.md) | 2026-05-02 | +| [p2-54a](p2-54a-deposits-three-axis-migration.md) | βœ… done | Migrate deposits/*.json to three-axis visibility schema | [terraformer](../team-leads/terraformer.md) | 2026-05-01 | +| [p2-54b](p2-54b-player-observation-cache.md) | βœ… done | Per-player tile observation cache β€” flora/fauna last-observed state | [terraformer](../team-leads/terraformer.md) | 2026-05-01 | +| [p2-54c](p2-54c-renderer-observations-and-indicators.md) | βœ… done | Renderer reads observations + indicator decorations for tech-gated resources | [terraformer](../team-leads/terraformer.md) | 2026-05-01 | +| [p2-54d](p2-54d-ai-tech-priority-from-visibility.md) | βœ… done | AI tech-priority bias from visible-but-gated luxuries + indicator decorations | [terraformer](../team-leads/terraformer.md) | 2026-05-01 | +| [p2-55](p2-55-civilian-capture-system.md) | 🟑 partial | "Civilian Capture / Destroy / Ransom" | [combat-dev](../team-leads/combat-dev.md) | 2026-05-07 | +| [p2-55a](p2-55a-engineer-capture.md) | πŸ”΄ stub | "Engineer (Great Person) capture mechanics" | [combat-dev](../team-leads/combat-dev.md) | 2026-05-07 | +| [p2-55b](p2-55b-caravan-master-capture.md) | πŸ”΄ stub | "Caravan master capture mechanics" | [combat-dev](../team-leads/combat-dev.md) | 2026-05-07 | +| [p2-55c](p2-55c-freepeople-capture.md) | πŸ”΄ stub | "Freepeople capture mechanics" | [combat-dev](../team-leads/combat-dev.md) | 2026-05-07 | +| [p2-55d](p2-55d-ai-ransom-decision-hook.md) | πŸ”΄ stub | "AI ransom accept/refuse hook in mc-turn start-of-turn" | β€” | 2026-05-03 | +| [p2-55e](p2-55e-richer-ransom-events.md) | βœ… done | "UnitRansomAccepted / UnitRansomExpired events on TurnResult" | β€” | 2026-05-03 | +| [p2-56](p2-56-worker-categories-and-expertise-tiers.md) | 🟑 partial | "Worker categories (Sustenance/Construction/Wealth) + 5-tier expertise + Master/Grandmaster auras + idle decay" | [unassigned](../team-leads/unassigned.md) | 2026-05-07 | +| [p2-56a](p2-56a-worker-category-types.md) | βœ… done | Worker category types β€” Sustenance / Construction / Wealth taxonomy | [unassigned](../team-leads/unassigned.md) | 2026-05-04 | +| [p2-56b](p2-56b-expertise-tier-progression.md) | βœ… done | Expertise tier progression β€” 5-tier specialist XP ladder | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-04 | +| [p2-56c](p2-56c-master-grandmaster-auras.md) | βœ… done | Master / Grandmaster auras β€” adjacent-slot yield propagation | [unassigned](../team-leads/unassigned.md) | 2026-05-07 | +| [p2-57](p2-57-production-chain-typed-resources.md) | 🟑 partial | "Production-chain typed resources β€” raw β†’ processed pipelines wired into mc-city" | [unassigned](../team-leads/unassigned.md) | 2026-05-03 | +| [p2-57a](p2-57a-typed-resource-stockpile.md) | βœ… done | Typed resource stockpile β€” raw vs processed taxonomy | [unassigned](../team-leads/unassigned.md) | 2026-05-07 | +| [p2-57b](p2-57b-consume-produce-edges.md) | πŸ”΄ stub | "Building consume/produce edges β€” stockpile coupled to unit quality" | [unassigned](../team-leads/unassigned.md) | 2026-05-03 | +| [p2-58](p2-58-ambient-encounter-rolls.md) | βœ… done | Ambient encounter rolls per tile moved β€” fauna_density Γ— ecology_tier | [unassigned](../team-leads/unassigned.md) | 2026-05-07 | +| [p2-58a](p2-58a-tilestate-fauna-fields.md) | βœ… done | "TileState fauna fields β€” fauna_density + fauna_index for AmbientTileCtx" | [shipwright](../team-leads/shipwright.md) | 2026-05-07 | +| [p2-58b](p2-58b-ambient-encounter-hook.md) | βœ… done | "Ambient encounter hook β€” mc-turn::movement calls roll_ambient_encounter per tile step" | [unassigned](../team-leads/unassigned.md) | 2026-05-07 | +| [p2-59](p2-59-pioneer-escort-mechanic.md) | πŸ”΄ stub | "Pioneer escort mechanic β€” protection rules vs ambient encounters" | [unassigned](../team-leads/unassigned.md) | 2026-05-03 | +| [p2-60](p2-60-weather-lens-godot-ui.md) | πŸ”΄ stub | "Weather / observation lens switcher in the Godot HUD" | [unassigned](../team-leads/unassigned.md) | 2026-05-03 | +| [p2-61](p2-61-observation-recording-gates-from-tech.md) | πŸ”΄ stub | "Bind mc-observation gate_bits to player tech state β€” recording gates per-field" | [unassigned](../team-leads/unassigned.md) | 2026-05-03 | +| [p2-62](p2-62-procedural-unit-and-building-renderer.md) | βœ… done | Procedural unit/building renderer β€” alpha-only visual substitute | [asset-sprite](../team-leads/asset-sprite.md) | 2026-05-04 | +| [p2-63](p2-63-mc-flora-biome-substrate-migration.md) | πŸ”΄ stub | "mc-flora generation: migrate biome filter to substrate_climate-aware path" | [unassigned](../team-leads/unassigned.md) | 2026-05-04 | +| [p2-64](p2-64-apricot-async-batch-protocol.md) | βœ… done | Apricot async batch protocol β€” launch / status / fetch decoupling | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-07 | +| [p2-65](p2-65-extract-mc-state-crate.md) | πŸ”΄ stub | "Extract `GameState` and pending-queue data types into a dedicated `mc-state` crate" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-09 | +| [p2-66](p2-66-world-map-visual-proof.md) | βœ… done | "World-map visual proof scene that actually renders" | [terraformer](../team-leads/terraformer.md) | 2026-05-13 | +| [p2-67](p2-67-claude-player-api.md) | 🟑 partial | "Claude-driven player API β€” programmatic player + Agent-SDK adapter" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-10 | +| [p2-67-followup-legal-actions](p2-67-followup-legal-actions.md) | βœ… done | "PlayerView.legal_actions β€” populate full per-unit / per-city / empire-level legal-action enumerators" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-11 | +| [p2-67-followup-mcts-tactical-state-impl](p2-67-followup-mcts-tactical-state-impl.md) | πŸ”΄ stub | "TreeState impl for TacticalState β€” wire real MCTS into the AI decision path" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-13 | +| [p2-68](p2-68-mc-ai-headless-turn-driver.md) | βœ… done | "mc-ai headless turn driver β€” GameState projector/applicator + run_ai_turn" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-11 | +| [p2-69](p2-69-api-gdext-mctscontroller-port.md) | βœ… done | "Port GdMcTreeController to mc-player-api AI driver (DRY consolidation)" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-11 | +| [p2-70](p2-70-mc-vision-visibility-producer.md) | βœ… done | "mc-vision β€” per-player tile visibility producer (Rust)" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-11 | +| [p2-71](p2-71-bench-projector-enrichment.md) | βœ… done | "Bench projector enrichment β€” make MCTS see a real tactical surface" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-11 | +| [p2-71b](p2-71b-militarist-starter-widening.md) | βœ… done | "Militarist starter widening β€” add a settler/founder unit so FoundCity fires" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-11 | +| [p2-72](p2-72-gdplayerapi-render-bridge.md) | πŸ”΄ stub | "GdPlayerApi β†’ render bridge (visualise the API-held game world)" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-11 | +| [p2-72-option-b](p2-72-option-b-workaround.md) | βœ… done | "Option B render bridge β€” proof scene rehydrates GDScript from GdPlayerApi each turn" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-12 | +| [p2-72a](p2-72a-gdgamestate-canonical-render-source.md) | πŸ”΄ stub | "Make `GdGameState` the canonical render source" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-12 | +| [p2-72a-building-entity-port](p2-72a-building-entity-port.md) | 🟑 partial | "Port NPC Building entity (lairs/villages/ruins) into Rust" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-12 | +| [p2-72a-pre-strip](p2-72a-pre-strip.md) | βœ… done | "Strip Game 2/3 magic/ascension/ley fields from Game 1 runtime" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-12 | +| [p2-72a-save-format-migration](p2-72a-save-format-migration.md) | 🟑 partial | "Decouple save format from GDScript-class shape" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-12 | +| [p2-72b-promote-playerstate-cities-to-city](p2-72b-promote-playerstate-cities-to-city.md) | πŸ”΄ stub | "Parallel-field cities synthesis at Godot bridge (Option C)" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-12 | -## Out of Scope +## Out of Scope (Game 2 / Game 3) -> These objectives are explicitly deferred. They are tracked for visibility but not blocking the current release. +> These objectives are explicitly future-scope. **Game 2 (Age of Kzzykt)** items introduce leylines, the Green school, and spacefaring. **Game 3 (Age of Elves)** items cover the full five-school magic system, Archons, and Arcane Ascension. None are part of the Game 1 Early Access release. -| ID | Status | Title | Tags | Owner | Updated | Blocked | -|---|---|---|---|---|---|---| -| [p1-14](p1-14-guide-magic-school-scope-drift.md) | ⚫ oos | Gate Game 2/3/4 magic-school content behind EpisodeGate (future-game scope) | β€” | β€” | 2026-04-17 | 🟒 unblocked | -| [g2-05](g2-05-tectonics-lithology-oos.md) | ⚫ oos | Tectonics + lithology axes for procedural map generation (Game 2) | β€” | β€” | 2026-04-30 | 🟒 unblocked | -| [g2-06](g2-06-soil-derivation-oos.md) | ⚫ oos | Soil derivation layer β€” emergent soil order from rock + climate + slope (Game 2) | β€” | β€” | 2026-04-30 | 🟒 unblocked | -| [g2-07](g2-07-flora-lifecycle-transitions-oos.md) | ⚫ oos | Flora lifecycle transitions β€” climate-driven succession over turns (Game 2) | β€” | β€” | 2026-05-01 | 🟒 unblocked | -| [g2-08](g2-08-fauna-population-dynamics-oos.md) | ⚫ oos | Fauna population dynamics β€” habitat_min, carrying_capacity, prey availability (Game 2) | β€” | β€” | 2026-05-01 | 🟒 unblocked | -| [g2-09](g2-09-flora-tolerance-driven-selection-oos.md) | ⚫ oos | Flora tolerance-driven selection β€” drought / fire / cold tolerances feed selector (Game 2) | β€” | β€” | 2026-05-01 | 🟒 unblocked | -| [g2-10](g2-10-fauna-migration-paths-oos.md) | ⚫ oos | Fauna migration paths β€” seasonal range shifts, reintroduction propagation (Game 2) | β€” | β€” | 2026-05-01 | 🟒 unblocked | -| [g2-01](g2-01-leylines-oos.md) | ⚫ oos | Ley lines β€” Game 2 (Age of Kzzykt) | β€” | β€” | 2026-04-17 | 🟒 unblocked | -| [g2-02](g2-02-additional-races-oos.md) | ⚫ oos | Kzzykt playable race β€” Game 2 (Age of Kzzykt) | β€” | β€” | 2026-04-17 | 🟒 unblocked | -| [g2-03](g2-03-green-school-oos.md) | ⚫ oos | Kzzykt Green school of magic β€” Game 2 (Age of Kzzykt) | β€” | β€” | 2026-04-17 | 🟒 unblocked | -| [g2-04](g2-04-multi-gpu-batch-simulate-oos.md) | ⚫ oos | Multi-GPU sharding for batch_simulate_gpu β€” out-of-scope (Game 2) | β€” | [warcouncil](../team-leads/warcouncil.md) | 2026-04-17 | 🟒 unblocked | -| [g2-11](g2-11-vertical-city-floor-stack-oos.md) | ⚫ oos | Vertical city floor stack (Game 2) β€” OOS | β€” | [unassigned](../team-leads/unassigned.md) | 2026-05-03 | πŸ”’ g2-12 | -| [g2-12](g2-12-underground-layer-stack-oos.md) | ⚫ oos | Underground layer stack (Game 2) β€” OOS | β€” | [unassigned](../team-leads/unassigned.md) | 2026-05-03 | 🟒 unblocked | -| [g3-01](g3-01-archons-oos.md) | ⚫ oos | Archons β€” Game 3 (Age of Elves) | β€” | β€” | 2026-04-17 | 🟒 unblocked | -| [g3-02](g3-02-life-school-oos.md) | ⚫ oos | Life school spellbook β€” Game 3 (Age of Elves) | β€” | β€” | 2026-04-17 | 🟒 unblocked | -| [g3-03](g3-03-death-school-oos.md) | ⚫ oos | Death school spellbook β€” Game 3 (Age of Elves) | β€” | β€” | 2026-04-17 | 🟒 unblocked | -| [g3-04](g3-04-chaos-school-oos.md) | ⚫ oos | Chaos school spellbook β€” Game 3 (Age of Elves) | β€” | β€” | 2026-04-17 | 🟒 unblocked | -| [g3-05](g3-05-aether-school-oos.md) | ⚫ oos | Aether school spellbook β€” Game 3 (Age of Elves) | β€” | β€” | 2026-04-17 | 🟒 unblocked | -| [g3-06](g3-06-arcane-ascension-oos.md) | ⚫ oos | Arcane Ascension victory β€” Game 3 (Age of Elves) | β€” | β€” | 2026-04-17 | 🟒 unblocked | -| [g4-01](g4-01-terran-race-oos.md) | ⚫ oos | Terran (Human) playable species β€” Game 4 (Age of Terrans) | β€” | β€” | 2026-04-17 | 🟒 unblocked | -| [g4-02](g4-02-psionics-oos.md) | ⚫ oos | Psionics ability system β€” Game 4 (Age of Terrans) | β€” | β€” | 2026-04-17 | 🟒 unblocked | -| [g4-03](g4-03-religious-victory-oos.md) | ⚫ oos | Religious victory condition β€” Game 4 (Age of Terrans) | β€” | β€” | 2026-04-17 | 🟒 unblocked | -| [g5-01](g5-01-phantasma-oos.md) | ⚫ oos | Phantasma playable species β€” Game 5 (Age of Ascension) | β€” | β€” | 2026-04-17 | 🟒 unblocked | -| [g5-02](g5-02-flugel-oos.md) | ⚫ oos | FlΓΌgel playable species β€” Game 5 (Age of Ascension) | β€” | β€” | 2026-04-17 | 🟒 unblocked | -| [g5-03](g5-03-gith-oos.md) | ⚫ oos | Gith playable species (Githyanki + Githzerai) β€” Game 5 (Age of Ascension) | β€” | β€” | 2026-04-17 | 🟒 unblocked | -| [g5-04](g5-04-demonia-oos.md) | ⚫ oos | Demonia playable species β€” Game 5 (Age of Ascension) | β€” | β€” | 2026-04-17 | 🟒 unblocked | -| [g6-01](g6-01-naval-combat-oos.md) | ⚫ oos | Naval combat β€” out-of-scope (post-v10) | β€” | β€” | 2026-04-26 | 🟒 unblocked | -| [g6-02](g6-02-caravan-trade-routes-oos.md) | ⚫ oos | Caravan trade routes β€” out-of-scope (post-v10) | β€” | β€” | 2026-04-26 | 🟒 unblocked | +| ID | Status | Title | Owner | Updated | +|---|---|---|---|---| +| [p1-14](p1-14-guide-magic-school-scope-drift.md) | ⚫ oos | Gate Game 2/3/4 magic-school content behind EpisodeGate (future-game scope) | β€” | 2026-04-17 | +| [g2-05](g2-05-tectonics-lithology-oos.md) | ⚫ oos | Tectonics + lithology axes for procedural map generation (Game 2) | β€” | 2026-04-30 | +| [g2-06](g2-06-soil-derivation-oos.md) | ⚫ oos | Soil derivation layer β€” emergent soil order from rock + climate + slope (Game 2) | β€” | 2026-04-30 | +| [g2-07](g2-07-flora-lifecycle-transitions-oos.md) | ⚫ oos | Flora lifecycle transitions β€” climate-driven succession over turns (Game 2) | β€” | 2026-05-01 | +| [g2-08](g2-08-fauna-population-dynamics-oos.md) | ⚫ oos | Fauna population dynamics β€” habitat_min, carrying_capacity, prey availability (Game 2) | β€” | 2026-05-01 | +| [g2-09](g2-09-flora-tolerance-driven-selection-oos.md) | ⚫ oos | Flora tolerance-driven selection β€” drought / fire / cold tolerances feed selector (Game 2) | β€” | 2026-05-01 | +| [g2-10](g2-10-fauna-migration-paths-oos.md) | ⚫ oos | Fauna migration paths β€” seasonal range shifts, reintroduction propagation (Game 2) | β€” | 2026-05-01 | +| [g2-01](g2-01-leylines-oos.md) | ⚫ oos | Ley lines β€” Game 2 (Age of Kzzykt) | β€” | 2026-04-17 | +| [g2-02](g2-02-additional-races-oos.md) | ⚫ oos | Kzzykt playable race β€” Game 2 (Age of Kzzykt) | β€” | 2026-04-17 | +| [g2-03](g2-03-green-school-oos.md) | ⚫ oos | Kzzykt Green school of magic β€” Game 2 (Age of Kzzykt) | β€” | 2026-04-17 | +| [g2-04](g2-04-multi-gpu-batch-simulate-oos.md) | ⚫ oos | Multi-GPU sharding for batch_simulate_gpu β€” out-of-scope (Game 2) | [warcouncil](../team-leads/warcouncil.md) | 2026-04-17 | +| [g2-11](g2-11-vertical-city-floor-stack-oos.md) | ⚫ oos | "Vertical city floor stack (Game 2) β€” OOS" | [unassigned](../team-leads/unassigned.md) | 2026-05-03 | +| [g2-12](g2-12-underground-layer-stack-oos.md) | ⚫ oos | "Underground layer stack (Game 2) β€” OOS" | [unassigned](../team-leads/unassigned.md) | 2026-05-03 | +| [g3-01](g3-01-archons-oos.md) | ⚫ oos | Archons β€” Game 3 (Age of Elves) | β€” | 2026-04-17 | +| [g3-02](g3-02-life-school-oos.md) | ⚫ oos | Life school spellbook β€” Game 3 (Age of Elves) | β€” | 2026-04-17 | +| [g3-03](g3-03-death-school-oos.md) | ⚫ oos | Death school spellbook β€” Game 3 (Age of Elves) | β€” | 2026-04-17 | +| [g3-04](g3-04-chaos-school-oos.md) | ⚫ oos | Chaos school spellbook β€” Game 3 (Age of Elves) | β€” | 2026-04-17 | +| [g3-05](g3-05-aether-school-oos.md) | ⚫ oos | Aether school spellbook β€” Game 3 (Age of Elves) | β€” | 2026-04-17 | +| [g3-06](g3-06-arcane-ascension-oos.md) | ⚫ oos | Arcane Ascension victory β€” Game 3 (Age of Elves) | β€” | 2026-04-17 | +| [g4-01](g4-01-terran-race-oos.md) | ⚫ oos | Terran (Human) playable species β€” Game 4 (Age of Terrans) | β€” | 2026-04-17 | +| [g4-02](g4-02-psionics-oos.md) | ⚫ oos | Psionics ability system β€” Game 4 (Age of Terrans) | β€” | 2026-04-17 | +| [g4-03](g4-03-religious-victory-oos.md) | ⚫ oos | Religious victory condition β€” Game 4 (Age of Terrans) | β€” | 2026-04-17 | +| [g5-01](g5-01-phantasma-oos.md) | ⚫ oos | Phantasma playable species β€” Game 5 (Age of Ascension) | β€” | 2026-04-17 | +| [g5-02](g5-02-flugel-oos.md) | ⚫ oos | FlΓΌgel playable species β€” Game 5 (Age of Ascension) | β€” | 2026-04-17 | +| [g5-03](g5-03-gith-oos.md) | ⚫ oos | Gith playable species (Githyanki + Githzerai) β€” Game 5 (Age of Ascension) | β€” | 2026-04-17 | +| [g5-04](g5-04-demonia-oos.md) | ⚫ oos | Demonia playable species β€” Game 5 (Age of Ascension) | β€” | 2026-04-17 | +| [g6-01](g6-01-naval-combat-oos.md) | ⚫ oos | Naval combat β€” out-of-scope (post-v10) | β€” | 2026-04-26 | +| [g6-02](g6-02-caravan-trade-routes-oos.md) | ⚫ oos | Caravan trade routes β€” out-of-scope (post-v10) | β€” | 2026-04-26 | ## Superseded -> These objectives were split into narrower children. Files are retained as index stubs so external references do not 404. +> These objectives were split into narrower children. Files are retained as index stubs so external references don't 404. The `superseded_by:` frontmatter field names the replacement IDs. -| ID | Status | Title | Tags | Owner | Updated | Blocked | -|---|---|---|---|---|---|---| -| [p0-20d](p0-20d-gpu-walltime-real-host.md) | ♻️ superseded | GPU MCTS wall-time gate β€” measure on real-discrete-GPU test host | β€” | [warcouncil](../team-leads/warcouncil.md) | 2026-05-05 | 🟒 unblocked | -| [p1-30b](p1-30b-parallel-mcts-rollouts.md) | ♻️ superseded | Parallel MCTS rollouts for huge-map decisive games (closes p1-22's huge-map sub-gate) | perf, mcts, tactical-ai | [warcouncil](../team-leads/warcouncil.md) | 2026-05-05 | 🟒 unblocked | -| [p1-27d](p1-27d-additive-value-estimate.md) | ♻️ superseded | Add `value_estimate_abstract` GdMcTreeController method β€” non-lossy MCTS service caller | β€” | [warcouncil](../team-leads/warcouncil.md) | 2026-04-25 | 🟒 unblocked | -| [p2-17](p2-17-sprite-assets.md) | ♻️ superseded | Sprite assets β€” superseded index (split into p2-22 … p2-28) | β€” | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-17 | 🟒 unblocked | +| ID | Status | Title | Owner | Updated | +|---|---|---|---|---| +| [p0-20d](p0-20d-gpu-walltime-real-host.md) | ♻️ superseded | GPU MCTS wall-time gate β€” measure on real-discrete-GPU test host | [warcouncil](../team-leads/warcouncil.md) | 2026-05-05 | +| [p1-30b](p1-30b-parallel-mcts-rollouts.md) | ♻️ superseded | "Parallel MCTS rollouts for huge-map decisive games (closes p1-22's huge-map sub-gate)" | [warcouncil](../team-leads/warcouncil.md) | 2026-05-05 | +| [p1-27d](p1-27d-additive-value-estimate.md) | ♻️ superseded | Add `value_estimate_abstract` GdMcTreeController method β€” non-lossy MCTS service caller | [warcouncil](../team-leads/warcouncil.md) | 2026-04-25 | +| [p2-17](p2-17-sprite-assets.md) | ♻️ superseded | Sprite assets β€” superseded index (split into p2-22 … p2-28) | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-17 | diff --git a/.project/objectives/p2-58a-tilestate-fauna-fields.md b/.project/objectives/p2-58a-tilestate-fauna-fields.md index ddc113a6..7b31ac6e 100644 --- a/.project/objectives/p2-58a-tilestate-fauna-fields.md +++ b/.project/objectives/p2-58a-tilestate-fauna-fields.md @@ -4,7 +4,7 @@ title: "TileState fauna fields β€” fauna_density + fauna_index for AmbientTileCt priority: p2 status: done scope: game1 -owner: game-systems +owner: shipwright updated_at: 2026-05-07 blocked_by: [] evidence: diff --git a/.project/objectives/p2-66-world-map-visual-proof.md b/.project/objectives/p2-66-world-map-visual-proof.md index ac63b36d..b1ce935b 100644 --- a/.project/objectives/p2-66-world-map-visual-proof.md +++ b/.project/objectives/p2-66-world-map-visual-proof.md @@ -5,7 +5,7 @@ priority: p2 status: done scope: game1 category: tooling -owner: godot-renderer +owner: terraformer created: 2026-05-10 updated_at: 2026-05-13 blocked_by: [] diff --git a/.project/objectives/p3-11-pioneer-engineer-action-points.md b/.project/objectives/p3-11-pioneer-engineer-action-points.md index a49e0d95..df2a27ab 100644 --- a/.project/objectives/p3-11-pioneer-engineer-action-points.md +++ b/.project/objectives/p3-11-pioneer-engineer-action-points.md @@ -4,7 +4,7 @@ title: "Pioneer & Engineer action-point pool" priority: p3 status: done scope: game1 -owner: game-systems +owner: shipwright updated_at: 2026-05-13 evidence: - "src/simulator/crates/mc-core/src/units.rs:48-119 ActionPoints typed newtype with current/capacity invariants" diff --git a/.project/objectives/p3-13b-geological-events.md b/.project/objectives/p3-13b-geological-events.md index 01245342..656cd48e 100644 --- a/.project/objectives/p3-13b-geological-events.md +++ b/.project/objectives/p3-13b-geological-events.md @@ -4,7 +4,7 @@ title: "Geological events β€” earthquake, volcanic_eruption, landslide" priority: p3 status: done scope: game1 -owner: game-systems +owner: shipwright updated_at: 2026-05-13 evidence: - "src/simulator/crates/mc-mapgen/src/events.rs:206-283 β€” derive_events emits earthquake/volcanic_eruption/landslide gated by boundary_kind / (is_active_volcano || plate_kind) + mountain_proximity / mountain_proximity+moisture" diff --git a/public/games/age-of-dwarves/data/objectives.json b/public/games/age-of-dwarves/data/objectives.json index 10c919ba..f0552fd2 100644 --- a/public/games/age-of-dwarves/data/objectives.json +++ b/public/games/age-of-dwarves/data/objectives.json @@ -1,13 +1,13 @@ { - "generated_at": "2026-05-05T19:09:41Z", + "generated_at": "2026-05-13T22:27:33Z", "totals": { "oos": 28, - "done": 156, - "missing": 6, - "partial": 32, - "stub": 24, "in_progress": 1, - "total": 247 + "partial": 30, + "stub": 22, + "missing": 5, + "done": 190, + "total": 276 }, "objectives": [ { @@ -690,6 +690,16 @@ "updated_at": "2026-05-05", "summary": "Spun out from p0-22 (Ultimate AI stress test) on 2026-04-25 after the 7 root-cause fixes (combat method typos, per-slot pinning, score-victory fallback, NOTIFICATION_PREDELETE, autoplay-batch.sh MCTS branch, etc.) verified the pipeline produces `outcome:victory` at T500 on the huge-map config. The remaining gap blocking `ultimate_stress: PASS` is **purely MCTS per-turn wall-clock cost on game-state complexity**: with deterministic seeds, some maps produce game states where each MCTS decision takes 30-60+ seconds (vs <5s on simpler states). Even at `PARALLEL=2 SAFETY_TIMEOUT_OVERRIDE=3600s`, slow seeds reach only T55-T236 in the 3600s budget (would need 4-8 hours wall-clock per game). Fast seeds reach T500 in ~45min.\n\nThis is engineering work, not test calibration: the AI is ALWAYS faster when it commits to a decision under a bounded budget. The current MCTS runs to a fixed iteration count regardless of wall-clock cost; on a complex 5-player huge-map state the iteration cost balloons." }, + { + "id": "p1-22a", + "title": "Huge-map AI quality β€” close the 4/10 β†’ β‰₯5/10 decisive-game gate", + "priority": "p1", + "status": "stub", + "scope": "game1", + "owner": "warcouncil", + "updated_at": "2026-05-08", + "summary": "The huge-map 5-clan batch (`tools/huge-map-5clan.sh`, 10 seeds, T300 limit,\n`MCTS_DECISION_BUDGET_MS=2000`) has landed at **4/10 victories** across three\nindependent runs (cycle-1 pre-budget, cycle-2 post-tactical-budget, cycle-3\npost-p0-20 2Γ— GPU rollout speed). The gate is β‰₯5/10.\n\nPost-p0-20 evidence eliminates budget plumbing as the bottleneck: with\n`budget_ms=50` the budget test fires at `dispatched=2623 << 100000`\n(1/38 of the iteration cap), and GPU rollouts are 2Γ— faster than CPU. Yet the\nratio did not move from 4/10. This is **AI strategic quality on huge maps**,\nnot throughput." + }, { "id": "p1-23", "title": "Restore StatsTracker β€” demographics overview broken in shipped builds", @@ -757,7 +767,7 @@ "status": "partial", "scope": "game1", "owner": "combat-dev", - "updated_at": "2026-05-03", + "updated_at": "2026-05-13", "summary": "Split out from p0-01's original v1 sub-gates that the AI-layer cycles (1, 2, 3) could not move because they measure emergent game-balance dynamics, not AI quality. p0-01 closed `done` 2026-04-26 against Gate v2 (3/5 v1 sub-gates pass cleanly: tier_peak=4, wonders 7/10, combats=255). The 2 v1 sub-gates that v2 reframed away need a real owner:\n\n- `tier_peak_gap ≀ 4` median: in surviving-pair games at end, one player tech-monopolizes (tp=6) while the other stagnates (tp=0), giving gap=5-6. Even with the alive-aware metric, the gap holds. Root cause: capture/combat dynamics let one player snowball without the other catching up. Loser stays alive but undeveloped.\n- `peak_unit_tier β‰₯ 3 in β‰₯7/10 games` absolute: 5/10 currently. 4 of the 5 fails are early-domination games (T48-T121) where tier-3 tech hasn't unlocked yet. The AI does deploy tier-3 units when available (80% of seeds reaching tp β‰₯3 also reach unit β‰₯3), but games end before tier-3 unlocks in half the seeds.\n\nCycle-3 attempted multiple AI-layer levers and confirmed they DON'T move these gates:\n- Tactical `DOMINANCE_FACTOR` bump (production.rs 1.25β†’2.0): no effect on outcome\n- Tactical dominance lerp bump (thresholds.rs 1.5β†’2.0/2.5 baseline): caused REGRESSION on tier_peak (faster opportunist wins)\n- Both reverted because the strategic MCTS doesn't pick attack actions β€” it only picks `SpawnUnit/FoundCity/Idle` per `mc-turn/src/snapshot.rs:204-214 action_prior`. The capture/development tempo is governed by mc-turn capture mechanics + mc-economy growth rates, NOT by AI scoring weights.\n\nReal levers (cross-team scope):\n- **mc-combat / mc-turn capture mechanics**: increase city HP, lengthen siege duration, add capital-recapture cost, weaken early-rush combat math.\n- **mc-economy growth rates**: faster baseline tech research, lower tier-3 prereq cost, give players tech catch-up bonus when behind.\n- **mc-turn turn-limit floor**: refuse to award domination victory before T150 (force games to mid-game minimum).\n\nPick one or compose multiple. Each requires the corresponding team-lead's involvement." }, { @@ -767,9 +777,29 @@ "status": "partial", "scope": "game1", "owner": "combat-dev", - "updated_at": "2026-05-04", + "updated_at": "2026-05-13", "summary": "Filed by p1-29 cycle 5 close-out as the combat-side intervention that should close p1-29's `tier_peak_gap ≀4` gate. Three consecutive cycles of research-side levers (catch-up tech-pick mult, catch-up tech-output mult, loss-tolerance lever) landed durably but failed to move the gate across three batches. The failure is structural: p1 (the losing AI) loses cities faster than research output can unlock era-2+ techs. Research-side levers multiply a tiny base into a tiny base. The gate is a **territory problem**, not a research problem.\n\nThis objective addresses the territory problem by giving the defender (when reduced to their last city) a combat-strength bonus that scales with how many cities they've lost β€” buying enough turns for the existing research-side levers to finally fire and unlock era-2+ techs." }, + { + "id": "p1-29b", + "title": "\"AI tech tier gap β€” structural research path quality (low-pop AI fails to reach t1+)\"", + "priority": "p1", + "status": "done", + "scope": "game1", + "owner": "warcouncil", + "updated_at": "2026-05-07", + "summary": "Filed by cycle 47 close-out as the structural root cause for the alive-aware gate failure in p1-29a. The `tier_peak_gap ≀ 4` gate (across ALL living players at game end) failed 1/10 seeds in the cycle-45 batch even after p1-29a's last-stand multiplier landed. The failure is structural: the MCTS evaluator, rollout scorer, and tactical production allocator all apply flat weights that make sole-city players deprioritize research relative to defense and expansion. Tuning multipliers on a compound that starts near zero does not close the gap." + }, + { + "id": "p1-29c", + "title": "\"Sole-city research path β€” lift trailing AI from tier_peak=1 to β‰₯2\"", + "priority": "p1", + "status": "stub", + "scope": "game1", + "owner": "unassigned", + "updated_at": "2026-05-13", + "summary": "Filed by p1-29b cycle-50 close-out (2026-05-07) and re-confirmed by p1-29a cycle-45 diagnosis (2026-05-07). p1-29b clamped p0's runaway (9/10 seeds now satisfy `tier_peak_gap ≀ 4`) but **p1 remains stuck at `tier_peak = 1` in every game**. The gap metric was tightened by capping the leader, not by lifting the trailing sole-city AI.\n\nThis objective is the missing structural fix for p1-29a's bullet 5 (alive-aware `tier_peak_gap ≀ 4`, requiring `p0_tp β‰₯ 2 AND p1_tp β‰₯ 2`) and bullet 7 (compose-isolation 3-batch, which has no signal to attribute while p1_tp=1 in 100% of seeds)." + }, { "id": "p1-30", "title": "\"Optimize `_build_tactical_state` β€” 8000-tile GDScript dict-build per AI turn blocks p1-22 huge-map gate\"", @@ -897,7 +927,7 @@ "status": "partial", "scope": "game1", "owner": null, - "updated_at": "2026-05-04", + "updated_at": "2026-05-13", "summary": "`mc-ai/tactical/production.rs::ids` hardcodes 8 building/unit IDs (`WARRIOR`, `WORKER`, `FOUNDER`, `WALLS`, `FORGE`, `CASTLE`, `MARKETPLACE`, `GRANARY`) and the priority ladder picks among them. The human player sees all 155 buildings in the city UI (`city_buildable_helper.gd` iterates `DataLoader.get_all_buildings()` and gates by `city.can_build()`); the AI's mental model is a ~5% slice of that catalog.\n\nResult: AI never builds `library`, `temple`, `colosseum`, `barracks`, `siege_workshop`, `harbor`, `aqueduct`, any of the 62 wonders, or any of the 32 military buildings beyond walls. Production decisions are silently flat across most of the tech tree.\n\nThe fix is to evaluate the full catalog the same way `pick_best_melee` evaluates units: filter by tech / race / resource gates, score by category Γ— personality Γ— city-state, return best. Catalog comes from the subscription manifest (`p1-41`) so the AI honors the same scope as the human." }, { @@ -907,19 +937,29 @@ "status": "partial", "scope": "game1", "owner": null, - "updated_at": "2026-05-05", + "updated_at": "2026-05-07", "summary": "User direction (2026-04-29): \"all the buildings should be buildable and some buildings can be built on top of each other (double barracks - infantry) ... what about comboing other buildings ... science stack, culture stack\".\n\nToday every building is binary: a city either has it or doesn't. The mechanic the user wants: queueing a building on top of an existing one upgrades the slot in place β€” `barracks` + another `barracks` build = `infantry` (a stronger military producer). The same primitive applies to every category: science stacks (library β†’ scriptorium β†’ academy), culture stacks (monument β†’ bardic_circle β†’ great_hall), production stacks (forge β†’ iron_forge β†’ grand_forge), etc. This is distinct from the BUILDINGS.md \"Hybrid Merged Structures\" mechanic (which combines TWO different buildings + Synthesis tech into a hybrid). Stacking is the simpler primitive: same-category Lv1 β†’ Lv2 β†’ Lv3 chains within one slot.\n\nThe existing data already implies category-tier chains via the `tier` + `category` fields:\n\n| Category | Lv1 (no tech) | Lv2 (mid tech) | Lv3+ (late tech) |\n|---|---|---|---|\n| Production | `forge` t1 | (gap β€” `iron_forge` doesn't exist) | `dwarf_deep_forge` t3, `tempering_forge` t6, `steam_forge` t7, `adamantine_foundry` t10 |\n| Science | `library` t1 | `university` t3, `observatory` t3 | `academy_of_sciences` t5, `climate_institute` t9 |\n| Culture | `monument` t1 | `great_hall` t3, `gathering_hall` t2 | `ancestor_hall` t10 |\n| Military | `barracks` t1 | (gap β€” `infantry` doesn't exist) | `armory` t3, `military_academy` t6, `command_citadel` t10 |\n| Food | `granary` t1 | `mill` t2, `brewery` t2, `watermill` t2 | `great_granary` t2 (wonder) |\n| Defense | `walls` t1 | `watchtower` t1 | `castle` t3 |\n| Wealth | `marketplace` t2, `market` t2 (DUPLICATE) | `guild_hall` t4 | (none) |\n| Religion | `temple` t2 | `temple_of_the_ancestor` t5 (wonder) | (none) |\n\nThe stacking schema makes these chains explicit and queryable. Where a Lv2 successor doesn't exist yet (e.g. `infantry`, `iron_forge`, `scriptorium`), this objective authors the missing intermediates.\n\nThree design questions need user sign-off before authoring:\n\n1. **Successor identity**: is `infantry` a NEW building (needs authoring) or an existing one (e.g. reuse `armory` as the \"barracks Lv2\" slot)?\n2. **Mechanic shape**:\n - **(a) Replacement**: building barracks twice consumes both, slot becomes `infantry`. Original gone.\n - **(b) Levelled**: building stays \"barracks\" but carries a `level: 2` field with stacked effects.\n - **(c) Per-tile**: two barracks on same tile merge (only relevant if `placement_tile_required: true`).\n3. **Schema**: declare on the lower tier (`barracks.json::stacks_into: \"infantry\"`) or on the upper (`infantry.json::requires_existing: \"barracks\"` + `consumes_existing: true`)? The latter keeps the relationship bidirectional readable.\n\nRecommendation: option **(a) Replacement** with declaration on the upper tier (`requires_existing` + `consumes_existing`). Matches civ-style upgrade slots, reads naturally in the city UI (\"Upgrade Barracks β†’ Infantry\"), avoids per-tile placement complexity for a v1." }, { "id": "p1-43b", "title": "Deep chain authoring β€” fill T6/T7/T8/T9/T10 building tiers across the 5 short chains", "priority": "p1", - "status": "stub", + "status": "done", "scope": "game1", "owner": null, "updated_at": "2026-05-05", "summary": "`p1-43a` (closed inline in `p1-43-building-stacking-upgrade.md` on 2026-05-05)\nshipped the engine + schema layer and **5 representative new high-tier\nbuildings** as a chain-extension proof:\n\n| ID | Tier | Chain |\n|---|---|---|\n| `hydroponic_farm` | 5 | food |\n| `bazaar` | 5 | wealth |\n| `grand_chronicle` | 7 | culture |\n| `gravity_press` | 9 | production |\n| `apothecarium` | 5 | medical |\n\nThis objective (`p1-43b`) covers the **remaining ~35 high-tier buildings**\nneeded to extend each short chain to ~8 tiers, per Q1's locked design." }, + { + "id": "p1-43c", + "title": "\"p1-43 follow-ups β€” chain ladder authoring, AI stack scoring, city UI upgrade surface, GUT bridge test\"", + "priority": "p1", + "status": "partial", + "scope": "game1", + "owner": null, + "updated_at": "2026-05-13", + "summary": "Remaining bullets from p1-43 that require either bulk data authoring (~21 producer\nbuilding `produces:` field fills across the 14 military + 7 civilian chains) or\ndepend on p1-42 (AI stack scoring) or need GDScript bridge wiring (UI upgrade\nsurface + GUT bridge test).\n\nAs of cycle 39: 209 building JSON files exist (206 known IDs in the validator).\n92 buildings carry a `produces:` field. The remaining ~117 producer buildings in\nthe 14 military + 7 civilian chains need their `produces:` arrays populated.\n\n**Cycle 2 progress (2026-05-08):** Round 1 filled 40 buildings (cycle 1). Round 2\nfilled 38 more buildings: air chain (airfield + zeppelin_dock expanded with\ndwarf_gyrocopter, dwarf_iron_hawk, dwarf_mithril_hawk), military capstones\n(ancestor_hall, ancestral_armoury, depot, signal_works, the_cold_anvil, walls,\noutpost/watchtower), and 29 civilian/infrastructure/wonder buildings. All 38 unit\nIDs verified against `public/resources/units/`. Validator: buildings section PASS,\nzero new failures. ~39 producer buildings remain unpopulated (mostly yield-only\nfood/infrastructure with no logical unit connection).\nEngine, schema, and Rust tests are fully done (see p1-43 evidence). Only data\nauthoring, AI scoring, UI surface, and GUT bridge test remain." + }, { "id": "p1-44", "title": "\"Buildings produce units, not the city center β€” per-building production queues\"", @@ -927,9 +967,19 @@ "status": "partial", "scope": "game1", "owner": null, - "updated_at": "2026-05-04", + "updated_at": "2026-05-13", "summary": "User direction (2026-04-29): \"it would make sense to build those units in the appropriate buildings rather than the city center.\"\n\nToday every city has **one** production queue (`city.gd:57 production_queue: Array`) where the player picks \"warrior\", \"barracks\", \"wonder\", anything goes through the same FIFO. Building selection just gates the menu β€” the building doesn't actually *do* anything when production happens.\n\nThe user's model β€” and the model `PRODUCTION_CHAIN.md` already describes β€” is that buildings are **producers**:\n\n> Every citizen is a resource pulled between three competing demands:\n> - **Construction** β€” builds new buildings, upgrades existing ones (investment)\n> - **Buildings** β€” produces units, research, culture, equipment (output)\n> - **Tiles** β€” produces food, raw materials, gold (sustenance)\n\nConcretely:\n- **Barracks** has its own queue producing infantry / armory / military_academy lineage units.\n- **Stable** queues cavalry units.\n- **Siege Workshop** queues siege units.\n- **Library** queues sages / cartographers / engineers (science civilians) and accumulates research per turn.\n- **Temple** queues battle priests and accumulates culture/happiness.\n- **Harbor** queues naval units (and gates them β€” see `p1-33`).\n- **Airfield** queues aerial units.\n- **Construction queue** (city-level, distinct from building queues) builds NEW buildings and upgrades existing ones.\n\nEach producer building runs its queue independently per turn. Citizens / production allocation gets split across buildings (per `PRODUCTION_CHAIN.md` \"Three-Way Tension\"). The city's single global queue dies; build-vs-train becomes a structural distinction not a queue-item distinction.\n\nThis is a major engine refactor. Touches: `mc-city`, `mc-turn`, `city.gd`, `city_screen.gd`, `city_buildable_helper.gd`, save schema, AI's `production.rs` (now picks per producer-building, not per city), and the new themed-unit catalog (battle_priest, sage, bard, merchant, etc. β€” see `p1-43` open question 1)." }, + { + "id": "p1-44c", + "title": "\"p1-44 follow-ups β€” UI, AI per-building emission, themed roster, GUT, batch\"", + "priority": "p1", + "status": "partial", + "scope": "game1", + "owner": null, + "updated_at": "2026-05-07", + "summary": "p1-44 Phase B (cycle 29) landed the per-building queue split at the engine\nlayer: `City.queues: BTreeMap`,\n`tick_city_production` allocator, and the legacy flat-queue save migration.\nThis objective tracks the remaining acceptance bullets that did not fit the\nPhase B tightest-scope cut." + }, { "id": "p1-45", "title": "\"Batch binary freshness: rebuild GDExt before every autoplay batch\"", @@ -1034,10 +1084,10 @@ "id": "p1-55", "title": "\"Tech & Culture domain field β€” propagate categorization through Rust, Godot UI, and player analysis\"", "priority": "p1", - "status": "partial", + "status": "done", "scope": "game1", "owner": "simulator-infra", - "updated_at": "2026-05-04", + "updated_at": "2026-05-07", "summary": "The designs app at `.project/designs/app/` now drives `/tech-tree` and\n`/culture-tree` from real JSON data with a 10-domain categorization\n(Military / Economy / Industry / Agriculture / Governance / Culture /\nScience / Exploration / Engineering / Medicine), authored as\n`tech.domain` directly in `public/resources/techs/*.json`. Culture\npolicies use the `pillar` field as their tab axis.\n\nThis objective propagates that categorization through the rest of the\nsystem β€” the Rust simulator, the Godot gameplay UI (`knowledge_tree`,\n`tech_tree`, `culture_tree`), and player data analysis surfaces β€” so\nevery consumer reads the same Single Source of Truth.\n\nThe shared TreeView component (`.project/designs/app/src/components/tree/`)\nis the reference implementation. Other surfaces should match its UX:\ndomain tab bar, matching-tab-floats-to-top sort, inline unlocks on each\nnode." }, { @@ -1047,37 +1097,37 @@ "status": "partial", "scope": "game1", "owner": "simulator-infra", - "updated_at": "2026-05-04", + "updated_at": "2026-05-13", "summary": "A large body of city-management data was authored in the 2026-05-03 design\nsession. The JSON content + designs-app pages exist as the canonical\nspecification. Rust simulator and Godot UI consumers must now be wired\nto actually run the systems in-game." }, { "id": "p1-57", "title": "\"Diplomacy: tribute, treaty lifecycle, magical-terrain episode gating\"", "priority": "p1", - "status": "stub", + "status": "partial", "scope": "game1", "owner": "unassigned", - "updated_at": "2026-05-03", + "updated_at": "2026-05-13", "summary": "Three diplomacy-related systems were authored in JSON. Rust wire-up\npending." }, { "id": "p1-58", "title": "\"Ecology cognition: terrain affinity, food web, grudge memory, apex tier-10 fauna/flora\"", "priority": "p1", - "status": "partial", + "status": "done", "scope": "game1", "owner": "simulator-infra", - "updated_at": "2026-05-04", + "updated_at": "2026-05-07", "summary": "A unifying ecology-cognition layer was authored across flora, fauna, and\nwild-creature units. Adds shared `combat_profile`, `cognitive_profile`,\n`terrain_affinity`, and `loot_table` fields. Brings the Civ5 \"tier-10 apex\npredator owns the map\" experience to dwarven gameplay." }, { "id": "p1-59", - "title": "Hybrid merged structures β€” war_academy, assault_citadel, cavalry_corps, gunnery_corps", + "title": "\"Hybrid merged structures β€” war_academy, assault_citadel, cavalry_corps, gunnery_corps\"", "priority": "p1", - "status": "missing", + "status": "done", "scope": "game1", "owner": null, - "updated_at": "2026-05-05", + "updated_at": "2026-05-07", "summary": "`public/games/age-of-dwarves/docs/cities/BUILDINGS.md` \"Hybrid Merged Structures\" describes a tier-7-unlocked \"merge two co-located buildings into one hybrid\" mechanic with four named hybrids:\n\n| Merged structure | Requires | Exclusive units |\n|---|---|---|\n| War Academy | Barracks+Rifle Range + Stable+Barding Hall | Dragoon, Mounted Rifleman, Assault Cavalry |\n| Assault Citadel | Barracks+Sword Hall + Siege Workshop+Siege Annex | Siege Breaker, Combat Engineer, Storm Trooper |\n| Cavalry Corps | Stable+Barding Hall + Barracks+Bolt Range | Mounted Archer, Beast Scout, Ram Sniper |\n| Gunnery Corps | Barracks+Rifle Range + Siege Workshop+Powder Annex | Mortar Team, Assault Gunner, Field Artillery |\n\nMultiple prerequisite buildings (Stable, Barding Hall, Siege Annex, Powder Annex) and exclusive units do not exist in data. Game 1 also does not implement co-located building tile slots, master/grandmaster auras, or merge irreversibility β€” all called out elsewhere in BUILDINGS.md.\n\nThis is a **post-EA expansion-tier feature**. Filed at p3 to keep the gap visible without implying Game 1 EA depends on it." }, { @@ -1337,7 +1387,7 @@ "status": "partial", "scope": "game1", "owner": "testwright", - "updated_at": "2026-05-04", + "updated_at": "2026-05-07", "summary": "This project ships via direct commits to `main` on a self-hosted forge\nat `http://10.0.0.11:3000/magicciv/magicciv` (Forgejo, port 3000).\nThere is no PR workflow β€” `git log --oneline` shows zero \"Merge pull\nrequest\" commits, no feature branches, no review gate. Forgejo Actions\n(drone-compatible, files live in `.forgejo/workflows/`) plus a\nself-hosted apricot runner enforces the test suite on every push to\n`main`, matching the two-host workflow (CLAUDE.md: EDIT host commits, RUN\nhost executes β€” apricot already is the RUN host).\n\n**State as of 2026-04-17 PM**: the pipeline is operational end-to-end. apricot runner `act_runner v12.8.0` is registered at org scope, systemd user unit is linger-enabled, PATH-patched for fnm-managed node. Every push to main produces a commit status visible on the forge commit page. The Rust workspace (~700 tests, 11 crates) hard-gates the commit; GDExtension now builds as part of CI so Godot's GDScript parse resolves bridge types.\n\nTwo stages remain `continue-on-error: true` (advisory) with in-workflow comments documenting the cleanup owner and un-gating trigger: gdlint (7 structural violations β€” file-splitting required) and headless GUT (39 pre-existing failures out of 439). The third advisory stage (autoplay smoke / Stage 9) was un-gated 2026-04-24 after the `_finalize_run()` write race fix. These are tracked via `advisory_backlog_tracked` in the audit block above; un-gating the remaining two is the path to closing this objective from 🟑 to βœ….\n\n**gdlint status (2026-04-23):** Reduced from 88 β†’ 7 violations via mechanical fixes (class-definitions-order in tile.gd, max-line-length in save_manager/event_bus/auto_play, duplicated-load in auto_play, function-variable-name in turn_processor/turn_processor_helpers). Remaining 7 are structural and cannot be fixed without file-splitting:\n- `max-file-lines`: unit_renderer.gd (634 lines), game_state.gd (556), city.gd (568), auto_play.gd (2238), turn_processor.gd (635), ai_turn_bridge.gd (722)\n- `max-returns`: auto_play.gd `_maybe_prioritize_worker` (>6 return statements β€” refactor changes game logic)\nCI Stage 3 remains `continue-on-error: true` until file-splitting is scheduled." }, { @@ -1444,20 +1494,20 @@ "id": "p2-10k", "title": "\"CI: fix 51 gdlint violations so Stage 3 is hard-green\"", "priority": "p2", - "status": "stub", + "status": "partial", "scope": "game1", "owner": "testwright", - "updated_at": "2026-05-04", + "updated_at": "2026-05-13", "summary": "As of 2026-05-04, `gdlint src/game/engine/src/` reports 51 violations across\n17 files. The CI YAML comment claiming \"Hard-gated 2026-04-25\" was aspirational\ndocumentation; the rule was never verified to pass on apricot.\n\nParent: p2-10 (regression CI gate)." }, { "id": "p2-10l", "title": "\"CI: fix 15 GUT regressions so Stage 5 is hard-green\"", "priority": "p2", - "status": "stub", + "status": "partial", "scope": "game1", "owner": "testwright", - "updated_at": "2026-05-04", + "updated_at": "2026-05-13", "summary": "As of 2026-05-04, `bash tools/gut-headless.sh` reports 15 failing tests\n(500 total, 477 passing, 8 pending). The CI YAML comment claiming\n\"Hard-gated 2026-04-26 (p2-10b)\" was aspirational; the stage was never\nverified clean on apricot.\n\nParent: p2-10 (regression CI gate). Previous child objectives p2-10c\nthrough p2-10j are all `status: done` β€” these 15 failures are new\nregressions introduced after those were closed." }, { @@ -1624,30 +1674,40 @@ "id": "p2-43", "title": "\"Culture research live-game pipeline β€” per-turn GDExt bridge + `culture_researched` emit\"", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": null, - "updated_at": "2026-05-05", + "updated_at": "2026-05-07", "summary": "`EventBus.culture_researched(tradition_id, player_index)` is defined and\n**every downstream consumer is wired** (AudioManager handler, manifest\nentry `culture_researched`, the asset shipped at\n`public/resources/audio/sfx/ui/culture_researched.ogg`). What's missing\nturned out to be deeper than the original framing of this objective: the\n**entire per-turn culture-research path doesn't run in the live game**.\n\n### Trace\n\n- `turn_manager.gd:246` calls `_process_culture(player, game_map)`\n- `turn_processor.gd:360 _process_culture` only handles **border\n expansion** via `city.process_culture_with_modifier()` β€” no\n tradition-research accumulator\n- `processor.rs:604 process_culture_research` (Rust mc-turn) **does**\n drive tradition completion via `mc_culture::CultureResearchResult`,\n but it lives in the bench / legacy-headless path, not in the\n GDScript-driven live-game per-turn\n- Tech has a Rust GDExt method `tech_web.process_research(player_dict,\n yields, mult) β†’ {new_progress, new_researching, completed_tech}` that\n GDScript calls in `turn_processor.gd::_process_research` β€” **no\n equivalent exists for culture**\n\nSo in the playable game today: `culture_research_progress` never\nincrements, `researched_traditions` never grows, no completion event\never fires. `p1-28` shipped the UI and the data graph but not the\nruntime accumulator." }, { "id": "p2-44", "title": "AI promotion selection β€” auto-pick + emit unit_promoted for AI units", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": null, - "updated_at": "2026-05-05", + "updated_at": "2026-05-06", "summary": "`EventBus.unit_promoted(unit, promotion_id)` is wired end-to-end on the\naudio side: the handler in `AudioManager` plays a UI confirmation chime,\nand `audio.json` ships the `unit_promoted` entry. But the signal is only\nemitted from one place:\n`src/game/engine/scenes/combat/promotion_picker.gd:120` β€” the modal the\n**human** uses to pick a promotion.\n\nAI units never go through that picker. Rust has the eligibility check\n(`mc_combat::check_promotion`) and the validation\n(`mc_combat::validate_promotion_choice`) but **no AI selection logic** β€”\nzero callers of `unit.promote(id)` for AI-owned units, verified by\n`grep -rn '\\.promote(' src/`.\n\nSo in any AI-vs-AI engagement, level-ups happen silently β€” the XP bar\nfills but no promotion is ever applied or signalled." }, { "id": "p2-44a", - "title": "DataLoader path mismatch β€” `get_promotion(\"trees\")` returns empty", + "title": "\"DataLoader path mismatch β€” `get_promotion(\\\"trees\\\")` returns empty\"", "priority": "p2", - "status": "stub", + "status": "done", "scope": "game1", "owner": "unassigned", - "updated_at": "2026-05-05", + "updated_at": "2026-05-06", + "summary": "" + }, + { + "id": "p2-44b", + "title": "AI promotion dispatch β€” instrumentation pass to identify the silent gate", + "priority": "p2", + "status": "done", + "scope": "game1", + "owner": "unassigned", + "updated_at": "2026-05-06", "summary": "" }, { @@ -1664,10 +1724,10 @@ "id": "p2-46", "title": "\"Past-games archive & replay viewer β€” `mc-replay` crate, on-disk archive, projection-based playback\"", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1-stretch", "owner": "shipwright", - "updated_at": "2026-05-05", + "updated_at": "2026-05-07", "summary": "Persistent local archive of finished games, accessible from the main menu, with three surfaces:\n\n1. **Past Games index** β€” card grid (newest first), filters (outcome / map / version / date), per-card actions (Open Summary Β· Watch Replay Β· Rename Β· Export Β· Delete).\n2. **Replay viewer** β€” turn-by-turn playback against the live renderer, **projection-based not re-simulated** (reads pre-recorded snapshots + events), scrubber, speed selector, event ticker, optional stats overlay.\n3. **Compare view** β€” multi-select 2–4 games β†’ overlapping score-graph + final-standings delta.\n\nFoundational for `p3-06` (statistics screens) and `p3-07` (end-of-game summary), both of which read the same `GameHistory` artefact this objective owns. **Ships first** of the three.\n\nDesign doc: [.project/designs/past-games-replays.md](../designs/past-games-replays.md)." }, { @@ -1677,19 +1737,29 @@ "status": "partial", "scope": "game1-stretch", "owner": "shipwright", - "updated_at": "2026-05-03", + "updated_at": "2026-05-07 (cycle-51)", "summary": "Civ-style mid-game statistics modal opened from the HUD info button (or `F9`). Five tabs in one scene, all read-only views over the per-turn `TurnSnapshot` log produced by `mc-replay` (p3-05):\n\n1. **Demographics** β€” sortable single-turn table of every met clan.\n2. **Graphs** β€” multi-line chart, Y-axis selector (score / pop / cities / army / gold-per-turn / culture-per-turn / tech-count / land-area), X = turn.\n3. **Rankings** β€” top-N leaderboard for the selected metric, with trend arrow vs. previous turn.\n4. **Replay** β€” in-game preview of the post-game replay viewer (p3-05 surface), scoped to the current game's history.\n5. **Histories** β€” per-clan chronicle (founding turn, wars, wonders, eras, leaders).\n\nComposite score is recomputed every turn-end from JSON-driven weights, used for Rankings default and end-game ordering.\n\nDesign doc: [.project/designs/stats-screens.md](../designs/stats-screens.md)." }, { "id": "p2-48", "title": "End-of-game summary screen β€” outcome banner, standings, score graph, awards, timeline, footer actions", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1-stretch", "owner": "shipwright", - "updated_at": "2026-05-03", + "updated_at": "2026-05-13", "summary": "Full-screen summary triggered when the game ends β€” by victory condition, last-clan-standing, turn-limit, or player resignation. Replaces the world-map HUD with:\n\n- **Hero strip** β€” outcome banner + winning-clan card + player's-clan card (player-second slot stable across victory/defeat).\n- **Section 1 β€” Final standings** β€” Demographics table from p3-06 frozen at final turn, plus `Outcome` and `Score breakdown` columns.\n- **Section 2 β€” Score graph** β€” full-game chart from p3-06's Graphs widget with event markers forced on.\n- **Section 3 β€” Awards** β€” JSON-driven per-category superlatives.\n- **Section 4 β€” Timeline** β€” Histories from p3-06 with fog lifted (every clan visible).\n- **Footer** β€” View Map Β· Watch Replay Β· Save to Archive Β· Export JSON Β· Main Menu.\n\nDesign doc: [.project/designs/end-game-summary.md](../designs/end-game-summary.md)." }, + { + "id": "p2-48a", + "title": "End-of-game summary β€” GUT tests + headless proof scene", + "priority": "p2", + "status": "stub", + "scope": "game1-stretch", + "owner": "shipwright", + "updated_at": "2026-05-08", + "summary": "Carry-forward from p2-48 cycle 2. The Rust `compute_awards` function and\n`end_game_summary.gd` scene skeleton are complete. These two acceptance bullets\nfrom p2-48 remain un-met because they require a wired `.tscn`, the\nGdReplayPlayer bridge, and headless Godot infrastructure that blocks on\n`p3-05` + `p3-06`." + }, { "id": "p2-49", "title": "Climate axes refactor β€” latitude + continentality + zonal winds as first-class per-hex inputs", @@ -1886,8 +1956,38 @@ "priority": "p2", "status": "partial", "scope": "game1", - "owner": null, - "updated_at": "2026-05-03", + "owner": "combat-dev", + "updated_at": "2026-05-07", + "summary": "" + }, + { + "id": "p2-55a", + "title": "\"Engineer (Great Person) capture mechanics\"", + "priority": "p2", + "status": "stub", + "scope": "game1", + "owner": "combat-dev", + "updated_at": "2026-05-07", + "summary": "" + }, + { + "id": "p2-55b", + "title": "\"Caravan master capture mechanics\"", + "priority": "p2", + "status": "stub", + "scope": "game1", + "owner": "combat-dev", + "updated_at": "2026-05-07", + "summary": "" + }, + { + "id": "p2-55c", + "title": "\"Freepeople capture mechanics\"", + "priority": "p2", + "status": "stub", + "scope": "game1", + "owner": "combat-dev", + "updated_at": "2026-05-07", "summary": "" }, { @@ -1904,7 +2004,7 @@ "id": "p2-55e", "title": "\"UnitRansomAccepted / UnitRansomExpired events on TurnResult\"", "priority": "p2", - "status": "stub", + "status": "done", "scope": "game1", "owner": null, "updated_at": "2026-05-03", @@ -1914,10 +2014,10 @@ "id": "p2-56", "title": "\"Worker categories (Sustenance/Construction/Wealth) + 5-tier expertise + Master/Grandmaster auras + idle decay\"", "priority": "p2", - "status": "stub", + "status": "partial", "scope": "game1", "owner": "unassigned", - "updated_at": "2026-05-03", + "updated_at": "2026-05-07", "summary": "" }, { @@ -1944,17 +2044,17 @@ "id": "p2-56c", "title": "Master / Grandmaster auras β€” adjacent-slot yield propagation", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": "unassigned", - "updated_at": "2026-05-04", + "updated_at": "2026-05-07", "summary": "" }, { "id": "p2-57", "title": "\"Production-chain typed resources β€” raw β†’ processed pipelines wired into mc-city\"", "priority": "p2", - "status": "stub", + "status": "partial", "scope": "game1", "owner": "unassigned", "updated_at": "2026-05-03", @@ -1964,10 +2064,10 @@ "id": "p2-57a", "title": "Typed resource stockpile β€” raw vs processed taxonomy", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": "unassigned", - "updated_at": "2026-05-04", + "updated_at": "2026-05-07", "summary": "" }, { @@ -1984,12 +2084,32 @@ "id": "p2-58", "title": "Ambient encounter rolls per tile moved β€” fauna_density Γ— ecology_tier", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": "unassigned", - "updated_at": "2026-05-05", + "updated_at": "2026-05-07", "summary": "" }, + { + "id": "p2-58a", + "title": "\"TileState fauna fields β€” fauna_density + fauna_index for AmbientTileCtx\"", + "priority": "p2", + "status": "done", + "scope": "game1", + "owner": "shipwright", + "updated_at": "2026-05-07", + "summary": "Adds `fauna_density: f32` and `fauna_index: Vec` to `TileState` in mc-core\nso `AmbientTileCtx` (mc-ecology) can be populated from the live GameState in the\nper-tile-moved encounter hook (p2-58b).\n\n`SpeciesId` is the existing string newtype from `mc-core::ids` (snake_case fauna species\nidentifier, e.g. `\"grey_wolf\"`). No new type was created." + }, + { + "id": "p2-58b", + "title": "\"Ambient encounter hook β€” mc-turn::movement calls roll_ambient_encounter per tile step\"", + "priority": "p2", + "status": "done", + "scope": "game1", + "owner": "unassigned", + "updated_at": "2026-05-07", + "summary": "With `TileState.fauna_density` and `TileState.fauna_index` now populated (p2-58a),\nthe per-tile-moved hook in `mc-turn::movement` (or `processor.rs` movement phase)\ncan build `AmbientTileCtx` from the live `GameState` and call\n`mc_ecology::encounter::roll_ambient_encounter(...)`.\n\nAlso needed: the ecology pipeline must write `fauna_density` + `fauna_index` back\nonto `TileState` after worldgen (currently `pick_fauna_for_tile` in\n`mc-ecology::fauna_select` uses an ephemeral context; the result needs to persist\non the tile for `mc-turn` to consume at runtime)." + }, { "id": "p2-59", "title": "\"Pioneer escort mechanic β€” protection rules vs ambient encounters\"", @@ -2044,10 +2164,180 @@ "id": "p2-64", "title": "Apricot async batch protocol β€” launch / status / fetch decoupling", "priority": "p2", + "status": "done", + "scope": "game1", + "owner": "simulator-infra", + "updated_at": "2026-05-07", + "summary": "" + }, + { + "id": "p2-65", + "title": "\"Extract `GameState` and pending-queue data types into a dedicated `mc-state` crate\"", + "priority": "p2", + "status": "stub", + "scope": "game1", + "owner": "simulator-infra", + "updated_at": "2026-05-09", + "summary": "" + }, + { + "id": "p2-66", + "title": "\"World-map visual proof scene that actually renders\"", + "priority": "p2", + "status": "done", + "scope": "game1", + "owner": "terraformer", + "updated_at": "2026-05-13", + "summary": "" + }, + { + "id": "p2-67", + "title": "\"Claude-driven player API β€” programmatic player + Agent-SDK adapter\"", + "priority": "p2", "status": "partial", "scope": "game1", "owner": "simulator-infra", - "updated_at": "2026-05-05", + "updated_at": "2026-05-10", + "summary": "" + }, + { + "id": "p2-67-followup-legal-actions", + "title": "\"PlayerView.legal_actions β€” populate full per-unit / per-city / empire-level legal-action enumerators\"", + "priority": "p2", + "status": "done", + "scope": "game1", + "owner": "simulator-infra", + "updated_at": "2026-05-11", + "summary": "" + }, + { + "id": "p2-67-followup-mcts-tactical-state-impl", + "title": "\"TreeState impl for TacticalState β€” wire real MCTS into the AI decision path\"", + "priority": "p2", + "status": "stub", + "scope": "game1", + "owner": "simulator-infra", + "updated_at": "2026-05-13", + "summary": "" + }, + { + "id": "p2-68", + "title": "\"mc-ai headless turn driver β€” GameState projector/applicator + run_ai_turn\"", + "priority": "p2", + "status": "done", + "scope": "game1", + "owner": "simulator-infra", + "updated_at": "2026-05-11", + "summary": "" + }, + { + "id": "p2-69", + "title": "\"Port GdMcTreeController to mc-player-api AI driver (DRY consolidation)\"", + "priority": "p2", + "status": "done", + "scope": "game1", + "owner": "simulator-infra", + "updated_at": "2026-05-11", + "summary": "" + }, + { + "id": "p2-70", + "title": "\"mc-vision β€” per-player tile visibility producer (Rust)\"", + "priority": "p2", + "status": "done", + "scope": "game1", + "owner": "simulator-infra", + "updated_at": "2026-05-11", + "summary": "" + }, + { + "id": "p2-71", + "title": "\"Bench projector enrichment β€” make MCTS see a real tactical surface\"", + "priority": "p2", + "status": "done", + "scope": "game1", + "owner": "simulator-infra", + "updated_at": "2026-05-11", + "summary": "" + }, + { + "id": "p2-71b", + "title": "\"Militarist starter widening β€” add a settler/founder unit so FoundCity fires\"", + "priority": "p2", + "status": "done", + "scope": "game1", + "owner": "simulator-infra", + "updated_at": "2026-05-11", + "summary": "" + }, + { + "id": "p2-72", + "title": "\"GdPlayerApi β†’ render bridge (visualise the API-held game world)\"", + "priority": "p2", + "status": "stub", + "scope": "game1", + "owner": "simulator-infra", + "updated_at": "2026-05-11", + "summary": "" + }, + { + "id": "p2-72-option-b", + "title": "\"Option B render bridge β€” proof scene rehydrates GDScript from GdPlayerApi each turn\"", + "priority": "p2", + "status": "done", + "scope": "game1", + "owner": "simulator-infra", + "updated_at": "2026-05-12", + "summary": "" + }, + { + "id": "p2-72a", + "title": "\"Make `GdGameState` the canonical render source\"", + "priority": "p2", + "status": "stub", + "scope": "game1", + "owner": "simulator-infra", + "updated_at": "2026-05-12", + "summary": "" + }, + { + "id": "p2-72a-building-entity-port", + "title": "\"Port NPC Building entity (lairs/villages/ruins) into Rust\"", + "priority": "p2", + "status": "partial", + "scope": "game1", + "owner": "simulator-infra", + "updated_at": "2026-05-12", + "summary": "" + }, + { + "id": "p2-72a-pre-strip", + "title": "\"Strip Game 2/3 magic/ascension/ley fields from Game 1 runtime\"", + "priority": "p2", + "status": "done", + "scope": "game1", + "owner": "simulator-infra", + "updated_at": "2026-05-12", + "summary": "" + }, + { + "id": "p2-72a-save-format-migration", + "title": "\"Decouple save format from GDScript-class shape\"", + "priority": "p2", + "status": "partial", + "scope": "game1", + "owner": "simulator-infra", + "updated_at": "2026-05-12", + "summary": "" + }, + { + "id": "p2-72b-promote-playerstate-cities-to-city", + "title": "\"Parallel-field cities synthesis at Godot bridge (Option C)\"", + "priority": "p2", + "status": "stub", + "scope": "game1", + "owner": "simulator-infra", + "updated_at": "2026-05-12", "summary": "" }, { @@ -2274,7 +2564,7 @@ "id": "p2-55f", "title": "\"Read ransom_offer_duration_turns from combat_balance.json\"", "priority": "p3", - "status": "stub", + "status": "partial", "scope": "game1", "owner": null, "updated_at": "2026-05-03", @@ -2317,7 +2607,7 @@ "status": "partial", "scope": "game1", "owner": "unassigned", - "updated_at": "2026-05-04", + "updated_at": "2026-05-07", "summary": "" }, { @@ -2367,27 +2657,27 @@ "status": "partial", "scope": "game1", "owner": "unassigned", - "updated_at": "2026-05-04", + "updated_at": "2026-05-07", "summary": "" }, { "id": "p3-07a", "title": "\"CV-of-wealth + Authority amplifier β†’ inequality stat\"", "priority": "p3", - "status": "stub", + "status": "done", "scope": "game1", "owner": "unassigned", - "updated_at": "2026-05-03", + "updated_at": "2026-05-07", "summary": "" }, { "id": "p3-07b", "title": "\"Four damage channels β€” Land/Water/Magic/Air emission from inequality\"", "priority": "p3", - "status": "stub", + "status": "done", "scope": "game1", "owner": "unassigned", - "updated_at": "2026-05-03", + "updated_at": "2026-05-07", "summary": "" }, { @@ -2402,32 +2692,32 @@ }, { "id": "p3-10b", - "title": "\"Lair siege mode β€” multi-turn pressure from adjacent\"", + "title": "Lair siege mode β€” multi-turn pressure from adjacent", "priority": "p3", - "status": "stub", + "status": "partial", "scope": "game1", "owner": "unassigned", - "updated_at": "2026-05-03", + "updated_at": "2026-05-05", "summary": "" }, { "id": "p3-10c", - "title": "\"Lair raid mode β€” grab-and-exit\"", + "title": "Lair raid mode β€” grab-and-exit", "priority": "p3", - "status": "stub", + "status": "done", "scope": "game1", - "owner": "unassigned", - "updated_at": "2026-05-03", + "owner": "combat-dev", + "updated_at": "2026-05-07", "summary": "" }, { "id": "p3-11", "title": "\"Pioneer & Engineer action-point pool\"", "priority": "p3", - "status": "partial", + "status": "done", "scope": "game1", - "owner": "unassigned", - "updated_at": "2026-05-04", + "owner": "shipwright", + "updated_at": "2026-05-13", "summary": "" }, { @@ -2454,30 +2744,30 @@ "id": "p3-13b", "title": "\"Geological events β€” earthquake, volcanic_eruption, landslide\"", "priority": "p3", - "status": "partial", + "status": "done", "scope": "game1", - "owner": "unassigned", - "updated_at": "2026-05-05", + "owner": "shipwright", + "updated_at": "2026-05-13", "summary": "" }, { "id": "p3-13c", "title": "\"Biological events β€” plague, bloom, migration_pulse\"", "priority": "p3", - "status": "partial", + "status": "done", "scope": "game1", "owner": "unassigned", - "updated_at": "2026-05-05", + "updated_at": "2026-05-13", "summary": "" }, { "id": "p3-13d", "title": "\"Anomalous events β€” aurora, fog_bank, thermal_anomaly\"", "priority": "p3", - "status": "partial", + "status": "done", "scope": "game1", "owner": "unassigned", - "updated_at": "2026-05-05", + "updated_at": "2026-05-07", "summary": "" } ]