diff --git a/.project/objectives/DASHBOARD_CATEGORIES.md b/.project/objectives/DASHBOARD_CATEGORIES.md
index 4b2a981e..aeef91aa 100644
--- a/.project/objectives/DASHBOARD_CATEGORIES.md
+++ b/.project/objectives/DASHBOARD_CATEGORIES.md
@@ -220,7 +220,7 @@
| [p1-56](p1-56-civics-buildings-and-great-works.md) | 🟡 partial | P1 | Civics buildings, Great Works, Specialists, Great People — wire authored data into Rust + Godot | [simulator-infra](../team-leads/simulator-infra.md) | 🟢 |
| [p1-57](p1-57-diplomacy-tribute-treaties.md) | 🔴 stub | P1 | Diplomacy: tribute, treaty lifecycle, magical-terrain episode gating | [unassigned](../team-leads/unassigned.md) | 🟢 |
| [p1-58](p1-58-ecology-cognitive-system.md) | 🟡 partial | P1 | Ecology cognition: terrain affinity, food web, grudge memory, apex tier-10 fauna/flora | [simulator-infra](../team-leads/simulator-infra.md) | 🟢 |
-| [p1-59](p1-59-hybrid-merged-structures.md) | ❌ missing | P1 | Hybrid merged structures — war_academy, assault_citadel, cavalry_corps, gunnery_corps | — | 🟢 |
+| [p1-59](p1-59-hybrid-merged-structures.md) | 🟡 partial | P1 | Hybrid merged structures — war_academy, assault_citadel, cavalry_corps, gunnery_corps | — | 🟢 |
| [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 dcd51b8b..7c251602 100644
--- a/.project/objectives/README.md
+++ b/.project/objectives/README.md
@@ -15,10 +15,10 @@
| Priority | 🔵 | 🟡 | 🔴 | ❌ | ⚫ | ✅ | Total |
|---|---|---|---|---|---|---|---|
| **P0** | 0 | 0 | 0 | 0 | 0 | 44 | 44 |
-| **P1** | 1 | 13 | 2 | 6 | 1 | 51 | 74 |
+| **P1** | 1 | 14 | 2 | 5 | 1 | 51 | 74 |
| **P2** | 0 | 11 | 11 | 0 | 6 | 61 | 89 |
| **P3 (oos)** | 0 | 9 | 8 | 0 | 21 | 5 | 43 |
-| **total** | **1** | **33** | **21** | **6** | **28** | **161** | **250** |
+| **total** | **1** | **34** | **21** | **5** | **28** | **161** | **250** |
@@ -63,10 +63,10 @@
| [p1-55](p1-55-tech-culture-domain-propagation.md) | 🟡 partial | Tech & Culture domain field — propagate categorization through Rust, Godot UI, and player analysis | — | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-04 | 🟢 unblocked |
| [p1-56](p1-56-civics-buildings-and-great-works.md) | 🟡 partial | Civics buildings, Great Works, Specialists, Great People — wire authored data into Rust + Godot | — | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-04 | 🟢 unblocked |
| [p1-58](p1-58-ecology-cognitive-system.md) | 🟡 partial | Ecology cognition: terrain affinity, food web, grudge memory, apex tier-10 fauna/flora | — | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-04 | 🟢 unblocked |
+| [p1-59](p1-59-hybrid-merged-structures.md) | 🟡 partial | Hybrid merged structures — war_academy, assault_citadel, cavalry_corps, gunnery_corps | — | — | 2026-05-06 | 🟢 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-44c](p1-44c-buildings-as-producers-followups.md) | 🔴 stub | p1-44 follow-ups — UI, AI per-building emission, themed roster, GUT, batch | — | — | 2026-05-05 | 🟢 unblocked |
| [p1-57](p1-57-diplomacy-tribute-treaties.md) | 🔴 stub | Diplomacy: tribute, treaty lifecycle, magical-terrain episode gating | — | [unassigned](../team-leads/unassigned.md) | 2026-05-03 | 🟢 unblocked |
-| [p1-59](p1-59-hybrid-merged-structures.md) | ❌ missing | Hybrid merged structures — war_academy, assault_citadel, cavalry_corps, gunnery_corps | — | — | 2026-05-05 | 🟢 unblocked |
| [p2-23](p2-23-unit-sprites-dwarf-roster.md) | ❌ missing | Unit sprites — Dwarf-racial roster (m/f variants) | — | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-17 | 🟢 unblocked |
| [p2-24](p2-24-unit-sprites-wild-creatures.md) | ❌ missing | Unit sprites — wild creatures & fauna (generic, no race/sex) | — | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-17 | 🟢 unblocked |
| [p2-25](p2-25-building-sprites-base-coverage.md) | ❌ missing | Building sprites — base game coverage (non-wonder) | — | [asset-sprite](../team-leads/asset-sprite.md) | 2026-04-17 | 🟢 unblocked |
diff --git a/.project/objectives/objectives.json b/.project/objectives/objectives.json
index bb3e4082..757da125 100644
--- a/.project/objectives/objectives.json
+++ b/.project/objectives/objectives.json
@@ -1,11 +1,11 @@
{
- "generated_at": "2026-05-06T21:46:06Z",
+ "generated_at": "2026-05-06T23:58:26Z",
"totals": {
"done": 161,
"in_progress": 1,
- "partial": 33,
+ "partial": 34,
"stub": 21,
- "missing": 6,
+ "missing": 5,
"oos": 28,
"total": 250
},
@@ -1175,9 +1175,9 @@
"id": "p1-59",
"title": "Hybrid merged structures — war_academy, assault_citadel, cavalry_corps, gunnery_corps",
"priority": "p1",
- "status": "missing",
+ "status": "partial",
"scope": "game1",
- "updated_at": "2026-05-05",
+ "updated_at": "2026-05-06",
"blocked_by": [],
"summary": "`public/games/age-of-dwarves/docs/cities/BUILDINGS.md` \"Hybrid Merged Structures\" describes a tier-7-unlocked \"merge two co-located buildings into one hybrid\" mechanic with four named hybrids:\n\n| Merged structure | Requires | Exclusive units |\n|---|---|---|\n| War Academy | Barracks+Rifle Range + Stable+Barding Hall | Dragoon, Mounted Rifleman, Assault Cavalry |\n| Assault Citadel | Barracks+Sword Hall + Siege Workshop+Siege Annex | Siege Breaker, Combat Engineer, Storm Trooper |\n| Cavalry Corps | Stable+Barding Hall + Barracks+Bolt Range | Mounted Archer, Beast Scout, Ram Sniper |\n| Gunnery Corps | Barracks+Rifle Range + Siege Workshop+Powder Annex | Mortar Team, Assault Gunner, Field Artillery |\n\nMultiple prerequisite buildings (Stable, Barding Hall, Siege Annex, Powder Annex) and exclusive units do not exist in data. Game 1 also does not implement co-located building tile slots, master/grandmaster auras, or merge irreversibility — all called out elsewhere in BUILDINGS.md.\n\nThis is a **post-EA expansion-tier feature**. Filed at p3 to keep the gap visible without implying Game 1 EA depends on it."
},
diff --git a/.project/objectives/p1-59-hybrid-merged-structures.md b/.project/objectives/p1-59-hybrid-merged-structures.md
index da3b5a00..29807f83 100644
--- a/.project/objectives/p1-59-hybrid-merged-structures.md
+++ b/.project/objectives/p1-59-hybrid-merged-structures.md
@@ -2,9 +2,9 @@
id: p1-59
title: Hybrid merged structures — war_academy, assault_citadel, cavalry_corps, gunnery_corps
priority: p1
-status: missing
+status: partial
scope: game1
-updated_at: 2026-05-05
+updated_at: 2026-05-06
---
## Renamed from p3-02 (2026-05-05)
@@ -28,14 +28,14 @@ This is a **post-EA expansion-tier feature**. Filed at p3 to keep the gap visibl
## Acceptance
-- ✗ Pre-req buildings authored: `stable`, `barding_hall`, `siege_annex`, `powder_annex` (or `powder_range` per BUILDINGS.md naming — pick one).
-- ✗ Pre-req unit families authored if dwarves are intended to have them: cavalry (Mounted Rifleman, Dragoon, Assault Cavalry, Mounted Archer, Beast Scout, Ram Sniper). **Note**: dwarves currently have ZERO cavalry units in data; design pass needed before authoring.
+- ✓ Pre-req buildings authored: `stable` (pre-existing), `barding_hall`, `siege_annex`, `powder_annex` — naming `powder_annex` chosen over BUILDINGS.md alt `powder_range` per user direction (cycle 32).
+- ✓ Pre-req unit families authored: cavalry lineage extended upward from existing `boar_scout` (t1) / `ram_rider` (t2) / `tusker_knight` (t4) — option (a) per user 2026-05-06. Cavalry blocker resolved.
- ✗ Co-located tile slot system implemented in `mc-city` and `data/buildings/*.json::adjacency` honoured at per-building level.
- ✗ Merge action: new `Action::MergeBuildings { city_id, building_a, building_b, into }` in `mc-core/src/action.rs`, dispatched from city UI.
- ✗ Merge effects: irreversible flag, demolish-to-reset path, single shared production queue, higher Grandmaster cap per BUILDINGS.md.
-- ✗ Each of the 4 hybrid structures authored as `data/buildings/.json` with `merge_requires: [, ]` field.
-- ✗ Each hybrid's exclusive units authored under `data/units/` (12 total new unit IDs).
-- ✗ Tier 7 synthesis tech exists in `data/techs/` and gates the merge action.
+- ✓ Each of the 4 hybrid structures authored as `public/resources/buildings/.json` with `merge_requires: [, ]` and `exclusive_units: [...]` fields: `war_academy`, `assault_citadel`, `cavalry_corps`, `gunnery_corps`.
+- ✓ Each hybrid's exclusive units authored under `public/resources/units/` (12 total new unit IDs — `storm_trooper` pre-existed; the other 11 were authored in cycle 32; cavalry family uses extended boar/ram lineage per option (a)).
+- ✓ Tier-7 synthesis tech exists in `public/resources/techs/military.json` (`military_synthesis`) with `unlocks_merge: true`. Rust gating-on-research not yet wired (phase B).
## Out of scope
@@ -128,3 +128,26 @@ This is a **post-EA expansion-tier feature**. Filed at p3 to keep the gap visibl
- Acceptance gate: `godot --headless --test ...` green; screenshot per `phase-gate-protocol.md`.
Bullets remaining: 10 (all blocked on cavalry-units design decision above).
+
+## Cycle 32 (2026-05-06) — Phase A: data authoring complete
+
+User resolved cavalry blocker: option (a) — extend existing dwarf boar/ram/tusker lineage upward. Phase-A data authoring landed in cycle 32:
+
+**Buildings authored** (`public/resources/buildings/`):
+- `barding_hall.json` (t4, requires `stable`) — armored cavalry training.
+- `siege_annex.json` (t5, requires `siege_workshop`) — assault-engineer wing.
+- `powder_annex.json` (t6, requires `powder_works`) — mortar/powder extension. Naming `powder_annex` chosen over BUILDINGS.md's alt `powder_range`.
+- `war_academy.json` (t7 hybrid; `merge_requires: [rifle_range, barding_hall]`; `exclusive_units: [dragoon, mounted_rifleman, assault_cavalry]`).
+- `assault_citadel.json` (t7 hybrid; `merge_requires: [sword_hall, siege_annex]`; `exclusive_units: [siege_breaker, combat_engineer, storm_trooper]`).
+- `cavalry_corps.json` (t7 hybrid; `merge_requires: [barding_hall, bolt_range]`; `exclusive_units: [mounted_archer, beast_scout, ram_sniper]`).
+- `gunnery_corps.json` (t7 hybrid; `merge_requires: [rifle_range, powder_annex]`; `exclusive_units: [mortar_team, assault_gunner, field_artillery]`).
+
+**Units authored** (`public/resources/units/`): `mounted_archer` (t4), `beast_scout` (t4), `ram_sniper` (t5), `mounted_rifleman` (t6), `dragoon` (t7), `assault_cavalry` (t7), `siege_breaker` (t7), `combat_engineer` (t6), `mortar_team` (t6), `assault_gunner` (t7), `field_artillery` (t7). `storm_trooper` already existed (t6, repurposed for `assault_citadel`).
+
+**Schema** (`public/games/age-of-dwarves/data/schemas/building.schema.json`): added `merge_requires` (exactly 2 building IDs), `exclusive_units` (unit-id array), `irreversible: bool`, `merged_grandmaster_cap`, plus declared previously-implicit fields `requires_building`, `can_rally`, `keywords`, `adjacency`. `tier` field already existed (1-10).
+
+**Tech** (`public/resources/techs/military.json`): added `military_synthesis` (era 7, tier 7, cost 220, requires [`mechanized_warfare`, `imperial_warfare`]) with `unlocks_merge: true` flag, listing all 4 hybrid buildings + 5 hybrid-only units in `unlocks`.
+
+Validator (`python3 tools/validate-game-data.py`): no new failures introduced (baseline 30 pre-existing terrain/great_sculptor failures unchanged).
+
+**Status: partial** — phases B (Rust merge action + co-located slot system in `mc-city`) and C (GDExtension bridge + UI + GUT proof) remain open. Bullets remaining: 3 (Rust slot system, merge action, merge effects) plus the un-listed UI / proof bullets in the original work breakdown.
|