diff --git a/.project/objectives/p3-29-rail1-turn-unification.md b/.project/objectives/p3-29-rail1-turn-unification.md index fb3cc59d..179ebca7 100644 --- a/.project/objectives/p3-29-rail1-turn-unification.md +++ b/.project/objectives/p3-29-rail1-turn-unification.md @@ -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` (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 +