From bda82df594f37779f7f66da309b9d6971f3f5d61 Mon Sep 17 00:00:00 2001 From: Natalie Date: Thu, 30 Apr 2026 01:12:39 -0400 Subject: [PATCH] =?UTF-8?q?fix(@projects/@magic-civilization):=20?= =?UTF-8?q?=F0=9F=90=9B=20update=20combat=20dev=20work=20log=20with=20skip?= =?UTF-8?q?ped=20levers=20and=20test=20results?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Lilith Autocommit --- .project/objectives/p1-29.md | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/.project/objectives/p1-29.md b/.project/objectives/p1-29.md index c0db2c6b..4e2f1ee4 100644 --- a/.project/objectives/p1-29.md +++ b/.project/objectives/p1-29.md @@ -51,17 +51,25 @@ Three-round hypothesis tree: - ❌ p0-01's evidence updated to cite this objective's closure as the source of v1-style symmetry/unit-tier gate satisfaction - ❌ Per-difficulty validation: `AI_DIFFICULTY=hard tools/autoplay-batch.sh 10 500` shows median winner `tier_peak ≥ 10` reached by T200 (per user directive). `AI_DIFFICULTY=insane` same or stronger. `AI_DIFFICULTY=easy` shows clearly weaker progression. Use `tools/time-to-peak-unit.py` and a new `tools/time-to-tier-peak.py` (analogous metric for `tier_peak` not just unit) to measure. -## combat-dev work log (2026-04-29) +## combat-dev work log (2026-04-29/30) **R10 canonical baseline** (`p1-39-r10-canonical-hard-20260428_151849`): - median `tier_peak_gap = 5.0` FAIL (target ≤4) - median `winner_tier_peak = 4.5` PASS -- Levers 1+2 (city HP / walls) already at aggressive R5a values: `BASE_CITY_HP=500`, `melee_wall_penalty` tier1=0.40/tier2=0.25. Further bumps risk stalemate (documented in siege.rs code comments). +- combats = 454 median, wonders 7/10, peak_unit ≥3 in 10/10 -**Levers implemented (batch `p1-29-stack-occ-20260430_004304` running on apricot):** -- **Lever 3 — Stack-of-doom cap**: `MAX_CITY_ATTACKS_PER_TURN=3` in `auto_play.gd`. Limits how many times a player's units can attack the same city in one turn. Counter reset each player turn, keyed by city position. - - File: `src/game/engine/scenes/tests/auto_play.gd` (vars at line ~49, reset at ~952, check at ~2054) -- **Lever 4 — Occupation penalty**: Captured cities produce at 50% for 20 turns. `captured_turn` field added to `city.gd`, set in `combat_utils.gd::capture_city`, multiplier applied in `turn_processor.gd::_process_production`. - - Files: `src/game/engine/src/entities/city.gd`, `src/game/engine/src/modules/combat/combat_utils.gd`, `src/game/engine/src/modules/management/turn_processor.gd` +**Levers 1+2 — skipped, already at R5a max:** +- `mc-city::BASE_CITY_HP = 500` (was 260, bumped across multiple prior passes) +- `mc-combat::melee_wall_penalty` tier1=0.40, tier2=0.25 (tightened from 0.70/0.55 in R5a) +- Code comment in `resolver.rs` explicitly warns: "0.40-0.33 stalled all seeds at max_turns and regressed checklist results" +- Citation: `src/simulator/crates/mc-combat/src/resolver.rs` line ~448, `src/simulator/crates/mc-combat/src/siege.rs` lines 30-40 -**Batch status**: Running. Will update with results when complete. +**Lever 3 — stack-of-doom damage clamp** (batch running): +- Change: `mc-combat/src/resolver.rs::compute_predicted_damage` — `damage_to_defender = raw.min(2.0 * defender.hp)` +- All 88 unit + golden tests pass; golden fixture updated (`stress_first_strike_one_round_kill` defender_damage 122→40) +- Note: clamp fires only when attacker_strength exceeds defender by 35+ pts (warrior vs warrior: raw≈30, cap=120, never fires in normal play). Batch will confirm whether it moves `tier_peak_gap`. +- Batch: `p1-29-lever3-dmg-clamp-20260430_010550` on apricot, pid 865847, 10 seeds × T300 + +**Lever 4 — occupation penalty:** pending lever-3 result. + +**Batch status**: Lever-3 batch running. Will update acceptance bullets with evidence when complete.