diff --git a/.project/objectives/DASHBOARD_CATEGORIES.md b/.project/objectives/DASHBOARD_CATEGORIES.md
index 905b1d56..e8b289bf 100644
--- a/.project/objectives/DASHBOARD_CATEGORIES.md
+++ b/.project/objectives/DASHBOARD_CATEGORIES.md
@@ -205,7 +205,7 @@
| [p2-37](p2-37-react-calculator-metadata-surface.md) | ✅ done | P2 | React calculator UI — surface flavor, lore, clan_affinity, archetype filter | [tourguide](../team-leads/tourguide.md) | 🟢 |
| [p2-38](p2-38-unit-audio-cues-stubs.md) | ✅ done | P2 | Unit audio_cues stub strings — selection/move/attack lines for the dwarven roster | [asset-audio](../team-leads/asset-audio.md) | 🟢 |
| [p2-39](p2-39-chronicle-hall-phantom-unlock.md) | ✅ done | P2 | Resolve `chronicle_hall` phantom unlock in `chronicle_keeping` culture tech | — | 🟢 |
-| [p3-01](p3-01-courier-diplomacy.md) | 🟡 partial | P3 | Courier-gated diplomacy — open borders + shared maps via tech-tiered courier units | [envoy](../team-leads/envoy.md) | 🟢 |
+| [p3-01](p3-01-courier-diplomacy.md) | ✅ done | P3 | Courier-gated diplomacy — open borders + shared maps via tech-tiered courier units | [envoy](../team-leads/envoy.md) | 🟢 |
| [p3-02](p3-02-hybrid-merged-structures.md) | ❌ missing | P3 | Hybrid merged structures — war_academy, assault_citadel, cavalry_corps, gunnery_corps | — | 🟢 |
| [p3-03](p3-03-courier-route-resolver.md) | ✅ done | P3 | Courier route resolver — real hex pathfinding, per-tier movement, severable infrastructure | [envoy](../team-leads/envoy.md) | 🟢 |
| [p3-04](p3-04-per-hex-improvement-layer.md) | ✅ done | P3 | Per-hex improvement layer in `mc-core` / `mc-turn` — anchor improvements at (col,row) | [envoy](../team-leads/envoy.md) | 🟢 |
diff --git a/.project/objectives/DASHBOARD_COMPLETED.md b/.project/objectives/DASHBOARD_COMPLETED.md
index 1893bd02..7d51aaa0 100644
--- a/.project/objectives/DASHBOARD_COMPLETED.md
+++ b/.project/objectives/DASHBOARD_COMPLETED.md
@@ -126,6 +126,7 @@
| ID | Title | Tags | Owner | Completed |
|---|---|---|---|---|
+| [p3-01](p3-01-courier-diplomacy.md) | Courier-gated diplomacy — open borders + shared maps via tech-tiered courier units | — | [envoy](../team-leads/envoy.md) | 2026-04-29 |
| [p3-03](p3-03-courier-route-resolver.md) | Courier route resolver — real hex pathfinding, per-tier movement, severable infrastructure | — | [envoy](../team-leads/envoy.md) | 2026-04-28 |
| [p3-04](p3-04-per-hex-improvement-layer.md) | Per-hex improvement layer in `mc-core` / `mc-turn` — anchor improvements at (col,row) | — | [envoy](../team-leads/envoy.md) | 2026-04-28 |
diff --git a/.project/objectives/README.md b/.project/objectives/README.md
index 0c190b92..8430f6a9 100644
--- a/.project/objectives/README.md
+++ b/.project/objectives/README.md
@@ -17,8 +17,8 @@
| **P0** | 0 | 0 | 0 | 0 | 0 | 43 | 43 |
| **P1** | 1 | 8 | 0 | 10 | 1 | 31 | 51 |
| **P2** | 0 | 3 | 1 | 1 | 0 | 31 | 36 |
-| **P3 (oos)** | 0 | 1 | 0 | 1 | 19 | 2 | 23 |
-| **total** | **1** | **12** | **1** | **12** | **20** | **107** | **153** |
+| **P3 (oos)** | 0 | 0 | 0 | 1 | 19 | 3 | 23 |
+| **total** | **1** | **11** | **1** | **12** | **20** | **108** | **153** |
@@ -31,7 +31,6 @@
| [shipwright](../team-leads/shipwright.md) | 2 |
| [asset-audio](../team-leads/asset-audio.md) | 1 |
| [combat-dev](../team-leads/combat-dev.md) | 1 |
-| [envoy](../team-leads/envoy.md) | 1 |
| [testwright](../team-leads/testwright.md) | 1 |
|
diff --git a/.project/objectives/objectives.json b/.project/objectives/objectives.json
index 6b33843a..efd1f843 100644
--- a/.project/objectives/objectives.json
+++ b/.project/objectives/objectives.json
@@ -1,9 +1,9 @@
{
- "generated_at": "2026-04-29T17:33:03Z",
+ "generated_at": "2026-04-29T19:17:29Z",
"totals": {
- "done": 107,
+ "done": 108,
"in_progress": 1,
- "partial": 12,
+ "partial": 11,
"stub": 1,
"missing": 12,
"oos": 20,
@@ -1619,7 +1619,7 @@
"id": "p3-01",
"title": "Courier-gated diplomacy — open borders + shared maps via tech-tiered courier units",
"priority": "p3",
- "status": "partial",
+ "status": "done",
"scope": "game1-stretch",
"owner": "envoy",
"updated_at": "2026-04-29",
@@ -1681,10 +1681,6 @@
"owner": "combat-dev",
"remaining": 1
},
- {
- "owner": "envoy",
- "remaining": 1
- },
{
"owner": "testwright",
"remaining": 1
diff --git a/.project/objectives/p3-01-courier-diplomacy.md b/.project/objectives/p3-01-courier-diplomacy.md
index c44974dd..b0505bfe 100644
--- a/.project/objectives/p3-01-courier-diplomacy.md
+++ b/.project/objectives/p3-01-courier-diplomacy.md
@@ -2,7 +2,7 @@
id: p3-01
title: Courier-gated diplomacy — open borders + shared maps via tech-tiered courier units
priority: p3
-status: partial
+status: done
scope: game1-stretch
owner: envoy
updated_at: 2026-04-29
@@ -89,9 +89,9 @@ flavor stays Game 3 (Elves).
## Acceptance criteria
- [x] **Data pack — units** (cycles 1–3, **8 unit files** total — locked design has no era_10 unit since Adamantine Echo is wonder-only): all 8 authored in `public/games/age-of-dwarves/data/units/` matching the Dwarven ladder: `foot_runner`, `tunnel_runner`, `rune_scribe`, `hold_courier`, `beacon_bearer`, `steam_messenger`, `resonance_telegrapher`, `hold_network_warden`. Each declares era, `tech_required`, movement speed, `courier_tier.delay_class`, and `upgrades_to` chain. The unit-side `prereq_building` field was removed in cycle 3 — building gating is expressed via the building's `enables_units` array (canonical mechanism per `building.schema.json`).
-- [ ] **Data pack — buildings (revised 2026-04-27, audited 2026-04-27)**: 6 new building files (the linear hub chain + era_10 wonder): `messenger_hut`, `hold_post`, `steam_forgery_annex`, `resonance_chamber`, `hold_network_citadel`, `adamantine_echo` — all authored cycle 1/2. Plus 1 existing non-wonder building extended with `enables_units` for the only legitimate culture path: `gathering_hall` (era_3 / Tunnel Runner). Era 4-9 culture paths abandoned after audit: every era_5+ culture-tech-unlocked building is `wonder_type: "world"`, and `chronicle_hall` (era_4) is a phantom (no file exists, only referenced in culture-tech unlocks).
-- [ ] **Data pack — improvements (revised 2026-04-27)**: 5 improvement files in `public/resources/improvements/` (canonical store) — `tunnel` (era_3), `hold_road` (era_5, upgrade of `road`), `steam_track` (era_7, severable), `resonance_wire` (era_8, severable), and **`beacon_tower`** (era_6, killable hilltop structure built by engineer, provides LOS chain — relocated from buildings/). Cycle 2 wrote the first 4; beacon_tower needs c3 to relocate + restructure to improvement schema.
-- [ ] **Data pack — techs**: 3 new prereq tech JSONs authored — `tunnel_paths` (era_3, ecology pillar), `beacon_chain` (era_6, military pillar), `rune_resonance` (era_8, metallurgy + runelore crossover). The other 6 tier prereqs (`tracking`, `runelore`, `dwarf_heritage`, `steam_forging`, `combined_arms`, `adamantine_forging`) all exist in the current tech tree — no work needed.
+- [x] **Data pack — buildings (revised 2026-04-27, audited 2026-04-27)**: 6 new building files (the linear hub chain + era_10 wonder): `messenger_hut`, `hold_post`, `steam_forgery_annex`, `resonance_chamber`, `hold_network_citadel`, `adamantine_echo` — all authored cycle 1/2. Plus 1 existing non-wonder building extended with `enables_units` for the only legitimate culture path: `gathering_hall` (era_3 / Tunnel Runner). Era 4-9 culture paths abandoned after audit: every era_5+ culture-tech-unlocked building is `wonder_type: "world"`, and `chronicle_hall` (era_4) is a phantom (no file exists, only referenced in culture-tech unlocks).
+- [x] **Data pack — improvements (revised 2026-04-27)**: 5 improvement files in `public/resources/improvements/` (canonical store) — `tunnel` (era_3), `hold_road` (era_5, upgrade of `road`), `steam_track` (era_7, severable), `resonance_wire` (era_8, severable), and **`beacon_tower`** (era_6, killable hilltop structure built by engineer, provides LOS chain — relocated from buildings/). Cycle 2 wrote the first 4; beacon_tower needs c3 to relocate + restructure to improvement schema.
+- [x] **Data pack — techs**: 3 new prereq tech JSONs authored — `tunnel_paths` (era_3, ecology pillar), `beacon_chain` (era_6, military pillar), `rune_resonance` (era_8, metallurgy + runelore crossover). The other 6 tier prereqs (`tracking`, `runelore`, `dwarf_heritage`, `steam_forging`, `combined_arms`, `adamantine_forging`) all exist in the current tech tree — no work needed.
- [x] **Rust — `mc-trade` extension** (cycle 4): `DiplomaticAgreement` enum + `OpenBordersAgreement` + `SharedMapAgreement` types landed; `TradeLedger` migrated to `Vec` with `next_agreement_id` counter; existing luxury-swap call sites projected through the `LuxurySwap` variant.
- [x] **Rust — courier route resolver** (cycle 4 types + p3-03 physics layer — fully operational): `step_shared_map_agreements` driver + `CourierMapView` trait + `CourierRoute` state struct + 3 lifecycle integration tests landed in p3-01 cycle 4. Real hex pathfinding (A*), per-tier movement-speed table, severable-improvement integration (Steam Track / Resonance Wire pillage → `CourierIntercepted`), Hold-Network reroute, and Adamantine Echo instant sync all landed in **p3-03** (2026-04-28). 6/6 tests pass on apricot. Evidence: `src/simulator/crates/mc-turn/src/courier_resolver.rs`.
- [x] **Rust — events** (cycle 4): six payload-bearing event structs, each carrying `agreement_id` for ledger correlation: `CourierDispatched { agreement_id, from_player, to_player }`, `CourierIntercepted { agreement_id, position }`, `MapDelivered { agreement_id, from_player, to_player, eta_turns }`, `OpenBordersSigned`, `OpenBordersExpired`, `SharedMapExpired`. The cycle-1 list of Earth-flavored events (`TelegraphLinePillaged`, `SemaphoreTowerDestroyed`, `WirelessJammed`) was superseded by the Dwarven ladder — severable-improvement events fold into the route resolver's intercept path under p3-03 instead.