From 2a3081cc0ba82dc3f37f11d2c81920ea743a1670 Mon Sep 17 00:00:00 2001 From: Natalie Date: Wed, 24 Jun 2026 19:51:32 -0400 Subject: [PATCH] =?UTF-8?q?docs(@projects/@magic-civilization):=20?= =?UTF-8?q?=F0=9F=93=9D=20regenerate=20objectives=20dashboard=20(verify=20?= =?UTF-8?q?step=202)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `tools/objectives-report.py --check` was failing (README/objectives.json stale vs per-objective frontmatter after recent objective edits). Regenerated both. Co-Authored-By: Claude Opus 4.8 (1M context) --- .project/objectives/README.md | 389 +++++++++++++++--- .../games/age-of-dwarves/data/objectives.json | 194 ++++----- 2 files changed, 410 insertions(+), 173 deletions(-) diff --git a/.project/objectives/README.md b/.project/objectives/README.md index e490e333..ba974eb4 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** | 0 | 0 | 0 | 0 | 1 | 88 | 89 | -| **P2** | 0 | 0 | 0 | 0 | 1 | 132 | 133 | -| **P3 (oos)** | 0 | 2 | 0 | 0 | 29 | 26 | 57 | -| **total** | **0** | **2** | **0** | **0** | **31** | **290** | **323** | +| **P0** | 44 | 0 | 0 | 0 | 0 | 0 | 44 | +| **P1** | 88 | 0 | 0 | 0 | 0 | 1 | 89 | +| **P2** | 130 | 0 | 0 | 0 | 0 | 1 | 131 | +| **P3 (oos)** | 26 | 0 | 2 | 0 | 0 | 29 | 57 | +| **total** | **288** | **0** | **2** | **0** | **0** | **31** | **321** | @@ -30,58 +30,335 @@ -## Out of Scope +## P0 β€” Blockers for "completely playable" -> These objectives are explicitly deferred. They are tracked for visibility but not blocking the current release. +| ID | Status | Title | Owner | Updated | +|---|---|---|---|---| +| [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 | -| 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 | -| [p2-55c](p2-55c-freepeople-capture.md) | ⚫ oos | Freepeople capture mechanics | β€” | [combat-dev](../team-leads/combat-dev.md) | 2026-05-14 | 🟒 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-06-06 | πŸ”’ g2-12a, g2-12c | -| [g2-12](g2-12-underground-layer-stack-oos.md) | ⚫ oos | Underground layer stack (Game 2) β€” OOS | β€” | [unassigned](../team-leads/unassigned.md) | 2026-06-06 | 🟒 unblocked | -| [g2-12a](g2-12a-layer-data-model-save-oos.md) | ⚫ oos | Underground β€” N-layer data model + save format (Game 2) β€” OOS | β€” | [unassigned](../team-leads/unassigned.md) | 2026-06-06 | 🟒 unblocked | -| [g2-12b](g2-12b-underground-worldgen-oos.md) | ⚫ oos | Underground β€” worldgen for L1/L2/L3 + cavern terrain (Game 2) β€” OOS | β€” | [unassigned](../team-leads/unassigned.md) | 2026-06-06 | πŸ”’ g2-12a | -| [g2-12c](g2-12c-excavation-cavern-lifecycle-oos.md) | ⚫ oos | Underground β€” excavation action + cavern lifecycle (Game 2) β€” OOS | β€” | [unassigned](../team-leads/unassigned.md) | 2026-06-06 | πŸ”’ g2-12a, g2-12b | -| [g2-12d](g2-12d-cross-layer-movement-pathfinding-oos.md) | ⚫ oos | Underground β€” cross-layer movement, connection points + pathfinding (Game 2) β€” OOS | β€” | [unassigned](../team-leads/unassigned.md) | 2026-06-06 | πŸ”’ g2-12a, g2-12c | -| [g2-12e](g2-12e-per-layer-fog-vision-oos.md) | ⚫ oos | Underground β€” per-layer fog of war + vision (Game 2) β€” OOS | β€” | [unassigned](../team-leads/unassigned.md) | 2026-06-06 | πŸ”’ g2-12a, g2-12d | -| [g2-12f](g2-12f-structural-integrity-collapse-oos.md) | ⚫ oos | Underground β€” structural integrity + cross-layer collapse (Game 2) β€” OOS | β€” | [unassigned](../team-leads/unassigned.md) | 2026-06-06 | πŸ”’ g2-12a, g2-12c | -| [g2-12g](g2-12g-layer-rendering-switch-ui-oos.md) | ⚫ oos | Underground β€” layer rendering + layer-switch UI (Game 2) β€” OOS | β€” | [unassigned](../team-leads/unassigned.md) | 2026-06-06 | πŸ”’ g2-12a, g2-12b, g2-12e | -| [g2-12h](g2-12h-ai-layer-awareness-oos.md) | ⚫ oos | Underground β€” AI layer-awareness (Game 2) β€” OOS | β€” | [unassigned](../team-leads/unassigned.md) | 2026-06-06 | πŸ”’ g2-12a, g2-12c, g2-12d, g2-12e | -| [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 | +## P1 β€” Ship-readiness + +| ID | Status | Title | Owner | Updated | +|---|---|---|---|---| +| [g2-07](g2-07-flora-lifecycle-transitions.md) | βœ… done | Flora succession β€” wire the existing flora lifecycle engine into the playable turn | β€” | 2026-06-09 | +| [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-26b](p0-26b-pick-research-rust-port.md) | βœ… done | Port _pick_research from GDScript into mc-ai (finish Rail-1 for the AI decision surface) | [warcouncil](../team-leads/warcouncil.md) | 2026-06-23 | +| [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) | βœ… done | Balance tuning β€” pop_peak β‰₯30 median, worker improvements β‰₯8 min | [shipwright](../team-leads/shipwright.md) | 2026-05-14 | +| [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.lan | [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) | βœ… done | MCTS per-decision wall-clock budget β€” bound per-turn cost on huge maps | [warcouncil](../team-leads/warcouncil.md) | 2026-05-14 | +| [p1-22a](p1-22a-huge-map-ai-quality.md) | βœ… done | Huge-map AI quality β€” close the 4/10 β†’ β‰₯5/10 decisive-game gate | [warcouncil](../team-leads/warcouncil.md) | 2026-05-17 | +| [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) | βœ… done | Extract GPU MCTS into a standalone service/client (model-boss-shaped, magic-civ-only) | [warcouncil](../team-leads/warcouncil.md) | 2026-05-14 | +| [p1-27a](p1-27a-mcts-service-telemetry.md) | βœ… done | MCTS service telemetry + parity test + huge-map wiring | [warcouncil](../team-leads/warcouncil.md) | 2026-05-16 | +| [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) | βœ… done | "Anti-early-domination: lift game-balance gates that p0-01 v1 measured" | [combat-dev](../team-leads/combat-dev.md) | 2026-05-14 | +| [p1-29a](p1-29a-last-stand-defense.md) | βœ… done | Last-stand defense β€” combat-strength multiplier when defender is at last city | [combat-dev](../team-leads/combat-dev.md) | 2026-05-14 | +| [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) | βœ… done | "Sole-city research path β€” lift trailing AI from tier_peak=1 to β‰₯2" | [warcouncil](../team-leads/warcouncil.md) | 2026-05-27 | +| [p1-29c-followup-empty-params-json-regression](p1-29c-followup-empty-params-json-regression.md) | βœ… done | "GdEconomy::process_turn fails β€” `_build_params_json` produces empty string for autoplay seeds" | [shipwright](../team-leads/shipwright.md) | 2026-05-15 | +| [p1-29d-p1-survival](p1-29d-p1-survival.md) | βœ… done | P1 (trailing AI) eliminated or stalled before T100 in 10/10 seeds β€” upstream of action priority | [warcouncil](../team-leads/warcouncil.md) | 2026-06-23 | +| [p1-29e-rl-divergence-mining](p1-29e-rl-divergence-mining.md) | βœ… done | "RL-policy divergence mining β†’ sole-city economy break-out (production, not science)" | [warcouncil](../team-leads/warcouncil.md) | 2026-06-23 | +| [p1-29f](p1-29f-learned-controller-bridge.md) | βœ… done | "learned:* controller bridge β€” make the trained RL policy playable in-engine" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-06-03 | +| [p1-29g](p1-29g-verify-gates-trained-vs-scripted.md) | βœ… done | Re-verify Game-1 AI quality gates trained-vs-scripted (and trained-vs-trained) | [warcouncil](../team-leads/warcouncil.md) | 2026-06-23 | +| [p1-29h-stateful-tactical-decisiveness](p1-29h-stateful-tactical-decisiveness.md) | βœ… done | Stateful tactical decisiveness β€” army target-lock + commitment hysteresis + press-on-capture in mc-ai | [warcouncil](../team-leads/warcouncil.md) | 2026-06-23 | +| [p1-29i-refound-suppression](p1-29i-refound-suppression.md) | βœ… done | Refound-suppression / capture-stickiness lever β€” convert captures into eliminations | [warcouncil](../team-leads/warcouncil.md) | 2026-06-23 | +| [p1-29j-autoplay-rust-action-application](p1-29j-autoplay-rust-action-application.md) | βœ… done | "Route autoplay action-application (city-founding / capture) through Rust mc_turn::processor" | [warcouncil](../team-leads/warcouncil.md) | 2026-06-23 | +| [p1-29k](p1-29k.md) | βœ… done | "Drive learned:* controllers on the autoplay (auto_play.gd) gate surface" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-06-23 | +| [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) | βœ… done | "Biome β†’ economy coupling β€” population & luxury driven by live ecology" | [shipwright](../team-leads/shipwright.md) | 2026-05-14 | +| [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) | βœ… done | "AI must consider the full 155-building catalog, not the hardcoded 8-id ladder" | β€” | 2026-05-14 | +| [p1-43](p1-43-building-stacking-upgrade.md) | βœ… done | Building stacking β€” per-category upgrade chains (military / science / culture / production / etc.) | β€” | 2026-05-14 | +| [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) | βœ… done | "p1-43 follow-ups β€” chain ladder authoring, AI stack scoring, city UI upgrade surface, GUT bridge test" | β€” | 2026-05-14 | +| [p1-43c-gdext-upgrade-target](p1-43c-gdext-upgrade-target.md) | βœ… done | "api-gdext bridge β€” GdBuildingRegistry::get_upgrade_target for city UI upgrade surface" | β€” | 2026-05-14 | +| [p1-44](p1-44-buildings-as-producers.md) | βœ… done | "Buildings produce units, not the city center β€” per-building production queues" | β€” | 2026-05-14 | +| [p1-44c](p1-44c-buildings-as-producers-followups.md) | βœ… done | "p1-44 follow-ups β€” UI, AI per-building emission, themed roster, GUT, batch" | β€” | 2026-05-14 | +| [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) | βœ… done | "Civics buildings, Great Works, Specialists, Great People β€” wire authored data into Rust + Godot" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-14T20:05Z | +| [p1-57](p1-57-diplomacy-tribute-treaties.md) | βœ… done | "Diplomacy: tribute, treaty lifecycle, magical-terrain episode gating" | [envoy](../team-leads/envoy.md) | 2026-06-06 | +| [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 | +| [p1-60](p1-60-fog-of-war-testing-ai-fairness.md) | βœ… done | "Fog-of-war end-to-end test coverage + AI fairness fix" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-18 | +| [p1-61](p1-61-ecology-content-gap-fill.md) | βœ… done | "Ecology content gap fill: sparse biomes + lineage tier holes (P1 actions from ecology-audit-gaps.md)" | [terraformer](../team-leads/terraformer.md) | 2026-06-06 | +| [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) | βœ… done | Audio assets β€” in-theme OSS launch pack + source ledger | [asset-audio](../team-leads/asset-audio.md) | 2026-06-22 | +| [p2-22](p2-22-sprite-generation-pipeline.md) | βœ… done | Sprite generation pipeline β€” runnable end-to-end | [asset-sprite](../team-leads/asset-sprite.md) | 2026-06-10 | +| [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-80](p2-80-mc-worldsim-integration.md) | βœ… done | mc-worldsim orchestration crate β€” drive the existing worldsim engines in the playable turn | β€” | 2026-06-09 | + +## P2 β€” Polish + +| ID | Status | Title | Owner | Updated | +|---|---|---|---|---| +| [g2-05](g2-05-tectonics-lithology.md) | βœ… done | Tectonics + lithology β€” extend the existing prepass/terrain-evolution into a lithology axis | β€” | 2026-06-23 | +| [g2-06](g2-06-soil-derivation.md) | βœ… done | Soil derivation layer β€” emergent soil order from rock + climate + slope (the one unbuilt worldsim engine) | β€” | 2026-06-23 | +| [g2-08](g2-08-fauna-population-dynamics.md) | βœ… done | Fauna population dynamics β€” confirm the existing LV engine ticks in the playable turn | β€” | 2026-06-23 | +| [g2-09](g2-09-flora-tolerance-driven-selection.md) | βœ… done | Flora tolerance-driven selection β€” extend the existing flora_select engine with tolerance gating | β€” | 2026-06-23 | +| [g2-10](g2-10-fauna-migration-paths.md) | βœ… done | Fauna migration β€” wire the existing apply_migrations engine into the per-turn step | β€” | 2026-06-23 | +| [p1-05-followup-shipwright-batch](p1-05-followup-shipwright-batch.md) | βœ… done | Shipwright autoplay-batch sign-off β€” luxury variance + personality win balance | [shipwright](../team-leads/shipwright.md) | 2026-06-23 | +| [p1-38-followup-shipwright-batch](p1-38-followup-shipwright-batch.md) | βœ… done | p1-38 follow-up β€” Shipwright coupled-mode 10-seed regression batch + sign-off | [shipwright](../team-leads/shipwright.md) | 2026-06-23 | +| [p1-42a](p1-42a-personality-priors-building-priors-field.md) | βœ… done | "Reconcile capture_scoring.rs ↔ PersonalityPriors β€” building_priors field location" | [warcouncil](../team-leads/warcouncil.md) | 2026-05-14 | +| [p1-42b](p1-42b-playerstate-priors-plumbing.md) | βœ… done | "Plumb per-personality building_category_weights + wonder_priorities through mc-turn PlayerState + GDScript bridge" | [warcouncil](../team-leads/warcouncil.md) | 2026-05-14 | +| [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) | βœ… done | Automated regression CI gate on every push to main | [testwright](../team-leads/testwright.md) | 2026-05-14 | +| [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) | βœ… done | "CI: fix 51 gdlint violations so Stage 3 is hard-green" | [testwright](../team-leads/testwright.md) | 2026-05-14 | +| [p2-10k-followup](p2-10k-followup-max-file-lines-policy.md) | βœ… done | "Workflow policy decision: how to clear the 10 max-file-lines gdlint violations" | [testwright](../team-leads/testwright.md) | 2026-06-23 | +| [p2-10l](p2-10l-gut-regression-triage.md) | βœ… done | "CI: fix 15 GUT regressions so Stage 5 is hard-green" | [testwright](../team-leads/testwright.md) | 2026-05-14 | +| [p2-10l-followup-gdai-set-map](p2-10l-followup-gdai-set-map.md) | βœ… done | "GdAiController::set_map β€” wire map into tactical state_json" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-15 | +| [p2-10l-followup-update-tile-negative-axial](p2-10l-followup-update-tile-negative-axial.md) | βœ… done | "GdAiController::update_tile rejects negative axial coordinates" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-15 | +| [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) | βœ… done | Guide web app β€” public hosting + deploy pipeline | β€” | 2026-06-23 | +| [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) | βœ… done | In-game statistics screens β€” Civ-style 5-tab modal (Demographics / Graphs / Rankings / Replay / Histories) | [shipwright](../team-leads/shipwright.md) | 2026-06-23 | +| [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-06-23 | +| [p2-48a](p2-48a-end-game-summary-gut-and-proof.md) | βœ… done | End-of-game summary β€” GUT tests + headless proof scene | [shipwright](../team-leads/shipwright.md) | 2026-06-22 | +| [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) | βœ… done | "Civilian Capture / Destroy / Ransom" | [combat-dev](../team-leads/combat-dev.md) | 2026-05-14 | +| [p2-55a](p2-55a-engineer-capture.md) | βœ… done | "Engineer (Great Person) capture mechanics" | [combat-dev](../team-leads/combat-dev.md) | 2026-05-14 | +| [p2-55b](p2-55b-caravan-master-capture.md) | βœ… done | "Caravan master capture mechanics" | [combat-dev](../team-leads/combat-dev.md) | 2026-05-14 | +| [p2-55d](p2-55d-ai-ransom-decision-hook.md) | βœ… done | "AI ransom accept/refuse hook in mc-turn start-of-turn" | β€” | 2026-05-14 | +| [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) | βœ… done | "Worker categories (Sustenance/Construction/Wealth) + 5-tier expertise + Master/Grandmaster auras + idle decay" | [unassigned](../team-leads/unassigned.md) | 2026-06-03 | +| [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) | βœ… done | "Production-chain typed resources β€” raw β†’ processed pipelines wired into mc-city" | [unassigned](../team-leads/unassigned.md) | 2026-05-14 | +| [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) | βœ… done | Building consume/produce edges β€” stockpile coupled to unit quality | [unassigned](../team-leads/unassigned.md) | 2026-06-23 | +| [p2-57c-mc-units-quality-consumer](p2-57c-mc-units-quality-consumer.md) | βœ… done | mc-units quality consumer β€” turn QualityTier into unit stat deltas (gives quality_chain a contract) | [simulator-infra](../team-leads/simulator-infra.md) | 2026-06-23 | +| [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) | βœ… done | Pioneer escort mechanic β€” protection rules vs ambient encounters | [combat-dev](../team-leads/combat-dev.md) | 2026-06-03 | +| [p2-60](p2-60-weather-lens-godot-ui.md) | βœ… done | "Weather / observation lens switcher in the Godot HUD" | [wireguard](../team-leads/wireguard.md) | 2026-06-06 | +| [p2-61](p2-61-observation-recording-gates-from-tech.md) | βœ… done | "Bind mc-observation gate_bits to player tech state β€” recording gates per-field" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-14 | +| [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) | βœ… done | "mc-flora generation: migrate biome filter to substrate_climate-aware path" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-13 | +| [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) | βœ… done | "Extract `GameState` and pending-queue data types into a dedicated `mc-state` crate" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-06-23 | +| [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) | βœ… done | "Claude-driven player API β€” programmatic player + Agent-SDK adapter" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-14 | +| [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) | βœ… done | "TreeState impl for TacticalState β€” wire real MCTS into the AI decision path" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-06-04 | +| [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) | βœ… done | GdPlayerApi β†’ render bridge (visualise the API-held game world) | [simulator-infra](../team-leads/simulator-infra.md) | 2026-06-23 | +| [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) | βœ… done | "Make `GdGameState` the canonical render source" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-06-23 | +| [p2-72a-building-entity-port](p2-72a-building-entity-port.md) | βœ… done | Port NPC Building entity (lairs/villages/ruins) into Rust | [simulator-infra](../team-leads/simulator-infra.md) | 2026-06-23 | +| [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) | βœ… done | Decouple save format from GDScript-class shape | [simulator-infra](../team-leads/simulator-infra.md) | 2026-06-23 | +| [p2-72b-promote-playerstate-cities-to-city](p2-72b-promote-playerstate-cities-to-city.md) | βœ… done | "Parallel-field cities synthesis at Godot bridge (Option C)" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-06-08 | +| [p2-73-ui-theme-token-pipeline](p2-73-ui-theme-token-pipeline.md) | βœ… done | "UI theme pipeline β€” generate ui_theme.tres from design-tokens.json + apply globally" | [wireguard](../team-leads/wireguard.md) | 2026-06-06 | +| [p2-74-ui-dehardcode-to-tokens](p2-74-ui-dehardcode-to-tokens.md) | βœ… done | De-hardcode the Godot UI β€” route 45 scene scripts off raw Color() onto theme/tokens | [wireguard](../team-leads/wireguard.md) | 2026-06-23 | +| [p2-75](p2-75-improvement-effects-subsystem.md) | βœ… done | Improvement-completion effects subsystem in Rust β€” move completion side-effects out of GDScript | β€” | 2026-06-23 | +| [p2-76](p2-76-bunker-improvement.md) | βœ… done | Bunker improvement β€” deposit-destroying fortified subterranean chamber | β€” | 2026-06-10 | +| [p2-77](p2-77-deposit-destruction-taxonomy.md) | βœ… done | Deposit-destruction environmental taxonomy β€” destruction_effect classes + contamination engine | β€” | 2026-06-23 | +| [p2-78](p2-78-runtime-hydrology-resolve.md) | βœ… done | Runtime localized hydrology re-solve β€” in-game flow/basin-fill triggered by terraforming | β€” | 2026-06-23 | +| [p2-79](p2-79-environmental-cascade-integration.md) | βœ… done | Environmental cascade integration β€” bunker β†’ dam β†’ flood/parch β†’ flora dieback β†’ fauna migration | β€” | 2026-06-23 | +| [p2-81](p2-81.md) | βœ… done | Improvement effects authored-but-unwired β€” move moisture/wind/erosion/movement to Rust | β€” | 2026-06-23 | +| [p2-82](p2-82-climate-input-save-fidelity.md) | βœ… done | Climate-input save-fidelity β€” persist (or re-derive) worldgen-static grid inputs across save/load | β€” | 2026-06-09 | +| [p2-83](p2-83.md) | βœ… done | Phase/round state machine + speculative parallel simulation of player-action-independent turn work | [simulator-infra](../team-leads/simulator-infra.md) | 2026-06-23 | +| [p2-84](p2-84.md) | βœ… done | "Dev-only compute profiling β€” per-feature CPU/RAM/GPU cost over time, trigger-attributed, zero-cost in release" | [simulator-infra](../team-leads/simulator-infra.md) | 2026-06-23 | +| [p2-86](p2-86-mcp-rendered-driver.md) | βœ… done | Claude-player MCP β€” rendered driver mode (drive UI + capture screenshots) | [simulator-infra](../team-leads/simulator-infra.md) | 2026-06-23 | +| [p2-87-single-color-system-sot](p2-87-single-color-system-sot.md) | βœ… done | "Single game-wide colour system β€” one source of truth, layered tokens, every consumer derives from it" | [wireguard](../team-leads/wireguard.md) | 2026-06-23 | + +## Out of Scope (Game 2 / Game 3) + +> 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 | 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 | +| [p2-55c](p2-55c-freepeople-capture.md) | ⚫ oos | "Freepeople capture mechanics" | [combat-dev](../team-leads/combat-dev.md) | 2026-05-14 | +| [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-06-06 | +| [g2-12](g2-12-underground-layer-stack-oos.md) | ⚫ oos | "Underground layer stack (Game 2) β€” OOS" | [unassigned](../team-leads/unassigned.md) | 2026-06-06 | +| [g2-12a](g2-12a-layer-data-model-save-oos.md) | ⚫ oos | "Underground β€” N-layer data model + save format (Game 2) β€” OOS" | [unassigned](../team-leads/unassigned.md) | 2026-06-06 | +| [g2-12b](g2-12b-underground-worldgen-oos.md) | ⚫ oos | "Underground β€” worldgen for L1/L2/L3 + cavern terrain (Game 2) β€” OOS" | [unassigned](../team-leads/unassigned.md) | 2026-06-06 | +| [g2-12c](g2-12c-excavation-cavern-lifecycle-oos.md) | ⚫ oos | "Underground β€” excavation action + cavern lifecycle (Game 2) β€” OOS" | [unassigned](../team-leads/unassigned.md) | 2026-06-06 | +| [g2-12d](g2-12d-cross-layer-movement-pathfinding-oos.md) | ⚫ oos | "Underground β€” cross-layer movement, connection points + pathfinding (Game 2) β€” OOS" | [unassigned](../team-leads/unassigned.md) | 2026-06-06 | +| [g2-12e](g2-12e-per-layer-fog-vision-oos.md) | ⚫ oos | "Underground β€” per-layer fog of war + vision (Game 2) β€” OOS" | [unassigned](../team-leads/unassigned.md) | 2026-06-06 | +| [g2-12f](g2-12f-structural-integrity-collapse-oos.md) | ⚫ oos | "Underground β€” structural integrity + cross-layer collapse (Game 2) β€” OOS" | [unassigned](../team-leads/unassigned.md) | 2026-06-06 | +| [g2-12g](g2-12g-layer-rendering-switch-ui-oos.md) | ⚫ oos | "Underground β€” layer rendering + layer-switch UI (Game 2) β€” OOS" | [unassigned](../team-leads/unassigned.md) | 2026-06-06 | +| [g2-12h](g2-12h-ai-layer-awareness-oos.md) | ⚫ oos | "Underground β€” AI layer-awareness (Game 2) β€” OOS" | [unassigned](../team-leads/unassigned.md) | 2026-06-06 | +| [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 | -| [p2-23](p2-23-unit-sprites-dwarf-roster.md) | ♻️ superseded | Unit sprites β€” Dwarf-racial roster (m/f variants) | β€” | [asset-sprite](../team-leads/asset-sprite.md) | 2026-06-23 | 🟒 unblocked | -| [p2-24](p2-24-unit-sprites-wild-creatures.md) | ♻️ superseded | Unit sprites β€” wild creatures & fauna (generic, no race/sex) | β€” | [asset-sprite](../team-leads/asset-sprite.md) | 2026-06-23 | 🟒 unblocked | -| [p2-25](p2-25-building-sprites-base-coverage.md) | ♻️ superseded | Building sprites β€” base game coverage (non-wonder) | β€” | [asset-sprite](../team-leads/asset-sprite.md) | 2026-06-23 | 🟒 unblocked | -| [p2-26](p2-26-mundane-wonder-sprites.md) | ♻️ superseded | Mundane-wonder sprites β€” 24 distinct, higher-fidelity art | β€” | [asset-sprite](../team-leads/asset-sprite.md) | 2026-06-23 | 🟒 unblocked | -| [p2-27](p2-27-city-population-tier-sprites.md) | ♻️ superseded | City population-tier sprites β€” city_q1 through city_q5 | β€” | [asset-sprite](../team-leads/asset-sprite.md) | 2026-06-23 | 🟒 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 | -| [p2-85](p2-85-poi-sprites-and-tooltips.md) | ♻️ superseded | POI sprites + hover tooltips β€” lairs (and resources) legible on the map | β€” | [asset-sprite](../team-leads/asset-sprite.md) | 2026-06-23 | 🟒 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 | +| [p2-23](p2-23-unit-sprites-dwarf-roster.md) | ♻️ superseded | Unit sprites β€” Dwarf-racial roster (m/f variants) | [asset-sprite](../team-leads/asset-sprite.md) | 2026-06-23 | +| [p2-24](p2-24-unit-sprites-wild-creatures.md) | ♻️ superseded | "Unit sprites β€” wild creatures & fauna (generic, no race/sex)" | [asset-sprite](../team-leads/asset-sprite.md) | 2026-06-23 | +| [p2-25](p2-25-building-sprites-base-coverage.md) | ♻️ superseded | Building sprites β€” base game coverage (non-wonder) | [asset-sprite](../team-leads/asset-sprite.md) | 2026-06-23 | +| [p2-26](p2-26-mundane-wonder-sprites.md) | ♻️ superseded | "Mundane-wonder sprites β€” 24 distinct, higher-fidelity art" | [asset-sprite](../team-leads/asset-sprite.md) | 2026-06-23 | +| [p2-27](p2-27-city-population-tier-sprites.md) | ♻️ superseded | City population-tier sprites β€” city_q1 through city_q5 | [asset-sprite](../team-leads/asset-sprite.md) | 2026-06-23 | +| [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 | +| [p2-85](p2-85-poi-sprites-and-tooltips.md) | ♻️ superseded | POI sprites + hover tooltips β€” lairs (and resources) legible on the map | [asset-sprite](../team-leads/asset-sprite.md) | 2026-06-23 | diff --git a/public/games/age-of-dwarves/data/objectives.json b/public/games/age-of-dwarves/data/objectives.json index a9547e9e..feecccf4 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-06-23T12:56:22Z", + "generated_at": "2026-06-24T23:51:15Z", "totals": { - "done": 256, - "missing": 0, - "stub": 5, "oos": 31, + "done": 288, + "partial": 2, "in_progress": 0, - "partial": 33, - "total": 325 + "missing": 0, + "stub": 0, + "total": 321 }, "objectives": [ { @@ -474,7 +474,7 @@ "id": "p0-26b", "title": "Port _pick_research from GDScript into mc-ai (finish Rail-1 for the AI decision surface)", "priority": "p1", - "status": "partial", + "status": "done", "scope": "game1", "owner": "warcouncil", "updated_at": "2026-06-23", @@ -508,7 +508,7 @@ "scope": "game1", "owner": "shipwright", "updated_at": "2026-04-17", - "summary": "`mc-trade` now has a full diplomacy surface: `declare_war` / `offer_peace` / `evaluate_trade_offer` / `apply_trade_offer` free functions plus `DiplomacyEvent` enum and `TradeOffer` struct. `TurnProcessor` exposes `action_declare_war`, `action_offer_peace`, `action_offer_trade`, and `action_accept_trade_offer` as public methods callable from GDExtension. EA policy: AI always rejects player-initiated peace offers and gold-for-luxury offers; automated luxury swaps flow through the existing `evaluate_trades` path. Relation state machine (`Relation::Neutral/Peace/Friendly/War`) was already present in `mc-trade::relation`.\n\nAI attack decisions are gated on `Relation::War` via `_is_at_war` in `simple_heuristic_ai.gd`. `_collect_enemy_units`, `_collect_enemy_city_positions`, and `_enemy_within` all skip players whose relation is Peace or Friendly. Missing key defaults to War (EA: all pairs start at war). GUT coverage in `test_simple_heuristic_ai_war_gate.gd`." + "summary": "`mc-trade` now has a full diplomacy surface: `declare_war` / `offer_peace` / `evaluate_trade_offer` / `apply_trade_offer` free functions plus `DiplomacyEvent` enum and `TradeOffer` struct. `TurnProcessor` exposes `action_declare_war`, `action_offer_peace`, `action_offer_trade`, and `action_accept_trade_offer` as public methods callable from GDExtension. EA policy: AI always rejects player-initiated peace offers and gold-for-luxury offers; automated luxury swaps flow through the existing `evaluate_trades` path. Relation state machine (`Relation::Neutral/Peace/Friendly/War`) was already present in `mc-trade::relation`.\n\nAI attack decisions are gated on `Relation::War` via `_is_at_war` in `simple_heuristic_ai.gd`. `_collect_enemy_units`, `_collect_enemy_city_positions`, and `_enemy_within` all skip players whose relation is Peace or Friendly. ~~Missing key defaults to War (EA: all pairs start at war).~~ **[SUPERSEDED β€” see banner: canonical start state is PEACE; war begins on war-dec dispatch per COMMUNICATIONS.md / p3-01.]** GUT coverage in `test_simple_heuristic_ai_war_gate.gd`." }, { "id": "p1-02", @@ -844,7 +844,7 @@ "id": "p1-29d-p1-survival", "title": "P1 (trailing AI) eliminated or stalled before T100 in 10/10 seeds β€” upstream of action priority", "priority": "p1", - "status": "partial", + "status": "done", "scope": "game1", "owner": "warcouncil", "updated_at": "2026-06-23", @@ -854,10 +854,10 @@ "id": "p1-29e-rl-divergence-mining", "title": "\"RL-policy divergence mining β†’ sole-city economy break-out (production, not science)\"", "priority": "p1", - "status": "partial", + "status": "done", "scope": "game1", "owner": "warcouncil", - "updated_at": "2026-06-03", + "updated_at": "2026-06-23", "summary": "" }, { @@ -874,20 +874,20 @@ "id": "p1-29g", "title": "Re-verify Game-1 AI quality gates trained-vs-scripted (and trained-vs-trained)", "priority": "p1", - "status": "partial", + "status": "done", "scope": "game1", "owner": "warcouncil", - "updated_at": "2026-06-08", + "updated_at": "2026-06-23", "summary": "" }, { "id": "p1-29h-stateful-tactical-decisiveness", - "title": "\"Stateful tactical decisiveness β€” army target-lock + commitment hysteresis + press-on-capture in mc-ai\"", + "title": "Stateful tactical decisiveness β€” army target-lock + commitment hysteresis + press-on-capture in mc-ai", "priority": "p1", - "status": "partial", + "status": "done", "scope": "game1", "owner": "warcouncil", - "updated_at": "2026-06-04", + "updated_at": "2026-06-23", "summary": "" }, { @@ -904,7 +904,7 @@ "id": "p1-29j-autoplay-rust-action-application", "title": "\"Route autoplay action-application (city-founding / capture) through Rust mc_turn::processor\"", "priority": "p1", - "status": "partial", + "status": "done", "scope": "game1", "owner": "warcouncil", "updated_at": "2026-06-23", @@ -914,7 +914,7 @@ "id": "p1-29k", "title": "\"Drive learned:* controllers on the autoplay (auto_play.gd) gate surface\"", "priority": "p1", - "status": "partial", + "status": "done", "scope": "game1", "owner": "simulator-infra", "updated_at": "2026-06-23", @@ -1310,56 +1310,6 @@ "updated_at": "2026-06-10", "summary": "Gate-one objective for every other `asset-sprite` child (`p2-23` … `p2-27`). Before any sprite can legitimately land in `public/games/age-of-dwarves/assets/sprites/`, the `tools/sprite-generation/` pipeline has to run cleanly end-to-end: scan game data β†’ generate variants via the configured model β†’ auto-rank via Sonnet vision β†’ surface in the Theater GUI for human approval β†’ chroma-key + resize + install with LICENSES.md row written.\n\nSlate is clean (user deleted 7 pre-existing sprites on 2026-04-17 for quality-bar failure; the prompt library and ranker had drifted). This objective closes out the \"pipeline works\" half of the split; actual sprite shipping lives in the downstream children." }, - { - "id": "p2-23", - "title": "Unit sprites β€” Dwarf-racial roster (m/f variants)", - "priority": "p1", - "status": "partial", - "scope": "game1", - "owner": "asset-sprite", - "updated_at": "2026-06-04", - "summary": "Every Dwarf-controlled combat + support unit Game 1 subscribes to (`manifest.json` `subscribes.units`, resolved against `public/resources/units/.json` β€” the non-wild entries, those with a `gender: { male, female }` block) needs matching PNG sprites in `public/games/age-of-dwarves/assets/sprites/units/` so `UnitRenderer` can overlay the sprite on top of the procedural baseline. (The objective originally cited `data/units/*.json`; unit data has since moved to the shared `resources/` library with a per-game manifest subscription.)\n\nThe 2026-04-17 snapshot listed 8 gender-bearing units (`archer`, `berserker`, `cavalry`, `pikeman`, `runesmith`, `spearmen`, `warrior`, `worker`); the live roster has grown to 103 gendered dwarf units (+15 wild β†’ `p2-24`, +42 plain support/civilian) = 160 subscribed. Race id is `dwarf` (singular β€” `public/resources/races/dwarves.json` `id: dwarf`); `Player.race_id` resolves to that at runtime (`unit_renderer.gd:_resolve_race_id()`), `gender_preset` ∈ {male, female}.\n\nSlate is clean β€” the 7 previously-authored sprites were deleted 2026-04-17 for quality-bar failure. Do not restore; regenerate via `p2-22` once the pipeline is green.\n\n**Stand-in coverage (2026-06-04).** Pending the bespoke paid-art pass, every renderer\nunit slot is filled with an OSS stand-in (game-icons.net CC-BY-3.0) via\n`tools/standin-sprites/build_standins.py`. Coverage is data-driven off the live\nGame-1 subscription (`public/games/age-of-dwarves/manifest.json` β†’ `subscribes.units`,\n160 units β€” far larger than the 2026-04-17 8-unit snapshot the roster has since\ngrown past), keyed to the renderer-constructed paths the engine actually loads\n(`sprites/units/.png` + `_dwarf_male.png` / `_dwarf_female.png` for the\n103 gendered dwarf units; `unit.gd` sets `type_id = resource id`, `player.gd`\n`gender_preset` ∈ {male, female}, race `dwarf`). 366 PNGs on disk, all RGBA/56px,\none `LICENSES.md` row each. These are PLACEHOLDER silhouettes, NOT the bespoke\nDwarf-racial m/f art the objective ultimately requires β€” the final-art bullets\nbelow stay βœ— and status is **partial**." - }, - { - "id": "p2-24", - "title": "Unit sprites β€” wild creatures & fauna (generic, no race/sex)", - "priority": "p1", - "status": "partial", - "scope": "game1", - "owner": "asset-sprite", - "updated_at": "2026-06-04", - "summary": "Wild creatures (unit resources with `faction: \"wild\"` / `keywords: [\"wild\"]`, in `public/resources/units/`; the objective originally said `unit_type: \"wild\"` in `data/units/` β€” both the field and the path have since moved) do not participate in the raceΓ—sex permutation. `UnitRenderer` falls back to `SPRITE_LOOKUP_GENERIC_FORMAT = \"sprites/units/%s.png\"` (`unit_renderer.gd:60`) for them β€” a single sprite per creature id.\n\nThe current wild roster (2026-04-17 snapshot): `ancient_hydra`, `basilisk_wild`, `dire_bear`, `dire_wolf`, `drake_wild`, `elder_wyrm`, `feral_spider`, `fire_imp`, `frostfang_alpha`, `garden_snail`, `lava_elemental`, `shambling_dead`, `stone_sentinel`, `wild_wyvern`, `wolf_pack` β€” 15 creatures, 15 PNG files.\n\nEach is a recognisable silhouette at the renderer's 56Γ—56 hex render size (verified via `sprite_proof.tscn` scaling behaviour established in `p0-23`).\n\n**Stand-in coverage (2026-06-04).** All 15 wild units (`faction: \"wild\"` in the live\n`subscribes.units` set β€” the same roster as the 2026-04-17 snapshot) are filled with\nOSS stand-ins (game-icons.net CC-BY-3.0) at `sprites/units/.png`, single sprite\nper id, no race/sex suffix, via `tools/standin-sprites/build_standins.py`. (The\nseparate 61-species ecology `fauna` manifest is NOT in scope here β€” those are\nsim-only species, not rendered map units.) PLACEHOLDER art; final-art bullets below\nstay βœ—, status **partial**." - }, - { - "id": "p2-25", - "title": "Building sprites β€” base game coverage (non-wonder)", - "priority": "p1", - "status": "partial", - "scope": "game1", - "owner": "asset-sprite", - "updated_at": "2026-06-04", - "summary": "Every standard (non-wonder) building Game 1 subscribes to β€” `manifest.json` `subscribes.buildings`, resolved against `public/resources/buildings/.json`, taking the entries WITHOUT a `wonder_type` field (wonders β†’ `p2-26`) β€” needs a sprite at `public/games/age-of-dwarves/assets/sprites/buildings/.png`. (The objective originally said `data/buildings/*.json`; building data has since moved to the shared `resources/` library with a per-game manifest subscription.) `city_renderer.gd:223` loads this flat, id-keyed path; the city-screen UI consumes the same files.\n\nCurrent base roster (2026-04-17 snapshot, 10 buildings): `ale_hall`, `barracks`, `bathhouse`, `colosseum`, `forge`, `library`, `marketplace`, `monument`, `temple`, `walls`.\n\n**Stand-in coverage (2026-06-04).** The live building roster has grown well past the\n10-building snapshot: `manifest.json` `subscribes.buildings` lists 166 entries, of\nwhich 103 are non-wonder base buildings (the other 62 are wonders β†’ `p2-26`). All 103\nare filled with OSS stand-ins (game-icons.net CC-BY-3.0) on a stone plate at 64px,\nwritten to `sprites/buildings/.png` β€” the flat, id-keyed path the renderer\nactually loads (`city_renderer.gd:223` `\"sprites/buildings/%s.png\" % bid`; no\n`wonders/` subdir, no resource-`sprite`-field read). Built via\n`tools/standin-sprites/build_standins.py`. PLACEHOLDER art; final-art bullets below\nstay βœ—, status **partial**. (One subscribed id, `market`, has no resource file β€” a\ndata gap logged in `STANDINS.md`, not a sprite gap.)" - }, - { - "id": "p2-26", - "title": "Mundane-wonder sprites β€” 24 distinct, higher-fidelity art", - "priority": "p1", - "status": "partial", - "scope": "game1", - "owner": "asset-sprite", - "updated_at": "2026-06-04", - "summary": "Game 1's world wonders (Civ5-style, no magic schools β€” mundane flavour wonders) are the subscribed buildings carrying a `wonder_type` field in `public/resources/buildings/.json`. (The objective originally cited `data/buildings/mundane_wonders.json` with 24 wonders; the data has since moved to the shared `resources/` library and the live count is 62.) Each needs a **distinct, higher-fidelity** sprite β€” a generic \"fancy building\" look drags the whole wonder system's perceived prestige. Split from `p2-25` so the quality bar can be tracked independently.\n\nCurrent wonder roster (2026-04-17 snapshot): `ancestral_forge`, `mead_hall`, `first_mineshaft`, `clan_moot_stone`, `iron_bulwark`, `hall_of_ancestors`, `the_deep_road`, `bardic_circle`, `archive_of_runes`, `royal_runestone`, `grand_observatory`, `covenant_stone`, `the_great_forge`, `iron_crown`, `undermount_vault`, `hall_of_echoes`, `world_pillar`, `well_of_ages`, `the_undying_flame`, `voice_of_ages`, `silent_cartograph`, `shrine_of_names`, `the_cold_anvil`, `hearthless_hall`.\n\n**Stand-in coverage (2026-06-04).** The wonder roster has grown past the 24-wonder\nsnapshot: the live subscription now has 62 wonders (buildings with a `wonder_type`\nfield). All 62 are filled with OSS stand-ins (game-icons.net CC-BY-3.0) on a **bronze\nplate at 96px** (higher fidelity than the 64px base-building stone plate, to read as\n\"monumental\"), written to the flat id-keyed path `sprites/buildings/.png` the\nrenderer loads (`city_renderer.gd:223`; `standin_sprite_proof.gd` MUNDANE WONDERS rows\nconfirm the flat path). Built via `tools/standin-sprites/build_standins.py`. These are\ngeneric silhouettes β€” they do NOT meet this objective's distinct-per-wonder,\ntier-appropriate-grandeur, ranker β‰₯ 4.2 bar. Final-art bullets below stay βœ—, status\n**partial**." - }, - { - "id": "p2-27", - "title": "City population-tier sprites β€” city_q1 through city_q5", - "priority": "p1", - "status": "partial", - "scope": "game1", - "owner": "asset-sprite", - "updated_at": "2026-06-04", - "summary": "`CityRenderer` looks up a city's sprite via `SPRITE_LOOKUP_CITY_FORMAT = \"sprites/cities/city_q%d.png\"` (`city_renderer.gd:29`) with the quality bucket computed as `clampi(city.population / CITY_QUALITY_BUCKET + 1, 1, CITY_QUALITY_MAX)` β€” five buckets, five PNGs. Tiny scope relative to the other children, but the key format and renderer path are distinct enough to warrant its own objective β€” can flip `done` early.\n\n**Stand-in coverage (2026-06-04).** All five tiers filled with OSS stand-ins\n(game-icons.net CC-BY-3.0, `hut β†’ huts-village β†’ village β†’ hill-fort β†’ castle` β€” a\nclear size/density progression) at `sprites/cities/city_q.png`, the exact path\n`city_renderer.gd:29` `SPRITE_LOOKUP_CITY_FORMAT` loads. Built via\n`tools/standin-sprites/build_standins.py`. PLACEHOLDER art; final-art bullets (native\n256/512px, ranker, reviewed proof screenshot) stay βœ—, status **partial**." - }, { "id": "p2-28", "title": "Sprite provenance ledger β€” LICENSES.md per-file attribution", @@ -1394,7 +1344,7 @@ "id": "g2-05", "title": "Tectonics + lithology β€” extend the existing prepass/terrain-evolution into a lithology axis", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": null, "updated_at": "2026-06-23", @@ -1404,7 +1354,7 @@ "id": "g2-06", "title": "Soil derivation layer β€” emergent soil order from rock + climate + slope (the one unbuilt worldsim engine)", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": null, "updated_at": "2026-06-23", @@ -1414,7 +1364,7 @@ "id": "g2-08", "title": "Fauna population dynamics β€” confirm the existing LV engine ticks in the playable turn", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": null, "updated_at": "2026-06-23", @@ -1424,7 +1374,7 @@ "id": "g2-09", "title": "Flora tolerance-driven selection β€” extend the existing flora_select engine with tolerance gating", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": null, "updated_at": "2026-06-23", @@ -1434,7 +1384,7 @@ "id": "g2-10", "title": "Fauna migration β€” wire the existing apply_migrations engine into the per-turn step", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": null, "updated_at": "2026-06-23", @@ -1442,22 +1392,22 @@ }, { "id": "p1-05-followup-shipwright-batch", - "title": "\"Shipwright autoplay-batch sign-off β€” luxury variance + personality win balance\"", + "title": "Shipwright autoplay-batch sign-off β€” luxury variance + personality win balance", "priority": "p2", - "status": "stub", + "status": "done", "scope": "game1", "owner": "shipwright", - "updated_at": "2026-06-04", + "updated_at": "2026-06-23", "summary": "Two p1-05 acceptance bullets cannot close inside p1-05's JSON-tuning-only\nscope β€” both depend on upstream warcouncil work and require a fresh\n10-seed (or 50-game) autoplay batch on apricot once that upstream lands:\n\n1. **Luxury variance β‰₯ 3 distinct luxuries per seed.** Un-gating\n experiment (`apricot-20260418_062941`) falsified the JSON-tuning hypothesis;\n the true blocker is game length (median domination ~T85), not the tech\n gate. p2-54d landed the `mc-ai::evaluator::score_tech` luxury-unlock\n scoring (211/211 mc-ai tests pass), but full revalidation requires a\n batch after `p0-08` domination tempo lengthens median game past T250.\n\n2. **`personality_win_balance` PASS per p0-02 acceptance.** Warcouncil\n owns the 50-game sample under `p0-02`; Shipwright signs off on the\n batch run + report once warcouncil delivers the personality tunes.\n\nBoth are autoplay-batch sign-off work, not new design or tuning. Tracked\nseparately so p1-05 itself can close on the in-scope JSON tuning that\nalready shipped (pop_peak median 69, worker_improvements min 15, techs\nmedian 39, combats median 808, strategic_gate_rejections 1670)." }, { "id": "p1-38-followup-shipwright-batch", - "title": "\"p1-38 follow-up β€” Shipwright coupled-mode 10-seed regression batch + sign-off\"", + "title": "p1-38 follow-up β€” Shipwright coupled-mode 10-seed regression batch + sign-off", "priority": "p2", - "status": "stub", + "status": "done", "scope": "game1", "owner": "shipwright", - "updated_at": "2026-06-04", + "updated_at": "2026-06-23", "summary": "Carved out of `p1-38-biome-economy-coupling.md` (closed `done` 2026-05-14\non the basis that all Rust + GDScript implementation work has shipped and\nonly the *operational* batch + JSON flip remain). This follow-up tracks\nthe autoplay-batch sign-off that flips\n`public/games/age-of-dwarves/data/balance/ecology_yields.json`\n`fallback_when_dormant: \"static_terrain\" β†’ \"coupled\"` in main.\n\nThis is owner-locked to Shipwright (see `p1-38` Coordination notes and\nfrontmatter): `game-systems` cannot self-sign-off, and the bullet is an\noperational gate rather than an implementation bullet." }, { @@ -1694,10 +1644,10 @@ "id": "p2-10k-followup", "title": "\"Workflow policy decision: how to clear the 10 max-file-lines gdlint violations\"", "priority": "p2", - "status": "stub", + "status": "done", "scope": "game1", "owner": "testwright", - "updated_at": "2026-05-14", + "updated_at": "2026-06-23", "summary": "Parent: `p2-10k-gdlint-cleanup.md` (audited and closed 2026-05-14 β€” see\n\"Out of scope\" closing note). Eleven `max-file-lines` violations remain on\n`gdlint src/game/engine/src/` and are blocked on a workflow-policy decision\nabove the gdlint-cleanup lane.\n\nThe original p2-10k plan called for inline\n`# gdlint:disable=max-file-lines # tracked: p2-10k` directives per file.\nThat path is **not executable from a Claude session**: the global\n`~/.claude/hooks/enforce-gdscript-quality.sh` PreToolUse hook hard-rejects\nany `gdlint:disable` / `noqa` insertion with `Lint Suppression: fix the\nlint error instead of suppressing it`." }, { @@ -1764,7 +1714,7 @@ "id": "p2-18", "title": "Guide web app β€” public hosting + deploy pipeline", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": null, "updated_at": "2026-06-23", @@ -1954,7 +1904,7 @@ "id": "p2-47", "title": "In-game statistics screens β€” Civ-style 5-tab modal (Demographics / Graphs / Rankings / Replay / Histories)", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1-stretch", "owner": "shipwright", "updated_at": "2026-06-23", @@ -2292,9 +2242,9 @@ }, { "id": "p2-57b", - "title": "\"Building consume/produce edges β€” stockpile coupled to unit quality\"", + "title": "Building consume/produce edges β€” stockpile coupled to unit quality", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": "unassigned", "updated_at": "2026-06-23", @@ -2302,9 +2252,9 @@ }, { "id": "p2-57c-mc-units-quality-consumer", - "title": "\"mc-units quality consumer β€” turn QualityTier into unit stat deltas (gives quality_chain a contract)\"", + "title": "mc-units quality consumer β€” turn QualityTier into unit stat deltas (gives quality_chain a contract)", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": "simulator-infra", "updated_at": "2026-06-23", @@ -2404,7 +2354,7 @@ "id": "p2-65", "title": "\"Extract `GameState` and pending-queue data types into a dedicated `mc-state` crate\"", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": "simulator-infra", "updated_at": "2026-06-23", @@ -2502,12 +2452,12 @@ }, { "id": "p2-72", - "title": "\"GdPlayerApi β†’ render bridge (visualise the API-held game world)\"", + "title": "GdPlayerApi β†’ render bridge (visualise the API-held game world)", "priority": "p2", - "status": "stub", + "status": "done", "scope": "game1", "owner": "simulator-infra", - "updated_at": "2026-05-11", + "updated_at": "2026-06-23", "summary": "" }, { @@ -2524,7 +2474,7 @@ "id": "p2-72a", "title": "\"Make `GdGameState` the canonical render source\"", "priority": "p2", - "status": "stub", + "status": "done", "scope": "game1", "owner": "simulator-infra", "updated_at": "2026-06-23", @@ -2532,9 +2482,9 @@ }, { "id": "p2-72a-building-entity-port", - "title": "\"Port NPC Building entity (lairs/villages/ruins) into Rust\"", + "title": "Port NPC Building entity (lairs/villages/ruins) into Rust", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": "simulator-infra", "updated_at": "2026-06-23", @@ -2552,12 +2502,12 @@ }, { "id": "p2-72a-save-format-migration", - "title": "\"Decouple save format from GDScript-class shape\"", + "title": "Decouple save format from GDScript-class shape", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": "simulator-infra", - "updated_at": "2026-05-12", + "updated_at": "2026-06-23", "summary": "" }, { @@ -2584,7 +2534,7 @@ "id": "p2-74-ui-dehardcode-to-tokens", "title": "De-hardcode the Godot UI β€” route 45 scene scripts off raw Color() onto theme/tokens", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": "wireguard", "updated_at": "2026-06-23", @@ -2594,7 +2544,7 @@ "id": "p2-75", "title": "Improvement-completion effects subsystem in Rust β€” move completion side-effects out of GDScript", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": null, "updated_at": "2026-06-23", @@ -2614,7 +2564,7 @@ "id": "p2-77", "title": "Deposit-destruction environmental taxonomy β€” destruction_effect classes + contamination engine", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": null, "updated_at": "2026-06-23", @@ -2624,7 +2574,7 @@ "id": "p2-78", "title": "Runtime localized hydrology re-solve β€” in-game flow/basin-fill triggered by terraforming", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": null, "updated_at": "2026-06-23", @@ -2634,7 +2584,7 @@ "id": "p2-79", "title": "Environmental cascade integration β€” bunker β†’ dam β†’ flood/parch β†’ flora dieback β†’ fauna migration", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": null, "updated_at": "2026-06-23", @@ -2644,7 +2594,7 @@ "id": "p2-81", "title": "Improvement effects authored-but-unwired β€” move moisture/wind/erosion/movement to Rust", "priority": "p2", - "status": "partial", + "status": "done", "scope": "game1", "owner": null, "updated_at": "2026-06-23", @@ -2680,16 +2630,6 @@ "updated_at": "2026-06-23", "summary": "**A development-time profiling layer that attributes compute cost (CPU / RAM / GPU) to the feature that incurred it, over game-time, tagged by what triggered it β€” so optimization effort is data-driven, not guessed. It MUST compile/gate out to zero overhead in the shipped game.**" }, - { - "id": "p2-85", - "title": "POI sprites + hover tooltips β€” lairs (and resources) legible on the map", - "priority": "p2", - "status": "partial", - "scope": "game1", - "owner": "asset-sprite", - "updated_at": "2026-06-23", - "summary": "" - }, { "id": "p2-86", "title": "Claude-player MCP β€” rendered driver mode (drive UI + capture screenshots)", @@ -3154,20 +3094,20 @@ "id": "p3-10a", "title": "Lair assault mode β€” enter-and-clear", "priority": "p3", - "status": "partial", + "status": "done", "scope": "game1", "owner": "unassigned", - "updated_at": "2026-06-03", + "updated_at": "2026-06-23", "summary": "" }, { "id": "p3-10b", "title": "Lair siege mode β€” multi-turn pressure from adjacent", "priority": "p3", - "status": "partial", + "status": "done", "scope": "game1", "owner": "unassigned", - "updated_at": "2026-05-05", + "updated_at": "2026-06-23", "summary": "" }, { @@ -3259,6 +3199,26 @@ "owner": "shipwright", "updated_at": "2026-06-19", "summary": "" + }, + { + "id": "p3-16", + "title": "AI proactive war-declaration via the courier system", + "priority": "p3", + "status": "partial", + "scope": "game1", + "owner": "warcouncil", + "updated_at": "2026-06-24", + "summary": "The canonical courier-diplomacy model (`COMMUNICATIONS.md` Β§\"War declaration\nsemantics\") assumes a player **dispatches a war-dec envelope** to enter war: the\n**sender** enters `War` immediately on dispatch and its units can attack the same\nturn; the **recipient** flips to `War` on delivery/interception; **defenders\nalways retaliate when struck** regardless of formal `RelationState`. Pairs start\nat **peace** (`mc-player-api/src/projection.rs::project_tactical_relations` defaults\nunset pairs to 0 = peace; `mc-player-api/src/comms_dispatch.rs` flips the shared\n`RelationState` cell to `War` only on delivery).\n\n**The war-declaration decision is now SHIPPED.** A new per-turn diplomacy step\n`decide_diplomacy` (`src/simulator/crates/mc-ai/src/tactical/diplomacy.rs:30`)\nevaluates each *discovered* rival against the clan's `aggression` axis and the\nown-vs-perceived military balance, and emits `Action::DeclareWar { target }`\n(`diplomacy.rs:69`) when conditions warrant. That action is routed through\n`mc_player_api::comms_dispatch::dispatch_war_declaration`\n(`mc-player-api/src/comms_dispatch.rs:59`) β€” the same envelope path the human\nwar-dec uses β€” so the **sender** enters `War` on dispatch and the **recipient**\nflips on delivery, exactly per `COMMUNICATIONS.md` Β§\"War declaration semantics\".\n\nIt is **unit-tested and proven to fire**:\n- 5 `mc-ai` diplomacy cases (`diplomacy.rs:140–185`) cover discovered-weaker\n (declares), undiscovered (holds), already-at-war (holds), cautious-at-parity\n vs warmonger-strikes (axis differentiation), and no-army (holds).\n- The dispatch round-trip is covered by\n `ai_declare_war_maps_to_player_declare_war` (`mc-player-api/src/dispatch.rs:3068`):\n the AI's `DeclareWar` maps to the same `RelationState` mutation the human path\n produces.\n- **Live proof:** in hotseat self-play (seed 42) war-decs dispatch on first\n contact at turns 17/18.\n\n**Why this is still `partial` β€” the war-dec does not yet transform AI-vs-AI\ngames.** The decision-to-declare half is shipped, but full aggressive AI play is\nblocked on a **separate upstream gap: the AI does not scout/explore** (tracked by\n**p3-17**, AI exploration / frontier-seeking). Two consequences:\n1. War-decs fire only on a fleeting enemy-**unit** sighting, which is rare because\n idle military units never push toward unexplored territory.\n2. Even once at war, `collect_enemy_city_positions` (`tactical/movement.rs:402`)\n returns only **visible** enemy cities β€” which the AIs almost never see, because\n idle military units fall to `score_patrol_for_military` (`movement.rs:285`,\n scout-sweep of already-known cities / garrison next to friendly cities) with\n **no frontier-seeking**. So the army declares war but cannot find the enemy\n capital to march on.\n\nThe downstream at-war combat path (`is_at_war` gate, `locked_target` maneuver,\n`aggression`-tuned posture per `mc-ai/src/tactical/thresholds.rs`) already works\nonce a pair is at war and an enemy city is known β€” but discovery starves it.\n**p3-17 must land before personality `aggression` materially differentiates\nAI-vs-AI war outcomes.**" + }, + { + "id": "p3-17", + "title": "AI exploration / frontier-seeking for idle military + scout units", + "priority": "p3", + "status": "partial", + "scope": "game1", + "owner": "warcouncil", + "updated_at": "2026-06-24", + "summary": "The AI never scouts or explores the map, which starves both target-acquisition\nand the war-declaration discovery gate. This objective adds a frontier-seeking\nmove for idle military / scout units so first contact and enemy-city discovery\nhappen reliably in AI-vs-AI play." } ] }