diff --git a/.project/objectives/DASHBOARD_CATEGORIES.md b/.project/objectives/DASHBOARD_CATEGORIES.md
index c7d30085..ea278607 100644
--- a/.project/objectives/DASHBOARD_CATEGORIES.md
+++ b/.project/objectives/DASHBOARD_CATEGORIES.md
@@ -41,6 +41,8 @@
| [g5-02](g5-02-flugel-oos.md) | β« oos | P3 | FlΓΌgel playable species β Game 5 (Age of Ascension) | β | π’ |
| [g5-03](g5-03-gith-oos.md) | β« oos | P3 | Gith playable species (Githyanki + Githzerai) β Game 5 (Age of Ascension) | β | π’ |
| [g5-04](g5-04-demonia-oos.md) | β« oos | P3 | Demonia playable species β Game 5 (Age of Ascension) | β | π’ |
+| [g6-01](g6-01-naval-combat-oos.md) | β« oos | P3 | Naval combat β out-of-scope (post-v10) | β | π’ |
+| [g6-02](g6-02-caravan-trade-routes-oos.md) | β« oos | P3 | Caravan trade routes β out-of-scope (post-v10) | β | π’ |
| [p0-01](p0-01-mcts-wiring.md) | π‘ partial | P0 | Wire MCTS into gameplay AI | [warcouncil](../team-leads/warcouncil.md) | π’ |
| [p0-02](p0-02-clan-personalities.md) | β
done | P0 | Five AI clan personalities drive distinct playstyles | [warcouncil](../team-leads/warcouncil.md) | π’ |
| [p0-03](p0-03-pvp-in-turn.md) | β
done | P0 | PvP combat resolved inside the authoritative turn processor | β | π’ |
@@ -112,7 +114,7 @@
| [p1-25](p1-25-export-script-error-cleanup.md) | β
done | P1 | Eliminate parse-error spam in export logs (Unit dup decl + SaveManager stray) | [shipwright](../team-leads/shipwright.md) | π’ |
| [p1-26](p1-26-tile-placement-preview-ux.md) | β missing | P1 | Tile-placement UX with effect preview β Civ7-style "where does this go and what changes" | [shipwright](../team-leads/shipwright.md) | π’ |
| [p1-27](p1-27-mcts-service-extraction.md) | β missing | P1 | Extract GPU MCTS into a standalone service/client (model-boss-shaped, magic-civ-only) | [warcouncil](../team-leads/warcouncil.md) | π’ |
-| [p1-28](p1-28-culture-research-tree.md) | π΅ in_progress | P1 | Culture research tree β real graph, bridge, UI | [shipwright](../team-leads/shipwright.md) | π’ |
+| [p1-28](p1-28-culture-research-tree.md) | π‘ partial | P1 | Culture research tree β real graph, bridge, UI | [shipwright](../team-leads/shipwright.md) | π’ |
| [p2-01](p2-01-minimap-improvements.md) | β
done | P2 | Minimap β fog reflection and unit markers | [shipwright](../team-leads/shipwright.md) | π’ |
| [p2-02](p2-02-hud-tooltips.md) | β
done | P2 | Tooltips on all HUD elements | [shipwright](../team-leads/shipwright.md) | π’ |
| [p2-03](p2-03-hotkey-cheat-sheet.md) | β
done | P2 | Hotkey cheat sheet (F1 / ?) | [shipwright](../team-leads/shipwright.md) | π’ |
diff --git a/.project/objectives/README.md b/.project/objectives/README.md
index 97990234..0061b003 100644
--- a/.project/objectives/README.md
+++ b/.project/objectives/README.md
@@ -15,10 +15,10 @@
| Priority | π΅ | π‘ | π΄ | β | β« | β
| Total |
|---|---|---|---|---|---|---|---|
| **P0** | 0 | 1 | 0 | 0 | 0 | 42 | 43 |
-| **P1** | 1 | 4 | 0 | 8 | 1 | 25 | 39 |
+| **P1** | 0 | 5 | 0 | 8 | 1 | 25 | 39 |
| **P2** | 0 | 2 | 8 | 0 | 0 | 20 | 30 |
-| **P3 (oos)** | 0 | 0 | 0 | 1 | 17 | 0 | 18 |
-| **total** | **1** | **7** | **8** | **9** | **18** | **87** | **130** |
+| **P3 (oos)** | 0 | 0 | 0 | 1 | 19 | 0 | 20 |
+| **total** | **0** | **8** | **8** | **9** | **20** | **87** | **132** |
@@ -35,16 +35,6 @@
|
-## π΅ In Progress
-
-> Actively claimed by a team lead. Grouped by owner.
-
-### [shipwright](../team-leads/shipwright.md)
-
-| ID | Priority | Title | Updated | Blocked |
-|---|---|---|---|---|
-| [p1-28](p1-28-culture-research-tree.md) | P1 | Culture research tree β real graph, bridge, UI | 2026-04-26 | π’ unblocked |
-
## P0 β Blockers
| ID | Status | Title | Tags | Owner | Updated | Blocked |
@@ -58,6 +48,7 @@
| [p0-20](p0-20-gpu-mcts-rollouts.md) | π‘ partial | GPU-accelerated MCTS rollouts for look-ahead decision-making | β | [warcouncil](../team-leads/warcouncil.md) | 2026-04-19 | π’ unblocked |
| [p1-05](p1-05-balance-tuning.md) | π‘ partial | Balance tuning β pop_peak β₯30 median, worker improvements β₯8 min | β | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | π’ unblocked |
| [p1-22](p1-22-mcts-wall-clock-budget.md) | π‘ partial | MCTS per-decision wall-clock budget β bound per-turn cost on huge maps | β | [warcouncil](../team-leads/warcouncil.md) | 2026-04-25 | π’ unblocked |
+| [p1-28](p1-28-culture-research-tree.md) | π‘ partial | Culture research tree β real graph, bridge, UI | β | [shipwright](../team-leads/shipwright.md) | 2026-04-26 | π’ unblocked |
| [p2-22](p2-22-sprite-generation-pipeline.md) | π‘ partial | Sprite generation pipeline β runnable end-to-end | β | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-25 | π’ unblocked |
| [p1-26](p1-26-tile-placement-preview-ux.md) | β missing | Tile-placement UX with effect preview β Civ7-style "where does this go and what changes" | β | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | π’ unblocked |
| [p1-27](p1-27-mcts-service-extraction.md) | β missing | Extract GPU MCTS into a standalone service/client (model-boss-shaped, magic-civ-only) | β | [warcouncil](../team-leads/warcouncil.md) | 2026-04-25 | π’ unblocked |
@@ -107,6 +98,8 @@
| [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 |
## Superseded
diff --git a/.project/objectives/g6-01-naval-combat-oos.md b/.project/objectives/g6-01-naval-combat-oos.md
new file mode 100644
index 00000000..2f94ea5d
--- /dev/null
+++ b/.project/objectives/g6-01-naval-combat-oos.md
@@ -0,0 +1,36 @@
+---
+id: g6-01
+title: Naval combat β out-of-scope (post-v10)
+priority: p3
+status: oos
+scope: post-v10
+owner:
+updated_at: 2026-04-26
+evidence: []
+---
+
+> **Out of scope for Game 1 "Age of Dwarves" and the planned Game 2-5 cycle.** Per `public/games/age-of-dwarves/data/shipping-roadmap.json`, naval combat is in the **post-v10** bucket alongside the Ethereal Plane, caravan trade routes, map editor, and mod support. Dwarves are mountain-dwelling; ships are not narratively core to Game 1's experience. Tracking here so the roadmap entry has a corresponding objective ID.
+
+## Summary
+
+Hex-based naval combat β water-tile movement for ships, ship unit types (transport / warship / etc.), naval-vs-naval and naval-vs-coastal-city combat, harbor / port buildings, sea-region map topology where applicable.
+
+## Acceptance
+
+- β Ship unit types in `public/games//data/units/` with `domain: "water"` (or new domain) and naval-only stats / promotions.
+- β Water-tile pathfinding in `mc-mapgen` / `mc-turn` honoring coast, deep-water, and impassable land/water transitions.
+- β Naval-vs-naval combat resolution in `mc-combat` (deck-to-deck volley + boarding distinct from land hex combat).
+- β Coastal-city bombardment and amphibious assault (transport unloads land troops onto a coastal hex).
+- β Harbor / shipyard buildings (production gate for ships, +trade for adjacency).
+- β Map topology variants supporting meaningful naval play (archipelago / continents / island maps).
+
+## Why post-v10 (not Game 1-5)
+
+- Game 1 (Dwarves): mountain-dwelling race, pangaea / continental landmass play. No naval need.
+- Games 2-5: each already scoped around specific systems (leylines, Archons, psionics, ascended species). No naval slot reserved.
+- Post-v10: roadmap pairs naval with map editor + mod support + Ethereal Plane β the "engine completes its surface" phase, not the "ship ten races" phase.
+
+## Non-goals
+
+- Submarine / aerial-naval hybrid mechanics (separate scope if relevant to post-v10 race work).
+- Procedural sea-monster encounters (would belong to whichever game's bestiary, not this objective).
diff --git a/.project/objectives/g6-02-caravan-trade-routes-oos.md b/.project/objectives/g6-02-caravan-trade-routes-oos.md
new file mode 100644
index 00000000..a12f3964
--- /dev/null
+++ b/.project/objectives/g6-02-caravan-trade-routes-oos.md
@@ -0,0 +1,37 @@
+---
+id: g6-02
+title: Caravan trade routes β out-of-scope (post-v10)
+priority: p3
+status: oos
+scope: post-v10
+owner:
+updated_at: 2026-04-26
+evidence: []
+---
+
+> **Out of scope for Game 1 "Age of Dwarves" and the planned Game 2-5 cycle.** Per `public/games/age-of-dwarves/data/shipping-roadmap.json`, caravan trade routes are in the **post-v10** bucket alongside naval combat (g6-01), the Ethereal Plane, map editor, and mod support. Game 1 ships peace/war + simple luxury-for-gold trade (p1-01 done); persistent unit-routed caravans are a separate, larger system.
+
+## Summary
+
+Persistent trade-route units (caravans, traders) that travel between owned cities OR between own-city and foreign-city, generate per-turn gold/resource yields tied to distance and city-pair characteristics, and can be plundered by enemy units. Distinct from p1-01's instantaneous luxury-for-gold trade modal.
+
+## Acceptance
+
+- β Caravan unit type with movement, finite cargo capacity, and a route assignment from origin β destination city.
+- β Per-turn trade yield computation in `mc-trade` based on route distance, city populations, road/river connections, and luxury parity between endpoints.
+- β Plunder mechanic: enemy military unit ending its turn on a caravan's hex captures cargo + interrupts the route.
+- β Route persistence across turns: the caravan auto-loops between endpoints, generating yield each cycle, until destroyed or reassigned.
+- β International routes (own-city β foreign-city) gated by diplomatic state β peace required, war breaks the route, alliance gives bonus.
+- β UI: route-management panel showing all active routes, per-route yield, expected-arrival turns, and reassignment controls.
+- β Caravan sprite + roads-and-rivers visual feedback distinguishing trade-routed paths.
+
+## Relationship to existing trade
+
+- `p1-01` (Diplomacy-lite β peace/war + one trade action) is the Game 1 trade surface. Gold-for-luxury exchange is instantaneous, no unit involved. Caravans are the persistent / spatial trade upgrade.
+- `mc-trade` already has `Relation::{Peace, War}` and `apply_trade_offer` β caravan routes layer on top, they don't replace.
+
+## Non-goals
+
+- Trade depots / warehouses as separate building types (could be a sub-feature of the harbor / city-improvement system if naval-coupled).
+- Stock-market / commodity-pricing minigame (out-of-scope even post-v10 unless a specific economic-focused expansion is greenlit).
+- Cross-game-world trade (any kind of inter-game economy is beyond the scope of any single game's design).
diff --git a/.project/objectives/objectives.json b/.project/objectives/objectives.json
index 392fe01d..5770a0d2 100644
--- a/.project/objectives/objectives.json
+++ b/.project/objectives/objectives.json
@@ -1,13 +1,13 @@
{
- "generated_at": "2026-04-26T07:39:22Z",
+ "generated_at": "2026-04-26T08:14:51Z",
"totals": {
"done": 87,
- "in_progress": 1,
- "partial": 7,
+ "in_progress": 0,
+ "partial": 8,
"stub": 8,
"missing": 9,
- "oos": 18,
- "total": 130
+ "oos": 20,
+ "total": 132
},
"objectives": [
{
@@ -796,12 +796,12 @@
"id": "p1-28",
"title": "Culture research tree β real graph, bridge, UI",
"priority": "p1",
- "status": "in_progress",
+ "status": "partial",
"scope": "game1",
"owner": "shipwright",
"updated_at": "2026-04-26",
"blocked_by": [],
- "summary": "The culture data files (`public/games/age-of-dwarves/data/culture/manifest.json` β\n`public/resources/culture/*.json`) describe a six-pillar culture tree that\nmirrors the tech-tree shape: `id`, `name`, `pillar`, `era`, `tier`, `cost`,\n`requires`, `unlocks{β¦}`, `flavor`. The web guide already renders it via the\nshared `TechTreeGraph` component (`CultureTreePage.tsx`).\n\nInside the Godot game there is **no** culture-tree surface: no Rust research\ngraph, no GDExtension bridge, no GDScript wrapper, no scene, no per-turn\nresearch accumulator. The `CulturePool` only powers border expansion.\n\nThis objective ships the live culture-research path end-to-end so the player\ncan open a culture-tree screen identical in UX to the tech tree, pick a\ntradition, accumulate culture-research progress per turn, and unlock\nbuildings / wonders / lenses / mechanics on completion."
+ "summary": "The culture data files\n(`public/games/age-of-dwarves/data/culture/manifest.json` β\n`public/resources/culture/*.json`) describe a six-pillar culture tree that\nmirrors the tech-tree shape: `id`, `name`, `pillar`, `era`, `tier`, `cost`,\n`requires`, `unlocks{β¦}`, `flavor`. The web guide already renders it via the\nshared `TechTreeGraph` component (`CultureTreePage.tsx`).\n\nInside the Godot game there was no culture-tree surface: no Rust research\ngraph, no GDExtension bridge, no GDScript wrapper, no scene, no per-turn\nresearch accumulator. The `CulturePool` only powered border expansion.\n\nThis objective shipped the live culture-research path end-to-end so the\nplayer can open a culture-tree screen identical in UX to the tech tree,\npick a tradition, accumulate culture-research progress per turn, and unlock\nbuildings / wonders / lenses / mechanics on completion."
},
{
"id": "p2-06",
@@ -1402,6 +1402,28 @@
"blocked_by": [],
"summary": "Demonia (NGNL rank 11) are the demon species of the Ethereal Plane, aligned with Chaos school. Low-to-mid tier; they have no coherent belief system, making them the primary beachhead for Terran religious conversion β susceptible when isolated, violently opposed when organized. They are the \"wild card\" species of Game 5: unpredictable alliances, high aggression, and the most conventional military threat."
},
+ {
+ "id": "g6-01",
+ "title": "Naval combat β out-of-scope (post-v10)",
+ "priority": "p3",
+ "status": "oos",
+ "scope": "post-v10",
+ "owner": "",
+ "updated_at": "2026-04-26",
+ "blocked_by": [],
+ "summary": "Hex-based naval combat β water-tile movement for ships, ship unit types (transport / warship / etc.), naval-vs-naval and naval-vs-coastal-city combat, harbor / port buildings, sea-region map topology where applicable."
+ },
+ {
+ "id": "g6-02",
+ "title": "Caravan trade routes β out-of-scope (post-v10)",
+ "priority": "p3",
+ "status": "oos",
+ "scope": "post-v10",
+ "owner": "",
+ "updated_at": "2026-04-26",
+ "blocked_by": [],
+ "summary": "Persistent trade-route units (caravans, traders) that travel between owned cities OR between own-city and foreign-city, generate per-turn gold/resource yields tied to distance and city-pair characteristics, and can be plundered by enemy units. Distinct from p1-01's instantaneous luxury-for-gold trade modal."
+ },
{
"id": "p3-01",
"title": "Courier-gated diplomacy β open borders + shared maps via tech-tiered courier units",