From 7d4f3ba480792c291914ba182a4e377505b0b81e Mon Sep 17 00:00:00 2001 From: autocommit Date: Tue, 19 May 2026 22:46:08 -0700 Subject: [PATCH] =?UTF-8?q?docs(objectives):=20=F0=9F=93=9D=20Add=20AI=20p?= =?UTF-8?q?orting=20strategy,=20fog-of-war=20testing=20framework,=20and=20?= =?UTF-8?q?ecology=20content=20gap=20analysis=20to=20project=20objectives?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- .../objectives/p0-26-ai-tactical-rust-port.md | 2 +- .../p1-60-fog-of-war-testing-ai-fairness.md | 1 + .../p1-61-ecology-content-gap-fill.md | 89 +++++++++++++++++++ 3 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 .project/objectives/p1-61-ecology-content-gap-fill.md diff --git a/.project/objectives/p0-26-ai-tactical-rust-port.md b/.project/objectives/p0-26-ai-tactical-rust-port.md index e86ce9f8..55229934 100644 --- a/.project/objectives/p0-26-ai-tactical-rust-port.md +++ b/.project/objectives/p0-26-ai-tactical-rust-port.md @@ -45,7 +45,7 @@ Full debug trail at `.project/experiments/p0-26-p1-inert.md` — 7 rounds, meta- - Replacing MCTS with a different algorithm (strategic layer stays as-is under `p0-01`). - Reworking `ai_personalities.json` schema (clan axes, scoring weights stay). -- Wild-creature AI (`wild_creature_ai.gd` 282 LOC) — separate objective if the port pattern stresses it. Wild creatures are not player-owned, and the GDScript state-machine is a reasonable fit until AI port lessons are learned. +- Wild-creature AI (`wild_creature_ai.gd` 282 LOC) — separate objective if the port pattern stresses it. Wild creatures are not player-owned, and the GDScript state-machine is a reasonable fit until AI port lessons are learned. When that future port objective is created, it MUST include the acceptance bullet: *ported `wild_creature_ai` (Rust) calls `mc_vision::has_line_of_sight` when filtering candidates inside detection radius, so creatures cannot detect player units through mountains / dense forest within their radius.* Rationale captured in `p1-60` follow-ups; doing this in current GDScript would be thrown-away work. ## Blocks diff --git a/.project/objectives/p1-60-fog-of-war-testing-ai-fairness.md b/.project/objectives/p1-60-fog-of-war-testing-ai-fairness.md index e500d31f..e387d550 100644 --- a/.project/objectives/p1-60-fog-of-war-testing-ai-fairness.md +++ b/.project/objectives/p1-60-fog-of-war-testing-ai-fairness.md @@ -112,6 +112,7 @@ Intended outcome: every fog-of-war seam (sim → projection → save/load → re - Spell-revealed / scrying tile gates — Game 3 (magic schools). - Per-tile weather or time-of-day vision modulators — future. +- NPC perception (wild-creature LoS within detection radius) is intentionally NOT carved out as a p1-60 follow-up. The creature controller is GDScript tech-debt tracked downstream of `p0-26-ai-tactical-rust-port.md` (its non-goal #48 carries the forward-pointer); LoS filtering lands as part of the Rust port, not as a throwaway GDScript edit. Lairs (passive `encounter_radius` triggers in `mc-turn::processor`), freepeople (geometric clustering in `mc-ecology::freepeople_camps`), and flora-fauna ecology (per-tile threat eval in `mc-ecology::behavior`) have no decision surface that perception would constrain, so they require no perception work. ## Sequencing diff --git a/.project/objectives/p1-61-ecology-content-gap-fill.md b/.project/objectives/p1-61-ecology-content-gap-fill.md new file mode 100644 index 00000000..8970e3b8 --- /dev/null +++ b/.project/objectives/p1-61-ecology-content-gap-fill.md @@ -0,0 +1,89 @@ +--- +id: p1-61 +title: "Ecology content gap fill: sparse biomes + lineage tier holes (P1 actions from ecology-audit-gaps.md)" +priority: p1 +status: open +scope: game1 +owner: game-data +updated_at: 2026-05-19 +evidence: [] +follow_ups: [] +assigned_by: simulator-infra +--- + +## Summary + +`public/games/age-of-dwarves/docs/ecology-audit-gaps.md` lists actionable content gaps in the ecology corpus (149 flora + 581 fauna species, all lineage-tagged). The P0 work (schema + tagging) is done; the P1 work — fill sparse biomes and close intra-lineage tier holes — is not. This objective lands the P1 actions only. P2 (enrichment) and P3 (T8-T10 fantasy flora) are explicit non-goals here; they get their own objectives if/when the design team prioritises them. + +## Context + +The audit at `ecology-audit-gaps.md` (158 lines, single source of truth for the gap set) reports: +- Total species: 730 (over the 560 target from `project_ecology_evolution_system.md` memory). +- Lineage coverage: 100%; tier coverage: 100%; broken refs: 0; trophic ratio: 0.77 (healthy). +- Rust ecology tests: 259/259 passing (`cargo test -p mc-ecology`). + +The remaining P1 surface is purely data authoring — new JSON species files plus a small number of tier corrections within existing lineages. No Rust changes, no schema changes, no GDScript changes. + +## Source-of-truth rails + +- Canonical gap list: `public/games/age-of-dwarves/docs/ecology-audit-gaps.md` (do **not** restate counts here; if numbers diverge, that doc wins and this objective is wrong). +- Species schema: `public/resources/ecology/flora/flora.schema.json` and `public/resources/ecology/fauna/fauna.schema.json` (read-only; this objective adds species records that conform, never edits the schemas). +- Lineage rules: `public/games/age-of-dwarves/docs/ECOLOGY_BINDING.md`. +- Fantasy creature reference: `project_ecology_evolution_system.md` (memory) — D&D/MTG inspired T8-T10 set already partially authored. + +## Acceptance + +- [ ] **Flora sparse-biome fill** (per `ecology-audit-gaps.md:36-42`): + - [ ] Desert biomes (`desert`, `dune_field`, `dust_plain`): +6 species so the combined desert flora count is ≥ 10. + - [ ] Deep ocean (`deep_ocean`, `hadal_zone`, `abyssal_plain`): +4 species so the count is ≥ 5. + - [ ] Estuary: +4 species so the count is ≥ 5. + - [ ] Tundra decomposers: +3 fungi species with `tundra` biome tag. + - [ ] Cloud forest: +4 species so the count is ≥ 10. +- [ ] **Fauna sparse-biome fill** (per `ecology-audit-gaps.md:103-113`): minimum 5 species per biome for `polar_desert`, `dust_plain`, `caldera`, `lava_field`, `hadal_zone`. Net additions documented in the PR description. +- [ ] **Lineage tier-hole closure** (per `ecology-audit-gaps.md:123-128` row 2): identify each lineage in `mc-ecology` that skips a tier; either fill the missing tier with a new species OR retier an adjacent species so the lineage is contiguous. List every change in the PR description with before/after tier. +- [ ] All new species files validate against the schema (`./run verify` step 1 passes, no new `FAIL` lines). +- [ ] `cargo test -p mc-ecology` stays green (259+ tests). +- [ ] `cargo test -p mc-turn` shows no new failures (the `abstract_projection` pre-existing failure is a known orthogonal issue documented in `.project/handoffs/20260519_p1-60-orthogonal-data-schema-drift.md` and remains outside this objective). +- [ ] **Audit doc update**: after acceptance, edit `ecology-audit-gaps.md` to mark the P1 rows as done. Per `feedback_no_resolution_status.md`, this means deleting the now-stale "P1" rows from the action table, not annotating them — the doc captures *current* gaps, not history. +- [ ] No new files exceed 500 lines (`feedback_file_size_limit.md`). +- [ ] No GDScript hardcoding — all new species data lives in JSON (`feedback_json_canonical_no_hardcoding.md`). + +## Non-goals + +- **P2 actions** (boreal enrichment, marine plants, savanna fire-adapted, additional T1 pioneers, tropical fungi, cloud-forest enrichment, the temperate_forest T1-T7 biome-column validation web) — separate objective if prioritised. +- **P3 actions** (T8-T10 fantasy flora — current 11, target 25) — separate objective; magic-school binding is Game 2/3 territory anyway per `scope-game1-vs-game2.md`. +- **Schema changes** — out of scope. The `lineage` and `ecology_tier` fields are already in the schemas (per audit doc). +- **AI / behaviour changes** — wild creature AI perception is tracked downstream of `p0-26-ai-tactical-rust-port.md`; lair behaviour is tracked by `p0-17-wild-creature-lair-loop.md`. This objective is content-only. +- **Renderer work** — flora/fauna renderers are `p1-48` / `p1-49`; new species files plug into the existing renderers without changes. +- **`CREATURE_ECOSYSTEM.md` cleanup** (the 1170-line superseded doc) — flagged in conversation but not part of this objective. If the design team wants it trimmed, it gets a doc-cleanup objective separately. + +## Sequencing + +Single PR (or one-author batch) authored by `game-data`. No dependencies on other open objectives. Can land alongside the orthogonal data-schema-drift fix described in `.project/handoffs/20260519_p1-60-orthogonal-data-schema-drift.md` — neither change touches the other's files. + +## Verification + +``` +./run verify # step 1 JSON schemas must stay clean +cd src/simulator && cargo test -p mc-ecology +cd src/simulator && cargo test -p mc-turn # spot-check, no new failures +``` + +Cross-reference check after the new species land: + +``` +grep -l '"lineage"' public/resources/ecology/flora/species/*.json | wc -l +grep -l '"lineage"' public/resources/ecology/fauna/species/*.json | wc -l +grep -l '"ecology_tier"' public/resources/ecology/{flora,fauna}/species/*.json | wc -l +``` + +Counts must equal the file count in each directory (100% coverage invariant). + +## Pointers + +- Audit source-of-truth: `public/games/age-of-dwarves/docs/ecology-audit-gaps.md`. +- Lineage / tier rules: `public/games/age-of-dwarves/docs/ECOLOGY_BINDING.md`. +- Schemas: `public/resources/ecology/{flora,fauna}/{flora,fauna}.schema.json`. +- Existing species library: `public/resources/ecology/{flora,fauna}/species/`. +- Game 1 fauna whitelist: `public/games/age-of-dwarves/data/manifests/fauna.json` (verify any new fauna intended for Game 1 is added to this whitelist; fantasy/Game 2 species do NOT enter the whitelist). +- Memory: `project_ecology_evolution_system.md`, `project_emergent_ecology_t10.md`, `feedback_ecology_design_principles.md`.