diff --git a/.project/objectives/p3-27-biosphere-headless.md b/.project/objectives/p3-27-biosphere-headless.md index c379a331..095da4da 100644 --- a/.project/objectives/p3-27-biosphere-headless.md +++ b/.project/objectives/p3-27-biosphere-headless.md @@ -22,7 +22,15 @@ interact with. ## Acceptance - [x] **Ecology population tick** ✅ (eb38e8678 + cba0ea8ec) — `process_ecology_phase` drives `EcologyEngine` per turn in `apply_end_turn` (relocated from mc-turn to dodge the mc-turn→mc-ecology→mc-mapgen cycle); seeds genesis on tick 1, persists via continuation-JSON on GameState; FFI `set_ecology_species_json` + harness `_apply_ecology_species`. mc-player-api 138/0. -- [~] **Flora succession** — `EcologyEngine::process_step` already returns + applies `FloraTransition`s (subsumed in the ecology tick above). Confirm whether a separate `mc-flora::FloraEngine` pass is still needed or if process_step covers it. +- [x] **Flora succession** — CONFIRMED 2026-06-27: `process_step` SUBSUMES it; no separate + `mc-flora::FloraEngine` pass is needed. Verified in engine code (not just the doc-comment): + `EcologyEngine::process_step` (engine.rs:341) calls `run_tier_advancement` (engine.rs:500), + which advances tiers **in-place** (`tile_populations.par_iter_mut` → `tier::tick_tiers_capped` + mutates each tile's `slots`, engine.rs:529/564) and returns the producer-diet `FloraTransition`s + purely as a chronicle **report**. The headless ecology phase (mc-turn `ecology_phase.rs:76`) + applies the succession by calling `process_step` and buffers the returned transitions into + `pending_flora_events` for the p3-29 `FloraSuccession` event surface — it does not need to + re-apply them. So flora succession is live + Rust-authoritative in the headless tick. - [x] **Marine ecology (core) — DONE; ocean-collapse refinement is GOLD-PLATING, dropped** ✅ (verified 2026-06-27). Per-tile fish-stock + coral-reef + mangrove→fish feedback tick inside `EcologyEngine::process_step` (engine.rs:416/424) in the headless ecology phase. `ocean_dead_fraction`