From 3934b34bb071c978e1c27aa58077a0688db7a42a Mon Sep 17 00:00:00 2001 From: Natalie Date: Sat, 25 Apr 2026 19:09:59 -0700 Subject: [PATCH] =?UTF-8?q?fix(@projects/@magic-civilization):=20?= =?UTF-8?q?=F0=9F=97=93=20update=20p0-01=20objective=20date?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- .project/objectives/README.md | 2 +- .project/objectives/objectives.json | 4 ++-- .project/objectives/p0-01-mcts-wiring.md | 3 ++- .project/objectives/p1-22-mcts-wall-clock-budget.md | 4 ++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.project/objectives/README.md b/.project/objectives/README.md index b5fba0ff..5e883534 100644 --- a/.project/objectives/README.md +++ b/.project/objectives/README.md @@ -38,7 +38,7 @@ | ID | Status | Title | Tags | Owner | Updated | Blocked | |---|---|---|---|---|---|---| -| [p0-01](p0-01-mcts-wiring.md) | 🟡 partial | Wire MCTS into gameplay AI | — | [warcouncil](../team-leads/warcouncil.md) | 2026-04-24 | 🟢 unblocked | +| [p0-01](p0-01-mcts-wiring.md) | 🟡 partial | Wire MCTS into gameplay AI | — | [warcouncil](../team-leads/warcouncil.md) | 2026-04-25 | 🟢 unblocked | | [p0-02](p0-02-clan-personalities.md) | 🟡 partial | Five AI clan personalities drive distinct playstyles | — | [warcouncil](../team-leads/warcouncil.md) | 2026-04-25 | 🟢 unblocked | | [p0-41a](p0-41a-rally-smoke.md) | 🟡 partial | Rally-point smoke test — unit moves toward rally hex on next turn | — | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | 🟢 unblocked | | [p0-42a](p0-42a-formation-smoke.md) | ❌ missing | Formation aggregation smoke — 3 units form, move through narrow pass, reflow | — | [shipwright](../team-leads/shipwright.md) | 2026-04-25 | 🟢 unblocked | diff --git a/.project/objectives/objectives.json b/.project/objectives/objectives.json index dce39f8c..ba7c8b6c 100644 --- a/.project/objectives/objectives.json +++ b/.project/objectives/objectives.json @@ -1,5 +1,5 @@ { - "generated_at": "2026-04-26T01:49:45Z", + "generated_at": "2026-04-26T02:05:50Z", "totals": { "done": 78, "in_progress": 0, @@ -17,7 +17,7 @@ "status": "partial", "scope": "game1", "owner": "warcouncil", - "updated_at": "2026-04-24", + "updated_at": "2026-04-25", "blocked_by": [], "summary": "`GdMcTreeController` (Rust GDExtension) is the unconditional AI driver. `AiTurnBridge.run()` always calls `_apply_mcts_strategic_override()` — no feature flag, no silent fallback. If the extension is absent, `push_error` + `assert(false)` crashes loudly. `SimpleHeuristicAi` handles tactical decisions (movement, combat) after MCTS sets the strategic directive.\n\n**Acceptance re-framed 2026-04-17 (user sign-off):** The prior \"median TTV in 200–350 band\" bullet was measuring the wrong thing. Every game ends at T300 (turn limit → score victory) OR earlier via domination; \"median TTV\" is bimodal (domination cluster + score-cluster-at-T299), and its value shifts based on dom:score ratio rather than game quality. Replaced with a **state-at-end quality metric set** (winner tier-peak, symmetry gap, peak unit tier, wonder count, combat count) that measures whether games reach competitive mid/late-game content *regardless* of whether they resolve via domination or score victory." }, diff --git a/.project/objectives/p0-01-mcts-wiring.md b/.project/objectives/p0-01-mcts-wiring.md index ad39383d..fe476617 100644 --- a/.project/objectives/p0-01-mcts-wiring.md +++ b/.project/objectives/p0-01-mcts-wiring.md @@ -5,8 +5,9 @@ priority: p0 status: partial scope: game1 owner: warcouncil -updated_at: 2026-04-24 +updated_at: 2026-04-25 evidence: + - ".local/iter/p0-01-quality-20260425_184059/ (10-seed apricot batch, post-cycle-1 binary 0d127464…): 10/10 victories; median winner tier_peak=6.0 PASS (gate ≥4); median max_peak_unit_tier ≥3 in 8/10 PASS (gate ≥7/10); median total_combats=536 PASS (gate ≥20); tier_peak_gap median 6.0 FAIL (gate ≤4 — early-domination artifact); wonder_count 0/10 FAIL (gate ≥5 — games end before wonder unlock); winner distribution: goldvein/blackhammer/ironhold/runesmith all win at least once = clan-personality differentiation visible at outcome level" - public/games/age-of-dwarves/data/techs/advanced_metallurgy.json (high_smithing circular dep fixed — tier 5-6 techs reachable) - "public/games/age-of-dwarves/data/resources/deposits/iron_ore.json (guarantee: tier 3 units now built in 8/10 seeds)" - .local/iter/p0-01-quality-20260424_055819/ (10/10 E2E PASSED; tech_tier reached 4-10; unit_tier peaked at 3; tier_peak median ~4.5 vs gate ≥6; peak_unit_tier at 3 vs gate ≥6) diff --git a/.project/objectives/p1-22-mcts-wall-clock-budget.md b/.project/objectives/p1-22-mcts-wall-clock-budget.md index 9289b5a6..8cd0ba98 100644 --- a/.project/objectives/p1-22-mcts-wall-clock-budget.md +++ b/.project/objectives/p1-22-mcts-wall-clock-budget.md @@ -27,8 +27,8 @@ This is engineering work, not test calibration: the AI is ALWAYS faster when it - ✓ `mc-ai` exposes a per-decision wall-clock budget (e.g. `MCTS_DECISION_BUDGET_MS=2000`) that caps the iteration loop in `mcts_tree::simulate_parallel` and `mcts_tree::iterate_gpu_batched` once `now() - start >= budget_ms`. Default off (0 = unbounded); opt-in via env var. Evidence: `src/simulator/crates/mc-ai/src/mcts_tree.rs:301,382`; unit test `simulate_parallel_respects_wall_clock_budget` passes at line 641. - ✓ `huge-map-5clan.sh` sets `MCTS_DECISION_BUDGET_MS=2000` so each AI decision is bounded — predictable per-turn cost regardless of state complexity. Evidence: `tools/huge-map-5clan.sh` lines 44 and ~99. -- ❌ Re-run `huge-map-5clan` 10-seed batch with the budget — verify ≥5/10 victories and ≥2 distinct winners. With `~5s/turn × 5 players × 500 turns = 12500s = 3.5hr` per game at PARALLEL=2 and 3600s safety_timeout, all seeds should reach T500 (≥9/10 victories expected). -- ❌ p0-22's `ultimate_stress: PASS` gate (now followup-tracked here) flips ✓ once this lands. +- 🟡 Re-run `huge-map-5clan` 10-seed batch with the budget — partial. Batch `.local/iter/p1-22-budget-20260425_180742/` (apricot, post-cycle-1 binary `0d127464…`) confirmed strategic budget activates per AI turn (`AiTurnBridge: MCTS_DECISION_BUDGET_MS=2000 ms active (p1-22)` logged in game.log every turn). Seed 5 advanced steadily T0→T236 (8.5 turns/min — strategic budget works as designed). However ≥4 of first 6 seeds hung at T75-T185 with no MCTS strategic timeout — discovered the **tactical AI / formation handling code path is NOT bounded by `MCTS_DECISION_BUDGET_MS`** (the budget only caps `mcts_tree::simulate_parallel` + `iterate_gpu_batched`; the tactical executor in `ai_turn_bridge.gd::_apply_tactical_actions` runs unbounded). Strategic budget alone is insufficient to flip the huge-map gate. Co-spawned p0-01 batch (standard map, 5 players) on the same binary scored 10/10 victories cleanly — confirming the budget is correct on workloads where the tactical path doesn't blow up. +- ❌ p0-22's `ultimate_stress: PASS` gate (now followup-tracked here) — blocked by tactical-AI bound, not by this objective. **Follow-up scope (separate objective recommended)**: extend the wall-clock budget to bound `GdAiController::decide_actions` and the formation-aggregation code path. The current p1-22 deliverable (strategic MCTS budget) is complete and verified on standard-map workloads. ## Why P1 (not P0)