docs(@projects): ✓ update p1-44c followup objective docs

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
Natalie 2026-05-06 23:25:49 -07:00
parent a5da3bea30
commit 0cb76bfb35

View file

@ -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<unit_id>` 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<BuildingId>, 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.