docs(@projects/@magic-civilization): p3-29 step 1 complete — Rust turn surfaces CityGrew + CityBordersExpanded + FloraSuccession

All three granular UI events the GDScript turn emitted inline are now emitted by the Rust turn
(replay value now; UI-parity ready for the swap). Remaining: step 2 (dict surface) + steps 3-5
(turn_manager → GdTurnProcessor.step + delete GDScript orchestration + render proof).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Natalie 2026-06-27 03:28:54 -04:00
parent 8e17594564
commit 91095be232

View file

@ -77,11 +77,10 @@ this session but the live game still runs GDScript — the event-surface gap was
- [x] **CityGrew** event (06c6e2547) — process_city_production emits it on growth.
- [x] **CityBordersExpanded** event (db808e477) — process_culture emits it on tile claim.
- [ ] **FloraSuccession** — DEFERRED to the swap pass: ecology runs in the END_OF_TURN_PHASES
registry whose `SimPhaseFn = fn(&mut GameState)` has no event sink; surfacing flora needs
either the registry signature to carry `&mut Vec<TurnEvent>` (a ~40-test-call-site cascade)
or a transient `GameState.pending_flora_events` buffer drained by `step()`. The registry-
events refactor belongs with steps 3-5 (it's needed there anyway), so flora rides with it.
- [x] **FloraSuccession** (7b6d24bde) — ecology buffers transitions into transient
`GameState.pending_flora_events`; `step()` drains them into `FloraSuccession` events (avoided
the registry-signature cascade via the buffer). **STEP 1 COMPLETE** — the Rust turn now emits
all three granular UI events the GDScript turn emitted inline.
Both high-value growth/border events are surfaced (replay value now; UI-parity at the swap).
Remaining: FloraSuccession + the registry-events refactor + dict surface + the live swap +