diff --git a/.project/objectives/p1-44c-buildings-as-producers-followups.md b/.project/objectives/p1-44c-buildings-as-producers-followups.md index 640bde4e..50beb2d7 100644 --- a/.project/objectives/p1-44c-buildings-as-producers-followups.md +++ b/.project/objectives/p1-44c-buildings-as-producers-followups.md @@ -9,6 +9,8 @@ parent: p1-44 evidence: - src/game/engine/scenes/city/city_screen.gd — _refresh_building_queues + _make_building_queue_panel added (cycle 35) - src/game/engine/tests/unit/test_p1_44c_per_building_ui.gd — 5 GUT headless tests (cycle 35) + - src/simulator/api-gdext/src/lib.rs:2225 — get_building_queues exposes BTreeMap queues to GDScript (f52e20bff, cycle 36) + - src/simulator/crates/mc-ai/src/tactical/production.rs:202 — building_origin_for routes gated units to producer queue (f52e20bff, cycle 36) --- ## Summary @@ -24,8 +26,11 @@ Phase B tightest-scope cut. - ✗ `city.gd::production_queue` retired in GDScript: replaced by `construction_queue` (buildings + upgrades) + `building_queues` dict per producer building. Bridge updated to consume the Rust BTreeMap shape. - **NOTE**: GDExt bridge does not yet expose `queues` field on city — needs - api-gdext extension (simulator-infra domain, cycle 36 target). + **NOTE**: GDExt bridge NOW exposes `get_building_queues()` in api-gdext + (f52e20bff, cycle 36, `src/simulator/api-gdext/src/lib.rs:2225`). The + remaining work is the GDScript-side retirement of `production_queue: Array` + in `src/game/engine/src/entities/city.gd:57` and wiring the bridge + accessors into city entity + dispatch. - ✓ `city_screen.gd` rework: `_refresh_building_queues()` + `_make_building_queue_panel()` added. Reads `city.get("queues", {})` and creates one PanelContainer per producer building in `%BuildingQueuesContainer` (falls back silently when bridge field absent). @@ -34,20 +39,25 @@ Phase B tightest-scope cut. - ✗ `Building` schema gains `produces: Array` mirror (currently unit JSON declares `requires_building`; the bidirectional mirror is authoring redundancy — see p1-43 validator rules). -- ✗ AI emission: `mc-ai/tactical/production.rs` emits one - `Action::SetProduction { city_id, building_id: Option, item_id }` - per producer building per turn. Per-building scoring decides what each - producer queues. `building_id == None` means construction. +- ✓ AI emission: `mc-ai/tactical/production.rs` emits `Action::EnqueueBuild` + with `building_origin` field per city per turn. `building_origin_for()` at + line 219 routes units that declare `requires_building` to the producer + building queue; all other items (buildings, wonders, ungated units) route + to `"__city_center__"`. GDScript dispatch at + `ai_turn_bridge_dispatch.gd:234` reads `building_origin` and calls + `city._bridge._gd_city.call("enqueue_to_building", building_origin, item_id)`. + Evidence: `src/simulator/crates/mc-ai/src/tactical/production.rs:202` + (f52e20bff, cycle 36). - ✗ Themed civilian unit roster: `battle_priest` (temple), `sage` - (library/university), `cartographer` (observatory), `merchant` (market), - `bard` (gathering_hall), `loremaster` (great_hall). Per-unit list - confirmed by p1-43 design pass. + (library/university), `cartographer` (observatory) — 3 still missing. + `bard.json` (gathering_hall), `loremaster.json` (great_hall), + `merchant.json` (market) — 3 already authored. - ✓ Headless GUT tests: 5 tests in `test_p1_44c_per_building_ui.gd` covering dict shape, queue separation, empty city, panel label derivation, and BTreeMap key accessibility. (cycle 35) -- ✗ Regression batch: `apricot-run.sh launch smoke 10 200` to confirm AI - cities with multiple producer buildings produce DIFFERENT units in the same turn. - Blocked until bridge exposes queues + AI emission lands. +- ✗ Regression batch: 10-seed `apricot-run.sh launch smoke 10 200` to confirm + AI cities with multiple producer buildings produce DIFFERENT units in the + same turn. Now unblocked (bridge exposed + AI emission wired in cycle 36). ## Out of scope @@ -62,3 +72,9 @@ Phase B tightest-scope cut. The Rust engine layer is now fully ready to host per-building queues with deterministic split production. p1-44c lifts the remaining presentation, AI, content, and verification work onto the new foundation. + +Cycle-39 batch: stamp=20260506_232419 launched async (10 seeds, 200 turns, +smoke mode). Fetch with `scripts/apricot-run.sh fetch 20260506_232419` after +completion. Verify differentiation: look for multiple distinct unit-ids in +`events.jsonl` unit_created entries per turn per player in cities with ≥2 +producer buildings.