FixedCombo gate pattern: Oops +20pp, Reanimator +14pp, Doomsday +15pp
Combo decks cracking Petals/Guides unconditionally T1, wasting all resources.
Root cause: no mana simulation before committing. Fix: check if combo is achievable (4+ mana with pieces in hand) before cracking. One if-statement per deck. Oops 37→57%, Reanimator +14pp vs Dimir, Doomsday +15pp vs D&T.
FixedEidolon: 0 opponent triggers → 1.0/game
Opponent spells bypassed cast_spell() pipeline, never firing Eidolon.
Post-strategy GY growth tracking catches ~50% of opponent spells. Full fix needs cast_spell() refactor (Brief C). Before: 262 triggers all on P1, 0 on P2. After: P1 1.7/game, P2 1.0/game.
FixedRift Bolt suspend modeled (CR 702.62)
Was instant-cast; now pays R, exiles, resolves next upkeep with counter window.
Suspend: pay R, exile, resolve at next upkeep. Counter window on resolution (not on suspend). Hard cast 2R only when opp ≤3 life. Not a prowess trigger (special action). 65% of games suspend, 91% resolve, 7% countered.
FixedFoW pitch protection: never exile Oracle/DD/Tendrils
Doomsday was pitching Thassa's Oracle to Force of Will — exiling win condition.
_select_fow_pitch() now has never_exile set for all combo win conditions + combo pieces. Also checks win_condition and is_combo_piece Card attributes. Doomsday vs Burn still low (life payment) but no longer self-sabotages.
FixedDepths crash: missing import random
Crop Rotation path crashed on random.random() — strategy forfeited turns.
Added import random. Also removed artificial 60% success cap on Crop Rotation (it's a tutor — always finds). Depths +11.7pp overall, vs Burn 20→42%.
FixedAffinity Automaton double-count
Emry recursions boosted Automaton inline AND via end-of-strategy counter.
Removed inline +1 per Emry cast. End-of-strategy artifacts_cast_this_turn already handles it. Max Automaton was 66/66 (clearly broken). Small overall WR impact.
FixedBurn fetchland manabase + Fireblast 0→42%
Burn had 0 fetchlands and Mountains lacked subtypes. Fireblast never cast.
Added 6 Wooded Foothills, Mountains get subtypes={'Mountain'}. Fireblast condition: T4+ (was T6). Cast rate 0→42%. Multiple matchups shifted 10-15pp.
FixedElves: Heritage Druid before Glimpse
Heritage deployed at Priority 4 (after Glimpse check at Priority 2). Chain never fired.
Now: Heritage + cheap elves deploy first, THEN Glimpse chain fires. Glimpse chains: barely firing → 85%. Natural Order kills: 25%. vs D&T +10pp.
VerifiedTrinisphere pre-dispatch CMC pattern
max(cmc, 3) before strategy dispatch. All strategies auto-pay tax. CR 601.2f compliant.
In play_turn() and protagonist_turn(), all cheap spells get cmc raised to max(cmc, 3) before strategy dispatch. Every strategy automatically pays the Trinisphere tax. Also blocks FoW/FoN alternate costs. LED costs 3 under Trinisphere (artifact, CMC 0 → taxed to 3).
VerifiedSymmetric counter logic
try_reactive_counter() works for either player slot.
Single function handles both directions. Scans defender hand for counter tags, classifies threat, checks Trinisphere/Veil, then walks FoN→FoW→CS→Fluster→Pyro→Daze. Hand-size gates: CS needs 4+ cards. Veil of Summer and Allosaurus Shepherd bypass entirely.
VerifiedPlugin deck architecture
deck_registry.py auto-discovers modules. 36 decks, zero engine edits.
Each file in decks/ exports DECK_META. deck_registry.py scans at import. Adding a new deck = one .py file in decks/. No changes to engine.py, sim.py, or cards.py.
P1Brief C: cast_spell() refactor
All strategies should use unified pipeline (Eidolon 50%→100% coverage).
Currently ~50% of opponent spells bypass cast_spell(), dodging Eidolon triggers and spell tracking. Refactoring all strategies to use the pipeline would give full Eidolon accuracy and enable future static effects.
P1No static lock persistence
Karn lockout partially implemented. Chalice CMC blocking not modeled.
Karn blocks Petal mana and Vial activation (implemented). Chalice CMC blocking and Ensnaring Bridge attack prevention need persistent game state flags. Lock-based decks sim below real-world performance.