magicciv/src
Natalie 12de49a16a test(@projects/@magic-civilization): 🐛 fix AI-never-builds-units in claude-vs-ai harness (race_id + unit_type)
`claude_vs_ai_full_game_transcript` failed: "no AI slot built a unit by turn 10".
Root cause was two test-fixture values diverging from the real engine, both in the
`build_3_player_state_like_harness` construction:

1. `add_player_militarist_inline` never set `PlayerState.race_id`. The real engine
   sets it from presentation metadata (api-gdext set_player_presentation ->
   p.race_id); the tactical production picker filters race-gated units
   (`dwarf_warrior` has race_required="dwarf") by it, so an empty race_id rejected
   every unit. Set race_id="dwarf" (Game 1 is all-dwarf).

2. `build_unit_catalog` set `unit_type: "military"` for dwarf_warrior/pikeman, but
   `pick_best_unit_of_type` filters on the combat archetype unit_type ∈
   {melee,ranged,siege} — the real units JSON uses "melee" (72 melee / 41 ranged /
   20 siege across public/resources/units). "military" matched no preferred type.

With either wrong, `pick_best_unit_for_clan` returned None and fell back to the
phantom id "warrior", which the queue classifier (units_catalog keyed by
"dwarf_warrior") then treated as a *building* (Queueable::Item) — so try_spawn_unit
skipped it, no unit ever spawned, no UnitCreated event fired, and the AI bled units
(4->3->2->1) with no replacement. After the fix the AI queues
`Unit { dwarf_warrior }`, spawns via step's try_spawn_unit (units 4->6 by turn 3),
and emits UnitCreated on the wire. Full mc-player-api suite green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 21:17:24 -04:00
..
game test(@projects/@magic-civilization): 🐛 install encounter rates + reframe militarist gold assertion 2026-06-24 12:02:38 -04:00
packages
simulator test(@projects/@magic-civilization): 🐛 fix AI-never-builds-units in claude-vs-ai harness (race_id + unit_type) 2026-06-24 21:17:24 -04:00