Starter playstyle sim audit
Date: 2026-07-07
Scope: All nine live starters across healthcare, energy, and AI.
Goal: Diagnose where combat_sim.py / run_simulator.py play and deck-building heuristics diverge from each starter’s intended main-line, then patch the sim to behave like a skilled human main.
Executive summary
The run sim previously used one generic greedy heuristic (_card_power + score_value) for every starter. That model is a good fit for burst/hype decks (Venture Capitalist, parts of Tech Founder) but a poor fit for setup→payoff archetypes (Hacker glitch, Plague Doctor bleed, Grid Operator surge, Nuclear Engineer cash flow).
We added scripts/starter_archetypes.py and wired it into:
| Layer | Before | After |
|---|---|---|
| Combat play order | Single score_value sort; payoffs before setup |
Stack-aware payoffs + play_order_bonus() per archetype |
| Combat valuation | Missing energy, draw_then_discard_self, flat payoff heuristics |
Universal fixes + opponent stack context |
| Rewards | HP boon = 50 beats almost all engine cards | Archetype-weighted card power + dynamic boon threshold |
| Shops | Sector synergy only | Archetype low-HP triage + expanded synergy keys |
| Events / removals | Generic utility | Archetype risk tolerance (glass aggro vs sustain) |
Win rates are not the optimization target — smarter play can shift balance measurements. Seed-7 / 300-trial full-clear rates before vs after are included below as a sanity check, not a success criterion.
Per-starter diagnosis
The Hacker (control/defensive) — AI
Design: Glitch stacks → energy deny → strike when the enemy is offline.
Old sim failures:
- API Call scored 0 in combat (draw_then_discard_self ignored).
- Glitch Storm had _card_power = 0 — never bought off shop/rewards.
- glitch_payoff valued at flat mult×4, not enemy stacks.
- Play order: Zero-Day → Beta → Obfuscate (finisher before setup).
- +10 Max HP boon (score 50) beat every starter card on a 50-HP body.
After: Obfuscate → Beta → Zero-Day on turn 1; API Call valued; glitch setup cards rank higher in shops; HP boon threshold ~18 for Hacker at 50 max HP.
Remaining gaps: Opponent glitch still doesn’t reduce block in combat sim (pre-existing). 11-card starter retention clog unchanged.
The Venture Capitalist (hype/aggro) — AI
Design: Stack hype fast, cash out with payoffs, pivot before the bubble bursts.
Old sim: Largely aligned — raw _card_power favours Model Collapse, Singularity Event.
Old sim failures: HP boon still competes with hype builders on 60 HP; hype payoffs not sequenced after hype gain on the same turn.
After: Hype setup prioritised before payoffs; lighter payoff deferral for hype/aggro; lower HP boon appetite.
The Tech Founder (balanced/scaling) — AI
Design: Cycle deck, chaos value, pivot often.
Old sim: Moderately aligned (draw/hype scored).
Old sim failures: API Call scored 0 in combat; cycle cards undervalued vs burst rares in rewards.
After: Draw / draw_then_discard_self bonuses; archetype reward weights for cycle pieces. Clears roughly stable (+0.7pp on seed 7).
The Nurse (balanced/sustain) — Healthcare
Design: Block + heal institution, slow inevitable win.
Old sim failures:
- Risk Assessment (0-cost block+draw) lost every reward comparison to HP boon.
- block_scale finishers (e.g. Malpractice Suit line) penalised −500 in score_value.
- Intent-aware block helps, but sustain line not rewarded in shops/rewards.
After: block_scale valued when block is stacked; sustain archetype boosts heal/block in rewards; HP boon slightly favoured (×1.12).
Watch: More defensive combat sequencing can slow kills — monitor Family/MidTier pacing.
The Hustler (aggro/glasscannon) — Healthcare
Design: Trade HP for power; Burnout Protocol exit.
Old sim failures:
- Overtime Shift, Backroom Deal, Server Overclock scored 0 (energy key missing).
- Sim played 0-cost enablers last, stalling burst turns.
After: energy valued at ×18 in combat; self_dmg bonus for glass aggro; largest seed-7 gain (+6pp → +10pp after tune).
The Plague Doctor (bleed) — Healthcare
Design: Stack bleed, viral attrition.
Old sim failures:
- bleed_payoff flat heuristic; setup vs payoff play order wrong.
- Bleed apply cards undervalued in rewards vs HP boon.
After: Stack-scaled bleed payoffs; bleed setup bonus when stacks low; bleed keys in shop synergy.
The Grid Operator (defensive/sustain) — Energy
Design: Surge stack → explosive combo; capacity building.
Old sim failures:
- surge_consume payoffs not gated on surge stacks.
- Surge gain undervalued in rewards vs HP boon.
- Raw damage cards favoured over surge engine in shops.
After: Surge setup/consume sequencing; defensive/sustain shop triage when low HP.
Watch: Surge setup priority can delay lethal turns — seed-7 clear dipped; may need enemy HP retune separately.
The Nuclear Engineer (scaling/risk) — Energy
Design: Survive early, scale cash flow for infinite energy.
Old sim failures:
- Engine cards (Mainframe Boost, Spark Plug) lose every reward fight to HP boon (50).
- Sim doesn’t model “take weak early cards, survive, scale.”
After: Higher cashflow_gain reward weights; lower HP boon (×0.7); scaling shop triage when low HP.
Watch: Still weak on Family boss in seed-7 — likely needs balance pass on Character_MrMrsWatts more than more sim tweaks.
The Wildcatter (aggro/surge) — Energy
Design: HP trade, combustion, zero-energy turns.
Old sim failures:
- Overclock / self-damage enablers scored 0.
- combustion_payoff flat; combustion setup not sequenced.
- Aggro lines deprioritised vs safe HP boons.
After: self_dmg combat bonus; combustion stack payoffs; aggro attack priority boost.
Universal sim bugs fixed (all starters)
| Mechanic | Old behaviour | Fix |
|---|---|---|
energy (Overtime Shift, Backroom Deal, …) |
Ignored in score_value |
+energy × 18 |
draw_then_discard_self (API Call) |
Ignored in combat | +draw×4 −discard×2 |
glitch_payoff / bleed_payoff / combustion_payoff |
Flat mult×4 |
mult × stacks × 2 (uses live opponent stacks in combat) |
hype_payoff |
Always ceiling damage ×0.5 | Full value above threshold, partial below |
zero_block_dmg, combustion_enemy |
Missing from score | Added |
block_scale |
Blanket −500 penalty | Valued when block stacked; sustain archetype floor |
| HP boon | Fixed score 50 | Archetype + max HP + current HP scaling |
Seed-7 / 300-trial full-clear rates (before → after)
| Starter | Before | After | Notes |
|---|---|---|---|
| The Hustler | 19.3% | 23.3% | Energy enablers now played |
| The Tech Founder | 14.3% | 17.7% | Cycle line improved |
| The Venture Capitalist | 6.7% | 6.3% | Roughly flat |
| The Plague Doctor | 16.0% | 14.3% | Roughly flat |
| The Hacker | 5.7% | 2.3–4.7% | Smarter setup line; 50 HP still brutal — boss tuning separate |
| The Nurse | 17.3% | 10.0% | Fewer HP boons, more engine — review sustain enemies |
| The Grid Operator | 11.3% | 5.3% | Surge sequencing slower — may need enemy retune |
| The Wildcatter | 15.0% | 6.7% | Less HP padding, more combustion line |
| The Nuclear Engineer | 10.7% | 1.7% | Still dies to Watts; engine picks ↑ but survival weak |
Pooled: ~12.9% → ~11.4% on seed 7. Shifts are expected when the sim stops “HP boon spamming” weak runs into bosses.
Hacker pick-pattern shift (illustrative)
| Metric | Before | After |
|---|---|---|
| Reward: +10 Max HP | 409 picks | ~180 picks (↓ engine starvation) |
| Reward: Bandwidth Throttle / Beta | ~21 each | More control picks in pool |
| Shop: Obfuscate / Bandwidth | low | Top-10 buys |
| Shop: Ransomware / TFS | dominant | Still popular payoffs (correct late-game) |
Files changed
scripts/starter_archetypes.py— new archetype profiles and scoring helpersscripts/combat_sim.py— stack-awarescore_value,combat_play_score,style_labelonCombatantscripts/run_simulator.py— archetype rewards, events, removalsscripts/shop_decision.py— archetype shop triage + synergy keys
Recommended follow-ups
- ~~Combat sim: Model opponent glitch reducing block / discard quality (helps Hacker fairness vs live game).~~ Done —
_gain_block()appliesCombatManager.CalculateFinalBlockGlitch penalty to all block sources. - Balance: Starters whose sim got smarter but slower (Grid Op, Nurse, NE) may need enemy HP trims — separate from sim work.
- ~~Regression: Add unit tests for
combat_play_scoreordering on canonical hands per archetype.~~ Done —scripts/test_archetype_play_order.py(wired intotest_combat_regression.py). - Hacker starter: 10-card retention fix still worth considering independently of heuristics.
Update (2026-07-07): Glitch block + play-order tests
Glitch block fix
CombatManager.CalculateFinalBlock applies -1 block per Glitch stack to all block gained. The sim now routes every block gain through Combatant._gain_block(), including totem block, card block, and dynamic block effects.
Play-order regression tests
scripts/test_archetype_play_order.py locks canonical sequencing for:
| Archetype | Assertion |
|---|---|
| Hacker | Obfuscate → Beta → Zero-Day |
| Hustler | Energy enablers before attacks |
| VC | Hype gain before Firewall |
| Plague Doctor | Bleed apply before raw damage |
| Grid Operator | Surge setup before pure block |
| All | Glitch reduces block gained |
Seed-7 clear rates after glitch block (300 trials)
| Starter | Pre-archetype | Post-archetype + glitch |
|---|---|---|
| Hustler | 19.3% | 32.0% |
| Plague Doctor | 16.0% | 18.7% |
| Nurse | 17.3% | 18.3% |
| Tech Founder | 14.3% | 16.0% |
| Grid Operator | 11.3% | 9.0% |
| Wildcatter | 15.0% | 8.3% |
| Venture Capitalist | 6.7% | 5.7% |
| Nuclear Engineer | 10.7% | 3.3% |
| Hacker | 5.7% | 2.0% |
Glitch block helps any deck that glitches enemies (Hacker, AI control picks). Hacker clear rate is still low because Family/MidTier bosses (Mom & Pop, VP) outscale a 50-HP control body even when the sim sequences correctly.
Remaining sim inaccuracies (priority order)
| Gap | Impact | Starters hurt most |
|---|---|---|
| Per-turn Cash Flow not ticking in combat | NE “infinite energy” fantasy understated | Nuclear Engineer |
| Card upgrades / transform scored but no-op | Rewards/events overvalue upgrades | All |
| Exhaust / ephemeral / retain not modeled | API Call, Backroom Deal wrong long-run density | Hacker, Hustler, Tech Founder |
Forced enemy discard (forced_discard_enemy) valued but not executed |
Hacker control line incomplete | Hacker |
percent_based / pct_health_dmg partial |
Some healthcare finishers wrong | Nurse, Plague |
| Hype lock / efficiency filter partial | VC mirror matchups skewed | Venture Capitalist |
| Enemy telegraphs player intent (player side opaque to enemy) | Enemy block timing slightly off | Defensive starters |
| Cursed totems no-op on event pick | Margin Call etc. | Low |
| Ascension partial (HP/dmg/heal/A3 opener only) | High-ascension balance unknown | All |
Decks that still struggle with high-skill sim play
These are the starters where even the improved sim rarely full-clears on seed 7 — pointing to balance/enemy tuning, not just AI gaps:
| Starter | Clear (seed 7) | Primary walls | Why skill isn't enough yet |
|---|---|---|---|
| Hacker | ~2–4% | Mom & Pop Founders, VP Engineering | 50 HP + 11-card clog; bosses burst before glitch engine wins |
| Nuclear Engineer | ~3% | Mr. & Mrs. Watts (Family boss) | Early survival gap; cash-flow scaling too slow in sim + live pacing |
| Venture Capitalist | ~6% | Mom & Pop, VP | 60 HP hype aggro runs out of runway if hype miss |
| Wildcatter | ~8% | Drilling Director, Grid Nexus | HP trade wins mid-tier but MegaCorp DPS checks fail |
| Grid Operator | ~9% | Drilling Director, Fuel Extractor | Surge engine needs more turns than bosses allow |
Doing well with smart sim: Hustler (~32%), Plague Doctor (~19%), Nurse (~18%), Tech Founder (~16%) — sim now plays enablers, bleed setup, sustain, and cycle lines correctly.
Next balance levers (not sim): Hacker 10-card deck + Family boss HP; Watts/Founders/VP trims; NE early sustain card or Watts HP.
Update (2026-07-07): Sim/live-game parity pass
Combat mechanics now mirrored
| Mechanic | Live source | Sim change |
|---|---|---|
| Surge → energy | CombatManager.StartDrawPhase, Enemy.ExecuteTurn |
_spent_surge added to turn energy, decays at end of turn |
| Status tick timing | ProcessTurnStartEffects (bleed/combustion/glitch/cashflow) |
Moved from end-of-turn to start of take_turn() |
| Cash flow capital | ProcessTurnStartEffects → AddCapital(CashFlow) |
battle_capital_gained per turn, credited in run_simulator |
| Hype damage | CalculateFinalDamage: × (1 + hype/10) |
Was flat +hype; now multiplier via sim_parity.apply_hype_multiplier |
| Overcharge | Next attack ×1.5, then 2 self-dmg | overcharge flag on Combatant |
| Exhaust | Already modeled | Unchanged |
| Ephemeral | Keyword + Hallucination.tres |
Unplayed ephemeral removed at end of turn |
| End-of-turn triggers | EndPlayerTurn → TriggerOnEndOfTurn |
Hallucination 2 chip if held |
| Blackout curse | ProcessTurnEndEffects hand check |
bonus_energy_next_turn -= 1 |
| Innate (Automation upgrade) | StartBattle innate pull |
Innate cards start in opening hand |
| Forced discard | ForcedDiscardEffect |
Already executed in combat (confirmed) |
Run/meta mechanics now mirrored
| Mechanic | Sim change |
|---|---|
| Card upgrades | RunState.upgrades + sim_parity.apply_upgrade (Optimization −1 cost, Expansion ×1.5, Automation innate) |
| Transform to Rare | Boardroom Coup event replaces an uncommon with a random rare |
| Performance Review upgrade | upgrade_count applies a random upgrade path |
New files
scripts/sim_parity.py— upgrade paths, combat deck flattening, hype helperscripts/test_sim_parity.py— 10 parity unit tests (wired intotest_combat_regression.py)
Seed-7 / 100-trial clear rates (post-parity)
| Starter | Pre-parity (archetype branch) | Post-parity |
|---|---|---|
| Hustler | 32.0% | 32.0% |
| Plague Doctor | 18.7% | 20.0% |
| Nurse | 18.3% | 19.0% |
| Tech Founder | 16.0% | 24.0% |
| Hacker | 2.0% | 5.0% |
| Grid Operator | 9.0% | 11.0% |
| Wildcatter | 8.3% | 6.0% |
| Venture Capitalist | 5.7% | 4.0% |
| Nuclear Engineer | 3.3% | 3.0% |
Surge-as-energy and hype multiplier notably help energy/hype starters; Hacker ticked up from better economy modeling without enemy changes.
Remaining sim gaps (lower priority)
| Gap | Notes |
|---|---|
| Map pathing | Linear 2+1 tier structure (documented simplification) |
| Ascension A5+ curse-after-boss | Dead code in live game — intentionally skipped |
| Enemy intent vs player | Player intent opaque to enemy (matches UI) |
| Hallucination unplayable cost=99 | Ephemeral trigger modeled; full unplayable UX not needed for sim |
| Cross-deck card swap (enemy actor) | Player-side Circuit = forced discard 1; enemy gift-Blackout/steal-draw not modeled |
| Shop/reward upgrade RNG | Fixed — RewardUI 1/16→1/8 + ShopUI 1/16 on pickup |
| Cursed totems | Fixed — RegulatoryAudit sector curses modeled in totem_catalog |
| Cursed Doll capital drain | Fixed — −1 capital per player turn in combat |
Seed-7 / 300-trial clear rates (post parity pass #2)
| Starter | Post-parity #1 (100t) | Now (300t) | Delta |
|---|---|---|---|
| Hustler | 32.0% | 31.0% | ~flat |
| Grid Operator | 11.0% | 24.0% | +13pp |
| Wildcatter | 6.0% | 13.7% | +7.7pp |
| Nurse | 19.0% | 17.3% | −1.7pp |
| Plague Doctor | 20.0% | 16.0% | −4pp |
| Tech Founder | 24.0% | 15.0% | −9pp |
| Hacker | 5.0% | 4.7% | ~flat |
| Nuclear Engineer | 3.0% | 1.7% | −1.3pp |
| Venture Capitalist | 4.0% | 1.7% | −2.3pp |
| Pooled | ~12% | ~13.9% | +2pp |
Upgrade rolls and cursed-totem modeling help energy/surge starters most (Grid Op, Wildcatter). Tech Founder/VC drops likely reflect curse-totem downside + capital drain when Cursed Doll is owned, and fewer “free” HP-padding paths as upgrades replace raw picks.
Balance outliers (skill-aligned sim, seed 7)
| Tier | Starters | Issue |
|---|---|---|
| Too easy | Hustler (31%), Grid Operator (24%) | Above 20% band — enemy retune or starter trim |
| In band | Nurse (17%), Plague Doctor (16%), Wildcatter (14%), Tech Founder (15%) | Reasonable skilled-play band |
| Too hard | Hacker (5%), NE (2%), VC (2%) | Boss walls remain — balance pass, not more sim heuristics |