feat(@projects/@magic-civilization): add survival objective tracking for p1-29d

Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
Natalie 2026-05-16 00:30:27 -07:00
parent 0c3e66e0de
commit ffba4db1f9

View file

@ -0,0 +1,56 @@
---
id: p1-29d-p1-survival
title: "P1 (trailing AI) eliminated or stalled before T100 in 10/10 seeds — upstream of action priority"
priority: p1
status: stub
scope: game1
category: balance
owner: warcouncil
created: 2026-05-16
updated_at: 2026-05-16
blocked_by: []
follow_ups: [p1-29c, p1-29a, p1-29]
---
## Context
`p1-29c` shipped sole-city research-priority uplift (`SituationalContext::sole_city_threatened` adds `+0.40 Settle / +0.20 Defend / +0.50 Research`) and was apricot-verified on batch `20260515_215705` (10/10 games produced complete turn_stats; infrastructure clean after commits `e200634df` + `8820ce04a`). The gate result:
```
Per-seed: P0 tier_peak 210 (healthy)
P1 tier_peak = 1 in ALL 10 seeds
P1 cities at end-game: 0 in 8 seeds, 1 in 2 seeds
Gate ≥7/10 alive-aware seeds with P1 tier_peak ≥ 2: 0/10 PASS
```
P1 is **eliminated or stalled before reaching tier 2 in 80% of seeds**. The current uplift sites in `mc-ai/src/policy.rs::SituationalContext` cannot move this — they tune action priority, but P1 doesn't survive long enough to act on it.
## The actual failure mode
The 8 seeds where P1 ends with 0 cities indicate `cities_lost == cities_founded == 1` (or P1 lost its capital). This is upstream of research-priority — P1 is losing combat encounters before getting to tier 2.
Likely contributors (any/all):
1. **Combat balance** — P1's tier-1 units cannot defend against a P0 that already has tier-2 unit access by mid-game.
2. **Map placement** — P1's capital might consistently be in a hostile region (no chokepoint, no fortifiable terrain).
3. **AI tactical decisions** — P1 may be over-attacking (losing units offensively) instead of fortifying.
4. **Personality skew** — most clans bias toward "Conquest" axis early, even from a weaker position.
## Acceptance
- ☐ Diagnose which contributor(s) dominate via batch instrumentation:
- Add `cities_lost`, `units_destroyed`, `turn_first_attack`, `last_alive_turn` to `player_stats` JSONL emission if not already present.
- Re-run apricot batch; tabulate elimination turn and immediate cause per seed.
- ☐ Identify the load-bearing lever (defensive multiplier? Map seed quality? AI flee threshold?).
- ☐ Implement the lever as either a Rust mc-combat balance tweak or an mc-ai posture/flee adjustment.
- ☐ Re-run apricot batch; gate ≥7/10 seeds with P1 `tier_peak ≥ 2`.
- ☐ Closes both p1-29c's bullet 1 and p1-29a's blocker.
## Why this exists separately from p1-29c
p1-29c's spec is "raise priority of Settle/Defend/Research when sole-city threatened." That work landed and is correct. The empirical failure mode is "P1 doesn't survive long enough to ACT on those priorities." That's a different code surface and a different design question — it deserves its own objective.
## References
- Apricot batch evidence: `apricot:~/.cache/mc-batches/20260515_215705/smoke/`
- p1-29c sole-city implementation: `mc-ai/src/policy.rs::action_prior_with_context`
- Prior diagnosis: `.project/objectives/p1-29.md` lines 124-134 ("Early-end games are intentionally-ungated elimination wins.")