From 90bf14c6494f691db99b10412a116c263352abdc Mon Sep 17 00:00:00 2001 From: Natalie Date: Sat, 9 May 2026 16:55:33 -0700 Subject: [PATCH] =?UTF-8?q?feat(@projects/@magic-civilization):=20?= =?UTF-8?q?=E2=9C=A8=20update=20combat=5Fbalance=20extraction=20status?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- .../p2-65-extract-mc-state-crate.md | 33 +++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/.project/objectives/p2-65-extract-mc-state-crate.md b/.project/objectives/p2-65-extract-mc-state-crate.md index 98d13939..c3e2473a 100644 --- a/.project/objectives/p2-65-extract-mc-state-crate.md +++ b/.project/objectives/p2-65-extract-mc-state-crate.md @@ -182,10 +182,39 @@ Estimated: ~2 hours. Pre-existing 1-day estimate did not account for either finding. Revised: -- Phase 0a — Resolve `CombatBalance` duplication (~2 hr). +- Phase 0a — Resolve `CombatBalance` duplication (~2 hr). **✓ Done 2026-05-09.** - Phase 0b — Move `ScoringWeights` group to mc-core (~1-2 hr). - Phase 1-7 — Original mc-state extraction (~1 day). -- **Total: 1.5-2 days of focused work.** +- **Remaining: ~1 day of focused work.** + +## Phase 0a — done 2026-05-09 + +Unified `CombatBalance` into `mc-core::combat_balance::CombatBalance` +(8-field struct: 5 JSON-canonical + 3 mc-ai-internal scoring fields). + +- New file: `src/simulator/crates/mc-core/src/combat_balance.rs`. Public + re-export at `mc_core::CombatBalance` and `mc_core::parse_combat_balance`. +- `src/simulator/crates/mc-turn/src/combat_balance.rs` now a thin shim: + re-exports `mc_core::combat_balance::CombatBalance`, retains + `load_combat_balance` wrapper that maps `serde_json::Error` → + `crate::end_conditions::ConfigError`. +- `src/simulator/crates/mc-ai/src/policy.rs` — local `CombatBalance` + + `Default` impl deleted; `pub use mc_core::CombatBalance;` added at + module head. `mc_ai::CombatBalance` re-export from `lib.rs` continues + to work transparently (re-export of re-export). +- **Default-value bug fix**: previous `mc-turn` defaults disagreed with + the canonical `combat_balance.json` on three fields. Defaults now + match JSON exactly: `denial_value_factor 0.5 → 0.6`, + `capture_civilian_xp_award 25 → 0`, + `destroy_civilian_xp_award_multiplier 0.5 → 1.0`. Production behaviour + was already correct (JSON wins on load); this aligns the + deserialise-from-empty / `::default()` path with canonical content. +- Verification on apricot: + - `cargo check -p mc-core -p mc-ai -p mc-turn` ✓ clean. + - `cargo test -p mc-core combat_balance` — 4/4 ✓. + - `cargo test -p mc-ai --test capture_scoring` — 8/8 ✓. + - `cargo test -p mc-turn --test ransom` — 12/12 ✓. + - `cargo test -p mc-turn --lib combat_balance` — 2/2 ✓. Given the cross-cutting nature (touches mc-core, mc-ai, mc-turn, mc-balance, all consumer crates, both API surfaces, plus 5+ test files)