From 2c0071e721b54d95b6e0bcf8d1e34e1dcf41c093 Mon Sep 17 00:00:00 2001 From: Natalie Date: Sat, 18 Apr 2026 10:27:49 -0700 Subject: [PATCH] =?UTF-8?q?feat(objectives):=20=E2=9C=A8=20update=20clan?= =?UTF-8?q?=20personalities=20priority=20and=20status?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- .project/objectives/README.md | 8 ++++---- .project/objectives/p0-02-clan-personalities.md | 2 +- .project/objectives/p0-08-domination-victory.md | 12 +++++++----- public/games/age-of-dwarves/data/objectives.json | 12 ++++++------ 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/.project/objectives/README.md b/.project/objectives/README.md index 021d8eeb..1aec9346 100644 --- a/.project/objectives/README.md +++ b/.project/objectives/README.md @@ -14,11 +14,11 @@ | Priority | ✅ | 🟡 | 🔴 | ❌ | ⚫ | Total | |---|---|---|---|---|---|---| -| **P0** | 28 | 6 | 1 | 0 | 0 | 35 | +| **P0** | 27 | 7 | 1 | 0 | 0 | 35 | | **P1** | 15 | 4 | 2 | 0 | 1 | 22 | | **P2** | 14 | 5 | 0 | 8 | 0 | 27 | | **P3 (oos)** | 0 | 0 | 0 | 0 | 17 | 17 | -| **total** | **57** | **15** | **3** | **8** | **18** | **101** | +| **total** | **56** | **16** | **3** | **8** | **18** | **101** | @@ -27,8 +27,8 @@ | Team Lead | Remaining | |---|---| | [asset-sprite](../team-leads/asset-sprite.md) | 7 | +| [warcouncil](../team-leads/warcouncil.md) | 6 | | [wireguard](../team-leads/wireguard.md) | 6 | -| [warcouncil](../team-leads/warcouncil.md) | 5 | | [shipwright](../team-leads/shipwright.md) | 2 | | [testwright](../team-leads/testwright.md) | 2 | | [asset-audio](../team-leads/asset-audio.md) | 1 | @@ -46,7 +46,7 @@ | [p0-05](p0-05-culture-and-borders.md) | ✅ done | Culture generation and border expansion | [shipwright](../team-leads/shipwright.md) | 2026-04-17 | | [p0-06](p0-06-economy-integration.md) | ✅ done | Fold gold income / upkeep / improvement yields into turn loop | — | 2026-04-17 | | [p0-07](p0-07-tech-research-costs.md) | ✅ done | Tech research costs and science pool pacing | — | 2026-04-17 | -| [p0-08](p0-08-domination-victory.md) | ✅ done | Domination victory path in mc-turn::victory | [warcouncil](../team-leads/warcouncil.md) | 2026-04-17 | +| [p0-08](p0-08-domination-victory.md) | 🟡 partial | Domination victory path in mc-turn::victory | [warcouncil](../team-leads/warcouncil.md) | 2026-04-18 | | [p0-09](p0-09-ui-completeness.md) | ✅ done | City-screen UI completeness (citizen assign, queue controls, promotion picker) | — | 2026-04-16 | | [p0-10](p0-10-completion-stability.md) | ✅ done | Game-completion stability — ≥7/10 seeds declare a winner | — | 2026-04-17 | | [p0-11](p0-11-mystery-item-authoring.md) | ✅ done | Author the four T8–T10 mystery item drops | — | 2026-04-16 | diff --git a/.project/objectives/p0-02-clan-personalities.md b/.project/objectives/p0-02-clan-personalities.md index bfe20dcc..6bb02097 100644 --- a/.project/objectives/p0-02-clan-personalities.md +++ b/.project/objectives/p0-02-clan-personalities.md @@ -76,7 +76,7 @@ Note: ablated TTV drops (not rises) because most games hit T300 stalemate when t - ✓ `mc-ai::ScoringWeights::from_personality(id: &str)` loads weights from JSON — implemented in `evaluator.rs`, GUT test 8 verifies `blackhammer.military_base > goldvein.military_base`. - ✓ AI assignment at game start picks one of the 5 personalities per AI player — `personality_assigner.gd` assigns randomly; `meta.json::player_clans` confirms. `AI_PIN_PERSONALITY` env var verified working. - 🟡 Batch of 5×10 seeds with `AI_PIN_PERSONALITY=` produces measurably different stats per clan. Legacy pre-reframe evidence: gold axis shows goldvein 2× ironhold (543 vs 266) — still valid. TTV divergence (goldvein/runesmith 30 turns faster than ironhold/deepforge) was the pre-p0-25 proxy for the era-progression metric and does NOT translate 1:1 into the reframed `tier_peak` framework. Post-reframe target: **median `winner_tier_peak` differs by ≥1 era between clans with divergent production/expansion axes** (ironhold/deepforge vs goldvein/runesmith). NEEDS batch re-run on the p0-25-instrumented binary to cite. -- ✓ **Personality win-rate balance (blackhammer)**: FIXED 2026-04-17 via two GDScript-only changes: `DOMINANCE_GOLD_FLOOR` 200→50 (unblocks rush-buy for low-economy clans) and `PRODUCTION_AXIS_BUILDING_BIAS` 6→8 (raises threshold so aggression=9 clans prefer units over buildings). Batch `blackhammer_tune_20260417_101447` (10 seeds, T300, `AI_PIN_PERSONALITY=blackhammer`): **2/10 blackhammer wins** (seed 4 T71, seed 9 T125, both domination). Gate: ≥1 win in 10-seed sample — PASSED. Seed 8 hit safety timeout (892s, `in_progress`) — not a blackhammer loss. Prior B5 zero-win run (`.local/iter/b5-manual-20260417_061957/`) used old binary with DOMINANCE_GOLD_FLOOR=200. +- ✓ **Personality win-rate balance** (50-game sample across all 5 clans, post-p0-26 port binary, 2026-04-18): ironhold 8/10, goldvein 9/10, blackhammer 9/10, deepforge 8/10, runesmith 9/10 — every clan wins ≥1/10 when pinned on player 1 (no clan shut out), spread 80-90% (no clan dominant). This is the 50-game personality_win_balance sample p1-05 cites as its warcouncil dependency. Historical fix trail retained: post-port binary preserves `DOMINANCE_GOLD_FLOOR = 50` + `PRODUCTION_AXIS_BUILDING_BIAS = 8` tunings via `mc-ai::tactical::production` constants, ported from the deleted `simple_heuristic_ai.gd` 2026-04-17 fixes. - 🟡 **Six axes each materially affect gameplay** — pre-reframe verification via per-axis ablation sweep (2026-04-17, `.local/iter/ablate__20260417_072921/`): each axis neutralized to 5 for all clans; all 6 showed ≥10% delta on correlated legacy metric (aggression→mil -16.7%, expansion→TTV -27.6%, grudge_persistence→TTV -28.9%, production→TTV -24.9%, trade_willingness→gold -48.9%, wealth→gold -40.0%). Neutralizing any axis collapses domination win rate from 49/49 to 1–8/10 — games stall. **POST-REFRAME target**: re-run the 6-axis ablation under p0-25 instrumentation and pin the era-progression-axis correlations (expansion/production/grudge_persistence should each show ≥1 era delta on `tier_peak_med`; aggression/trade_willingness/wealth retain their existing mil_med / gold_med correlations). NEEDS re-run to cite under the reframed gate. ## Post-reframe evidence (2026-04-18, p0-25-instrumented binary) diff --git a/.project/objectives/p0-08-domination-victory.md b/.project/objectives/p0-08-domination-victory.md index 1cab11c9..cce38aef 100644 --- a/.project/objectives/p0-08-domination-victory.md +++ b/.project/objectives/p0-08-domination-victory.md @@ -2,16 +2,17 @@ id: p0-08 title: Domination victory path in mc-turn::victory priority: p0 -status: done +status: partial scope: game1 owner: warcouncil -updated_at: 2026-04-17 +updated_at: 2026-04-18 evidence: - src/simulator/crates/mc-turn/src/victory.rs + - src/simulator/crates/mc-ai/src/tactical/movement.rs # DOMINANCE_FACTOR, CAPITAL_APPROACH_HEX ported from simple_heuristic_ai.gd + - src/simulator/crates/mc-ai/src/tactical/production.rs # DOMINANCE_GOLD_FLOOR, CAPITAL_WALLS_MIN_AGE_TURNS - src/game/engine/scenes/menus/victory_screen.gd - - src/game/engine/src/modules/ai/simple_heuristic_ai.gd - - src/game/engine/tests/unit/ai/test_simple_heuristic_ai.gd - .local/batches/dom_tune2_20260417_101435/ + - .local/iter/apricot-20260418_074209/ # post-port smoke: domination T39-T300 --- ## Summary @@ -25,4 +26,5 @@ Domination victory fires when one player captures all opponent original capitals - ✓ `victory::check_domination_victory` implemented in `mc-turn/src/victory.rs`; checks `player.city_positions.contains(cap_pos)` for each opponent original capital. - ✓ `processor::end_turn_phase` calls domination check before score check (domination takes precedence). `check_victory()` order: Domination → Science → Economic → Culture → CityCount → Score. - ✓ `victory_screen.tscn` shows domination message when `victory_type=domination` — wired via `VictoryType` enum surface. -- ✓ Headless batch dom_tune2_20260417_101435 reports `victory_type=domination` in `turn_stats.jsonl` — 2/10 seeds (≥2/10 target met). AI heuristic tuning: `DOMINANCE_FACTOR=1.25`, `CAPITAL_APPROACH_HEX=16`, `FINAL_PUSH_ENEMY_CITY_COUNT=1` with GUT coverage in `test_simple_heuristic_ai.gd`. +- ✓ Headless batch dom_tune2_20260417_101435 reports `victory_type=domination` in `turn_stats.jsonl` — 2/10 seeds (≥2/10 target met). AI heuristic tuning: `DOMINANCE_FACTOR=1.25`, `CAPITAL_APPROACH_HEX=16`, `FINAL_PUSH_ENEMY_CITY_COUNT=1` — ported into `mc-ai::tactical::{movement,production}` during p0-26. Test coverage migrated to `cargo test -p mc-ai tactical` (constant-value assertions at `movement.rs:1049-1054` + `production.rs:446`). +- ✗ **Domination tempo calibration** (added 2026-04-18 per p1-05 dependency). Post-port batches (5 clan pins + smoke, 2026-04-18) resolve T39-T150 via domination — too fast for the downstream quality gates. p1-05 luxury variance requires median game length ≥ T250; p0-01 state-at-end tier_peak ≥ 6 requires games reach tier 6+ content before resolving. Current tempo rushes past both. **Retune target**: raise `DOMINANCE_FACTOR` from 1.25 toward 1.75-2.0 OR scale up `CAPITAL_WALLS_MIN_AGE_TURNS` (production.rs:68, currently 20) so early capital assaults fail more often. Needs a parameter sweep + 10-seed validation batch per candidate value. diff --git a/public/games/age-of-dwarves/data/objectives.json b/public/games/age-of-dwarves/data/objectives.json index 9de532b6..19ca3422 100644 --- a/public/games/age-of-dwarves/data/objectives.json +++ b/public/games/age-of-dwarves/data/objectives.json @@ -1,11 +1,11 @@ { - "generated_at": "2026-04-18T17:08:47Z", + "generated_at": "2026-04-18T17:25:56Z", "totals": { - "missing": 8, + "partial": 16, "stub": 3, + "missing": 8, + "done": 56, "oos": 18, - "partial": 15, - "done": 57, "total": 101 }, "objectives": [ @@ -83,10 +83,10 @@ "id": "p0-08", "title": "Domination victory path in mc-turn::victory", "priority": "p0", - "status": "done", + "status": "partial", "scope": "game1", "owner": "warcouncil", - "updated_at": "2026-04-17", + "updated_at": "2026-04-18", "summary": "Domination victory fires when one player captures all opponent original capitals. `victory.rs` checks domination before score; `VictoryConfig.domination_requires_all_capitals=true`. AI heuristics tuned to commit to capital assault: `DOMINANCE_FACTOR=1.25` (own_mil ≥ 1.25× enemy_mil), `CAPITAL_APPROACH_HEX=16` bypass prevents stray-chase near capital, `FINAL_PUSH_ENEMY_CITY_COUNT=1` all-in gate when enemy is at last city. GUT tests cover both tuning paths.\n\n10-seed T300 batch (dom_tune2_20260417_101435, 2026-04-17): **2/10 domination** (seeds 1 at T142, seed 4 at T75). Remaining 8 seeds crashed via pre-existing screenshot bug (task #72) before T300 — not caused by these changes. Of completable seeds, 2/2 = domination." }, {