Restructure into a multi-deck engine; generalize tools/ off Jund/Reaper hardcodes

Migrates the reaper-king-no-more proof of concept into decks/reaper-king-no-more/
as the first deck under a shared tools/ engine, so the repo can hold many
Commander decks instead of one implicit one.

- tools/deckctx.py: new shared DeckContext, resolves --deck / $MTG_DECK / cwd,
  loads a deck's config.yaml, and derives color identity from the commander's
  own card data (never a hardcoded color combination).
- cards.py: drop the JUND=frozenset("BRG") constant; jund_legal() renamed to
  identity_legal(card, identity); DB() takes an explicit blacklist_path since
  the blacklist is per-deck, not shared.
- combos.py, roles.py, similar.py, similar_text.py, bracket_check.py: take
  --deck, use the deck's real identity instead of Jund/BRG.
- power.py, card_stats.py, forge_report.py: OURS deck-name constant now comes
  from the deck's config (name: / commander), matched via DeckContext instead
  of hardcoded "Reaper King No More".
- to_dck.py, batch_run.py, ab_test.py: .dck filename and [metadata] Name= are
  derived from the deck (slug / config name), not a hardcoded "reaper.dck".
- generate.py: RECIPES and make_variants.py's VARIANTS (deck-specific
  hypotheses) moved out of Python into decks/reaper-king-no-more/variants.yaml;
  protected cards now come from config.yaml's protected: list instead of a
  hardcoded set.
- New tools/mtg dispatcher: `tools/mtg decks/<name> <tool> [args...]` runs any
  tool against any deck without cd-ing into its directory.
- data/ (Scryfall/MTGJSON/Spellbook bulk, ~1.2GB, gitignored) and embeddings.npz
  move to the repo root as shared, commander-format-wide data.
- docs/howto.md: moved from the deck dir (it documents the tool, not the deck)
  and updated its example commands to the real generalized CLI.
- README.md: rewritten to describe the multi-deck repo and point at
  decks/reaper-king-no-more as the reference example.

Verified after the change: bracket_check, combos, and roles against
reaper-king-no-more reproduce the exact PASS/11-combos/role-profile numbers
from before the move; generate.py --list now loads recipes from YAML;
make_variants.py reproduces all 7 hand-curated variants including the
mikaeus FAIL control case; to_dck.py derives the right Name= and filename;
variant.py and compare.py reproduce decks/README.md's original numbers
exactly. The original POC at ~/mtg/reaper-king-no-more is untouched.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QPKgLYpMR8szWNFXyK1XNu
This commit is contained in:
mark rosenberg 2026-09-12 00:34:57 -04:00
parent 1d4419f094
commit d4a8a587f0
122 changed files with 31297 additions and 1 deletions

5
.gitignore vendored Normal file
View file

@ -0,0 +1,5 @@
data/
out/
__pycache__/
*.pyc
.DS_Store

View file

@ -1,3 +1,83 @@
# mtg # mtg
mark's magic decks A generic toolkit for building, testing, and simulating Magic: The Gathering
Commander decks — evidenced by real games played in a real rules engine
([Forge](https://github.com/Card-Forge/forge)), not vibes.
Give it four things about a deck — a commander, a card pool, a blacklist of
cards you refuse to play, and a few constraints (bracket, land count, role
budget) — and it derives everything else from offline card databases: color
identity, legality, Game Changers, Scryfall Tagger tags (so it knows what a
"sac outlet" or "drain payoff" *is*), and the Commander Spellbook combo
database (108k+ combos). It can then generate deck variants as falsifiable
hypotheses, check them against Commander Bracket rules and house rules, and
simulate them in Forge to get card-level and deck-level statistics — cast
rate, win-rate contribution, synergy pairs — instead of guesses.
See `docs/howto.md` for the full methodology: what you supply, how pool size
and game count determine whether results mean anything, how the Forge AI's
weaknesses get worked around, and how to read the output honestly.
## Layout
```
mtg/
tools/ generic engine — works on ANY deck given its config.yaml
mtg single dispatcher: tools/mtg decks/<name> <tool> [args...]
deckctx.py resolves --deck / $MTG_DECK, loads config.yaml
cards.py shared index: oracle + tags + edhrecRank + combos + blacklist
bracket_check.py Bracket 3 + house-rule check (game changers, MLD, vacuum combos)
combos.py offline combo finder (included / one-card-away)
roles.py role classification + budget profile
generate.py role-budget variant generator (recipes in <deck>/variants.yaml)
make_variants.py hand-curated cut/add variant generator (same file)
to_dck.py decklist -> Forge .dck
batch_run.py / run_forge.sh / ab_test.py Forge simulation, in bulk or A/B
forge_report.py / card_stats.py / power.py turn Forge logs into reports
compare.py rebuilds a deck's decks/README.md summary table
similar.py / similar_text.py / embed.py semantic "cards like this" search
fetch_data.py downloads the shared bulk data below
decks/
reaper-king-no-more/ one deck: data + config, the reference example
config.yaml commander, pool, constraints, role budget, protected cards
decklist.txt the 100 cards
blacklist.txt cards you refuse to play, with reasons
variants.yaml variant hypotheses (role-budget recipes + hand-curated cut/add)
plan.md / README.md this deck's own design notes
forge-overrides/ AI tuning for cards Forge's default AI can't pilot
sim_substitutions.yaml simulation-only stand-ins for AI-unpilotable cards
decks/<variant>/ RESULTS: one dir per archetype variant (generated)
data/ gitignored, ~1.2GB — Scryfall/MTGJSON/Spellbook bulk downloads.
Shared across every deck: this is Commander-format-wide data,
not deck-specific. One copy at the repo root.
out/ gitignored scratch output
docs/howto.md the full methodology (pool size, game count, AI tuning, caveats)
```
## Quickstart
```bash
# one-time, shared across all decks
python3 tools/fetch_data.py # ~1.2GB: Scryfall, MTGJSON, Spellbook
python3 tools/embed.py # -> data/embeddings.npz
# install Forge 2.0.14 to ~/forge (needs Java 17+)
# check the reference deck
python3 tools/bracket_check.py --deck decks/reaper-king-no-more
python3 tools/combos.py --deck decks/reaper-king-no-more
python3 tools/roles.py --deck decks/reaper-king-no-more
# or via the single dispatcher
tools/mtg decks/reaper-king-no-more bracket_check
tools/mtg decks/reaper-king-no-more variant no-mikaeus --sim 24
```
To add a new deck: copy the shape of `decks/reaper-king-no-more/` (at minimum
`config.yaml`, `decklist.txt`, `blacklist.txt`), point `--deck` at it, and
every tool in `tools/` works on it immediately — nothing in `tools/` is
hardcoded to a specific commander, color identity, or deck name. See
`docs/howto.md` for what each config field does and why, and
`decks/reaper-king-no-more/plan.md` / `README.md` for a worked example of
building one deck end to end.

View file

@ -0,0 +1,13 @@
https://magic.wizards.com/en/news/announcements/introducing-commander-brackets-beta
This is a repo to to help me make and undrstand how to play my commander Bracket 3 deck
goal of this deck is to infinite combo with arisocrats style creature entre abilites
i'd aim to also have -1/-1 synergy cards as The Reaper, King no More is the commander
engine effects like blowfly infestation and hapatra vizier of poisons to get infinite etb triggers
while one off cards that synergize with the reaper like humble defector are great too

View file

@ -0,0 +1,20 @@
# Cards I don't play, regardless of legality or power.
#
# Format: Card Name | reason
# Blank lines and #-comments ignored. Matched exactly against card names.
#
# These are PREFERENCES, not format rules. bracket_check.py reports them
# separately from bracket violations, and the card-search tools filter them
# out so they never get re-suggested.
## boycott -- personal, no game-logic reason
Sol Ring | boycott, not a power-level call
## playstyle: ramp with LANDS, not rocks (we're in green, use it)
Mind Stone | prefer land ramp
Fellwar Stone | prefer land ramp
Everflowing Chalice | prefer land ramp
Worn Powerstone | prefer land ramp
Thought Vessel | prefer land ramp
Coalition Relic | prefer land ramp
Chromatic Lantern | prefer land ramp

View file

@ -0,0 +1,66 @@
# What you supply. Everything else is derived from the card databases.
# Deck name, used as the Forge [metadata] Name= value and to match "our seat"
# in Forge's play-by-play logs. Deliberately distinct from the commander's own
# card name (which also appears in the decklist) so log matching never
# confuses "cast the commander" with "our player seat".
name: "Reaper King No More"
commander: "The Reaper, King No More"
# Which cards decks may be built from.
# Either a rank cap (popularity proxy) or an explicit curated file.
pool:
max_edhrec_rank: 1000 # ~451 cards in Jund. See howto.md "Choosing a pool size"
# file: mypool.txt # ...or curate the list yourself
min_mana_value: 0
max_mana_value: 7
# Cards you refuse to play, with reasons. See blacklist.txt.
blacklist_file: blacklist.txt
constraints:
bracket: 3 # game changers <=3, no MLD, extra turns sparse
no_vacuum_combos: true # house rule: no 2-card infinites needing no board state
lands: 36
deck_size: 100
# How many of each job a deck should contain. The generator fills to these
# targets and a variant is a deliberate deviation from them.
# Roles are detected automatically from Scryfall Tagger tags.
roles:
minus_engine: 16
sac_outlet: 6
sac_payoff: 4
opp_death: 7
drain: 5
death_trigger: 8
ramp: 9
draw: 6
removal_mass: 3
removal_spot: 8
tokens: 2
proliferate: 2
reanimate: 1
tutor: 0
# Cards the generator may never cut -- your deck's identity.
protected:
- "Hapatra, Vizier of Poisons"
- "Blowfly Infestation"
- "Nest of Scarabs"
- "Necroskitter"
- "Yawgmoth, Thran Physician"
- "Blood Artist"
- "Zulaport Cutthroat"
- "Viscera Seer"
- "Carrion Feeder"
# tools/generate.py's variant recipes -- role-budget reallocation hypotheses.
variants_file: variants.yaml
simulation:
games_per_deck: 150 # 150 = +/-6.9pp. Below 100 is noise. See howto.md
workers: 16 # ~1 core and ~1.5GB RAM each
heap: 2g # per-worker JVM heap
rotate_opponents: true # 4 precon pods, so results aren't matchup-specific

View file

@ -0,0 +1,89 @@
# Commander
1 The Reaper, King No More
# Main
1 Hapatra, Vizier of Poisons
1 Blowfly Infestation
1 Nest of Scarabs
1 Necroskitter
1 Yawgmoth, Thran Physician
1 Flourishing Defenses
1 Obelisk Spider
1 Plague Belcher
1 Archfiend of Ifnir
1 Grim Poppet
1 Contagion Clasp
1 Black Sun's Zenith
1 Murderous Redcap
1 Putrid Goblin
1 Cauldron of Souls
1 Viscera Seer
1 Carrion Feeder
1 Ashnod's Altar
1 Phyrexian Altar
1 Goblin Bombardment
1 Yahenni, Undying Partisan
1 Woe Strider
1 Blood Artist
1 Zulaport Cutthroat
1 Vengeful Bloodwitch
1 Poison-Tip Archer
1 Mirkwood Bats
1 Mayhem Devil
1 Syr Konrad, the Grim
1 Bastion of Remembrance
1 Mazirek, Kraul Death Priest
1 The Meathook Massacre
1 Massacre Wurm
1 Massacre Girl, Known Killer
1 Humble Defector
1 Midnight Reaper
1 Grim Haruspex
1 Village Rites
1 Deadly Dispute
1 Greater Good
1 Beast Within
1 Chaos Warp
1 Terminate
1 Bedevil
1 Assassin's Trophy
1 Damnation
1 Toxic Deluge
1 Vandalblast
1 Cultivate
1 Kodama's Reach
1 Farseek
1 Nature's Lore
1 Three Visits
1 Birds of Paradise
1 Sakura-Tribe Elder
1 Persistent Constrictor
1 Overseer of the Damned
1 Skullclamp
1 Rampant Growth
1 Harrow
1 Wood Elves
1 Springbloom Druid
1 Binding the Old Gods
1 Command Tower
1 Path of Ancestry
1 Exotic Orchard
1 Blood Crypt
1 Overgrown Tomb
1 Stomping Ground
1 Blackcleave Cliffs
1 Blooming Marsh
1 Copperline Gorge
1 Savage Lands
1 Jungle Hollow
1 Bloodfell Caves
1 Rugged Highlands
1 Ziatora's Proving Ground
1 Bojuka Bog
1 Castle Locthwain
1 Llanowar Wastes
1 Karplusan Forest
1 Yavimaya, Cradle of Growth
8 Swamp
5 Forest
4 Mountain

View file

@ -0,0 +1,83 @@
# decks/
Forge simulation results and deck analysis, one directory per **archetype variant**.
Each variant is a hypothesis: change a few cards, then measure what it does to legality, combo density, and win rate. Every file here is generated — see *regenerating* below.
## variants
| variant | bracket 3 | vacuum combos | combos | sac outlets | cmdr synergy | lands | avg MV | Forge win rate |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| [`no-mikaeus/`](no-mikaeus/) ⭐ | **PASS** | 0 | 11 | 8 | 6 | 36 | 3.02 | 29% (24g) |
| [`fast-ramp/`](fast-ramp/) | **PASS** | 0 | 11 | 8 | 6 | 36 | 2.84 | 33% (6g) |
| [`lean-outlets/`](lean-outlets/) | **PASS** | 0 | 10 | 5 | 7 | 36 | 2.97 | — |
| [`commander-focus/`](commander-focus/) | **PASS** | 0 | 7 | 7 | 10 | 36 | 3.03 | — |
| [`heavy-removal/`](heavy-removal/) | **PASS** | 0 | 7 | 8 | 8 | 36 | 2.95 | — |
| [`low-curve/`](low-curve/) | **PASS** | 0 | 11 | 8 | 9 | 36 | 2.67 | — |
| [`mikaeus/`](mikaeus/) | **FAIL** | 7 | 39 | 8 | 6 | 36 | 3.08 | — |
| [`aggro-hate/`](aggro-hate/) | **PASS** | 0 | 9 | 6 | 5 | 36 | 3.03 | 50% (2g) |
| [`card-engine/`](card-engine/) | **PASS** | 0 | 10 | 8 | 6 | 36 | 2.97 | — |
| [`go-wide/`](go-wide/) | **PASS** | 0 | 10 | 8 | 6 | 36 | 2.97 | 0% (2g) |
| [`grindy/`](grindy/) | **PASS** | 0 | 9 | 6 | 5 | 36 | 2.92 | 100% (1g) |
| [`opponent-facing/`](opponent-facing/) | **PASS** | 0 | 9 | 5 | 10 | 36 | 2.92 | — |
| [`proliferate/`](proliferate/) | **PASS** | 0 | 10 | 5 | 5 | 36 | 3.08 | — |
⭐ = current baseline
## the hypotheses
**`no-mikaeus`** — Baseline. Aristocrats + -1/-1, every combo needs board state.
**`fast-ramp`** — fast-ramp
**`lean-outlets`** — The deck runs 8 sac outlets and probably needs ~5. Cut 3 for interaction and card advantage -- does consistency actually drop?
**`commander-focus`** — The commander only steals from OPPONENTS' creatures, but the deck's -1/-1 engine mostly counters our own. Push counters onto their board.
**`heavy-removal`** — Bracket 3 pods interact. Trade combo redundancy for removal and see whether surviving longer beats assembling faster.
**`low-curve`** — Avg MV is 3.02 and the engine lands ~T6. Cut the top of the curve entirely -- does the deck come online sooner and win more?
**`mikaeus`** — Does the highest-leverage combo card (28 combos) stay legal? Expected FAIL: goes infinite with every sac outlet.
**`aggro-hate`** — aggro-hate
**`card-engine`** — card-engine
**`go-wide`** — go-wide
**`grindy`** — grindy
**`opponent-facing`** — opponent-facing
**`proliferate`** — proliferate
## layout
```
decks/<variant>/
decklist.txt the 100 cards, "N Card Name" per line
bracket.txt bracket-3 + house-rule check
combos.txt combos already in the deck, and one card away
sim/ Forge runs, one triple per batch:
<stamp>.log raw Forge output, every game
<stamp>.txt human-readable report
<stamp>.json machine-readable results
README.md generated summary
```
## regenerating
```bash
python3 tools/make_variants.py # rebuild every decklist from the spec
python3 tools/variant.py <name> # analysis for one variant (~10s)
python3 tools/variant.py <name> --sim 24 # + 24 Forge games (~25 min)
python3 tools/compare.py # rebuild this file
```
The decklists are generated from `tools/make_variants.py`, which holds each variant as a cut/add list against the baseline. Change the baseline and every variant follows. Analysis files are rewritten each run; **sim runs are additive**, so batches accumulate and stay comparable.
## reading the win rates
Forge's AI is heuristic and **weak at combo decks** by its own documentation. Ours is a combo deck, so the AI under-plays it. Treat win rates as a **floor** and as evidence the deck functions and its cards interact — not as a power rating. Random baseline in a 4-player pod is 25%. Opponents are stock Commander precons (roughly bracket 2).

View file

@ -0,0 +1,21 @@
# aggro-hate
_generated 2026-09-07 23:37Z by `tools/variant.py`_
- **bracket 3: PASS** (two-card vacuum combos: 0)
- 86 lines in `decklist.txt`
## files
| file | what it is |
| --- | --- |
| `decklist.txt` | the deck, `N Card Name` per line |
| `bracket.txt` | bracket-3 + house-rule check |
| `combos.txt` | combos in the deck, and one card away |
| `sim/` | Forge runs — `.log` raw, `.txt` report, `.json` data |
| `card_stats.txt` | per-card cast rate, avg round, win% (newest sim) |
## simulation runs
_none yet — run with `--sim 24`_

View file

@ -0,0 +1,24 @@
COMMANDER: The Reaper, King No More
DECK SIZE: 99 + 1 commander = 100
GAME CHANGERS: 0/3 OK
MASS LAND DENIAL: 0 OK
EXTRA TURNS: 0 OK
TWO-CARD INFINITE COMBOS IN A VACUUM: 0 OK
two-card combos needing board state (ALLOWED, 3):
- Blowfly Infestation + Hapatra, Vizier of Poisons
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Flourishing Defenses
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Nest of Scarabs
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
==========================================================
BRACKET 3: PASS

View file

@ -0,0 +1,86 @@
==========================================================================
CARD STATISTICS — 20260908T001736Z.log
==========================================================================
games: 2 our wins: 0 (0.0%) deck: /home/markdoeswork/mtg/reaper-king-no-more/decks/aggro-hate/decklist.txt
NEVER CAST IN ANY GAME: 42
--------------------------------------------------------------------------
(dead weight, unplayable by the AI, or just never drawn in time)
Accursed Marauder
Ashnod's Altar
Assassin's Trophy
Beast Within
Binding the Old Gods
Black Sun's Zenith
Blasphemous Act
Contagion Clasp
Cultivate
Damnation
Deadly Dispute
Deadly Rollick
Farseek
Feed the Swarm
Flourishing Defenses
Goblin Bombardment
Greater Good
Grim Haruspex
Hapatra, Vizier of Poisons
Humble Defector
Kodama's Reach
Massacre Wurm
Mayhem Devil
Mazirek, Kraul Death Priest
Midnight Reaper
Mirkwood Bats
Murderous Redcap
Nature's Lore
Persistent Constrictor
Phyrexian Altar
Plague Belcher
Poison-Tip Archer
Putrid Goblin
Springbloom Druid
The Meathook Massacre
Toxic Deluge
Vandalblast
Vengeful Bloodwitch
Village Rites
Viscera Seer
Wood Elves
Yawgmoth, Thran Physician
MOST-CAST CARDS
--------------------------------------------------------------------------
card cast in avg round win% when cast
Necroskitter 2/2 R11.5 0%
The Reaper, King No More 2/2 R8.7 0%
Terminate 2/2 R9.0 0%
Nest of Scarabs 1/2 R8.0 0%
Carrion Feeder 1/2 R4.0 0%
Chandra's Ignition 1/2 R7.0 0%
Blood Artist 1/2 R7.0 0%
Skullclamp 1/2 R1.0 0%
Three Visits 1/2 R3.0 0%
Zulaport Cutthroat 1/2 R6.0 0%
Massacre Girl, Known Killer 1/2 R7.0 0%
Bedevil 1/2 R9.0 0%
Archfiend of Ifnir 1/2 R11.0 0%
Chaos Warp 1/2 R6.0 0%
Birds of Paradise 1/2 R6.0 0%
Harrow 1/2 R3.0 0%
Overseer of the Damned 1/2 R9.0 0%
Rampant Growth 1/2 R2.0 0%
Blowfly Infestation 1/2 R6.0 0%
Syr Konrad, the Grim 1/2 R10.0 0%
CAVEATS — DO NOT CUT CARDS ON THIS ALONE
--------------------------------------------------------------------------
* 2 games is a tiny sample. A card cast in 5 games has a win-rate
swing of +/-40% from noise alone.
* 'Never cast' conflates three very different things: a bad card, a
card the AI cannot use, and a card that was simply never drawn.
* Correlation only. Cards cast in LONG games look good because long
games are ones we survived -- the card didn't cause the win.
* Forge's AI is weak at combo; it under-casts combo pieces.
raw: /home/markdoeswork/mtg/reaper-king-no-more/decks/aggro-hate/sim/20260908T001736Z-cards.json

View file

@ -0,0 +1,78 @@
==================================================================
COMBOS ALREADY IN THE DECK: 9
==================================================================
[E] Blowfly Infestation + Flourishing Defenses
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite death triggers
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Nest of Scarabs
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Hapatra, Vizier of Poisons
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Yawgmoth, Thran Physician + Nest of Scarabs + Blood Artist
-> Near-infinite -1/-1 counters
-> Near-infinite card draw
-> Near-infinite death triggers
requires: Your life total is at least 2.
requires: You control at least one additional creature.
requires: There is at least one other creature on the battlefield.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Blood Artist
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Zulaport Cutthroat
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Viscera Seer
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Ashnod's Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colorless mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Phyrexian Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colored mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
==================================================================
ONE CARD AWAY: 286 combos, 90 distinct cards
==================================================================
15 combos Mikaeus, the Unhallowed {3}{B}{B}{B} #1306
10 combos First Day of Class {1}{R} #10147
8 combos Veinwitch Coven {2}{B} #4179
8 combos Host of the Hereafter {2}{B}{G} #7758
7 combos Rhythm of the Wild {1}{R}{G} #216
7 combos Grumgully, the Generous {1}{R}{G} #4341
7 combos Scurry Oak {2}{G} #2259
6 combos Thran Vigil {1}{B} #6285
6 combos Rocksteady, Mutant Marauder {2}{G} #10233
6 combos Support Mission {2}{G} #31928
6 combos Captain Kathryn Janeway {3}{G} #26133
6 combos Surrak and Goreclaw {4}{G}{G} #1600
6 combos Warden of the Grove {2}{G} #2262
6 combos Railway Brawler {3}{G}{G} #2493
6 combos Uncivil Unrest {4}{R} #2947
decklist: /home/markdoeswork/mtg/reaper-king-no-more/decks/aggro-hate/decklist.txt | source: data/variants.json (108,535 combos)

View file

@ -0,0 +1,95 @@
# aggro-hate
# 15 of 17 losses were life hitting 0 against aggro. Trade combo redundancy for sweepers and spot removal.
# generated by tools/generate.py from decks/no-mikaeus
# roles: {'removal_mass': 3, 'removal_spot': 2, 'minus_engine': -3, 'sac_outlet': -2}
# Commander
1 The Reaper, King No More
# Main
1 Accursed Marauder
1 Archfiend of Ifnir
1 Ashnod's Altar
1 Assassin's Trophy
1 Bastion of Remembrance
1 Beast Within
1 Bedevil
1 Binding the Old Gods
1 Birds of Paradise
1 Black Sun's Zenith
1 Blackcleave Cliffs
1 Blasphemous Act
1 Blood Artist
1 Blood Crypt
1 Bloodfell Caves
1 Blooming Marsh
1 Blowfly Infestation
1 Bojuka Bog
1 Carrion Feeder
1 Castle Locthwain
1 Chandra's Ignition
1 Chaos Warp
1 Command Tower
1 Contagion Clasp
1 Copperline Gorge
1 Cultivate
1 Damnation
1 Deadly Dispute
1 Deadly Rollick
1 Exotic Orchard
1 Farseek
1 Feed the Swarm
1 Flourishing Defenses
1 Goblin Bombardment
1 Greater Good
1 Grim Haruspex
1 Hapatra, Vizier of Poisons
1 Harrow
1 Humble Defector
1 Jungle Hollow
1 Karplusan Forest
1 Kodama's Reach
1 Llanowar Wastes
1 Massacre Girl, Known Killer
1 Massacre Wurm
1 Mayhem Devil
1 Mazirek, Kraul Death Priest
1 Midnight Reaper
1 Mirkwood Bats
1 Murderous Redcap
1 Nature's Lore
1 Necroskitter
1 Nest of Scarabs
1 Overgrown Tomb
1 Overseer of the Damned
1 Path of Ancestry
1 Persistent Constrictor
1 Phyrexian Altar
1 Plague Belcher
1 Poison-Tip Archer
1 Putrid Goblin
1 Rampant Growth
1 Rugged Highlands
1 Sakura-Tribe Elder
1 Savage Lands
1 Skullclamp
1 Springbloom Druid
1 Stomping Ground
1 Syr Konrad, the Grim
1 Terminate
1 The Meathook Massacre
1 Three Visits
1 Toxic Deluge
1 Vandalblast
1 Vengeful Bloodwitch
1 Village Rites
1 Viscera Seer
1 Wood Elves
1 Yavimaya, Cradle of Growth
1 Yawgmoth, Thran Physician
1 Ziatora's Proving Ground
1 Zulaport Cutthroat
8 Swamp
5 Forest
4 Mountain

View file

@ -0,0 +1,583 @@
{
"log": "/home/markdoeswork/mtg/reaper-king-no-more/decks/aggro-hate/sim/20260908T001736Z.log",
"games": 2,
"base_win_rate": 0.0,
"cards": [
{
"card": "Necroskitter",
"games_cast": 2,
"cast_rate": 1.0,
"avg_turn": 11.5,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 2
},
{
"card": "The Reaper, King No More",
"games_cast": 2,
"cast_rate": 1.0,
"avg_turn": 8.666666666666666,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 6
},
{
"card": "Terminate",
"games_cast": 2,
"cast_rate": 1.0,
"avg_turn": 9.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 2
},
{
"card": "Nest of Scarabs",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 8.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Carrion Feeder",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 4.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Chandra's Ignition",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 7.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Blood Artist",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 7.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Skullclamp",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 1.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Three Visits",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 3.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Zulaport Cutthroat",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 6.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Massacre Girl, Known Killer",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 7.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Bedevil",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 9.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Archfiend of Ifnir",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 11.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Chaos Warp",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 6.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Birds of Paradise",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 6.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Harrow",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 3.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Overseer of the Damned",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 9.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Rampant Growth",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 2.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Blowfly Infestation",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 6.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Syr Konrad, the Grim",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 10.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Bastion of Remembrance",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 11.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Sakura-Tribe Elder",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 12.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Greater Good",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Poison-Tip Archer",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Wood Elves",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Humble Defector",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Putrid Goblin",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "The Meathook Massacre",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Farseek",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Grim Haruspex",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Mayhem Devil",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Black Sun's Zenith",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Phyrexian Altar",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Nature's Lore",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Blasphemous Act",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Mazirek, Kraul Death Priest",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Hapatra, Vizier of Poisons",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Plague Belcher",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Yawgmoth, Thran Physician",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Contagion Clasp",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Toxic Deluge",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Murderous Redcap",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Beast Within",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Springbloom Druid",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Cultivate",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Deadly Dispute",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Mirkwood Bats",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Binding the Old Gods",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Midnight Reaper",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Feed the Swarm",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Kodama's Reach",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Deadly Rollick",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Flourishing Defenses",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Village Rites",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Accursed Marauder",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Ashnod's Altar",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Damnation",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Vengeful Bloodwitch",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Massacre Wurm",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Persistent Constrictor",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Goblin Bombardment",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Viscera Seer",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Vandalblast",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Assassin's Trophy",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
}
]
}

View file

@ -0,0 +1,60 @@
{
"meta": {
"generated": "20260908T002027Z",
"engine": "Forge 2.0.14",
"format": "Commander, 4 players",
"games_requested": "2",
"games_completed": 2,
"seed": "20260907",
"decklist_file": "/home/markdoeswork/mtg/reaper-king-no-more/decks/aggro-hate/decklist.txt",
"log_file": "/home/markdoeswork/mtg/reaper-king-no-more/decks/aggro-hate/sim/20260908T001736Z.log",
"caveat": "Forge AI is weak at combo decks; treat win rate as a floor"
},
"win_counts": {
"Reaper King No More": 1,
"Faceless Menace [C19] [2019]": 1,
"Merciless Rage [C19] [2019]": 0,
"Arcane Maelstrom [C20] [2020]": 0
},
"our_win_rate": 0.5,
"games": [
{
"turns": 22,
"winner": "Arcane Maelstrom [C20] [2020]",
"losers": [
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 1,
"ms": 120068
},
{
"turns": 32,
"winner": "Faceless Menace [C19] [2019]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 2,
"ms": 46164
}
]
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,45 @@
====================================================================
FORGE SIMULATION REPORT — 4-player Commander pod
====================================================================
games completed : 2 (requested 2) seed: 20260907
decklist : /home/markdoeswork/mtg/reaper-king-no-more/decks/aggro-hate/decklist.txt (full 100 cards)
engine : Forge 2.0.14, full rules, AI vs AI
WIN RATE
--------------------------------------------------------------------
our deck : 1/2 (50.0%) [random baseline in a 4-pod = 25%]
all players:
Reaper King No More 1 (50.0%) ############### <-- ours
Faceless Menace [C19] [2019] 1 (50.0%) ###############
Merciless Rage [C19] [2019] 0 ( 0.0%)
Arcane Maelstrom [C20] [2020] 0 ( 0.0%)
GAME LENGTH
--------------------------------------------------------------------
turns median 27 min 22 max 32
seconds median 83 total 2.8 min
HOW OUR DECK LOST
--------------------------------------------------------------------
1x life total reached 0
WHO BEAT US (winner, in games our deck lost)
--------------------------------------------------------------------
1x Faceless Menace [C19] [2019]
CAVEAT — READ THIS BEFORE TRUSTING THE WIN RATE
--------------------------------------------------------------------
Forge's AI is heuristic and, by its own documentation, WEAK AT COMBO
decks. Ours is a combo/aristocrats deck, so the AI systematically
under-plays it: it will miss sac-loop lines a human would see.
Read this as a FLOOR on the deck's power, and as proof the deck
functions and its cards interact — not as a power rating.
Opponents are stock precons, which are roughly bracket 2.
====================================================================
decklist : /home/markdoeswork/mtg/reaper-king-no-more/decks/aggro-hate/decklist.txt
full log : /home/markdoeswork/mtg/reaper-king-no-more/decks/aggro-hate/sim/20260908T001736Z.log (every game, all Forge output)
raw data : /home/markdoeswork/mtg/reaper-king-no-more/decks/aggro-hate/sim/20260908T001736Z.json
this report: /home/markdoeswork/mtg/reaper-king-no-more/decks/aggro-hate/sim/20260908T001736Z.txt
====================================================================

View file

@ -0,0 +1,21 @@
# card-engine
_generated 2026-09-07 23:37Z by `tools/variant.py`_
- **bracket 3: PASS** (two-card vacuum combos: 0)
- 86 lines in `decklist.txt`
## files
| file | what it is |
| --- | --- |
| `decklist.txt` | the deck, `N Card Name` per line |
| `bracket.txt` | bracket-3 + house-rule check |
| `combos.txt` | combos in the deck, and one card away |
| `sim/` | Forge runs — `.log` raw, `.txt` report, `.json` data |
| `card_stats.txt` | per-card cast rate, avg round, win% (newest sim) |
## simulation runs
_none yet — run with `--sim 24`_

View file

@ -0,0 +1,25 @@
COMMANDER: The Reaper, King No More
DECK SIZE: 99 + 1 commander = 100
GAME CHANGERS: 1/3 OK
- The One Ring
MASS LAND DENIAL: 0 OK
EXTRA TURNS: 0 OK
TWO-CARD INFINITE COMBOS IN A VACUUM: 0 OK
two-card combos needing board state (ALLOWED, 3):
- Blowfly Infestation + Flourishing Defenses
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Nest of Scarabs
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Hapatra, Vizier of Poisons
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
==========================================================
BRACKET 3: PASS

View file

@ -0,0 +1,83 @@
==================================================================
COMBOS ALREADY IN THE DECK: 10
==================================================================
[E] Blowfly Infestation + Flourishing Defenses
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite death triggers
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Nest of Scarabs
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Hapatra, Vizier of Poisons
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Yawgmoth, Thran Physician + Nest of Scarabs + Blood Artist
-> Near-infinite -1/-1 counters
-> Near-infinite card draw
-> Near-infinite death triggers
requires: Your life total is at least 2.
requires: You control at least one additional creature.
requires: There is at least one other creature on the battlefield.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Blood Artist
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Zulaport Cutthroat
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Woe Strider
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Viscera Seer
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Ashnod's Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colorless mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Phyrexian Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colored mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
==================================================================
ONE CARD AWAY: 416 combos, 106 distinct cards
==================================================================
21 combos Mikaeus, the Unhallowed {3}{B}{B}{B} #1306
10 combos Host of the Hereafter {2}{B}{G} #7758
10 combos First Day of Class {1}{R} #10147
8 combos Veinwitch Coven {2}{B} #4179
8 combos Thran Vigil {1}{B} #6285
8 combos Grumgully, the Generous {1}{R}{G} #4341
7 combos Stalwart Successor {1}{B}{G} #13591
7 combos Melira, Sylvok Outcast {1}{G} #11230
7 combos Rocksteady, Mutant Marauder {2}{G} #10233
7 combos Reyhan, Last of the Abzan {1}{B}{G} #6299
7 combos Support Mission {2}{G} #31928
7 combos Captain Kathryn Janeway {3}{G} #26133
7 combos The Unbeatable Squirrel Girl {1}{G}{G}{G} #7070
7 combos Surrak and Goreclaw {4}{G}{G} #1600
7 combos Railway Brawler {3}{G}{G} #2493
decklist: /home/markdoeswork/mtg/reaper-king-no-more/decks/card-engine/decklist.txt | source: data/variants.json (108,535 combos)

View file

@ -0,0 +1,95 @@
# card-engine
# Only 1 real draw engine in 99 cards. An aristocrats deck that draws off its own deaths should never run out of gas.
# generated by tools/generate.py from decks/no-mikaeus
# roles: {'draw': 5, 'death_trigger': 2, 'minus_engine': -4, 'ramp': -3}
# Commander
1 The Reaper, King No More
# Main
1 Archfiend of Ifnir
1 Ashnod's Altar
1 Assassin's Trophy
1 Bastion of Remembrance
1 Beast Within
1 Bedevil
1 Birds of Paradise
1 Black Sun's Zenith
1 Blackcleave Cliffs
1 Blood Artist
1 Blood Crypt
1 Bloodfell Caves
1 Blooming Marsh
1 Blowfly Infestation
1 Bojuka Bog
1 Carrion Feeder
1 Castle Locthwain
1 Chaos Warp
1 Command Tower
1 Contagion Clasp
1 Copperline Gorge
1 Cultivate
1 Damnation
1 Exotic Orchard
1 Farseek
1 Flourishing Defenses
1 Garruk's Uprising
1 Goblin Bombardment
1 Greater Good
1 Grim Haruspex
1 Hapatra, Vizier of Poisons
1 Humble Defector
1 Idol of Oblivion
1 Jungle Hollow
1 Karplusan Forest
1 Kodama's Reach
1 Llanowar Wastes
1 Massacre Girl, Known Killer
1 Massacre Wurm
1 Mayhem Devil
1 Mazirek, Kraul Death Priest
1 Midnight Reaper
1 Mirkwood Bats
1 Nature's Lore
1 Necroskitter
1 Nest of Scarabs
1 Overgrown Tomb
1 Overseer of the Damned
1 Path of Ancestry
1 Persistent Constrictor
1 Phyrexian Altar
1 Phyrexian Arena
1 Pitiless Plunderer
1 Plague Belcher
1 Poison-Tip Archer
1 Putrid Goblin
1 Rampant Growth
1 Return of the Wildspeaker
1 Rugged Highlands
1 Sakura-Tribe Elder
1 Savage Lands
1 Skullclamp
1 Solemn Simulacrum
1 Springbloom Druid
1 Stomping Ground
1 Syr Konrad, the Grim
1 Terminate
1 The Meathook Massacre
1 The One Ring
1 Three Visits
1 Toxic Deluge
1 Vandalblast
1 Vengeful Bloodwitch
1 Village Rites
1 Viscera Seer
1 Woe Strider
1 Wood Elves
1 Yahenni, Undying Partisan
1 Yavimaya, Cradle of Growth
1 Yawgmoth, Thran Physician
1 Ziatora's Proving Ground
1 Zulaport Cutthroat
8 Swamp
5 Forest
4 Mountain

View file

@ -0,0 +1,20 @@
# commander-focus
_generated 2026-09-07 15:51Z by `tools/variant.py`_
- **bracket 3: PASS** (two-card vacuum combos: 0)
- 86 lines in `decklist.txt`
## files
| file | what it is |
| --- | --- |
| `decklist.txt` | the deck, `N Card Name` per line |
| `bracket.txt` | bracket-3 + house-rule check |
| `combos.txt` | combos in the deck, and one card away |
| `sim/` | Forge runs — `.log` raw, `.txt` report, `.json` data |
## simulation runs
_none yet — run with `--sim 24`_

View file

@ -0,0 +1,24 @@
COMMANDER: The Reaper, King No More
DECK SIZE: 99 + 1 commander = 100
GAME CHANGERS: 0/3 OK
MASS LAND DENIAL: 0 OK
EXTRA TURNS: 0 OK
TWO-CARD INFINITE COMBOS IN A VACUUM: 0 OK
two-card combos needing board state (ALLOWED, 3):
- Blowfly Infestation + Flourishing Defenses
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Nest of Scarabs
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Hapatra, Vizier of Poisons
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
==========================================================
BRACKET 3: PASS

View file

@ -0,0 +1,70 @@
==================================================================
COMBOS ALREADY IN THE DECK: 7
==================================================================
[E] Blowfly Infestation + Flourishing Defenses
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite death triggers
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Nest of Scarabs
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Hapatra, Vizier of Poisons
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Obelisk Spider
-> Near-infinite lifeloss
-> Near-infinite lifegain triggers
-> Near-infinite creature ETB
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[E] Yawgmoth, Thran Physician + Nest of Scarabs + Blood Artist
-> Near-infinite -1/-1 counters
-> Near-infinite card draw
-> Near-infinite death triggers
requires: Your life total is at least 2.
requires: You control at least one additional creature.
requires: There is at least one other creature on the battlefield.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Blood Artist
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Zulaport Cutthroat
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
==================================================================
ONE CARD AWAY: 288 combos, 79 distinct cards
==================================================================
24 combos Mikaeus, the Unhallowed {3}{B}{B}{B} #1306
9 combos Host of the Hereafter {2}{B}{G} #7758
8 combos Veinwitch Coven {2}{B} #4179
7 combos Scurry Oak {2}{G} #2259
6 combos Stalwart Successor {1}{B}{G} #13591
6 combos Thran Vigil {1}{B} #6285
6 combos Melira, Sylvok Outcast {1}{G} #11230
6 combos Rocksteady, Mutant Marauder {2}{G} #10233
6 combos Reyhan, Last of the Abzan {1}{B}{G} #6299
6 combos Support Mission {2}{G} #31928
6 combos Captain Kathryn Janeway {3}{G} #26133
6 combos First Day of Class {1}{R} #10147
6 combos Surrak and Goreclaw {4}{G}{G} #1600
6 combos Warden of the Grove {2}{G} #2262
6 combos Railway Brawler {3}{G}{G} #2493
decklist: /home/markdoeswork/mtg/reaper-king-no-more/decks/commander-focus/decklist.txt | source: data/variants.json (108,535 combos)

View file

@ -0,0 +1,92 @@
# commander-focus
# The commander only steals from OPPONENTS' creatures, but the deck's -1/-1 engine mostly counters our own. Push counters onto their board.
# Commander
1 The Reaper, King No More
# Main
1 Hapatra, Vizier of Poisons
1 Blowfly Infestation
1 Nest of Scarabs
1 Necroskitter
1 Yawgmoth, Thran Physician
1 Flourishing Defenses
1 Obelisk Spider
1 Plague Belcher
1 Archfiend of Ifnir
1 Grim Poppet
1 Contagion Clasp
1 Black Sun's Zenith
1 Viscera Seer
1 Carrion Feeder
1 Ashnod's Altar
1 Phyrexian Altar
1 Goblin Bombardment
1 Yahenni, Undying Partisan
1 Blood Artist
1 Zulaport Cutthroat
1 Vengeful Bloodwitch
1 Poison-Tip Archer
1 Mirkwood Bats
1 Mayhem Devil
1 Syr Konrad, the Grim
1 Bastion of Remembrance
1 Mazirek, Kraul Death Priest
1 The Meathook Massacre
1 Massacre Wurm
1 Massacre Girl, Known Killer
1 Humble Defector
1 Midnight Reaper
1 Grim Haruspex
1 Village Rites
1 Deadly Dispute
1 Greater Good
1 Beast Within
1 Chaos Warp
1 Terminate
1 Bedevil
1 Assassin's Trophy
1 Damnation
1 Toxic Deluge
1 Vandalblast
1 Cultivate
1 Kodama's Reach
1 Farseek
1 Nature's Lore
1 Three Visits
1 Birds of Paradise
1 Sakura-Tribe Elder
1 Persistent Constrictor
1 Overseer of the Damned
1 Skullclamp
1 Rampant Growth
1 Harrow
1 Wood Elves
1 Springbloom Druid
1 Binding the Old Gods
1 Mari, the Killing Quill
1 Sangromancer
1 Patron of the Vein
1 Slaughter Specialist
1 Command Tower
1 Path of Ancestry
1 Exotic Orchard
1 Blood Crypt
1 Overgrown Tomb
1 Stomping Ground
1 Blackcleave Cliffs
1 Blooming Marsh
1 Copperline Gorge
1 Savage Lands
1 Jungle Hollow
1 Bloodfell Caves
1 Rugged Highlands
1 Ziatora's Proving Ground
1 Bojuka Bog
1 Castle Locthwain
1 Llanowar Wastes
1 Karplusan Forest
1 Yavimaya, Cradle of Growth
8 Swamp
5 Forest
4 Mountain

View file

@ -0,0 +1,22 @@
# fast-ramp
_generated 2026-09-08 02:07Z by `tools/variant.py`_
- **bracket 3: PASS** (two-card vacuum combos: 0)
- 86 lines in `decklist.txt`
## files
| file | what it is |
| --- | --- |
| `decklist.txt` | the deck, `N Card Name` per line |
| `bracket.txt` | bracket-3 + house-rule check |
| `combos.txt` | combos in the deck, and one card away |
| `sim/` | Forge runs — `.log` raw, `.txt` report, `.json` data |
| `card_stats.txt` | per-card cast rate, avg round, win% (newest sim) |
| `power.txt` | what the deck DID (engine assembly, pressure) win or lose |
## simulation runs
- `sim/20260907T225441Z.txt` — our deck : 2/6 (33.3%) [random baseline in a 4-pod = 25%]

View file

@ -0,0 +1,24 @@
COMMANDER: The Reaper, King No More
DECK SIZE: 99 + 1 commander = 100
GAME CHANGERS: 0/3 OK
MASS LAND DENIAL: 0 OK
EXTRA TURNS: 0 OK
TWO-CARD INFINITE COMBOS IN A VACUUM: 0 OK
two-card combos needing board state (ALLOWED, 3):
- Blowfly Infestation + Flourishing Defenses
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Hapatra, Vizier of Poisons
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Nest of Scarabs
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
==========================================================
BRACKET 3: PASS

View file

@ -0,0 +1,58 @@
==========================================================================
CARD STATISTICS — 20260907T225441Z.log
==========================================================================
games: 6 our wins: 1 (16.7%) deck: /home/markdoeswork/mtg/reaper-king-no-more/decks/fast-ramp/decklist.txt
NEVER CAST IN ANY GAME: 14
--------------------------------------------------------------------------
(dead weight, unplayable by the AI, or just never drawn in time)
Beast Within
Black Sun's Zenith
Blood Artist
Carrion Feeder
Cauldron of Souls
Elvish Mystic
Goblin Bombardment
Greater Good
Grim Haruspex
Overseer of the Damned
Plague Belcher
The Meathook Massacre
Toxic Deluge
Viscera Seer
MOST-CAST CARDS
--------------------------------------------------------------------------
card cast in avg round win% when cast
The Reaper, King No More 6/6 R10.7 17%
Necroskitter 4/6 R10.2 0%
Contagion Clasp 4/6 R12.8 25%
Skullclamp 3/6 R5.3 0%
Three Visits 3/6 R6.3 33%
Village Rites 3/6 R14.7 0%
Persistent Constrictor 3/6 R10.3 33%
Mirkwood Bats 3/6 R7.7 0%
Zulaport Cutthroat 3/6 R14.0 33%
Fyndhorn Elves 2/6 R9.5 0%
Massacre Wurm 2/6 R8.0 0%
Birds of Paradise 2/6 R5.5 0%
Bedevil 2/6 R5.5 0%
Sakura-Tribe Elder 2/6 R3.5 0%
Assassin's Trophy 2/6 R7.5 0%
Putrid Goblin 2/6 R8.0 0%
Mazirek, Kraul Death Priest 2/6 R9.0 0%
Midnight Reaper 2/6 R13.0 50%
Archfiend of Ifnir 2/6 R7.0 50%
Yahenni, Undying Partisan 2/6 R7.0 0%
CAVEATS — DO NOT CUT CARDS ON THIS ALONE
--------------------------------------------------------------------------
* 6 games is a tiny sample. A card cast in 5 games has a win-rate
swing of +/-40% from noise alone.
* 'Never cast' conflates three very different things: a bad card, a
card the AI cannot use, and a card that was simply never drawn.
* Correlation only. Cards cast in LONG games look good because long
games are ones we survived -- the card didn't cause the win.
* Forge's AI is weak at combo; it under-casts combo pieces.
raw: /home/markdoeswork/mtg/reaper-king-no-more/decks/fast-ramp/sim/20260907T225441Z-cards.json

View file

@ -0,0 +1,90 @@
==================================================================
COMBOS ALREADY IN THE DECK: 11
==================================================================
[E] Blowfly Infestation + Flourishing Defenses
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite death triggers
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Nest of Scarabs
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Hapatra, Vizier of Poisons
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Obelisk Spider
-> Near-infinite lifeloss
-> Near-infinite lifegain triggers
-> Near-infinite creature ETB
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[E] Yawgmoth, Thran Physician + Nest of Scarabs + Blood Artist
-> Near-infinite -1/-1 counters
-> Near-infinite card draw
-> Near-infinite death triggers
requires: Your life total is at least 2.
requires: You control at least one additional creature.
requires: There is at least one other creature on the battlefield.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Blood Artist
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Zulaport Cutthroat
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Woe Strider
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Viscera Seer
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Ashnod's Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colorless mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Phyrexian Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colored mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
==================================================================
ONE CARD AWAY: 354 combos, 81 distinct cards
==================================================================
28 combos Mikaeus, the Unhallowed {3}{B}{B}{B} #1306
12 combos First Day of Class {1}{R} #10147
10 combos Host of the Hereafter {2}{B}{G} #7758
9 combos Rhythm of the Wild {1}{R}{G} #216
9 combos Grumgully, the Generous {1}{R}{G} #4341
8 combos Veinwitch Coven {2}{B} #4179
8 combos Thran Vigil {1}{B} #6285
8 combos Rocksteady, Mutant Marauder {2}{G} #10233
8 combos Support Mission {2}{G} #31928
8 combos Captain Kathryn Janeway {3}{G} #26133
8 combos Surrak and Goreclaw {4}{G}{G} #1600
8 combos Railway Brawler {3}{G}{G} #2493
8 combos Warden of the Grove {2}{G} #2262
8 combos Uncivil Unrest {4}{R} #2947
8 combos Renata, Called to the Hunt {2}{G}{G} #2830
decklist: /home/markdoeswork/mtg/reaper-king-no-more/decks/fast-ramp/decklist.txt | source: data/variants.json (108,535 combos)

View file

@ -0,0 +1,92 @@
# fast-ramp
# 6 of 10 ramp pieces cost 3+, and the deck already has 22 three-drops. T3 ramp means NOT deploying an engine piece. Swap the 3-mana fetch spells for 1-mana dorks -- which are also creatures, so they feed the sac outlets and the -1/-1 engine instead of being do-nothing sorceries.
# Commander
1 The Reaper, King No More
# Main
1 Hapatra, Vizier of Poisons
1 Blowfly Infestation
1 Nest of Scarabs
1 Necroskitter
1 Yawgmoth, Thran Physician
1 Flourishing Defenses
1 Obelisk Spider
1 Plague Belcher
1 Archfiend of Ifnir
1 Grim Poppet
1 Contagion Clasp
1 Black Sun's Zenith
1 Murderous Redcap
1 Putrid Goblin
1 Cauldron of Souls
1 Viscera Seer
1 Carrion Feeder
1 Ashnod's Altar
1 Phyrexian Altar
1 Goblin Bombardment
1 Yahenni, Undying Partisan
1 Woe Strider
1 Blood Artist
1 Zulaport Cutthroat
1 Vengeful Bloodwitch
1 Poison-Tip Archer
1 Mirkwood Bats
1 Mayhem Devil
1 Syr Konrad, the Grim
1 Bastion of Remembrance
1 Mazirek, Kraul Death Priest
1 The Meathook Massacre
1 Massacre Wurm
1 Massacre Girl, Known Killer
1 Humble Defector
1 Midnight Reaper
1 Grim Haruspex
1 Village Rites
1 Deadly Dispute
1 Greater Good
1 Beast Within
1 Chaos Warp
1 Terminate
1 Bedevil
1 Assassin's Trophy
1 Damnation
1 Toxic Deluge
1 Vandalblast
1 Farseek
1 Nature's Lore
1 Three Visits
1 Birds of Paradise
1 Sakura-Tribe Elder
1 Persistent Constrictor
1 Overseer of the Damned
1 Skullclamp
1 Rampant Growth
1 Harrow
1 Llanowar Elves
1 Elvish Mystic
1 Fyndhorn Elves
1 Ignoble Hierarch
1 Delighted Halfling
1 Command Tower
1 Path of Ancestry
1 Exotic Orchard
1 Blood Crypt
1 Overgrown Tomb
1 Stomping Ground
1 Blackcleave Cliffs
1 Blooming Marsh
1 Copperline Gorge
1 Savage Lands
1 Jungle Hollow
1 Bloodfell Caves
1 Rugged Highlands
1 Ziatora's Proving Ground
1 Bojuka Bog
1 Castle Locthwain
1 Llanowar Wastes
1 Karplusan Forest
1 Yavimaya, Cradle of Growth
8 Swamp
5 Forest
4 Mountain

View file

@ -0,0 +1,27 @@
======================================================================
POWER REPORT — what the deck did, win or lose
======================================================================
games: 6 wins: 1 (17%) timeout draws: 3 (50%)
DID THE DECK DO ITS THING?
----------------------------------------------------------------------
commander deployed 6/6 games (100%) median round 5
engine assembled 5/6 games ( 83%) median round 14
sac_outlet 6/6 (100%) median round 12
drain 5/6 ( 83%) median round 9
minus_engine 6/6 (100%) median round 13
PRESSURE & SURVIVAL
----------------------------------------------------------------------
life taken from table mean 105.8
life we lost mean 25.7
spells cast mean 19.8
rounds survived mean 17.7
POWER SCORE (composite; see score() for weights)
----------------------------------------------------------------------
mean 75.7 median 78.5 min 36.0 max 109.5
Use this, not win rate, to A/B a change: it moves on far fewer games
because it scores every game instead of only the ones we won.
======================================================================

View file

@ -0,0 +1,583 @@
{
"log": "decks/fast-ramp/sim/20260907T225441Z.log",
"games": 6,
"base_win_rate": 0.16666666666666666,
"cards": [
{
"card": "The Reaper, King No More",
"games_cast": 6,
"cast_rate": 1.0,
"avg_turn": 10.653846153846153,
"win_rate_when_cast": 0.16666666666666666,
"delta": 0.0,
"total_casts": 26
},
{
"card": "Necroskitter",
"games_cast": 4,
"cast_rate": 0.6666666666666666,
"avg_turn": 10.25,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 4
},
{
"card": "Contagion Clasp",
"games_cast": 4,
"cast_rate": 0.6666666666666666,
"avg_turn": 12.75,
"win_rate_when_cast": 0.25,
"delta": 0.08333333333333334,
"total_casts": 4
},
{
"card": "Persistent Constrictor",
"games_cast": 3,
"cast_rate": 0.5,
"avg_turn": 10.333333333333334,
"win_rate_when_cast": 0.3333333333333333,
"delta": 0.16666666666666666,
"total_casts": 3
},
{
"card": "Skullclamp",
"games_cast": 3,
"cast_rate": 0.5,
"avg_turn": 5.333333333333333,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 3
},
{
"card": "Village Rites",
"games_cast": 3,
"cast_rate": 0.5,
"avg_turn": 14.666666666666666,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 3
},
{
"card": "Zulaport Cutthroat",
"games_cast": 3,
"cast_rate": 0.5,
"avg_turn": 14.0,
"win_rate_when_cast": 0.3333333333333333,
"delta": 0.16666666666666666,
"total_casts": 3
},
{
"card": "Three Visits",
"games_cast": 3,
"cast_rate": 0.5,
"avg_turn": 6.333333333333333,
"win_rate_when_cast": 0.3333333333333333,
"delta": 0.16666666666666666,
"total_casts": 3
},
{
"card": "Mirkwood Bats",
"games_cast": 3,
"cast_rate": 0.5,
"avg_turn": 7.666666666666667,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 3
},
{
"card": "Massacre Wurm",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 8.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 2
},
{
"card": "Mazirek, Kraul Death Priest",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 9.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 2
},
{
"card": "Fyndhorn Elves",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 9.5,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 2
},
{
"card": "Hapatra, Vizier of Poisons",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 12.5,
"win_rate_when_cast": 0.5,
"delta": 0.33333333333333337,
"total_casts": 2
},
{
"card": "Bedevil",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 5.5,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 2
},
{
"card": "Vandalblast",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 5.5,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 2
},
{
"card": "Humble Defector",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 12.5,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 2
},
{
"card": "Sakura-Tribe Elder",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 3.5,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 2
},
{
"card": "Chaos Warp",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 11.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 2
},
{
"card": "Archfiend of Ifnir",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 7.0,
"win_rate_when_cast": 0.5,
"delta": 0.33333333333333337,
"total_casts": 2
},
{
"card": "Terminate",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 11.5,
"win_rate_when_cast": 0.5,
"delta": 0.33333333333333337,
"total_casts": 2
},
{
"card": "Assassin's Trophy",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 7.5,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 2
},
{
"card": "Rampant Growth",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 15.0,
"win_rate_when_cast": 0.5,
"delta": 0.33333333333333337,
"total_casts": 2
},
{
"card": "Nature's Lore",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 10.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 2
},
{
"card": "Birds of Paradise",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 5.5,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 2
},
{
"card": "Woe Strider",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 11.333333333333334,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 3
},
{
"card": "Damnation",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 15.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 2
},
{
"card": "Syr Konrad, the Grim",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 10.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 2
},
{
"card": "Ashnod's Altar",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 15.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 2
},
{
"card": "Putrid Goblin",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 8.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 2
},
{
"card": "Yahenni, Undying Partisan",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 7.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 2
},
{
"card": "Poison-Tip Archer",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 12.0,
"win_rate_when_cast": 0.5,
"delta": 0.33333333333333337,
"total_casts": 2
},
{
"card": "Murderous Redcap",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 6.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 2
},
{
"card": "Mayhem Devil",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 8.0,
"win_rate_when_cast": 0.5,
"delta": 0.33333333333333337,
"total_casts": 2
},
{
"card": "Midnight Reaper",
"games_cast": 2,
"cast_rate": 0.3333333333333333,
"avg_turn": 13.0,
"win_rate_when_cast": 0.5,
"delta": 0.33333333333333337,
"total_casts": 2
},
{
"card": "Delighted Halfling",
"games_cast": 1,
"cast_rate": 0.16666666666666666,
"avg_turn": 10.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 1
},
{
"card": "Flourishing Defenses",
"games_cast": 1,
"cast_rate": 0.16666666666666666,
"avg_turn": 17.0,
"win_rate_when_cast": 1.0,
"delta": 0.8333333333333334,
"total_casts": 1
},
{
"card": "Yawgmoth, Thran Physician",
"games_cast": 1,
"cast_rate": 0.16666666666666666,
"avg_turn": 14.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 1
},
{
"card": "Grim Poppet",
"games_cast": 1,
"cast_rate": 0.16666666666666666,
"avg_turn": 10.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 1
},
{
"card": "Vengeful Bloodwitch",
"games_cast": 1,
"cast_rate": 0.16666666666666666,
"avg_turn": 11.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 1
},
{
"card": "Harrow",
"games_cast": 1,
"cast_rate": 0.16666666666666666,
"avg_turn": 18.0,
"win_rate_when_cast": 1.0,
"delta": 0.8333333333333334,
"total_casts": 1
},
{
"card": "Massacre Girl, Known Killer",
"games_cast": 1,
"cast_rate": 0.16666666666666666,
"avg_turn": 16.0,
"win_rate_when_cast": 1.0,
"delta": 0.8333333333333334,
"total_casts": 1
},
{
"card": "Deadly Dispute",
"games_cast": 1,
"cast_rate": 0.16666666666666666,
"avg_turn": 18.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 1
},
{
"card": "Blowfly Infestation",
"games_cast": 1,
"cast_rate": 0.16666666666666666,
"avg_turn": 13.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 1
},
{
"card": "Ignoble Hierarch",
"games_cast": 1,
"cast_rate": 0.16666666666666666,
"avg_turn": 12.0,
"win_rate_when_cast": 1.0,
"delta": 0.8333333333333334,
"total_casts": 1
},
{
"card": "Nest of Scarabs",
"games_cast": 1,
"cast_rate": 0.16666666666666666,
"avg_turn": 13.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 1
},
{
"card": "Farseek",
"games_cast": 1,
"cast_rate": 0.16666666666666666,
"avg_turn": 19.0,
"win_rate_when_cast": 1.0,
"delta": 0.8333333333333334,
"total_casts": 1
},
{
"card": "Obelisk Spider",
"games_cast": 1,
"cast_rate": 0.16666666666666666,
"avg_turn": 8.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 1
},
{
"card": "Phyrexian Altar",
"games_cast": 1,
"cast_rate": 0.16666666666666666,
"avg_turn": 12.0,
"win_rate_when_cast": 1.0,
"delta": 0.8333333333333334,
"total_casts": 1
},
{
"card": "Bastion of Remembrance",
"games_cast": 1,
"cast_rate": 0.16666666666666666,
"avg_turn": 15.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 1
},
{
"card": "Llanowar Elves",
"games_cast": 1,
"cast_rate": 0.16666666666666666,
"avg_turn": 14.0,
"win_rate_when_cast": 0.0,
"delta": -0.16666666666666666,
"total_casts": 1
},
{
"card": "Elvish Mystic",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Cauldron of Souls",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Viscera Seer",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Overseer of the Damned",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Black Sun's Zenith",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Toxic Deluge",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Blood Artist",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Beast Within",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Grim Haruspex",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Goblin Bombardment",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Carrion Feeder",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Greater Good",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Plague Belcher",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "The Meathook Massacre",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
}
]
}

View file

@ -0,0 +1,123 @@
{
"meta": {
"generated": "20260907T230328Z",
"engine": "Forge 2.0.14",
"format": "Commander, 4 players",
"games_requested": "6",
"games_completed": 6,
"seed": "4242",
"decklist_file": "/home/markdoeswork/mtg/reaper-king-no-more/decks/fast-ramp/decklist.txt",
"log_file": "/home/markdoeswork/mtg/reaper-king-no-more/decks/fast-ramp/sim/20260907T225441Z.log",
"caveat": "Forge AI is weak at combo decks; treat win rate as a floor"
},
"win_counts": {
"Reaper King No More": 2,
"Faceless Menace [C19] [2019]": 1,
"Merciless Rage [C19] [2019]": 2,
"Arcane Maelstrom [C20] [2020]": 1
},
"our_win_rate": 0.3333333333333333,
"games": [
{
"turns": 31,
"winner": "Merciless Rage [C19] [2019]",
"losers": [
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 1,
"ms": 120060
},
{
"turns": 37,
"winner": "Reaper King No More",
"losers": [
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 2,
"ms": 38800
},
{
"turns": 26,
"winner": "Arcane Maelstrom [C20] [2020]",
"losers": [
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 3,
"ms": 120000
},
{
"turns": 33,
"winner": "Arcane Maelstrom [C20] [2020]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 4,
"ms": 34073
},
{
"turns": 37,
"winner": "Arcane Maelstrom [C20] [2020]",
"losers": [],
"win_reason": "all opponents have lost",
"game": 5,
"ms": 120000
},
{
"turns": 43,
"winner": "Faceless Menace [C19] [2019]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 6,
"ms": 90431
}
]
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,46 @@
====================================================================
FORGE SIMULATION REPORT — 4-player Commander pod
====================================================================
games completed : 6 (requested 6) seed: 4242
decklist : /home/markdoeswork/mtg/reaper-king-no-more/decks/fast-ramp/decklist.txt (full 100 cards)
engine : Forge 2.0.14, full rules, AI vs AI
WIN RATE
--------------------------------------------------------------------
our deck : 2/6 (33.3%) [random baseline in a 4-pod = 25%]
all players:
Reaper King No More 2 (33.3%) ########## <-- ours
Merciless Rage [C19] [2019] 2 (33.3%) ##########
Faceless Menace [C19] [2019] 1 (16.7%) #####
Arcane Maelstrom [C20] [2020] 1 (16.7%) #####
GAME LENGTH
--------------------------------------------------------------------
turns median 35 min 26 max 43
seconds median 105 total 8.7 min
HOW OUR DECK LOST
--------------------------------------------------------------------
2x life total reached 0
WHO BEAT US (winner, in games our deck lost)
--------------------------------------------------------------------
1x Arcane Maelstrom [C20] [2020]
1x Faceless Menace [C19] [2019]
CAVEAT — READ THIS BEFORE TRUSTING THE WIN RATE
--------------------------------------------------------------------
Forge's AI is heuristic and, by its own documentation, WEAK AT COMBO
decks. Ours is a combo/aristocrats deck, so the AI systematically
under-plays it: it will miss sac-loop lines a human would see.
Read this as a FLOOR on the deck's power, and as proof the deck
functions and its cards interact — not as a power rating.
Opponents are stock precons, which are roughly bracket 2.
====================================================================
decklist : /home/markdoeswork/mtg/reaper-king-no-more/decks/fast-ramp/decklist.txt
full log : /home/markdoeswork/mtg/reaper-king-no-more/decks/fast-ramp/sim/20260907T225441Z.log (every game, all Forge output)
raw data : /home/markdoeswork/mtg/reaper-king-no-more/decks/fast-ramp/sim/20260907T225441Z.json
this report: /home/markdoeswork/mtg/reaper-king-no-more/decks/fast-ramp/sim/20260907T225441Z.txt
====================================================================

View file

@ -0,0 +1,21 @@
# go-wide
_generated 2026-09-07 23:37Z by `tools/variant.py`_
- **bracket 3: PASS** (two-card vacuum combos: 0)
- 86 lines in `decklist.txt`
## files
| file | what it is |
| --- | --- |
| `decklist.txt` | the deck, `N Card Name` per line |
| `bracket.txt` | bracket-3 + house-rule check |
| `combos.txt` | combos in the deck, and one card away |
| `sim/` | Forge runs — `.log` raw, `.txt` report, `.json` data |
| `card_stats.txt` | per-card cast rate, avg round, win% (newest sim) |
## simulation runs
_none yet — run with `--sim 24`_

View file

@ -0,0 +1,25 @@
COMMANDER: The Reaper, King No More
DECK SIZE: 99 + 1 commander = 100
GAME CHANGERS: 1/3 OK
- Orcish Bowmasters
MASS LAND DENIAL: 0 OK
EXTRA TURNS: 0 OK
TWO-CARD INFINITE COMBOS IN A VACUUM: 0 OK
two-card combos needing board state (ALLOWED, 3):
- Blowfly Infestation + Flourishing Defenses
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Hapatra, Vizier of Poisons
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Nest of Scarabs
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
==========================================================
BRACKET 3: PASS

View file

@ -0,0 +1,88 @@
==========================================================================
CARD STATISTICS — 20260908T001736Z.log
==========================================================================
games: 2 our wins: 0 (0.0%) deck: /home/markdoeswork/mtg/reaper-king-no-more/decks/go-wide/decklist.txt
NEVER CAST IN ANY GAME: 44
--------------------------------------------------------------------------
(dead weight, unplayable by the AI, or just never drawn in time)
Archfiend of Ifnir
Assassin's Trophy
Bastion of Remembrance
Beast Within
Black Market Connections
Black Sun's Zenith
Blood Artist
Captain Lannery Storm
Chaos Warp
Cultivate
Damnation
Deadly Dispute
Flourishing Defenses
Goblin Bombardment
Greater Good
Grim Haruspex
Helm of the Host
Humble Defector
Kodama's Reach
Massacre Wurm
Mayhem Devil
Mazirek, Kraul Death Priest
Midnight Reaper
Mirkwood Bats
Murderous Redcap
Nature's Lore
Necroskitter
Overseer of the Damned
Phyrexian Altar
Plague Belcher
Poison-Tip Archer
Rampant Growth
Sakura-Tribe Elder
Scute Swarm
Skullclamp
The Meathook Massacre
Toxic Deluge
Vandalblast
Vengeful Bloodwitch
Village Rites
Viscera Seer
Woe Strider
Wood Elves
Yahenni, Undying Partisan
MOST-CAST CARDS
--------------------------------------------------------------------------
card cast in avg round win% when cast
Three Visits 2/2 R9.5 0%
Zulaport Cutthroat 2/2 R11.5 0%
The Reaper, King No More 2/2 R6.5 0%
Tireless Tracker 2/2 R8.0 0%
Contagion Clasp 1/2 R9.0 0%
Rampaging Baloths 1/2 R7.0 0%
Persistent Constrictor 1/2 R5.0 0%
Yawgmoth, Thran Physician 1/2 R11.0 0%
Ashnod's Altar 1/2 R12.0 0%
Springbloom Druid 1/2 R9.0 0%
Hapatra, Vizier of Poisons 1/2 R2.0 0%
Farseek 1/2 R6.0 0%
Orcish Bowmasters 1/2 R4.0 0%
Syr Konrad, the Grim 1/2 R7.0 0%
Blowfly Infestation 1/2 R8.0 0%
Massacre Girl, Known Killer 1/2 R8.0 0%
Birds of Paradise 1/2 R1.0 0%
Carrion Feeder 1/2 R6.0 0%
Nest of Scarabs 1/2 R8.0 0%
Putrid Goblin 1/2 R10.0 0%
CAVEATS — DO NOT CUT CARDS ON THIS ALONE
--------------------------------------------------------------------------
* 2 games is a tiny sample. A card cast in 5 games has a win-rate
swing of +/-40% from noise alone.
* 'Never cast' conflates three very different things: a bad card, a
card the AI cannot use, and a card that was simply never drawn.
* Correlation only. Cards cast in LONG games look good because long
games are ones we survived -- the card didn't cause the win.
* Forge's AI is weak at combo; it under-casts combo pieces.
raw: /home/markdoeswork/mtg/reaper-king-no-more/decks/go-wide/sim/20260908T001736Z-cards.json

View file

@ -0,0 +1,83 @@
==================================================================
COMBOS ALREADY IN THE DECK: 10
==================================================================
[E] Blowfly Infestation + Flourishing Defenses
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite death triggers
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Nest of Scarabs
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Hapatra, Vizier of Poisons
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Yawgmoth, Thran Physician + Nest of Scarabs + Blood Artist
-> Near-infinite -1/-1 counters
-> Near-infinite card draw
-> Near-infinite death triggers
requires: Your life total is at least 2.
requires: You control at least one additional creature.
requires: There is at least one other creature on the battlefield.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Blood Artist
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Zulaport Cutthroat
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Woe Strider
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Viscera Seer
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Ashnod's Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colorless mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Phyrexian Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colored mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
==================================================================
ONE CARD AWAY: 366 combos, 93 distinct cards
==================================================================
21 combos Mikaeus, the Unhallowed {3}{B}{B}{B} #1306
12 combos First Day of Class {1}{R} #10147
10 combos Host of the Hereafter {2}{B}{G} #7758
9 combos Rhythm of the Wild {1}{R}{G} #216
9 combos Grumgully, the Generous {1}{R}{G} #4341
8 combos Veinwitch Coven {2}{B} #4179
8 combos Thran Vigil {1}{B} #6285
8 combos Rocksteady, Mutant Marauder {2}{G} #10233
8 combos Support Mission {2}{G} #31928
8 combos Captain Kathryn Janeway {3}{G} #26133
8 combos Surrak and Goreclaw {4}{G}{G} #1600
8 combos Railway Brawler {3}{G}{G} #2493
8 combos Warden of the Grove {2}{G} #2262
8 combos Uncivil Unrest {4}{R} #2947
8 combos Renata, Called to the Hunt {2}{G}{G} #2830
decklist: /home/markdoeswork/mtg/reaper-king-no-more/decks/go-wide/decklist.txt | source: data/variants.json (108,535 combos)

View file

@ -0,0 +1,95 @@
# go-wide
# Token swarms feed sac outlets and the -1/-1 engine simultaneously. Tests whether bodies beat individually stronger cards.
# generated by tools/generate.py from decks/no-mikaeus
# roles: {'tokens': 5, 'sac_payoff': 2, 'minus_engine': -3, 'removal_spot': -2, 'ramp': -2}
# Commander
1 The Reaper, King No More
# Main
1 Archfiend of Ifnir
1 Ashnod's Altar
1 Assassin's Trophy
1 Bastion of Remembrance
1 Beast Within
1 Birds of Paradise
1 Black Market Connections
1 Black Sun's Zenith
1 Blackcleave Cliffs
1 Blood Artist
1 Blood Crypt
1 Bloodfell Caves
1 Blooming Marsh
1 Blowfly Infestation
1 Bojuka Bog
1 Captain Lannery Storm
1 Carrion Feeder
1 Castle Locthwain
1 Chaos Warp
1 Command Tower
1 Contagion Clasp
1 Copperline Gorge
1 Cultivate
1 Damnation
1 Deadly Dispute
1 Exotic Orchard
1 Farseek
1 Flourishing Defenses
1 Goblin Bombardment
1 Greater Good
1 Grim Haruspex
1 Hapatra, Vizier of Poisons
1 Helm of the Host
1 Humble Defector
1 Jungle Hollow
1 Karplusan Forest
1 Kodama's Reach
1 Llanowar Wastes
1 Massacre Girl, Known Killer
1 Massacre Wurm
1 Mayhem Devil
1 Mazirek, Kraul Death Priest
1 Midnight Reaper
1 Mirkwood Bats
1 Murderous Redcap
1 Nature's Lore
1 Necroskitter
1 Nest of Scarabs
1 Orcish Bowmasters
1 Overgrown Tomb
1 Overseer of the Damned
1 Path of Ancestry
1 Persistent Constrictor
1 Phyrexian Altar
1 Plague Belcher
1 Poison-Tip Archer
1 Putrid Goblin
1 Rampaging Baloths
1 Rampant Growth
1 Rugged Highlands
1 Sakura-Tribe Elder
1 Savage Lands
1 Scute Swarm
1 Skullclamp
1 Springbloom Druid
1 Stomping Ground
1 Syr Konrad, the Grim
1 The Meathook Massacre
1 Three Visits
1 Tireless Tracker
1 Toxic Deluge
1 Vandalblast
1 Vengeful Bloodwitch
1 Village Rites
1 Viscera Seer
1 Woe Strider
1 Wood Elves
1 Yahenni, Undying Partisan
1 Yavimaya, Cradle of Growth
1 Yawgmoth, Thran Physician
1 Ziatora's Proving Ground
1 Zulaport Cutthroat
8 Swamp
5 Forest
4 Mountain

View file

@ -0,0 +1,583 @@
{
"log": "/home/markdoeswork/mtg/reaper-king-no-more/decks/go-wide/sim/20260908T001736Z.log",
"games": 2,
"base_win_rate": 0.0,
"cards": [
{
"card": "Three Visits",
"games_cast": 2,
"cast_rate": 1.0,
"avg_turn": 9.5,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 2
},
{
"card": "Zulaport Cutthroat",
"games_cast": 2,
"cast_rate": 1.0,
"avg_turn": 11.5,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 2
},
{
"card": "The Reaper, King No More",
"games_cast": 2,
"cast_rate": 1.0,
"avg_turn": 6.5,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 6
},
{
"card": "Tireless Tracker",
"games_cast": 2,
"cast_rate": 1.0,
"avg_turn": 8.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 2
},
{
"card": "Contagion Clasp",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 9.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Rampaging Baloths",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 7.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Persistent Constrictor",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 5.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Yawgmoth, Thran Physician",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 11.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Ashnod's Altar",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 12.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Springbloom Druid",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 9.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Hapatra, Vizier of Poisons",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 2.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Farseek",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 6.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Orcish Bowmasters",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 4.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Syr Konrad, the Grim",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 7.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Blowfly Infestation",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 8.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Massacre Girl, Known Killer",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 8.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Birds of Paradise",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 1.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Carrion Feeder",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 6.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Nest of Scarabs",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 8.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Putrid Goblin",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 10.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Rampant Growth",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Grim Haruspex",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Poison-Tip Archer",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Bastion of Remembrance",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Vandalblast",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Humble Defector",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Murderous Redcap",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Blood Artist",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Plague Belcher",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Mazirek, Kraul Death Priest",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Nature's Lore",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Assassin's Trophy",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Damnation",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Kodama's Reach",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Chaos Warp",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Black Sun's Zenith",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Phyrexian Altar",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Greater Good",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Viscera Seer",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Toxic Deluge",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Black Market Connections",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Mirkwood Bats",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Village Rites",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Helm of the Host",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Massacre Wurm",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Vengeful Bloodwitch",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Goblin Bombardment",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Deadly Dispute",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Archfiend of Ifnir",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Flourishing Defenses",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Necroskitter",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Overseer of the Damned",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Skullclamp",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Mayhem Devil",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Beast Within",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Wood Elves",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Captain Lannery Storm",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Sakura-Tribe Elder",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Cultivate",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Midnight Reaper",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Woe Strider",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Scute Swarm",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "The Meathook Massacre",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Yahenni, Undying Partisan",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
}
]
}

View file

@ -0,0 +1,56 @@
{
"meta": {
"generated": "20260908T002004Z",
"engine": "Forge 2.0.14",
"format": "Commander, 4 players",
"games_requested": "2",
"games_completed": 2,
"seed": "20260908",
"decklist_file": "/home/markdoeswork/mtg/reaper-king-no-more/decks/go-wide/decklist.txt",
"log_file": "/home/markdoeswork/mtg/reaper-king-no-more/decks/go-wide/sim/20260908T001736Z.log",
"caveat": "Forge AI is weak at combo decks; treat win rate as a floor"
},
"win_counts": {
"Reaper King No More": 0,
"Mystic Intellect [C19] [2019]": 1,
"Primal Genesis [C19] [2019]": 1,
"Enhanced Evolution [C20] [2020]": 0
},
"our_win_rate": 0.0,
"games": [
{
"turns": 29,
"winner": "Enhanced Evolution [C20] [2020]",
"losers": [
{
"player": "Primal Genesis [C19] [2019]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 1,
"ms": 120053
},
{
"turns": 24,
"winner": "Primal Genesis [C19] [2019]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Mystic Intellect [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Enhanced Evolution [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 2,
"ms": 23165
}
]
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,45 @@
====================================================================
FORGE SIMULATION REPORT — 4-player Commander pod
====================================================================
games completed : 2 (requested 2) seed: 20260908
decklist : /home/markdoeswork/mtg/reaper-king-no-more/decks/go-wide/decklist.txt (full 100 cards)
engine : Forge 2.0.14, full rules, AI vs AI
WIN RATE
--------------------------------------------------------------------
our deck : 0/2 (0.0%) [random baseline in a 4-pod = 25%]
all players:
Mystic Intellect [C19] [2019] 1 (50.0%) ###############
Primal Genesis [C19] [2019] 1 (50.0%) ###############
Reaper King No More 0 ( 0.0%) <-- ours
Enhanced Evolution [C20] [2020] 0 ( 0.0%)
GAME LENGTH
--------------------------------------------------------------------
turns median 26 min 24 max 29
seconds median 72 total 2.4 min
HOW OUR DECK LOST
--------------------------------------------------------------------
1x life total reached 0
WHO BEAT US (winner, in games our deck lost)
--------------------------------------------------------------------
1x Primal Genesis [C19] [2019]
CAVEAT — READ THIS BEFORE TRUSTING THE WIN RATE
--------------------------------------------------------------------
Forge's AI is heuristic and, by its own documentation, WEAK AT COMBO
decks. Ours is a combo/aristocrats deck, so the AI systematically
under-plays it: it will miss sac-loop lines a human would see.
Read this as a FLOOR on the deck's power, and as proof the deck
functions and its cards interact — not as a power rating.
Opponents are stock precons, which are roughly bracket 2.
====================================================================
decklist : /home/markdoeswork/mtg/reaper-king-no-more/decks/go-wide/decklist.txt
full log : /home/markdoeswork/mtg/reaper-king-no-more/decks/go-wide/sim/20260908T001736Z.log (every game, all Forge output)
raw data : /home/markdoeswork/mtg/reaper-king-no-more/decks/go-wide/sim/20260908T001736Z.json
this report: /home/markdoeswork/mtg/reaper-king-no-more/decks/go-wide/sim/20260908T001736Z.txt
====================================================================

View file

@ -0,0 +1,21 @@
# grindy
_generated 2026-09-07 23:38Z by `tools/variant.py`_
- **bracket 3: PASS** (two-card vacuum combos: 0)
- 86 lines in `decklist.txt`
## files
| file | what it is |
| --- | --- |
| `decklist.txt` | the deck, `N Card Name` per line |
| `bracket.txt` | bracket-3 + house-rule check |
| `combos.txt` | combos in the deck, and one card away |
| `sim/` | Forge runs — `.log` raw, `.txt` report, `.json` data |
| `card_stats.txt` | per-card cast rate, avg round, win% (newest sim) |
## simulation runs
_none yet — run with `--sim 24`_

View file

@ -0,0 +1,26 @@
COMMANDER: The Reaper, King No More
DECK SIZE: 99 + 1 commander = 100
GAME CHANGERS: 2/3 OK
- Bolas's Citadel
- The One Ring
MASS LAND DENIAL: 0 OK
EXTRA TURNS: 0 OK
TWO-CARD INFINITE COMBOS IN A VACUUM: 0 OK
two-card combos needing board state (ALLOWED, 3):
- Blowfly Infestation + Nest of Scarabs
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Hapatra, Vizier of Poisons
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Flourishing Defenses
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
==========================================================
BRACKET 3: PASS

View file

@ -0,0 +1,88 @@
==========================================================================
CARD STATISTICS — 20260908T012700Z.log
==========================================================================
games: 1 our wins: 0 (0.0%) deck: /home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/decklist.txt
NEVER CAST IN ANY GAME: 47
--------------------------------------------------------------------------
(dead weight, unplayable by the AI, or just never drawn in time)
Animate Dead
Assassin's Trophy
Bastion of Remembrance
Beast Within
Bedevil
Birds of Paradise
Black Sun's Zenith
Blood Artist
Blowfly Infestation
Carrion Feeder
Contagion Clasp
Damnation
Deadly Dispute
Farseek
Garruk's Uprising
Goblin Bombardment
Gray Merchant of Asphodel
Greater Good
Grim Haruspex
Hapatra, Vizier of Poisons
Kodama's Reach
Massacre Girl, Known Killer
Massacre Wurm
Mazirek, Kraul Death Priest
Midnight Reaper
Nature's Lore
Necroskitter
Nest of Scarabs
Persistent Constrictor
Plague Belcher
Putrid Goblin
Rampant Growth
Reanimate
Sign in Blood
Syr Konrad, the Grim
Terminate
The Meathook Massacre
The One Ring
Three Visits
Toxic Deluge
Vandalblast
Vengeful Bloodwitch
Village Rites
Viscera Seer
Wood Elves
Yawgmoth, Thran Physician
Zulaport Cutthroat
MOST-CAST CARDS
--------------------------------------------------------------------------
card cast in avg round win% when cast
Mayhem Devil 1/1 R11.0 0%
Humble Defector 1/1 R12.0 0%
Ashnod's Altar 1/1 R12.0 0%
Phyrexian Altar 1/1 R11.0 0%
Archfiend of Ifnir 1/1 R10.0 0%
Bolas's Citadel 1/1 R11.0 0%
Chaos Warp 1/1 R4.0 0%
Poison-Tip Archer 1/1 R11.0 0%
Skullclamp 1/1 R1.0 0%
Mirkwood Bats 1/1 R11.0 0%
Victimize 1/1 R7.0 0%
Sakura-Tribe Elder 1/1 R11.0 0%
Cultivate 1/1 R12.0 0%
Flourishing Defenses 1/1 R5.0 0%
The Reaper, King No More 1/1 R9.0 0%
Overseer of the Damned 1/1 R8.5 0%
Springbloom Druid 1/1 R3.0 0%
CAVEATS — DO NOT CUT CARDS ON THIS ALONE
--------------------------------------------------------------------------
* 1 games is a tiny sample. A card cast in 5 games has a win-rate
swing of +/-40% from noise alone.
* 'Never cast' conflates three very different things: a bad card, a
card the AI cannot use, and a card that was simply never drawn.
* Correlation only. Cards cast in LONG games look good because long
games are ones we survived -- the card didn't cause the win.
* Forge's AI is weak at combo; it under-casts combo pieces.
raw: /home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/sim/20260908T012700Z-cards.json

View file

@ -0,0 +1,78 @@
==================================================================
COMBOS ALREADY IN THE DECK: 9
==================================================================
[E] Blowfly Infestation + Flourishing Defenses
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite death triggers
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Nest of Scarabs
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Hapatra, Vizier of Poisons
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Yawgmoth, Thran Physician + Nest of Scarabs + Blood Artist
-> Near-infinite -1/-1 counters
-> Near-infinite card draw
-> Near-infinite death triggers
requires: Your life total is at least 2.
requires: You control at least one additional creature.
requires: There is at least one other creature on the battlefield.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Blood Artist
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Zulaport Cutthroat
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Viscera Seer
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Ashnod's Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colorless mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Phyrexian Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colored mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
==================================================================
ONE CARD AWAY: 274 combos, 85 distinct cards
==================================================================
16 combos Mikaeus, the Unhallowed {3}{B}{B}{B} #1306
13 combos Mortuary {3}{B} #13068
8 combos Veinwitch Coven {2}{B} #4179
8 combos Host of the Hereafter {2}{B}{G} #7758
8 combos First Day of Class {1}{R} #10147
7 combos Scurry Oak {2}{G} #2259
6 combos Thran Vigil {1}{B} #6285
6 combos Grumgully, the Generous {1}{R}{G} #4341
5 combos Stalwart Successor {1}{B}{G} #13591
5 combos Melira, Sylvok Outcast {1}{G} #11230
5 combos Rocksteady, Mutant Marauder {2}{G} #10233
5 combos Reyhan, Last of the Abzan {1}{B}{G} #6299
5 combos Support Mission {2}{G} #31928
5 combos Captain Kathryn Janeway {3}{G} #26133
5 combos Dualcaster Mage {1}{R}{R} #666
decklist: /home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/decklist.txt | source: data/variants.json (108,535 combos)

View file

@ -0,0 +1,95 @@
# grindy
# Recursion + drain: never combo, just refuse to lose and bleed the table out. Tests whether this deck wants to be a value pile.
# generated by tools/generate.py from decks/no-mikaeus
# roles: {'reanimate': 3, 'drain': 3, 'draw': 2, 'minus_engine': -4, 'sac_outlet': -2, 'ramp': -2}
# Commander
1 The Reaper, King No More
# Main
1 Animate Dead
1 Archfiend of Ifnir
1 Ashnod's Altar
1 Assassin's Trophy
1 Bastion of Remembrance
1 Beast Within
1 Bedevil
1 Birds of Paradise
1 Black Sun's Zenith
1 Blackcleave Cliffs
1 Blood Artist
1 Blood Crypt
1 Bloodfell Caves
1 Blooming Marsh
1 Blowfly Infestation
1 Bojuka Bog
1 Bolas's Citadel
1 Carrion Feeder
1 Castle Locthwain
1 Chaos Warp
1 Command Tower
1 Contagion Clasp
1 Copperline Gorge
1 Cultivate
1 Damnation
1 Deadly Dispute
1 Exotic Orchard
1 Farseek
1 Flourishing Defenses
1 Garruk's Uprising
1 Goblin Bombardment
1 Gray Merchant of Asphodel
1 Greater Good
1 Grim Haruspex
1 Hapatra, Vizier of Poisons
1 Humble Defector
1 Jungle Hollow
1 Karplusan Forest
1 Kodama's Reach
1 Llanowar Wastes
1 Massacre Girl, Known Killer
1 Massacre Wurm
1 Mayhem Devil
1 Mazirek, Kraul Death Priest
1 Midnight Reaper
1 Mirkwood Bats
1 Nature's Lore
1 Necroskitter
1 Nest of Scarabs
1 Overgrown Tomb
1 Overseer of the Damned
1 Path of Ancestry
1 Persistent Constrictor
1 Phyrexian Altar
1 Plague Belcher
1 Poison-Tip Archer
1 Putrid Goblin
1 Rampant Growth
1 Reanimate
1 Rugged Highlands
1 Sakura-Tribe Elder
1 Savage Lands
1 Sign in Blood
1 Skullclamp
1 Springbloom Druid
1 Stomping Ground
1 Syr Konrad, the Grim
1 Terminate
1 The Meathook Massacre
1 The One Ring
1 Three Visits
1 Toxic Deluge
1 Vandalblast
1 Vengeful Bloodwitch
1 Victimize
1 Village Rites
1 Viscera Seer
1 Wood Elves
1 Yavimaya, Cradle of Growth
1 Yawgmoth, Thran Physician
1 Ziatora's Proving Ground
1 Zulaport Cutthroat
8 Swamp
5 Forest
4 Mountain

View file

@ -0,0 +1,583 @@
{
"log": "/home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/sim/20260908T001530Z.log",
"games": 2,
"base_win_rate": 0.0,
"cards": [
{
"card": "The Reaper, King No More",
"games_cast": 2,
"cast_rate": 1.0,
"avg_turn": 6.833333333333333,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 6
},
{
"card": "Syr Konrad, the Grim",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 6.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Necroskitter",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 7.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Assassin's Trophy",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 4.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Reanimate",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 10.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Bedevil",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 3.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Flourishing Defenses",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 8.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Springbloom Druid",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 9.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Vengeful Bloodwitch",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 3.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Deadly Dispute",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 10.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Massacre Wurm",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 9.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Humble Defector",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 8.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Carrion Feeder",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 5.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Nature's Lore",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 2.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Wood Elves",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 10.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Phyrexian Altar",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 10.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Chaos Warp",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 9.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Blowfly Infestation",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 10.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Yawgmoth, Thran Physician",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 4.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Three Visits",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Blood Artist",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Animate Dead",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "The One Ring",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Gray Merchant of Asphodel",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Nest of Scarabs",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Overseer of the Damned",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Farseek",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Mayhem Devil",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Hapatra, Vizier of Poisons",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Terminate",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Plague Belcher",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Vandalblast",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Sign in Blood",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Viscera Seer",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Midnight Reaper",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "The Meathook Massacre",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Cultivate",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Toxic Deluge",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Beast Within",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Ashnod's Altar",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Grim Haruspex",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Bolas's Citadel",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Archfiend of Ifnir",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Putrid Goblin",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Damnation",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Mirkwood Bats",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Kodama's Reach",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Rampant Growth",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Goblin Bombardment",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Massacre Girl, Known Killer",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Village Rites",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Sakura-Tribe Elder",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Victimize",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Bastion of Remembrance",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Black Sun's Zenith",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Contagion Clasp",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Persistent Constrictor",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Zulaport Cutthroat",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Mazirek, Kraul Death Priest",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Garruk's Uprising",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Birds of Paradise",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Poison-Tip Archer",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Greater Good",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Skullclamp",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
}
]
}

View file

@ -0,0 +1,60 @@
{
"meta": {
"generated": "20260908T001659Z",
"engine": "Forge 2.0.14",
"format": "Commander, 4 players",
"games_requested": "2",
"games_completed": 2,
"seed": "20260909",
"decklist_file": "/home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/decklist.txt",
"log_file": "/home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/sim/20260908T001530Z.log",
"caveat": "Forge AI is weak at combo decks; treat win rate as a floor"
},
"win_counts": {
"Reaper King No More": 0,
"Bedecked Brokers [NCC] [2022]": 1,
"Cabaretti Cacophony [NCC] [2022]": 1,
"Maestros Massacre [NCC] [2022]": 0
},
"our_win_rate": 0.0,
"games": [
{
"turns": 20,
"winner": "Cabaretti Cacophony [NCC] [2022]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Bedecked Brokers [NCC] [2022]",
"reason": "life total reached 0"
},
{
"player": "Maestros Massacre [NCC] [2022]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 1,
"ms": 60440
},
{
"turns": 19,
"winner": "Bedecked Brokers [NCC] [2022]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Cabaretti Cacophony [NCC] [2022]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 2,
"ms": 24197
}
]
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,46 @@
====================================================================
FORGE SIMULATION REPORT — 4-player Commander pod
====================================================================
games completed : 2 (requested 2) seed: 20260909
decklist : /home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/decklist.txt (full 100 cards)
engine : Forge 2.0.14, full rules, AI vs AI
WIN RATE
--------------------------------------------------------------------
our deck : 0/2 (0.0%) [random baseline in a 4-pod = 25%]
all players:
Bedecked Brokers [NCC] [2022] 1 (50.0%) ###############
Cabaretti Cacophony [NCC] [2022] 1 (50.0%) ###############
Reaper King No More 0 ( 0.0%) <-- ours
Maestros Massacre [NCC] [2022] 0 ( 0.0%)
GAME LENGTH
--------------------------------------------------------------------
turns median 19 min 19 max 20
seconds median 42 total 1.4 min
HOW OUR DECK LOST
--------------------------------------------------------------------
2x life total reached 0
WHO BEAT US (winner, in games our deck lost)
--------------------------------------------------------------------
1x Cabaretti Cacophony [NCC] [2022]
1x Bedecked Brokers [NCC] [2022]
CAVEAT — READ THIS BEFORE TRUSTING THE WIN RATE
--------------------------------------------------------------------
Forge's AI is heuristic and, by its own documentation, WEAK AT COMBO
decks. Ours is a combo/aristocrats deck, so the AI systematically
under-plays it: it will miss sac-loop lines a human would see.
Read this as a FLOOR on the deck's power, and as proof the deck
functions and its cards interact — not as a power rating.
Opponents are stock precons, which are roughly bracket 2.
====================================================================
decklist : /home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/decklist.txt
full log : /home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/sim/20260908T001530Z.log (every game, all Forge output)
raw data : /home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/sim/20260908T001530Z.json
this report: /home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/sim/20260908T001530Z.txt
====================================================================

View file

@ -0,0 +1,583 @@
{
"log": "/home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/sim/20260908T001736Z.log",
"games": 2,
"base_win_rate": 0.0,
"cards": [
{
"card": "The Reaper, King No More",
"games_cast": 2,
"cast_rate": 1.0,
"avg_turn": 6.833333333333333,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 6
},
{
"card": "Massacre Wurm",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 9.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Syr Konrad, the Grim",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 6.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Bedevil",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 3.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Reanimate",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 10.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Assassin's Trophy",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 4.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Wood Elves",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 10.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Deadly Dispute",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 10.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Carrion Feeder",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 5.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Humble Defector",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 8.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Phyrexian Altar",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 10.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Springbloom Druid",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 9.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Chaos Warp",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 9.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Necroskitter",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 7.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Vengeful Bloodwitch",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 3.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Yawgmoth, Thran Physician",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 4.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Flourishing Defenses",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 8.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Blowfly Infestation",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 10.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Nature's Lore",
"games_cast": 1,
"cast_rate": 0.5,
"avg_turn": 2.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Birds of Paradise",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Ashnod's Altar",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Gray Merchant of Asphodel",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Garruk's Uprising",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Poison-Tip Archer",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Mirkwood Bats",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Bolas's Citadel",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Contagion Clasp",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Massacre Girl, Known Killer",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Overseer of the Damned",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Viscera Seer",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Zulaport Cutthroat",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "The Meathook Massacre",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Village Rites",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Persistent Constrictor",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Skullclamp",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Kodama's Reach",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Grim Haruspex",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Damnation",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Animate Dead",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Midnight Reaper",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Bastion of Remembrance",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Cultivate",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Victimize",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Hapatra, Vizier of Poisons",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Nest of Scarabs",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Plague Belcher",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Black Sun's Zenith",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Sakura-Tribe Elder",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Terminate",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Mazirek, Kraul Death Priest",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Vandalblast",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Rampant Growth",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "The One Ring",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Archfiend of Ifnir",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Toxic Deluge",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Mayhem Devil",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Sign in Blood",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Beast Within",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Goblin Bombardment",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Three Visits",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Blood Artist",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Farseek",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Putrid Goblin",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Greater Good",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
}
]
}

View file

@ -0,0 +1,60 @@
{
"meta": {
"generated": "20260908T001907Z",
"engine": "Forge 2.0.14",
"format": "Commander, 4 players",
"games_requested": "2",
"games_completed": 2,
"seed": "20260909",
"decklist_file": "/home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/decklist.txt",
"log_file": "/home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/sim/20260908T001736Z.log",
"caveat": "Forge AI is weak at combo decks; treat win rate as a floor"
},
"win_counts": {
"Reaper King No More": 0,
"Bedecked Brokers [NCC] [2022]": 1,
"Cabaretti Cacophony [NCC] [2022]": 1,
"Maestros Massacre [NCC] [2022]": 0
},
"our_win_rate": 0.0,
"games": [
{
"turns": 20,
"winner": "Cabaretti Cacophony [NCC] [2022]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Bedecked Brokers [NCC] [2022]",
"reason": "life total reached 0"
},
{
"player": "Maestros Massacre [NCC] [2022]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 1,
"ms": 62068
},
{
"turns": 19,
"winner": "Bedecked Brokers [NCC] [2022]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Cabaretti Cacophony [NCC] [2022]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 2,
"ms": 24619
}
]
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,46 @@
====================================================================
FORGE SIMULATION REPORT — 4-player Commander pod
====================================================================
games completed : 2 (requested 2) seed: 20260909
decklist : /home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/decklist.txt (full 100 cards)
engine : Forge 2.0.14, full rules, AI vs AI
WIN RATE
--------------------------------------------------------------------
our deck : 0/2 (0.0%) [random baseline in a 4-pod = 25%]
all players:
Bedecked Brokers [NCC] [2022] 1 (50.0%) ###############
Cabaretti Cacophony [NCC] [2022] 1 (50.0%) ###############
Reaper King No More 0 ( 0.0%) <-- ours
Maestros Massacre [NCC] [2022] 0 ( 0.0%)
GAME LENGTH
--------------------------------------------------------------------
turns median 19 min 19 max 20
seconds median 43 total 1.4 min
HOW OUR DECK LOST
--------------------------------------------------------------------
2x life total reached 0
WHO BEAT US (winner, in games our deck lost)
--------------------------------------------------------------------
1x Cabaretti Cacophony [NCC] [2022]
1x Bedecked Brokers [NCC] [2022]
CAVEAT — READ THIS BEFORE TRUSTING THE WIN RATE
--------------------------------------------------------------------
Forge's AI is heuristic and, by its own documentation, WEAK AT COMBO
decks. Ours is a combo/aristocrats deck, so the AI systematically
under-plays it: it will miss sac-loop lines a human would see.
Read this as a FLOOR on the deck's power, and as proof the deck
functions and its cards interact — not as a power rating.
Opponents are stock precons, which are roughly bracket 2.
====================================================================
decklist : /home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/decklist.txt
full log : /home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/sim/20260908T001736Z.log (every game, all Forge output)
raw data : /home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/sim/20260908T001736Z.json
this report: /home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/sim/20260908T001736Z.txt
====================================================================

View file

@ -0,0 +1,583 @@
{
"log": "/home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/sim/20260908T012700Z.log",
"games": 1,
"base_win_rate": 0.0,
"cards": [
{
"card": "Mayhem Devil",
"games_cast": 1,
"cast_rate": 1.0,
"avg_turn": 11.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Humble Defector",
"games_cast": 1,
"cast_rate": 1.0,
"avg_turn": 12.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Ashnod's Altar",
"games_cast": 1,
"cast_rate": 1.0,
"avg_turn": 12.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Phyrexian Altar",
"games_cast": 1,
"cast_rate": 1.0,
"avg_turn": 11.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Archfiend of Ifnir",
"games_cast": 1,
"cast_rate": 1.0,
"avg_turn": 10.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Bolas's Citadel",
"games_cast": 1,
"cast_rate": 1.0,
"avg_turn": 11.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Chaos Warp",
"games_cast": 1,
"cast_rate": 1.0,
"avg_turn": 4.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Poison-Tip Archer",
"games_cast": 1,
"cast_rate": 1.0,
"avg_turn": 11.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Skullclamp",
"games_cast": 1,
"cast_rate": 1.0,
"avg_turn": 1.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Mirkwood Bats",
"games_cast": 1,
"cast_rate": 1.0,
"avg_turn": 11.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Victimize",
"games_cast": 1,
"cast_rate": 1.0,
"avg_turn": 7.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Sakura-Tribe Elder",
"games_cast": 1,
"cast_rate": 1.0,
"avg_turn": 11.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Cultivate",
"games_cast": 1,
"cast_rate": 1.0,
"avg_turn": 12.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Flourishing Defenses",
"games_cast": 1,
"cast_rate": 1.0,
"avg_turn": 5.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "The Reaper, King No More",
"games_cast": 1,
"cast_rate": 1.0,
"avg_turn": 9.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 2
},
{
"card": "Overseer of the Damned",
"games_cast": 1,
"cast_rate": 1.0,
"avg_turn": 8.5,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 2
},
{
"card": "Springbloom Druid",
"games_cast": 1,
"cast_rate": 1.0,
"avg_turn": 3.0,
"win_rate_when_cast": 0.0,
"delta": 0.0,
"total_casts": 1
},
{
"card": "Plague Belcher",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Black Sun's Zenith",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Viscera Seer",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Bastion of Remembrance",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Beast Within",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Midnight Reaper",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Farseek",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Assassin's Trophy",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Yawgmoth, Thran Physician",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "The Meathook Massacre",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Kodama's Reach",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Bedevil",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Deadly Dispute",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Nest of Scarabs",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Sign in Blood",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Grim Haruspex",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Contagion Clasp",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Persistent Constrictor",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Blowfly Infestation",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Mazirek, Kraul Death Priest",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Terminate",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Syr Konrad, the Grim",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Vandalblast",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Wood Elves",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Necroskitter",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Massacre Wurm",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Carrion Feeder",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Vengeful Bloodwitch",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Putrid Goblin",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Toxic Deluge",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Reanimate",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Goblin Bombardment",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Rampant Growth",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Gray Merchant of Asphodel",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Birds of Paradise",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Massacre Girl, Known Killer",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Village Rites",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Garruk's Uprising",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Zulaport Cutthroat",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Hapatra, Vizier of Poisons",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Greater Good",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Three Visits",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Animate Dead",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Damnation",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "The One Ring",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Nature's Lore",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Blood Artist",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
}
]
}

View file

@ -0,0 +1,30 @@
{
"meta": {
"generated": "20260908T012903Z",
"engine": "Forge 2.0.14",
"format": "Commander, 4 players",
"games_requested": "1",
"games_completed": 1,
"seed": "20260907",
"decklist_file": "/home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/decklist.txt",
"log_file": "/home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/sim/20260908T012700Z.log",
"caveat": "Forge AI is weak at combo decks; treat win rate as a floor"
},
"win_counts": {
"Reaper King No More": 1,
"Faceless Menace [C19] [2019]": 0,
"Merciless Rage [C19] [2019]": 0,
"Arcane Maelstrom [C20] [2020]": 0
},
"our_win_rate": 1.0,
"games": [
{
"turns": 24,
"winner": "Arcane Maelstrom [C20] [2020]",
"losers": [],
"win_reason": "all opponents have lost",
"game": 1,
"ms": 120048
}
]
}

View file

@ -0,0 +1,897 @@
Error handling registered!
21:27:00 [INFO ] GuiBase: ##########################################
21:27:00 [INFO ] GuiBase: APP: Forge v.2.0.14-SNAPSHOT-08.08
21:27:00 [INFO ] GuiBase: Java: 26.0.2.1 (Arch Linux)
21:27:00 [INFO ] GuiBase: OS: Linux 7.1.9-arch1-2 amd64
21:27:00 [INFO ] GuiBase: RAM: 2048 MB max, 20 CPUs
21:27:00 [INFO ] GuiBase: ##########################################
Language 'en-US' loaded successfully.
(ThreadUtil first call): Running with priority 5
Read cards: 33617 archived files in 0 ms (25 parts) using thread pool
Read cards: 836 files in 0 ms (8 parts) using thread pool
Simulation mode
Ai(1)-Reaper King No More vs Ai(2)-Faceless Menace [C19] [2019] vs Ai(3)-Merciless Rage [C19] [2019] vs Ai(4)-Arcane Maelstrom [C20] [2020] - one game of Commander seed 20260907
Comet Storm (307) - [Couldn't add to stack, failed to target] - Choose any target, then choose another target for each time this spell was kicked. CARDNAME deals X damage to each of them.[[Bloodhall Priest (300)]]
Stopping slow match as draw
Mulligan: Ai(3)-Merciless Rage [C19] [2019] has kept a hand of 7 cards
Mulligan: Ai(4)-Arcane Maelstrom [C20] [2020] has kept a hand of 7 cards
Mulligan: Ai(1)-Reaper King No More has kept a hand of 7 cards
Mulligan: Ai(2)-Faceless Menace [C19] [2019] has kept a hand of 7 cards
Turn: Turn 1 (Ai(3)-Merciless Rage [C19] [2019])
Land: Ai(3)-Merciless Rage [C19] [2019] played Rix Maadi, Dungeon Palace (214)
Turn: Turn 2 (Ai(4)-Arcane Maelstrom [C20] [2020])
Land: Ai(4)-Arcane Maelstrom [C20] [2020] played Yavimaya Coast (360)
Turn: Turn 3 (Ai(1)-Reaper King No More)
Land: Ai(1)-Reaper King No More played Llanowar Wastes (80)
Mana: Llanowar Wastes (80) - {T}: Add {C}.
Add To Stack: Ai(1)-Reaper King No More cast Skullclamp
Resolve Stack: Skullclamp
Turn: Turn 4 (Ai(2)-Faceless Menace [C19] [2019])
Land: Ai(2)-Faceless Menace [C19] [2019] played Island (103)
Turn: Turn 5 (Ai(3)-Merciless Rage [C19] [2019])
Replacement Effect: Barren Moor enters tapped.
Land: Ai(3)-Merciless Rage [C19] [2019] played Barren Moor (218)
Turn: Turn 6 (Ai(4)-Arcane Maelstrom [C20] [2020])
Land: Ai(4)-Arcane Maelstrom [C20] [2020] played Forest (370)
Turn: Turn 7 (Ai(1)-Reaper King No More)
Land: Ai(1)-Reaper King No More played Swamp (60)
Mana: Swamp (60) - {T}: Add {B}.
Mana: Llanowar Wastes (80) - {T}: Add {C}.
Discard: Ai(1)-Reaper King No More discards Archfiend of Ifnir (42).
Add To Stack: Ai(1)-Reaper King No More activated Archfiend of Ifnir
Resolve Stack: Archfiend of Ifnir (42) - Ai(1)-Reaper King No More draws a card.
Turn: Turn 8 (Ai(2)-Faceless Menace [C19] [2019])
Land: Ai(2)-Faceless Menace [C19] [2019] played Forest (121)
Mana: Forest (121) - {T}: Add {G}.
Mana: Island (103) - {T}: Add {U}.
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] cast Sakura-Tribe Elder
Resolve Stack: Sakura-Tribe Elder - Creature 1 / 1
Zone Change: Sakura-Tribe Elder (170) was put into Graveyard from Battlefield.
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] activated Sakura-Tribe Elder
Resolve Stack: Sakura-Tribe Elder (170) - Ai(2)-Faceless Menace [C19] [2019] searches their library for a basic land card, puts it onto the battlefield tapped, then shuffles.
Turn: Turn 9 (Ai(3)-Merciless Rage [C19] [2019])
Land: Ai(3)-Merciless Rage [C19] [2019] played Mountain (244)
Mana: Barren Moor (218) - {T}: Add {B}.
Mana: Mountain (244) - {T}: Add {R}.
Mana: Rix Maadi, Dungeon Palace (214) - {T}: Add {C}.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] cast Anje Falkenrath
Resolve Stack: Anje Falkenrath - Creature 1 / 3
Combat: Ai(3)-Merciless Rage [C19] [2019] assigned Anje Falkenrath (302) to attack Ai(1)-Reaper King No More.
Combat: Ai(1)-Reaper King No More didn't block Anje Falkenrath (302).
Damage: Anje Falkenrath (302) deals 1 combat damage to Ai(1)-Reaper King No More.
Life: Life: Ai(1)-Reaper King No More 40 > 39
Turn: Turn 10 (Ai(4)-Arcane Maelstrom [C20] [2020])
Replacement Effect: Rugged Highlands enters tapped.
Land: Ai(4)-Arcane Maelstrom [C20] [2020] played Rugged Highlands (357)
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] triggered Rugged Highlands
Life: Life: Ai(4)-Arcane Maelstrom [C20] [2020] 40 > 41
Resolve Stack: When Rugged Highlands enters, you gain 1 life. [Zone Changer: Rugged Highlands (357)]
Turn: Turn 11 (Ai(1)-Reaper King No More)
Replacement Effect: Blooming Marsh enters tapped unless you control two or fewer other lands.
Land: Ai(1)-Reaper King No More played Blooming Marsh (40)
Mana: Blooming Marsh (40) - {T}: Add {B} or {G}.
Mana: Swamp (60) - {T}: Add {B}.
Mana: Llanowar Wastes (80) - {T}: Add {C}.
Add To Stack: Ai(1)-Reaper King No More cast Springbloom Druid
Resolve Stack: Springbloom Druid - Creature 1 / 1
Add To Stack: Ai(1)-Reaper King No More triggered Springbloom Druid
Zone Change: Swamp (60) was put into Graveyard from Battlefield.
Resolve Stack: When Springbloom Druid enters, you may sacrifice a land. If you do, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle. [Zone Changer: Springbloom Druid (22)]
Turn: Turn 12 (Ai(2)-Faceless Menace [C19] [2019])
Replacement Effect: Golgari Rot Farm enters tapped.
Land: Ai(2)-Faceless Menace [C19] [2019] played Golgari Rot Farm (134)
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Golgari Rot Farm
Resolve Stack: When Golgari Rot Farm enters, return a land you control to its owner's hand. [Zone Changer: Golgari Rot Farm (134)]
Mana: Forest (121) - {T}: Add {G}.
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] cast Sol Ring
Resolve Stack: Sol Ring
Mana: Sol Ring (157) - {T}: Add {C}{C}.
Mana: Swamp (186) - {T}: Add {B}.
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] cast Morph
Resolve Stack: Morph - Creature 2/2
Turn: Turn 13 (Ai(3)-Merciless Rage [C19] [2019])
Land: Ai(3)-Merciless Rage [C19] [2019] played Swamp (288)
Mana: Mountain (244) - {T}: Add {R}.
Mana: Barren Moor (218) - {T}: Add {B}.
Mana: Swamp (288) - {T}: Add {B}.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] cast Chaos Warp targeting [Face-down card (H4)]
Resolve Stack: Chaos Warp (212) - Shuffle Face-down card (H4) into its owner's library. Ai(3)-Merciless Rage [C19] [2019] reveals the top card of Ai(2)-Faceless Menace [C19] [2019]'s library.
Turn: Turn 14 (Ai(4)-Arcane Maelstrom [C20] [2020])
Replacement Effect: Oran-Rief, the Vastwood enters tapped.
Land: Ai(4)-Arcane Maelstrom [C20] [2020] played Oran-Rief, the Vastwood (304)
Turn: Turn 15 (Ai(1)-Reaper King No More)
Mana: Mountain (94) - {T}: Add {R}.
Mana: Mountain (92) - {T}: Add {R}.
Mana: Blooming Marsh (40) - {T}: Add {B} or {G}.
Add To Stack: Ai(1)-Reaper King No More cast Chaos Warp targeting [Volrath, the Shapestealer (127)]
Resolve Stack: Chaos Warp (82) - Shuffle Volrath, the Shapestealer (127) into its owner's library. Ai(1)-Reaper King No More reveals the top card of Ai(2)-Faceless Menace [C19] [2019]'s library.
Land: Ai(1)-Reaper King No More played Swamp (61)
Turn: Turn 16 (Ai(2)-Faceless Menace [C19] [2019])
Land: Ai(2)-Faceless Menace [C19] [2019] played Island (103)
Mana: Swamp (186) - {T}: Add {B}.
Mana: Golgari Rot Farm (134) - {T}: Add {B}{G}.
Mana: Sol Ring (157) - {T}: Add {C}{C}.
Mana: Forest (121) - {T}: Add {G}.
Mana: Forest (125) - {T}: Add {G}.
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] cast Thieving Amalgam
Resolve Stack: Thieving Amalgam - Creature 6 / 7
Turn: Turn 17 (Ai(3)-Merciless Rage [C19] [2019])
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Thieving Amalgam
Resolve Stack: At the beginning of each opponent's upkeep, you manifest the top card of that player's library. (Put it onto the battlefield face down as a 2/2 creature. Turn it face up any time for its mana cost if it's a creature card.) [Phase: Ai(3)-Merciless Rage [C19] [2019]]
Mana: Mountain (244) - {T}: Add {R}.
Mana: Barren Moor (218) - {T}: Add {B}.
Mana: Swamp (288) - {T}: Add {B}.
Mana: Rix Maadi, Dungeon Palace (214) - {T}: Add {C}.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] cast Bloodhall Priest
Resolve Stack: Bloodhall Priest - Creature 4 / 4
Turn: Turn 18 (Ai(4)-Arcane Maelstrom [C20] [2020])
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Thieving Amalgam
Resolve Stack: At the beginning of each opponent's upkeep, you manifest the top card of that player's library. (Put it onto the battlefield face down as a 2/2 creature. Turn it face up any time for its mana cost if it's a creature card.) [Phase: Ai(4)-Arcane Maelstrom [C20] [2020]]
Mana: Forest (370) - {T}: Add {G}.
Mana: Rugged Highlands (357) - {T}: Add {R} or {G}.
Mana: Oran-Rief, the Vastwood (304) - {T}: Add {G}.
Zone Change: Forest (370) was put into Graveyard from Battlefield.
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] cast Harrow
Resolve Stack: Harrow (346) - Ai(4)-Arcane Maelstrom [C20] [2020] searches their library for up to two basic land cards, puts them onto the battlefield, then shuffles.
Replacement Effect: Mosswort Bridge enters tapped.
Land: Ai(4)-Arcane Maelstrom [C20] [2020] played Mosswort Bridge (329)
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] triggered Mosswort Bridge
Resolve Stack: Hideaway 4 (When this permanent enters, look at the top four cards of your library, exile one face down, then put the rest on the bottom of your library.) [Zone Changer: Mosswort Bridge (329)]
Turn: Turn 19 (Ai(1)-Reaper King No More)
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Thieving Amalgam
Resolve Stack: At the beginning of each opponent's upkeep, you manifest the top card of that player's library. (Put it onto the battlefield face down as a 2/2 creature. Turn it face up any time for its mana cost if it's a creature card.) [Phase: Ai(1)-Reaper King No More]
Mana: Blooming Marsh (40) - {T}: Add {B} or {G}.
Mana: Mountain (94) - {T}: Add {R}.
Mana: Mountain (92) - {T}: Add {R}.
Mana: Swamp (61) - {T}: Add {B}.
Mana: Llanowar Wastes (80) - {T}: Add {C}.
Add To Stack: Ai(1)-Reaper King No More cast Flourishing Defenses
Resolve Stack: Flourishing Defenses
Turn: Turn 20 (Ai(2)-Faceless Menace [C19] [2019])
Mana: Island (103) - {T}: Add {U}.
Mana: Sol Ring (157) - {T}: Add {C}{C}.
Resolve Stack: Ai(2)-Faceless Menace [C19] [2019] has unmanifested Haldan, Avid Arcanist
Land: Ai(2)-Faceless Menace [C19] [2019] played Llanowar Wastes (184)
Combat: Ai(2)-Faceless Menace [C19] [2019] assigned Thieving Amalgam (117) to attack Ai(3)-Merciless Rage [C19] [2019].
Combat: Ai(3)-Merciless Rage [C19] [2019] didn't block Thieving Amalgam (117).
Damage: Thieving Amalgam (117) deals 6 combat damage to Ai(3)-Merciless Rage [C19] [2019].
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 40 > 34
Turn: Turn 21 (Ai(3)-Merciless Rage [C19] [2019])
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Thieving Amalgam
Resolve Stack: At the beginning of each opponent's upkeep, you manifest the top card of that player's library. (Put it onto the battlefield face down as a 2/2 creature. Turn it face up any time for its mana cost if it's a creature card.) [Phase: Ai(3)-Merciless Rage [C19] [2019]]
Combat: Ai(3)-Merciless Rage [C19] [2019] assigned Bloodhall Priest (300) to attack Ai(2)-Faceless Menace [C19] [2019].
Combat: Ai(2)-Faceless Menace [C19] [2019] didn't block Bloodhall Priest (300).
Damage: Bloodhall Priest (300) deals 4 combat damage to Ai(2)-Faceless Menace [C19] [2019].
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 40 > 36
Mana: Mountain (244) - {T}: Add {R}.
Mana: Barren Moor (218) - {T}: Add {B}.
Mana: Swamp (288) - {T}: Add {B}.
Mana: Rix Maadi, Dungeon Palace (214) - {T}: Add {C}.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] cast Scaretiller
Resolve Stack: Scaretiller - Creature 1 / 4
Turn: Turn 22 (Ai(4)-Arcane Maelstrom [C20] [2020])
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Thieving Amalgam
Resolve Stack: At the beginning of each opponent's upkeep, you manifest the top card of that player's library. (Put it onto the battlefield face down as a 2/2 creature. Turn it face up any time for its mana cost if it's a creature card.) [Phase: Ai(4)-Arcane Maelstrom [C20] [2020]]
Land: Ai(4)-Arcane Maelstrom [C20] [2020] played Mountain (389)
Mana: Mountain (389) - {T}: Add {R}.
Mana: Rugged Highlands (357) - {T}: Add {R} or {G}.
Mana: Island (350) - {T}: Add {U}.
Mana: Island (351) - {T}: Add {U}.
Mana: Oran-Rief, the Vastwood (304) - {T}: Add {G}.
Mana: Mosswort Bridge (329) - {T}: Add {G}.
Mana: Yavimaya Coast (360) - {T}: Add {C}.
Add To Stack: Comet Storm (307) - [Couldn't add to stack, failed to target] - Choose any target, then choose another target for each time this spell was kicked. CARDNAME deals X damage to each of them.
Turn: Turn 23 (Ai(1)-Reaper King No More)
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Thieving Amalgam
Resolve Stack: At the beginning of each opponent's upkeep, you manifest the top card of that player's library. (Put it onto the battlefield face down as a 2/2 creature. Turn it face up any time for its mana cost if it's a creature card.) [Phase: Ai(1)-Reaper King No More]
Mana: Mountain (94) - {T}: Add {R}.
Mana: Mountain (92) - {T}: Add {R}.
Mana: Swamp (61) - {T}: Add {B}.
Mana: Blooming Marsh (40) - {T}: Add {B} or {G}.
Add To Stack: Ai(1)-Reaper King No More cast The Reaper, King No More
Resolve Stack: The Reaper, King No More - Creature 3 / 3
Add To Stack: Ai(1)-Reaper King No More triggered The Reaper, King No More targeting [The Reaper, King No More (100), Springbloom Druid (22)]
Resolve Stack: When The Reaper, King No More enters, put a -1/-1 counter on each of up to two target creatures. (Targeting: [[The Reaper, King No More (100), Springbloom Druid (22)]]) [Zone Changer: The Reaper, King No More (100)]
Zone Change: Springbloom Druid (22) was put into Graveyard from Battlefield.
Add To Stack: Ai(1)-Reaper King No More triggered Flourishing Defenses
Add To Stack: Ai(1)-Reaper King No More triggered Flourishing Defenses
Resolve Stack: Whenever a -1/-1 counter is put on a creature, you may create a 1/1 green Elf Warrior creature token. [Added once: Springbloom Druid (22)]
Resolve Stack: Whenever a -1/-1 counter is put on a creature, you may create a 1/1 green Elf Warrior creature token. [Added once: The Reaper, King No More (100)]
Mana: Llanowar Wastes (80) - {T}: Add {C}.
Add To Stack: Ai(1)-Reaper King No More activated Skullclamp targeting [The Reaper, King No More (100)]
Resolve Stack: Skullclamp (3) - Attach to The Reaper, King No More (100)
Turn: Turn 24 (Ai(2)-Faceless Menace [C19] [2019])
Mana: Island (103) - {T}: Add {U}.
Mana: Swamp (186) - {T}: Add {B}.
Mana: Forest (121) - {T}: Add {G}.
Mana: Sol Ring (157) - {T}: Add {C}{C}.
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] cast Kadena, Slinking Sorcerer
Resolve Stack: Kadena, Slinking Sorcerer - Creature 3 / 3
Combat: Ai(2)-Faceless Menace [C19] [2019] assigned Thieving Amalgam (117), Face-down card (H5), Face-down card (H8), Face-down card (H9), Face-down card (H10), Face-down card (H11) and Haldan, Avid Arcanist (306) to attack Ai(1)-Reaper King No More.
Combat: Ai(1)-Reaper King No More didn't block Thieving Amalgam (117).
Ai(1)-Reaper King No More didn't block Face-down card (H5).
Ai(1)-Reaper King No More didn't block Face-down card (H8).
Ai(1)-Reaper King No More didn't block Face-down card (H9).
Ai(1)-Reaper King No More didn't block Face-down card (H10).
Ai(1)-Reaper King No More didn't block Face-down card (H11).
Ai(1)-Reaper King No More didn't block Haldan, Avid Arcanist (306).
Damage: Thieving Amalgam (117) deals 6 combat damage to Ai(1)-Reaper King No More.
Damage: Face-down card (H5) deals 2 combat damage to Ai(1)-Reaper King No More.
Damage: Face-down card (H8) deals 2 combat damage to Ai(1)-Reaper King No More.
Damage: Face-down card (H9) deals 2 combat damage to Ai(1)-Reaper King No More.
Damage: Face-down card (H10) deals 2 combat damage to Ai(1)-Reaper King No More.
Damage: Face-down card (H11) deals 2 combat damage to Ai(1)-Reaper King No More.
Damage: Haldan, Avid Arcanist (306) deals 1 combat damage to Ai(1)-Reaper King No More.
Life: Life: Ai(1)-Reaper King No More 39 > 22
Replacement Effect: Golgari Guildgate enters tapped.
Land: Ai(2)-Faceless Menace [C19] [2019] played Golgari Guildgate (183)
Turn: Turn 25 (Ai(3)-Merciless Rage [C19] [2019])
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Thieving Amalgam
Resolve Stack: At the beginning of each opponent's upkeep, you manifest the top card of that player's library. (Put it onto the battlefield face down as a 2/2 creature. Turn it face up any time for its mana cost if it's a creature card.) [Phase: Ai(3)-Merciless Rage [C19] [2019]]
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Kadena, Slinking Sorcerer
Resolve Stack: Whenever a face-down creature you control enters, draw a card. [Zone Changer: Face-down card (H12)]
Mana: Barren Moor (218) - {T}: Add {B}.
Mana: Swamp (288) - {T}: Add {B}.
Mana: Mountain (244) - {T}: Add {R}.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] cast Big Game Hunter
Resolve Stack: Big Game Hunter - Creature 1 / 1
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] triggered Big Game Hunter targeting [Thieving Amalgam (117)]
Zone Change: Thieving Amalgam (117) was put into Graveyard from Battlefield.
Resolve Stack: When Big Game Hunter enters, destroy target creature with power 4 or greater. It can't be regenerated. (Targeting: [[Thieving Amalgam (117)]]) [Zone Changer: Big Game Hunter (223)]
Discard: Ai(3)-Merciless Rage [C19] [2019] discards Squee, Goblin Nabob (238).
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] activated Anje Falkenrath
Resolve Stack: Anje Falkenrath (302) - Ai(3)-Merciless Rage [C19] [2019] draws a card.
Land: Ai(3)-Merciless Rage [C19] [2019] played Swamp (287)
Mana: Swamp (287) - {T}: Add {B}.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] cast Sol Ring
Resolve Stack: Sol Ring
Mana: Sol Ring (255) - {T}: Add {C}{C}.
Mana: Rix Maadi, Dungeon Palace (214) - {T}: Add {C}.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] cast Rakdos Locket
Resolve Stack: Rakdos Locket
Turn: Turn 26 (Ai(4)-Arcane Maelstrom [C20] [2020])
Mana: Rugged Highlands (357) - {T}: Add {R} or {G}.
Mana: Mountain (389) - {T}: Add {R}.
Mana: Island (350) - {T}: Add {U}.
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] cast Natural Connection
Resolve Stack: Natural Connection (308) - Ai(4)-Arcane Maelstrom [C20] [2020] searches their library for a basic land card, puts it onto the battlefield tapped, then shuffles.
Replacement Effect: Rupture Spire enters tapped.
Land: Ai(4)-Arcane Maelstrom [C20] [2020] played Rupture Spire (359)
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] triggered Rupture Spire
Mana: Island (351) - {T}: Add {U}.
Resolve Stack: When Rupture Spire enters, sacrifice it unless you pay {1}. [Zone Changer: Rupture Spire (359)]
Turn: Turn 27 (Ai(1)-Reaper King No More)
Mana: Swamp (61) - {T}: Add {B}.
Mana: Mountain (94) - {T}: Add {R}.
Mana: Mountain (92) - {T}: Add {R}.
Add To Stack: Ai(1)-Reaper King No More cast Victimize
Zone Change: Elf Warrior Token (410) was put into Graveyard from Battlefield.
Resolve Stack: Victimize (38) - Ai(1)-Reaper King No More sacrifices a creature. If you do, return Archfiend of Ifnir (42) and Springbloom Druid (22) from the graveyard to the battlefield tapped.
Add To Stack: Ai(1)-Reaper King No More triggered Springbloom Druid
Damage: Yavimaya Coast (360) deals 1 non-combat damage to Ai(4)-Arcane Maelstrom [C20] [2020].
Life: Life: Ai(4)-Arcane Maelstrom [C20] [2020] 41 > 40
Mana: Yavimaya Coast (360) - {T}: Add {G} or {U}. Yavimaya Coast deals 1 damage to you.
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] cast Whiplash Trap targeting [Kadena, Slinking Sorcerer (201), Archfiend of Ifnir (42)]
Resolve Stack: Whiplash Trap (392) - Return Kadena, Slinking Sorcerer (201) and Archfiend of Ifnir (42) to their owner's hand.
Zone Change: Mountain (94) was put into Graveyard from Battlefield.
Resolve Stack: When Springbloom Druid enters, you may sacrifice a land. If you do, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle. [Zone Changer: Springbloom Druid (22)]
Turn: Turn 28 (Ai(2)-Faceless Menace [C19] [2019])
Land: Ai(2)-Faceless Menace [C19] [2019] played Forest (126)
Mana: Island (103) - {T}: Add {U}.
Mana: Swamp (186) - {T}: Add {B}.
Mana: Forest (121) - {T}: Add {G}.
Mana: Sol Ring (157) - {T}: Add {C}{C}.
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] cast Kadena, Slinking Sorcerer
Resolve Stack: Kadena, Slinking Sorcerer - Creature 3 / 3
Mana: Forest (125) - {T}: Add {G}.
Mana: Forest (126) - {T}: Add {G}.
Mana: Golgari Rot Farm (134) - {T}: Add {B}{G}.
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] cast Voice of Many
Resolve Stack: Voice of Many - Creature 3 / 3
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Voice of Many
Resolve Stack: When Voice of Many enters, draw a card for each opponent who controls fewer creatures than you. [Zone Changer: Voice of Many (169)]
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] cast Morph
Resolve Stack: Morph - Creature 2/2
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Kadena, Slinking Sorcerer
Resolve Stack: Whenever a face-down creature you control enters, draw a card. [Zone Changer: Face-down card (H16)]
Turn: Turn 29 (Ai(3)-Merciless Rage [C19] [2019])
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] triggered Squee, Goblin Nabob
Resolve Stack: At the beginning of your upkeep, you may return Squee, Goblin Nabob from your graveyard to your hand. [Phase: Ai(3)-Merciless Rage [C19] [2019]]
Mana: Mountain (244) - {T}: Add {R}.
Mana: Rakdos Locket (295) - {T}: Add {B} or {R}.
Mana: Sol Ring (255) - {T}: Add {C}{C}.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] cast Fiery Temper targeting [The Reaper, King No More (100)]
Damage: Fiery Temper (203) deals 3 damage to The Reaper, King No More (100).
Resolve Stack: Fiery Temper (203) - Fiery Temper (203) deals 3 damage to The Reaper, King No More (100).
Zone Change: The Reaper, King No More (100) was put into Graveyard from Battlefield.
Add To Stack: Ai(1)-Reaper King No More triggered Skullclamp
Resolve Stack: Whenever equipped creature dies, draw two cards. [Zone Changer: The Reaper, King No More (100)]
Combat: Ai(3)-Merciless Rage [C19] [2019] assigned Bloodhall Priest (300) to attack Ai(2)-Faceless Menace [C19] [2019].
Combat: Ai(2)-Faceless Menace [C19] [2019] didn't block Bloodhall Priest (300).
Damage: Bloodhall Priest (300) deals 4 combat damage to Ai(2)-Faceless Menace [C19] [2019].
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 36 > 32
Discard: Ai(3)-Merciless Rage [C19] [2019] discards Squee, Goblin Nabob (238).
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] activated Anje Falkenrath
Resolve Stack: Anje Falkenrath (302) - Ai(3)-Merciless Rage [C19] [2019] draws a card.
Mana: Barren Moor (218) - {T}: Add {B}.
Mana: Swamp (288) - {T}: Add {B}.
Mana: Swamp (287) - {T}: Add {B}.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] cast Faith of the Devoted
Resolve Stack: Faith of the Devoted
Turn: Turn 30 (Ai(4)-Arcane Maelstrom [C20] [2020])
Replacement Effect: Halimar Depths enters tapped.
Land: Ai(4)-Arcane Maelstrom [C20] [2020] played Halimar Depths (395)
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] triggered Halimar Depths
Resolve Stack: When Halimar Depths enters, look at the top three cards of your library, then put them back in any order. [Zone Changer: Halimar Depths (395)]
Mana: Island (350) - {T}: Add {U}.
Mana: Forest (369) - {T}: Add {G}.
Mana: Mountain (389) - {T}: Add {R}.
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] cast Frantic Search
Discard: Ai(4)-Arcane Maelstrom [C20] [2020] discards Dualcaster Mage (398).
Discard: Ai(4)-Arcane Maelstrom [C20] [2020] discards Glademuse (399).
Resolve Stack: Frantic Search (355) - Ai(4)-Arcane Maelstrom [C20] [2020] draws two cards. Ai(4)-Arcane Maelstrom [C20] [2020] discards two cards. Untap up to 3 Lands.
Mana: Mountain (389) - {T}: Add {R}.
Mana: Rugged Highlands (357) - {T}: Add {R} or {G}.
Mana: Island (350) - {T}: Add {U}.
Mana: Island (351) - {T}: Add {U}.
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] cast Crackling Drake
Resolve Stack: Crackling Drake - Creature * / 4
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] triggered Crackling Drake
Resolve Stack: When Crackling Drake enters, draw a card. [Zone Changer: Crackling Drake (313)]
Mana: Rupture Spire (359) - {T}: Add one mana of any color.
Mana: Halimar Depths (395) - {T}: Add {U}.
Mana: Oran-Rief, the Vastwood (304) - {T}: Add {G}.
Mana: Mosswort Bridge (329) - {T}: Add {G}.
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] cast Kalamax, the Stormsire
Resolve Stack: Kalamax, the Stormsire - Creature 4 / 4
Turn: Turn 31 (Ai(1)-Reaper King No More)
Land: Ai(1)-Reaper King No More played Yavimaya, Cradle of Growth (90)
Mana: Swamp (61) - {T}: Add {B}.
Mana: Blooming Marsh (40) - {T}: Add {B} or {G}.
Mana: Forest (28) - {T}: Add {G}.
Mana: Forest (32) - {T}: Add {G}.
Mana: Yavimaya, Cradle of Growth (90) - {T}: Add {G}.
Mana: Mountain (92) - {T}: Add {G}.
Mana: Llanowar Wastes (80) - {T}: Add {C}.
Add To Stack: Ai(1)-Reaper King No More cast Overseer of the Damned
Resolve Stack: Overseer of the Damned - Creature 5 / 5
Add To Stack: Ai(1)-Reaper King No More triggered Overseer of the Damned targeting [Kadena, Slinking Sorcerer (201)]
Zone Change: Kadena, Slinking Sorcerer (201) was put into Graveyard from Battlefield.
Resolve Stack: When Overseer of the Damned enters, you may destroy target creature. (Targeting: [[Kadena, Slinking Sorcerer (201)]]) [Zone Changer: Overseer of the Damned (49)]
Add To Stack: Ai(1)-Reaper King No More triggered Overseer of the Damned
Resolve Stack: Whenever a nontoken creature an opponent controls dies, create a tapped 2/2 black Zombie creature token. [Zone Changer: Kadena, Slinking Sorcerer (201)]
Turn: Turn 32 (Ai(2)-Faceless Menace [C19] [2019])
Mana: Island (103) - {T}: Add {U}.
Mana: Forest (121) - {T}: Add {G}.
Mana: Sol Ring (157) - {T}: Add {C}{C}.
Resolve Stack: Ai(2)-Faceless Menace [C19] [2019] has unmorphed Icefeather Aven
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Icefeather Aven targeting [Overseer of the Damned (49)]
Resolve Stack: When Icefeather Aven is turned face up, you may return another target creature to its owner's hand. (Targeting: [[Overseer of the Damned (49)]]) [Turn Face up: Icefeather Aven (199)]
Land: Ai(2)-Faceless Menace [C19] [2019] played Command Tower (119)
Mana: Command Tower (119) - {T}: Add one mana of any color in your commander's color identity.
Mana: Swamp (186) - {T}: Add {B}.
Mana: Forest (125) - {T}: Add {G}.
Mana: Forest (126) - {T}: Add {G}.
Mana: Golgari Rot Farm (134) - {T}: Add {G}.
Mana: Golgari Guildgate (183) - {T}: Add {G}.
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] cast Kadena, Slinking Sorcerer
Resolve Stack: Kadena, Slinking Sorcerer - Creature 3 / 3
Combat: Ai(2)-Faceless Menace [C19] [2019] assigned Icefeather Aven (199) to attack Ai(3)-Merciless Rage [C19] [2019].
Combat: Ai(3)-Merciless Rage [C19] [2019] didn't block Icefeather Aven (199).
Damage: Icefeather Aven (199) deals 2 combat damage to Ai(3)-Merciless Rage [C19] [2019].
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 34 > 32
Mana: Llanowar Wastes (184) - {T}: Add {C}.
Discard: Ai(2)-Faceless Menace [C19] [2019] discards Ash Barrens (144).
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] activated Ash Barrens
Resolve Stack: Ash Barrens (144) - Ai(2)-Faceless Menace [C19] [2019] searches their library for a Basic card, reveals it, puts it into their hand, then shuffles.
Turn: Turn 33 (Ai(3)-Merciless Rage [C19] [2019])
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] triggered Squee, Goblin Nabob
Resolve Stack: At the beginning of your upkeep, you may return Squee, Goblin Nabob from your graveyard to your hand. [Phase: Ai(3)-Merciless Rage [C19] [2019]]
Discard: Ai(3)-Merciless Rage [C19] [2019] discards Squee, Goblin Nabob (238).
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] activated Anje Falkenrath
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] triggered Faith of the Devoted
Mana: Sol Ring (255) - {T}: Add {C}{C}.
Life: Life: Ai(4)-Arcane Maelstrom [C20] [2020] 40 > 38
Life: Life: Ai(1)-Reaper King No More 22 > 20
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 32 > 30
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 32 > 34
Resolve Stack: Whenever you cycle or discard a card, you may pay {1}. If you do, each opponent loses 2 life and you gain 2 life. [Discarded: Squee, Goblin Nabob (238), Cause: null]
Resolve Stack: Anje Falkenrath (302) - Ai(3)-Merciless Rage [C19] [2019] draws a card.
Land: Ai(3)-Merciless Rage [C19] [2019] played Mountain (246)
Mana: Barren Moor (218) - {T}: Add {B}.
Mana: Swamp (288) - {T}: Add {B}.
Mana: Mountain (244) - {T}: Add {G}.
Mana: Mountain (246) - {T}: Add {G}.
Mana: Swamp (287) - {T}: Add {G}.
Mana: Rix Maadi, Dungeon Palace (214) - {T}: Add {C}.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] cast Hedonist's Trove
Resolve Stack: Hedonist's Trove
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] triggered Hedonist's Trove targeting [Ai(4)-Arcane Maelstrom [C20] [2020]]
Resolve Stack: When Hedonist's Trove enters, exile all cards from target opponent's graveyard. (Targeting: [[Ai(4)-Arcane Maelstrom [C20] [2020]]]) [Zone Changer: Hedonist's Trove (281)]
Turn: Turn 34 (Ai(4)-Arcane Maelstrom [C20] [2020])
Combat: Ai(4)-Arcane Maelstrom [C20] [2020] assigned Crackling Drake (313) to attack Ai(2)-Faceless Menace [C19] [2019].
Combat: Ai(2)-Faceless Menace [C19] [2019] didn't block Crackling Drake (313).
Damage: Crackling Drake (313) deals 4 combat damage to Ai(2)-Faceless Menace [C19] [2019].
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 30 > 26
Replacement Effect: Swiftwater Cliffs enters tapped.
Land: Ai(4)-Arcane Maelstrom [C20] [2020] played Swiftwater Cliffs (316)
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] triggered Swiftwater Cliffs
Life: Life: Ai(4)-Arcane Maelstrom [C20] [2020] 38 > 39
Resolve Stack: When Swiftwater Cliffs enters, you gain 1 life. [Zone Changer: Swiftwater Cliffs (316)]
Mana: Mountain (389) - {T}: Add {R}.
Mana: Forest (369) - {T}: Add {G}.
Mana: Island (350) - {T}: Add {G}.
Mana: Island (351) - {T}: Add {G}.
Mana: Halimar Depths (395) - {T}: Add {G}.
Mana: Rugged Highlands (357) - {T}: Add {G}.
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] cast Charmbreaker Devils
Resolve Stack: Charmbreaker Devils - Creature 4 / 4
Turn: Turn 35 (Ai(1)-Reaper King No More)
Replacement Effect: As Overgrown Tomb enters, you may pay 2 life. If you don't, it enters tapped.
Land: Ai(1)-Reaper King No More played Overgrown Tomb (72)
Mana: Swamp (61) - {T}: Add {B}.
Mana: Blooming Marsh (40) - {T}: Add {B} or {G}.
Mana: Forest (28) - {T}: Add {G}.
Mana: Forest (32) - {T}: Add {G}.
Mana: Yavimaya, Cradle of Growth (90) - {T}: Add {G}.
Mana: Mountain (92) - {T}: Add {G}.
Mana: Llanowar Wastes (80) - {T}: Add {C}.
Add To Stack: Ai(1)-Reaper King No More cast Overseer of the Damned
Resolve Stack: Overseer of the Damned - Creature 5 / 5
Add To Stack: Ai(1)-Reaper King No More triggered Overseer of the Damned targeting [Voice of Many (169)]
Zone Change: Voice of Many (169) was put into Graveyard from Battlefield.
Resolve Stack: When Overseer of the Damned enters, you may destroy target creature. (Targeting: [[Voice of Many (169)]]) [Zone Changer: Overseer of the Damned (49)]
Add To Stack: Ai(1)-Reaper King No More triggered Overseer of the Damned
Resolve Stack: Whenever a nontoken creature an opponent controls dies, create a tapped 2/2 black Zombie creature token. [Zone Changer: Voice of Many (169)]
Turn: Turn 36 (Ai(2)-Faceless Menace [C19] [2019])
Mana: Island (103) - {T}: Add {U}.
Mana: Swamp (186) - {T}: Add {B}.
Mana: Forest (121) - {T}: Add {G}.
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] cast Sultai Charm
Zone Change: Overseer of the Damned (49) was put into Graveyard from Battlefield.
Resolve Stack: Sultai Charm (111) - Destroy target monocolored creature. (Targeting: Overseer of the Damned (49))
Land: Ai(2)-Faceless Menace [C19] [2019] played Shrine of the Forsaken Gods (128)
Combat: Ai(2)-Faceless Menace [C19] [2019] assigned Icefeather Aven (199) to attack Ai(3)-Merciless Rage [C19] [2019].
Combat: Ai(3)-Merciless Rage [C19] [2019] didn't block Icefeather Aven (199).
Damage: Icefeather Aven (199) deals 2 combat damage to Ai(3)-Merciless Rage [C19] [2019].
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 34 > 32
Mana: Command Tower (119) - {T}: Add one mana of any color in your commander's color identity.
Mana: Forest (125) - {T}: Add {G}.
Mana: Sol Ring (157) - {T}: Add {C}{C}.
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] cast Bounty of the Luxa
Resolve Stack: Bounty of the Luxa
Turn: Turn 37 (Ai(3)-Merciless Rage [C19] [2019])
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] triggered Squee, Goblin Nabob
Resolve Stack: At the beginning of your upkeep, you may return Squee, Goblin Nabob from your graveyard to your hand. [Phase: Ai(3)-Merciless Rage [C19] [2019]]
Mana: Barren Moor (218) - {T}: Add {G}.
Mana: Sol Ring (255) - {T}: Add {C}{C}.
Zone Change: Mountain (244) was put into Graveyard from Battlefield.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] cast Harrow
Resolve Stack: Harrow (346) - Ai(3)-Merciless Rage [C19] [2019] searches their library for up to two basic land cards, puts them onto the battlefield, then shuffles.
Land: Ai(3)-Merciless Rage [C19] [2019] played Forest (370)
Discard: Ai(3)-Merciless Rage [C19] [2019] discards Squee, Goblin Nabob (238).
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] activated Anje Falkenrath
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] triggered Faith of the Devoted
Mana: Forest (370) - {T}: Add {G}.
Life: Life: Ai(4)-Arcane Maelstrom [C20] [2020] 39 > 37
Life: Life: Ai(1)-Reaper King No More 20 > 18
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 26 > 24
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 32 > 34
Resolve Stack: Whenever you cycle or discard a card, you may pay {1}. If you do, each opponent loses 2 life and you gain 2 life. [Discarded: Squee, Goblin Nabob (238), Cause: null]
Resolve Stack: Anje Falkenrath (302) - Ai(3)-Merciless Rage [C19] [2019] draws a card.
Mana: Swamp (288) - {T}: Add {B}.
Mana: Swamp (287) - {T}: Add {B}.
Mana: Mountain (246) - {T}: Add {G}.
Mana: Mountain (245) - {T}: Add {G}.
Mana: Mountain (248) - {T}: Add {G}.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] cast From Under the Floorboards
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 34 > 37
Resolve Stack: From Under the Floorboards (253) - Ai(3)-Merciless Rage [C19] [2019] creates three tapped 2/2 black Zombie creature tokens and you gain 3 life. If From Under the Floorboards's madness cost was paid, instead create X of those tokens and you gain X life. Ai(3)-Merciless Rage [C19] [2019] gains 3 life.
Mana: Rix Maadi, Dungeon Palace (214) - {T}: Add {C}.
Mana: Rakdos Locket (295) - {T}: Add {B} or {R}.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] cast Armillary Sphere
Resolve Stack: Armillary Sphere
Turn: Turn 38 (Ai(4)-Arcane Maelstrom [C20] [2020])
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] triggered Charmbreaker Devils
Resolve Stack: At the beginning of your upkeep, return an instant or sorcery card at random from your graveyard to your hand. [Phase: Ai(4)-Arcane Maelstrom [C20] [2020]]
Mana: Forest (369) - {T}: Add {G}.
Mana: Island (350) - {T}: Add {G}.
Mana: Island (351) - {T}: Add {G}.
Zone Change: Island (350) was put into Graveyard from Battlefield.
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] cast Harrow
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] triggered Charmbreaker Devils
Resolve Stack: Whenever you cast a instant or sorcery spell, Charmbreaker Devils gets +4/+0 until end of turn. [Card: Harrow (346), Activator: Ai(4)-Arcane Maelstrom [C20] [2020], SpellAbility: As an additional cost to cast this spell, sacrifice a land.
Search your library for up to two basic land cards, put them onto the battlefield, then shuffle.]
Resolve Stack: Harrow (346) - Ai(4)-Arcane Maelstrom [C20] [2020] searches their library for up to two basic land cards, puts them onto the battlefield, then shuffles.
Combat: Ai(4)-Arcane Maelstrom [C20] [2020] assigned Charmbreaker Devils (309), Crackling Drake (313) and Kalamax, the Stormsire (403) to attack Ai(2)-Faceless Menace [C19] [2019].
Combat: Ai(2)-Faceless Menace [C19] [2019] didn't block Charmbreaker Devils (309).
Ai(2)-Faceless Menace [C19] [2019] didn't block Crackling Drake (313).
Ai(2)-Faceless Menace [C19] [2019] didn't block Kalamax, the Stormsire (403).
Damage: Charmbreaker Devils (309) deals 8 combat damage to Ai(2)-Faceless Menace [C19] [2019].
Damage: Crackling Drake (313) deals 4 combat damage to Ai(2)-Faceless Menace [C19] [2019].
Damage: Kalamax, the Stormsire (403) deals 4 combat damage to Ai(2)-Faceless Menace [C19] [2019].
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 24 > 8
Replacement Effect: Gruul Turf enters tapped.
Land: Ai(4)-Arcane Maelstrom [C20] [2020] played Gruul Turf (339)
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] triggered Gruul Turf
Resolve Stack: When Gruul Turf enters, return a land you control to its owner's hand. [Zone Changer: Gruul Turf (339)]
Turn: Turn 39 (Ai(1)-Reaper King No More)
Mana: Forest (28) - {T}: Add {G}.
Add To Stack: Ai(1)-Reaper King No More activated Skullclamp targeting [Zombie Token (543)]
Resolve Stack: Skullclamp (3) - Attach to Zombie Token (543)
Replacement Effect: Path of Ancestry enters tapped.
Land: Ai(1)-Reaper King No More played Path of Ancestry (8)
Mana: Swamp (61) - {T}: Add {B}.
Mana: Overgrown Tomb (72) - {T}: Add {B}.
Mana: Forest (32) - {T}: Add {G}.
Mana: Yavimaya, Cradle of Growth (90) - {T}: Add {G}.
Mana: Mountain (92) - {T}: Add {G}.
Add To Stack: Ai(1)-Reaper King No More cast Archfiend of Ifnir
Resolve Stack: Archfiend of Ifnir - Creature 5 / 4
Turn: Turn 40 (Ai(2)-Faceless Menace [C19] [2019])
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Bounty of the Luxa
Resolve Stack: At the beginning of your first main phase, remove all flood counters from Bounty of the Luxa. If no counters were removed this way, put a flood counter on Bounty of the Luxa and draw a card. Otherwise, add {C}{G}{U}. [Phase: Ai(2)-Faceless Menace [C19] [2019]]
Land: Ai(2)-Faceless Menace [C19] [2019] played Darkwater Catacombs (178)
Turn: Turn 41 (Ai(3)-Merciless Rage [C19] [2019])
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] triggered Squee, Goblin Nabob
Resolve Stack: At the beginning of your upkeep, you may return Squee, Goblin Nabob from your graveyard to your hand. [Phase: Ai(3)-Merciless Rage [C19] [2019]]
Mana: Forest (370) - {T}: Add {G}.
Mana: Sol Ring (255) - {T}: Add {C}{C}.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] cast Natural Connection
Resolve Stack: Natural Connection (308) - Ai(3)-Merciless Rage [C19] [2019] searches their library for a basic land card, puts it onto the battlefield tapped, then shuffles.
Combat: Ai(3)-Merciless Rage [C19] [2019] assigned Bloodhall Priest (300) to attack Ai(2)-Faceless Menace [C19] [2019].
Combat: Ai(2)-Faceless Menace [C19] [2019] assigned Haldan, Avid Arcanist (306) and Kadena, Slinking Sorcerer (201) to block Bloodhall Priest (300).
Damage: Bloodhall Priest (300) deals 1 damage to Haldan, Avid Arcanist (306).
Damage: Bloodhall Priest (300) deals 3 damage to Kadena, Slinking Sorcerer (201).
Damage: Haldan, Avid Arcanist (306) deals 1 damage to Bloodhall Priest (300).
Damage: Kadena, Slinking Sorcerer (201) deals 3 damage to Bloodhall Priest (300).
Zone Change: Bloodhall Priest (300) was put into Graveyard from Battlefield.
Zone Change: Kadena, Slinking Sorcerer (201) was put into Graveyard from Battlefield.
Discard: Ai(3)-Merciless Rage [C19] [2019] discards Squee, Goblin Nabob (238).
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] activated Anje Falkenrath
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] triggered Faith of the Devoted
Mana: Mountain (246) - {T}: Add {G}.
Life: Life: Ai(4)-Arcane Maelstrom [C20] [2020] 37 > 35
Life: Life: Ai(1)-Reaper King No More 18 > 16
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 8 > 6
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 37 > 39
Resolve Stack: Whenever you cycle or discard a card, you may pay {1}. If you do, each opponent loses 2 life and you gain 2 life. [Discarded: Squee, Goblin Nabob (238), Cause: null]
Resolve Stack: Anje Falkenrath (302) - Ai(3)-Merciless Rage [C19] [2019] draws a card.
Mana: Mountain (245) - {T}: Add {R}.
Mana: Mountain (248) - {T}: Add {G}.
Mana: Barren Moor (218) - {T}: Add {G}.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] cast Stromkirk Occultist
Resolve Stack: Stromkirk Occultist - Creature 3 / 2
Mana: Swamp (288) - {T}: Add {B}.
Mana: Swamp (287) - {T}: Add {G}.
Mana: Rix Maadi, Dungeon Palace (214) - {T}: Add {C}.
Mana: Rakdos Locket (295) - {T}: Add {B} or {R}.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] cast Grave Scrabbler
Resolve Stack: Grave Scrabbler - Creature 2 / 2
Turn: Turn 42 (Ai(4)-Arcane Maelstrom [C20] [2020])
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] triggered Charmbreaker Devils
Resolve Stack: At the beginning of your upkeep, return an instant or sorcery card at random from your graveyard to your hand. [Phase: Ai(4)-Arcane Maelstrom [C20] [2020]]
Mana: Forest (369) - {T}: Add {G}.
Mana: Mountain (389) - {T}: Add {G}.
Mana: Halimar Depths (395) - {T}: Add {G}.
Zone Change: Island (348) was put into Graveyard from Battlefield.
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] cast Harrow
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] triggered Charmbreaker Devils
Resolve Stack: Whenever you cast a instant or sorcery spell, Charmbreaker Devils gets +4/+0 until end of turn. [Card: Harrow (346), Activator: Ai(4)-Arcane Maelstrom [C20] [2020], SpellAbility: As an additional cost to cast this spell, sacrifice a land.
Search your library for up to two basic land cards, put them onto the battlefield, then shuffle.]
Resolve Stack: Harrow (346) - Ai(4)-Arcane Maelstrom [C20] [2020] searches their library for up to two basic land cards, puts them onto the battlefield, then shuffles.
Combat: Ai(4)-Arcane Maelstrom [C20] [2020] assigned Charmbreaker Devils (309), Crackling Drake (313) and Kalamax, the Stormsire (403) to attack Ai(2)-Faceless Menace [C19] [2019].
Combat: Ai(2)-Faceless Menace [C19] [2019] assigned Face-down card (H5) and Face-down card (H9) to block Charmbreaker Devils (309).
Ai(2)-Faceless Menace [C19] [2019] assigned Icefeather Aven (199) to block Crackling Drake (313).
Ai(2)-Faceless Menace [C19] [2019] assigned Face-down card (H8) and Face-down card (H10) to block Kalamax, the Stormsire (403).
Damage: Charmbreaker Devils (309) deals 2 damage to Face-down card (H5).
Damage: Charmbreaker Devils (309) deals 6 damage to Face-down card (H9).
Damage: Crackling Drake (313) deals 4 damage to Icefeather Aven (199).
Damage: Kalamax, the Stormsire (403) deals 2 damage to Face-down card (H10).
Damage: Kalamax, the Stormsire (403) deals 2 damage to Face-down card (H8).
Damage: Face-down card (H5) deals 2 damage to Charmbreaker Devils (309).
Damage: Face-down card (H9) deals 2 damage to Charmbreaker Devils (309).
Damage: Icefeather Aven (199) deals 2 damage to Crackling Drake (313).
Damage: Face-down card (H8) deals 2 damage to Kalamax, the Stormsire (403).
Damage: Face-down card (H10) deals 2 damage to Kalamax, the Stormsire (403).
Zone Change: Face-down card (H10) was put into Graveyard from Battlefield.
Zone Change: Kalamax, the Stormsire (403) was put into Graveyard from Battlefield.
Zone Change: Charmbreaker Devils (309) was put into Graveyard from Battlefield.
Zone Change: Face-down card (H8) was put into Graveyard from Battlefield.
Zone Change: Icefeather Aven (199) was put into Graveyard from Battlefield.
Zone Change: Face-down card (H5) was put into Graveyard from Battlefield.
Zone Change: Face-down card (H9) was put into Graveyard from Battlefield.
Land: Ai(4)-Arcane Maelstrom [C20] [2020] played Island (351)
Mana: Island (347) - {T}: Add {U}.
Mana: Mountain (388) - {T}: Add {R}.
Mana: Island (351) - {T}: Add {G}.
Mana: Mountain (387) - {T}: Add {G}.
Mana: Swiftwater Cliffs (316) - {T}: Add {G}.
Mana: Rugged Highlands (357) - {T}: Add {G}.
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] cast Kalamax, the Stormsire
Resolve Stack: Kalamax, the Stormsire - Creature 4 / 4
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] activated Oran-Rief, the Vastwood
Resolve Stack: Oran-Rief, the Vastwood (304) - Put a +1/+1 counter on each valid permanent.
Turn: Turn 43 (Ai(1)-Reaper King No More)
Land: Ai(1)-Reaper King No More played Swamp (59)
Combat: Ai(1)-Reaper King No More assigned Archfiend of Ifnir (42) to attack Ai(3)-Merciless Rage [C19] [2019].
Combat: Ai(3)-Merciless Rage [C19] [2019] didn't block Archfiend of Ifnir (42).
Damage: Archfiend of Ifnir (42) deals 5 combat damage to Ai(3)-Merciless Rage [C19] [2019].
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 39 > 34
Mana: Swamp (61) - {T}: Add {B}.
Mana: Overgrown Tomb (72) - {T}: Add {B}.
Mana: Swamp (59) - {T}: Add {B}.
Mana: Forest (28) - {T}: Add {G}.
Mana: Forest (32) - {T}: Add {G}.
Mana: Yavimaya, Cradle of Growth (90) - {T}: Add {G}.
Add To Stack: Ai(1)-Reaper King No More cast Bolas's Citadel
Resolve Stack: Bolas's Citadel
Life: Life: Ai(1)-Reaper King No More 16 > 13
Add To Stack: Ai(1)-Reaper King No More cast Phyrexian Altar
Resolve Stack: Phyrexian Altar
Life: Life: Ai(1)-Reaper King No More 13 > 10
Add To Stack: Ai(1)-Reaper King No More cast Mayhem Devil
Resolve Stack: Mayhem Devil - Creature 3 / 3
Life: Life: Ai(1)-Reaper King No More 10 > 6
Add To Stack: Ai(1)-Reaper King No More cast Poison-Tip Archer
Resolve Stack: Poison-Tip Archer - Creature 2 / 3
Life: Life: Ai(1)-Reaper King No More 6 > 4
Add To Stack: Ai(1)-Reaper King No More cast Sakura-Tribe Elder
Resolve Stack: Sakura-Tribe Elder - Creature 1 / 1
Zone Change: Sakura-Tribe Elder (85) was put into Graveyard from Battlefield.
Add To Stack: Ai(1)-Reaper King No More activated Sakura-Tribe Elder
Add To Stack: Ai(1)-Reaper King No More triggered Mayhem Devil targeting [Ai(2)-Faceless Menace [C19] [2019]]
Add To Stack: Ai(1)-Reaper King No More triggered Poison-Tip Archer
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 6 > 5
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 34 > 33
Life: Life: Ai(4)-Arcane Maelstrom [C20] [2020] 35 > 34
Resolve Stack: Whenever another creature dies, each opponent loses 1 life. [Zone Changer: Sakura-Tribe Elder (85)]
Damage: Mayhem Devil (63) deals 1 non-combat damage to Ai(2)-Faceless Menace [C19] [2019].
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 5 > 4
Resolve Stack: Whenever a player sacrifices a permanent, Mayhem Devil deals 1 damage to any target. (Targeting: [[Ai(2)-Faceless Menace [C19] [2019]]]) [Sacrificed: Sakura-Tribe Elder (85)]
Resolve Stack: Sakura-Tribe Elder (85) - Ai(1)-Reaper King No More searches their library for a basic land card, puts it onto the battlefield tapped, then shuffles.
Mana: Blooming Marsh (40) - {T}: Add {B} or {G}.
Mana: Mountain (92) - {T}: Add {G}.
Mana: Path of Ancestry (8) - {T}: Add {G}.
Mana: Llanowar Wastes (80) - {T}: Add {C}.
Add To Stack: Ai(1)-Reaper King No More cast Mirkwood Bats
Resolve Stack: Mirkwood Bats - Creature 2 / 3
Turn: Turn 44 (Ai(2)-Faceless Menace [C19] [2019])
Mana: Forest (121) - {T}: Add {G}.
Mana: Sol Ring (157) - {T}: Add {C}{C}.
Mana: Forest (125) - {T}: Add {G}.
Mana: Forest (126) - {T}: Add {G}.
Mana: Swamp (186) - {T}: Add {G}.
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] cast Great Oak Guardian
Resolve Stack: Great Oak Guardian - Creature 4 / 5
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Great Oak Guardian targeting [Ai(2)-Faceless Menace [C19] [2019]]
Resolve Stack: When Great Oak Guardian enters, creatures target player controls get +2/+2 until end of turn. Untap them. (Targeting: [[Ai(2)-Faceless Menace [C19] [2019]]]) [Zone Changer: Great Oak Guardian (149)]
Mana: Golgari Rot Farm (134) - {T}: Add {B}{G}.
Resolve Stack: Ai(2)-Faceless Menace [C19] [2019] has unmanifested Blood Artist
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Bounty of the Luxa
Resolve Stack: At the beginning of your first main phase, remove all flood counters from Bounty of the Luxa. If no counters were removed this way, put a flood counter on Bounty of the Luxa and draw a card. Otherwise, add {C}{G}{U}. [Phase: Ai(2)-Faceless Menace [C19] [2019]]
Land: Ai(2)-Faceless Menace [C19] [2019] played Island (104)
Mana: Golgari Guildgate (183) - {T}: Add {B} or {G}.
Mana: Island (103) - {T}: Add {G}.
Mana: Island (104) - {T}: Add {G}.
Mana: Shrine of the Forsaken Gods (128) - {T}: Add {C}.
Mana: Command Tower (119) - {T}: Add {G}.
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] cast Kadena, Slinking Sorcerer
Resolve Stack: Kadena, Slinking Sorcerer - Creature 3 / 3
Turn: Turn 45 (Ai(3)-Merciless Rage [C19] [2019])
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] triggered Squee, Goblin Nabob
Resolve Stack: At the beginning of your upkeep, you may return Squee, Goblin Nabob from your graveyard to your hand. [Phase: Ai(3)-Merciless Rage [C19] [2019]]
Mana: Mountain (246) - {T}: Add {R}.
Mana: Sol Ring (255) - {T}: Add {C}{C}.
Mana: Forest (370) - {T}: Add {G}.
Mana: Mountain (245) - {T}: Add {G}.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] cast Alchemist's Greeting targeting [Archfiend of Ifnir (42)]
Damage: Alchemist's Greeting (264) deals 4 damage to Archfiend of Ifnir (42).
Resolve Stack: Alchemist's Greeting (264) - Alchemist's Greeting (264) deals 4 damage to Archfiend of Ifnir (42).
Zone Change: Archfiend of Ifnir (42) was put into Graveyard from Battlefield.
Add To Stack: Ai(1)-Reaper King No More triggered Poison-Tip Archer
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Blood Artist targeting [Ai(3)-Merciless Rage [C19] [2019]]
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 33 > 32
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 4 > 5
Resolve Stack: Whenever Blood Artist or another creature dies, target player loses 1 life and you gain 1 life. (Targeting: [[Ai(3)-Merciless Rage [C19] [2019]]]) [Zone Changer: Archfiend of Ifnir (42)]
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 32 > 31
Life: Life: Ai(4)-Arcane Maelstrom [C20] [2020] 34 > 33
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 5 > 4
Resolve Stack: Whenever another creature dies, each opponent loses 1 life. [Zone Changer: Archfiend of Ifnir (42)]
Combat: Ai(3)-Merciless Rage [C19] [2019] assigned Stromkirk Occultist (237) to attack Ai(1)-Reaper King No More.
Combat: Ai(1)-Reaper King No More assigned Zombie Token (656) and Elf Warrior Token (413) to block Stromkirk Occultist (237).
Damage: Stromkirk Occultist (237) deals 2 damage to Zombie Token (656).
Damage: Stromkirk Occultist (237) deals 1 damage to Elf Warrior Token (413).
Damage: Zombie Token (656) deals 2 damage to Stromkirk Occultist (237).
Damage: Elf Warrior Token (413) deals 1 damage to Stromkirk Occultist (237).
Zone Change: Stromkirk Occultist (237) was put into Graveyard from Battlefield.
Zone Change: Elf Warrior Token (413) was put into Graveyard from Battlefield.
Zone Change: Zombie Token (656) was put into Graveyard from Battlefield.
Add To Stack: Ai(1)-Reaper King No More triggered Poison-Tip Archer
Add To Stack: Ai(1)-Reaper King No More triggered Poison-Tip Archer
Add To Stack: Ai(1)-Reaper King No More triggered Poison-Tip Archer
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Blood Artist targeting [Ai(3)-Merciless Rage [C19] [2019]]
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Blood Artist targeting [Ai(3)-Merciless Rage [C19] [2019]]
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Blood Artist targeting [Ai(3)-Merciless Rage [C19] [2019]]
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 31 > 30
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 4 > 5
Resolve Stack: Whenever Blood Artist or another creature dies, target player loses 1 life and you gain 1 life. (Targeting: [[Ai(3)-Merciless Rage [C19] [2019]]]) [Zone Changer: Zombie Token (656)]
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 30 > 29
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 5 > 6
Resolve Stack: Whenever Blood Artist or another creature dies, target player loses 1 life and you gain 1 life. (Targeting: [[Ai(3)-Merciless Rage [C19] [2019]]]) [Zone Changer: Elf Warrior Token (413)]
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 29 > 28
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 6 > 7
Resolve Stack: Whenever Blood Artist or another creature dies, target player loses 1 life and you gain 1 life. (Targeting: [[Ai(3)-Merciless Rage [C19] [2019]]]) [Zone Changer: Stromkirk Occultist (237)]
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 28 > 27
Life: Life: Ai(4)-Arcane Maelstrom [C20] [2020] 33 > 32
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 7 > 6
Resolve Stack: Whenever another creature dies, each opponent loses 1 life. [Zone Changer: Zombie Token (656)]
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 27 > 26
Life: Life: Ai(4)-Arcane Maelstrom [C20] [2020] 32 > 31
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 6 > 5
Resolve Stack: Whenever another creature dies, each opponent loses 1 life. [Zone Changer: Elf Warrior Token (413)]
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 26 > 25
Life: Life: Ai(4)-Arcane Maelstrom [C20] [2020] 31 > 30
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 5 > 4
Resolve Stack: Whenever another creature dies, each opponent loses 1 life. [Zone Changer: Stromkirk Occultist (237)]
Discard: Ai(3)-Merciless Rage [C19] [2019] discards Squee, Goblin Nabob (238).
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] activated Anje Falkenrath
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] triggered Faith of the Devoted
Mana: Mountain (248) - {T}: Add {G}.
Life: Life: Ai(4)-Arcane Maelstrom [C20] [2020] 30 > 28
Life: Life: Ai(1)-Reaper King No More 4 > 2
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 4 > 2
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 25 > 27
Resolve Stack: Whenever you cycle or discard a card, you may pay {1}. If you do, each opponent loses 2 life and you gain 2 life. [Discarded: Squee, Goblin Nabob (238), Cause: null]
Resolve Stack: Anje Falkenrath (302) - Ai(3)-Merciless Rage [C19] [2019] draws a card.
Mana: Barren Moor (218) - {T}: Add {B}.
Mana: Swamp (288) - {T}: Add {G}.
Mana: Swamp (287) - {T}: Add {G}.
Mana: Swamp (289) - {T}: Add {G}.
Mana: Rix Maadi, Dungeon Palace (214) - {T}: Add {C}.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] cast Bone Miser
Resolve Stack: Bone Miser - Creature 4 / 4
Turn: Turn 46 (Ai(4)-Arcane Maelstrom [C20] [2020])
Combat: Ai(4)-Arcane Maelstrom [C20] [2020] assigned Kalamax, the Stormsire (403) and Crackling Drake (313) to attack Ai(1)-Reaper King No More.
Combat: Ai(1)-Reaper King No More assigned Poison-Tip Archer (26) to block Kalamax, the Stormsire (403).
Ai(1)-Reaper King No More assigned Mirkwood Bats (36) to block Crackling Drake (313).
Damage: Kalamax, the Stormsire (403) deals 5 damage to Poison-Tip Archer (26).
Damage: Crackling Drake (313) deals 4 damage to Mirkwood Bats (36).
Damage: Poison-Tip Archer (26) deals 2 damage (Deathtouch) to Kalamax, the Stormsire (403).
Damage: Mirkwood Bats (36) deals 2 damage to Crackling Drake (313).
Zone Change: Kalamax, the Stormsire (403) was put into Graveyard from Battlefield.
Zone Change: Poison-Tip Archer (26) was put into Graveyard from Battlefield.
Zone Change: Mirkwood Bats (36) was put into Graveyard from Battlefield.
Add To Stack: Ai(1)-Reaper King No More triggered Poison-Tip Archer
Add To Stack: Ai(1)-Reaper King No More triggered Poison-Tip Archer
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Blood Artist targeting [Ai(3)-Merciless Rage [C19] [2019]]
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Blood Artist targeting [Ai(3)-Merciless Rage [C19] [2019]]
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Blood Artist targeting [Ai(3)-Merciless Rage [C19] [2019]]
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 27 > 26
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 2 > 3
Resolve Stack: Whenever Blood Artist or another creature dies, target player loses 1 life and you gain 1 life. (Targeting: [[Ai(3)-Merciless Rage [C19] [2019]]]) [Zone Changer: Mirkwood Bats (36)]
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 26 > 25
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 3 > 4
Resolve Stack: Whenever Blood Artist or another creature dies, target player loses 1 life and you gain 1 life. (Targeting: [[Ai(3)-Merciless Rage [C19] [2019]]]) [Zone Changer: Poison-Tip Archer (26)]
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 25 > 24
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 4 > 5
Resolve Stack: Whenever Blood Artist or another creature dies, target player loses 1 life and you gain 1 life. (Targeting: [[Ai(3)-Merciless Rage [C19] [2019]]]) [Zone Changer: Kalamax, the Stormsire (403)]
Life: Life: Ai(4)-Arcane Maelstrom [C20] [2020] 28 > 27
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 5 > 4
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 24 > 23
Resolve Stack: Whenever another creature dies, each opponent loses 1 life. [Zone Changer: Mirkwood Bats (36)]
Life: Life: Ai(4)-Arcane Maelstrom [C20] [2020] 27 > 26
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 4 > 3
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 23 > 22
Resolve Stack: Whenever another creature dies, each opponent loses 1 life. [Zone Changer: Kalamax, the Stormsire (403)]
Replacement Effect: Izzet Boilerworks enters tapped.
Land: Ai(4)-Arcane Maelstrom [C20] [2020] played Izzet Boilerworks (396)
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] triggered Izzet Boilerworks
Resolve Stack: When Izzet Boilerworks enters, return a land you control to its owner's hand. [Zone Changer: Izzet Boilerworks (396)]
Mana: Halimar Depths (395) - {T}: Add {U}.
Mana: Mountain (389) - {T}: Add {R}.
Mana: Forest (369) - {T}: Add {G}.
Mana: Island (347) - {T}: Add {G}.
Mana: Island (351) - {T}: Add {G}.
Mana: Mountain (387) - {T}: Add {G}.
Mana: Swiftwater Cliffs (316) - {T}: Add {G}.
Mana: Rugged Highlands (357) - {T}: Add {G}.
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] cast Kalamax, the Stormsire
Resolve Stack: Kalamax, the Stormsire - Creature 4 / 4
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] activated Oran-Rief, the Vastwood
Resolve Stack: Oran-Rief, the Vastwood (304) - Put a +1/+1 counter on each valid permanent.
Turn: Turn 47 (Ai(1)-Reaper King No More)
Land: Ai(1)-Reaper King No More played Forest (29)
Mana: Forest (28) - {T}: Add {G}.
Mana: Forest (32) - {T}: Add {G}.
Mana: Yavimaya, Cradle of Growth (90) - {T}: Add {G}.
Mana: Forest (29) - {T}: Add {G}.
Mana: Mountain (92) - {T}: Add {R}.
Mana: Mountain (93) - {T}: Add {G}.
Add To Stack: Ai(1)-Reaper King No More cast The Reaper, King No More
Resolve Stack: The Reaper, King No More - Creature 3 / 3
Add To Stack: Ai(1)-Reaper King No More triggered The Reaper, King No More targeting [The Reaper, King No More (100), Mayhem Devil (63)]
Resolve Stack: When The Reaper, King No More enters, put a -1/-1 counter on each of up to two target creatures. (Targeting: [[The Reaper, King No More (100), Mayhem Devil (63)]]) [Zone Changer: The Reaper, King No More (100)]
Add To Stack: Ai(1)-Reaper King No More triggered Flourishing Defenses
Add To Stack: Ai(1)-Reaper King No More triggered Flourishing Defenses
Resolve Stack: Whenever a -1/-1 counter is put on a creature, you may create a 1/1 green Elf Warrior creature token. [Added once: Mayhem Devil (63)]
Resolve Stack: Whenever a -1/-1 counter is put on a creature, you may create a 1/1 green Elf Warrior creature token. [Added once: The Reaper, King No More (100)]
Mana: Swamp (61) - {T}: Add {G}.
Mana: Overgrown Tomb (72) - {T}: Add {G}.
Mana: Swamp (59) - {T}: Add {G}.
Add To Stack: Ai(1)-Reaper King No More cast Ashnod's Altar
Resolve Stack: Ashnod's Altar
Mana: Blooming Marsh (40) - {T}: Add {G}.
Mana: Path of Ancestry (8) - {T}: Add {G}.
Mana: Llanowar Wastes (80) - {T}: Add {C}.
Add To Stack: Ai(1)-Reaper King No More cast Cultivate
Resolve Stack: Cultivate (39) - Search your library for up to two basic land cards, reveal those cards, put one onto the battlefield tapped and the other into your hand, then shuffle.
Zone Change: The Reaper, King No More (100) was put into Graveyard from Battlefield.
Mana: Phyrexian Altar (52) - Sacrifice a creature: Add one mana of any color.
Zone Change: Elf Warrior Token (732) was put into Graveyard from Battlefield.
Mana: Ashnod's Altar (6) - Sacrifice a creature: Add {C}{C}.
Add To Stack: Ai(1)-Reaper King No More cast Humble Defector
Add To Stack: Ai(1)-Reaper King No More triggered Mayhem Devil targeting [Ai(2)-Faceless Menace [C19] [2019]]
Add To Stack: Ai(1)-Reaper King No More triggered Mayhem Devil targeting [Ai(2)-Faceless Menace [C19] [2019]]
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Blood Artist targeting [Ai(3)-Merciless Rage [C19] [2019]]
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Blood Artist targeting [Ai(3)-Merciless Rage [C19] [2019]]
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 22 > 21
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 3 > 4
Resolve Stack: Whenever Blood Artist or another creature dies, target player loses 1 life and you gain 1 life. (Targeting: [[Ai(3)-Merciless Rage [C19] [2019]]]) [Zone Changer: Elf Warrior Token (732)]
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 21 > 20
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 4 > 5
Resolve Stack: Whenever Blood Artist or another creature dies, target player loses 1 life and you gain 1 life. (Targeting: [[Ai(3)-Merciless Rage [C19] [2019]]]) [Zone Changer: The Reaper, King No More (100)]
Damage: Mayhem Devil (63) deals 1 non-combat damage to Ai(2)-Faceless Menace [C19] [2019].
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 5 > 4
Resolve Stack: Whenever a player sacrifices a permanent, Mayhem Devil deals 1 damage to any target. (Targeting: [[Ai(2)-Faceless Menace [C19] [2019]]]) [Sacrificed: Elf Warrior Token (732)]
Damage: Mayhem Devil (63) deals 1 non-combat damage to Ai(2)-Faceless Menace [C19] [2019].
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 4 > 3
Resolve Stack: Whenever a player sacrifices a permanent, Mayhem Devil deals 1 damage to any target. (Targeting: [[Ai(2)-Faceless Menace [C19] [2019]]]) [Sacrificed: The Reaper, King No More (100)]
Resolve Stack: Humble Defector - Creature 2 / 1
Turn: Turn 48 (Ai(2)-Faceless Menace [C19] [2019])
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Bounty of the Luxa
Resolve Stack: At the beginning of your first main phase, remove all flood counters from Bounty of the Luxa. If no counters were removed this way, put a flood counter on Bounty of the Luxa and draw a card. Otherwise, add {C}{G}{U}. [Phase: Ai(2)-Faceless Menace [C19] [2019]]
Land: Ai(2)-Faceless Menace [C19] [2019] played Swamp (185)
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] cast Morph
Resolve Stack: Morph - Creature 2/2
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] triggered Kadena, Slinking Sorcerer
Resolve Stack: Whenever a face-down creature you control enters, draw a card. [Zone Changer: Face-down card (H20)]
Mana: Forest (121) - {T}: Add {G}.
Mana: Sol Ring (157) - {T}: Add {C}{C}.
Mana: Forest (125) - {T}: Add {G}.
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] cast Tempt with Discovery
Replacement Effect: Woodland Stream enters tapped.
Replacement Effect: As Stomping Ground enters, you may pay 2 life. If you don't, it enters tapped.
Replacement Effect: Akoum Refuge enters tapped.
Replacement Effect: Simic Growth Chamber enters tapped.
Replacement Effect: Sunken Hollow enters tapped unless you control two or more basic lands.
Resolve Stack: Tempt with Discovery (131) - Tempting offer — Search your library for a land card and put it onto the battlefield. Each opponent may search their library for a land card and put it onto the battlefield. For each opponent who searches a library this way, search your library for a land card and put it onto the battlefield. Then each player who searched a library this way shuffles. (OPTIONAL) Ai(2)-Faceless Menace [C19] [2019] searches Ai(3)-Merciless Rage [C19] [2019], Ai(4)-Arcane Maelstrom [C20] [2020] and Ai(1)-Reaper King No More library for a land card, puts it onto the battlefield, then shuffles.
Add To Stack: Ai(3)-Merciless Rage [C19] [2019] triggered Akoum Refuge
Add To Stack: Ai(4)-Arcane Maelstrom [C20] [2020] triggered Simic Growth Chamber
Zone Change: Evolving Wilds (136) was put into Graveyard from Battlefield.
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] activated Evolving Wilds
Add To Stack: Ai(1)-Reaper King No More triggered Mayhem Devil targeting [Ai(2)-Faceless Menace [C19] [2019]]
Damage: Mayhem Devil (63) deals 1 non-combat damage to Ai(2)-Faceless Menace [C19] [2019].
Life: Life: Ai(2)-Faceless Menace [C19] [2019] 3 > 2
Resolve Stack: Whenever a player sacrifices a permanent, Mayhem Devil deals 1 damage to any target. (Targeting: [[Ai(2)-Faceless Menace [C19] [2019]]]) [Sacrificed: Evolving Wilds (136)]
Resolve Stack: Evolving Wilds (136) - Ai(2)-Faceless Menace [C19] [2019] searches their library for a basic land card, puts it onto the battlefield tapped, then shuffles.
Resolve Stack: When Simic Growth Chamber enters, return a land you control to its owner's hand. [Zone Changer: Simic Growth Chamber (379)]
Life: Life: Ai(3)-Merciless Rage [C19] [2019] 20 > 21
Resolve Stack: When Akoum Refuge enters, you gain 1 life. [Zone Changer: Akoum Refuge (228)]
Mana: Forest (126) - {T}: Add {G}.
Mana: Swamp (186) - {T}: Add {G}.
Mana: Swamp (185) - {T}: Add {G}.
Add To Stack: Ai(2)-Faceless Menace [C19] [2019] cast Cultivate
Player Control: Ai(1)-Reaper King No More has restored control over themself
Player Control: Ai(2)-Faceless Menace [C19] [2019] has restored control over themself
Player Control: Ai(3)-Merciless Rage [C19] [2019] has restored control over themself
Player Control: Ai(4)-Arcane Maelstrom [C20] [2020] has restored control over themself
Game Outcome: Turn 24
Game Outcome: Ai(1)-Reaper King No More has won because all opponents have lost
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has won because all opponents have lost
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has won because all opponents have lost
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has won because all opponents have lost
Match Result: Ai(1)-Reaper King No More: 1 Ai(2)-Faceless Menace [C19] [2019]: 0 Ai(3)-Merciless Rage [C19] [2019]: 0 Ai(4)-Arcane Maelstrom [C20] [2020]: 0
Game Result: Game 1 ended in 120048 ms. Ai(1)-Reaper King No More has won!

View file

@ -0,0 +1,45 @@
====================================================================
FORGE SIMULATION REPORT — 4-player Commander pod
====================================================================
games completed : 1 (requested 1) seed: 20260907
decklist : /home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/decklist.txt (full 100 cards)
engine : Forge 2.0.14, full rules, AI vs AI
WIN RATE
--------------------------------------------------------------------
our deck : 1/1 (100.0%) [random baseline in a 4-pod = 25%]
all players:
Reaper King No More 1 (100.0%) ############################## <-- ours
Faceless Menace [C19] [2019] 0 ( 0.0%)
Merciless Rage [C19] [2019] 0 ( 0.0%)
Arcane Maelstrom [C20] [2020] 0 ( 0.0%)
GAME LENGTH
--------------------------------------------------------------------
turns median 24 min 24 max 24
seconds median 120 total 2.0 min
HOW OUR DECK LOST
--------------------------------------------------------------------
(never lost)
WHO BEAT US (winner, in games our deck lost)
--------------------------------------------------------------------
(n/a)
CAVEAT — READ THIS BEFORE TRUSTING THE WIN RATE
--------------------------------------------------------------------
Forge's AI is heuristic and, by its own documentation, WEAK AT COMBO
decks. Ours is a combo/aristocrats deck, so the AI systematically
under-plays it: it will miss sac-loop lines a human would see.
Read this as a FLOOR on the deck's power, and as proof the deck
functions and its cards interact — not as a power rating.
Opponents are stock precons, which are roughly bracket 2.
====================================================================
decklist : /home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/decklist.txt
full log : /home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/sim/20260908T012700Z.log (every game, all Forge output)
raw data : /home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/sim/20260908T012700Z.json
this report: /home/markdoeswork/mtg/reaper-king-no-more/decks/grindy/sim/20260908T012700Z.txt
====================================================================

View file

@ -0,0 +1,20 @@
# heavy-removal
_generated 2026-09-07 15:51Z by `tools/variant.py`_
- **bracket 3: PASS** (two-card vacuum combos: 0)
- 86 lines in `decklist.txt`
## files
| file | what it is |
| --- | --- |
| `decklist.txt` | the deck, `N Card Name` per line |
| `bracket.txt` | bracket-3 + house-rule check |
| `combos.txt` | combos in the deck, and one card away |
| `sim/` | Forge runs — `.log` raw, `.txt` report, `.json` data |
## simulation runs
_none yet — run with `--sim 24`_

View file

@ -0,0 +1,18 @@
COMMANDER: The Reaper, King No More
DECK SIZE: 99 + 1 commander = 100
GAME CHANGERS: 0/3 OK
MASS LAND DENIAL: 0 OK
EXTRA TURNS: 0 OK
TWO-CARD INFINITE COMBOS IN A VACUUM: 0 OK
two-card combos needing board state (ALLOWED, 1):
- Blowfly Infestation + Hapatra, Vizier of Poisons
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
==========================================================
BRACKET 3: PASS

View file

@ -0,0 +1,64 @@
==================================================================
COMBOS ALREADY IN THE DECK: 7
==================================================================
[E] Blowfly Infestation + Hapatra, Vizier of Poisons
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Blood Artist
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Zulaport Cutthroat
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Woe Strider
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Viscera Seer
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Ashnod's Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colorless mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Phyrexian Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colored mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
==================================================================
ONE CARD AWAY: 349 combos, 77 distinct cards
==================================================================
28 combos Mikaeus, the Unhallowed {3}{B}{B}{B} #1306
12 combos First Day of Class {1}{R} #10147
9 combos Rhythm of the Wild {1}{R}{G} #216
9 combos Grumgully, the Generous {1}{R}{G} #4341
8 combos Veinwitch Coven {2}{B} #4179
8 combos Thran Vigil {1}{B} #6285
8 combos Rocksteady, Mutant Marauder {2}{G} #10233
8 combos Host of the Hereafter {2}{B}{G} #7758
8 combos Support Mission {2}{G} #31928
8 combos Captain Kathryn Janeway {3}{G} #26133
8 combos Surrak and Goreclaw {4}{G}{G} #1600
8 combos Railway Brawler {3}{G}{G} #2493
8 combos Warden of the Grove {2}{G} #2262
8 combos Uncivil Unrest {4}{R} #2947
8 combos Renata, Called to the Hunt {2}{G}{G} #2830
decklist: /home/markdoeswork/mtg/reaper-king-no-more/decks/heavy-removal/decklist.txt | source: data/variants.json (108,535 combos)

View file

@ -0,0 +1,92 @@
# heavy-removal
# Bracket 3 pods interact. Trade combo redundancy for removal and see whether surviving longer beats assembling faster.
# Commander
1 The Reaper, King No More
# Main
1 Hapatra, Vizier of Poisons
1 Blowfly Infestation
1 Necroskitter
1 Yawgmoth, Thran Physician
1 Plague Belcher
1 Archfiend of Ifnir
1 Grim Poppet
1 Contagion Clasp
1 Black Sun's Zenith
1 Murderous Redcap
1 Putrid Goblin
1 Cauldron of Souls
1 Viscera Seer
1 Carrion Feeder
1 Ashnod's Altar
1 Phyrexian Altar
1 Goblin Bombardment
1 Yahenni, Undying Partisan
1 Woe Strider
1 Blood Artist
1 Zulaport Cutthroat
1 Vengeful Bloodwitch
1 Poison-Tip Archer
1 Mirkwood Bats
1 Mayhem Devil
1 Syr Konrad, the Grim
1 Bastion of Remembrance
1 Mazirek, Kraul Death Priest
1 The Meathook Massacre
1 Massacre Wurm
1 Massacre Girl, Known Killer
1 Humble Defector
1 Midnight Reaper
1 Grim Haruspex
1 Village Rites
1 Deadly Dispute
1 Greater Good
1 Beast Within
1 Chaos Warp
1 Terminate
1 Bedevil
1 Assassin's Trophy
1 Damnation
1 Toxic Deluge
1 Vandalblast
1 Cultivate
1 Kodama's Reach
1 Farseek
1 Nature's Lore
1 Three Visits
1 Birds of Paradise
1 Sakura-Tribe Elder
1 Overseer of the Damned
1 Skullclamp
1 Rampant Growth
1 Harrow
1 Wood Elves
1 Springbloom Druid
1 Binding the Old Gods
1 Fiery Cannonade
1 Vraska, the Silencer
1 Meathook Massacre II
1 Go for the Throat
1 Command Tower
1 Path of Ancestry
1 Exotic Orchard
1 Blood Crypt
1 Overgrown Tomb
1 Stomping Ground
1 Blackcleave Cliffs
1 Blooming Marsh
1 Copperline Gorge
1 Savage Lands
1 Jungle Hollow
1 Bloodfell Caves
1 Rugged Highlands
1 Ziatora's Proving Ground
1 Bojuka Bog
1 Castle Locthwain
1 Llanowar Wastes
1 Karplusan Forest
1 Yavimaya, Cradle of Growth
8 Swamp
5 Forest
4 Mountain

View file

@ -0,0 +1,20 @@
# lean-outlets
_generated 2026-09-07 15:51Z by `tools/variant.py`_
- **bracket 3: PASS** (two-card vacuum combos: 0)
- 86 lines in `decklist.txt`
## files
| file | what it is |
| --- | --- |
| `decklist.txt` | the deck, `N Card Name` per line |
| `bracket.txt` | bracket-3 + house-rule check |
| `combos.txt` | combos in the deck, and one card away |
| `sim/` | Forge runs — `.log` raw, `.txt` report, `.json` data |
## simulation runs
_none yet — run with `--sim 24`_

View file

@ -0,0 +1,24 @@
COMMANDER: The Reaper, King No More
DECK SIZE: 99 + 1 commander = 100
GAME CHANGERS: 0/3 OK
MASS LAND DENIAL: 0 OK
EXTRA TURNS: 0 OK
TWO-CARD INFINITE COMBOS IN A VACUUM: 0 OK
two-card combos needing board state (ALLOWED, 3):
- Blowfly Infestation + Nest of Scarabs
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Flourishing Defenses
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Hapatra, Vizier of Poisons
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
==========================================================
BRACKET 3: PASS

View file

@ -0,0 +1,85 @@
==================================================================
COMBOS ALREADY IN THE DECK: 10
==================================================================
[E] Blowfly Infestation + Flourishing Defenses
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite death triggers
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Nest of Scarabs
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Hapatra, Vizier of Poisons
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Obelisk Spider
-> Near-infinite lifeloss
-> Near-infinite lifegain triggers
-> Near-infinite creature ETB
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[E] Yawgmoth, Thran Physician + Nest of Scarabs + Blood Artist
-> Near-infinite -1/-1 counters
-> Near-infinite card draw
-> Near-infinite death triggers
requires: Your life total is at least 2.
requires: You control at least one additional creature.
requires: There is at least one other creature on the battlefield.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Blood Artist
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Zulaport Cutthroat
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Viscera Seer
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Ashnod's Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colorless mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Phyrexian Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colored mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
==================================================================
ONE CARD AWAY: 283 combos, 82 distinct cards
==================================================================
20 combos Mikaeus, the Unhallowed {3}{B}{B}{B} #1306
10 combos First Day of Class {1}{R} #10147
8 combos Veinwitch Coven {2}{B} #4179
8 combos Host of the Hereafter {2}{B}{G} #7758
7 combos Rhythm of the Wild {1}{R}{G} #216
7 combos Grumgully, the Generous {1}{R}{G} #4341
7 combos Scurry Oak {2}{G} #2259
6 combos Thran Vigil {1}{B} #6285
6 combos Rocksteady, Mutant Marauder {2}{G} #10233
6 combos Support Mission {2}{G} #31928
6 combos Captain Kathryn Janeway {3}{G} #26133
6 combos Surrak and Goreclaw {4}{G}{G} #1600
6 combos Warden of the Grove {2}{G} #2262
6 combos Railway Brawler {3}{G}{G} #2493
6 combos Uncivil Unrest {4}{R} #2947
decklist: /home/markdoeswork/mtg/reaper-king-no-more/decks/lean-outlets/decklist.txt | source: data/variants.json (108,535 combos)

View file

@ -0,0 +1,92 @@
# lean-outlets
# The deck runs 8 sac outlets and probably needs ~5. Cut 3 for interaction and card advantage -- does consistency actually drop?
# Commander
1 The Reaper, King No More
# Main
1 Hapatra, Vizier of Poisons
1 Blowfly Infestation
1 Nest of Scarabs
1 Necroskitter
1 Yawgmoth, Thran Physician
1 Flourishing Defenses
1 Obelisk Spider
1 Plague Belcher
1 Archfiend of Ifnir
1 Grim Poppet
1 Contagion Clasp
1 Black Sun's Zenith
1 Murderous Redcap
1 Putrid Goblin
1 Cauldron of Souls
1 Viscera Seer
1 Carrion Feeder
1 Ashnod's Altar
1 Phyrexian Altar
1 Goblin Bombardment
1 Blood Artist
1 Zulaport Cutthroat
1 Vengeful Bloodwitch
1 Poison-Tip Archer
1 Mirkwood Bats
1 Mayhem Devil
1 Syr Konrad, the Grim
1 Bastion of Remembrance
1 Mazirek, Kraul Death Priest
1 The Meathook Massacre
1 Massacre Wurm
1 Massacre Girl, Known Killer
1 Humble Defector
1 Midnight Reaper
1 Grim Haruspex
1 Village Rites
1 Deadly Dispute
1 Beast Within
1 Chaos Warp
1 Terminate
1 Bedevil
1 Assassin's Trophy
1 Damnation
1 Toxic Deluge
1 Vandalblast
1 Cultivate
1 Kodama's Reach
1 Farseek
1 Nature's Lore
1 Three Visits
1 Birds of Paradise
1 Sakura-Tribe Elder
1 Persistent Constrictor
1 Overseer of the Damned
1 Skullclamp
1 Rampant Growth
1 Harrow
1 Wood Elves
1 Springbloom Druid
1 Binding the Old Gods
1 Bloodchief Ascension
1 Toshiro Umezawa
1 Fiery Cannonade
1 Command Tower
1 Path of Ancestry
1 Exotic Orchard
1 Blood Crypt
1 Overgrown Tomb
1 Stomping Ground
1 Blackcleave Cliffs
1 Blooming Marsh
1 Copperline Gorge
1 Savage Lands
1 Jungle Hollow
1 Bloodfell Caves
1 Rugged Highlands
1 Ziatora's Proving Ground
1 Bojuka Bog
1 Castle Locthwain
1 Llanowar Wastes
1 Karplusan Forest
1 Yavimaya, Cradle of Growth
8 Swamp
5 Forest
4 Mountain

View file

@ -0,0 +1,20 @@
# low-curve
_generated 2026-09-07 15:52Z by `tools/variant.py`_
- **bracket 3: PASS** (two-card vacuum combos: 0)
- 86 lines in `decklist.txt`
## files
| file | what it is |
| --- | --- |
| `decklist.txt` | the deck, `N Card Name` per line |
| `bracket.txt` | bracket-3 + house-rule check |
| `combos.txt` | combos in the deck, and one card away |
| `sim/` | Forge runs — `.log` raw, `.txt` report, `.json` data |
## simulation runs
_none yet — run with `--sim 24`_

View file

@ -0,0 +1,24 @@
COMMANDER: The Reaper, King No More
DECK SIZE: 99 + 1 commander = 100
GAME CHANGERS: 0/3 OK
MASS LAND DENIAL: 0 OK
EXTRA TURNS: 0 OK
TWO-CARD INFINITE COMBOS IN A VACUUM: 0 OK
two-card combos needing board state (ALLOWED, 3):
- Blowfly Infestation + Nest of Scarabs
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Hapatra, Vizier of Poisons
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Flourishing Defenses
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
==========================================================
BRACKET 3: PASS

View file

@ -0,0 +1,90 @@
==================================================================
COMBOS ALREADY IN THE DECK: 11
==================================================================
[E] Blowfly Infestation + Flourishing Defenses
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite death triggers
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Nest of Scarabs
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Hapatra, Vizier of Poisons
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Obelisk Spider
-> Near-infinite lifeloss
-> Near-infinite lifegain triggers
-> Near-infinite creature ETB
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[E] Yawgmoth, Thran Physician + Nest of Scarabs + Blood Artist
-> Near-infinite -1/-1 counters
-> Near-infinite card draw
-> Near-infinite death triggers
requires: Your life total is at least 2.
requires: You control at least one additional creature.
requires: There is at least one other creature on the battlefield.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Blood Artist
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Zulaport Cutthroat
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Woe Strider
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Viscera Seer
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Ashnod's Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colorless mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Phyrexian Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colored mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
==================================================================
ONE CARD AWAY: 342 combos, 79 distinct cards
==================================================================
21 combos Mikaeus, the Unhallowed {3}{B}{B}{B} #1306
12 combos First Day of Class {1}{R} #10147
10 combos Host of the Hereafter {2}{B}{G} #7758
9 combos Rhythm of the Wild {1}{R}{G} #216
9 combos Grumgully, the Generous {1}{R}{G} #4341
8 combos Veinwitch Coven {2}{B} #4179
8 combos Thran Vigil {1}{B} #6285
8 combos Rocksteady, Mutant Marauder {2}{G} #10233
8 combos Support Mission {2}{G} #31928
8 combos Captain Kathryn Janeway {3}{G} #26133
8 combos Surrak and Goreclaw {4}{G}{G} #1600
8 combos Railway Brawler {3}{G}{G} #2493
8 combos Warden of the Grove {2}{G} #2262
8 combos Uncivil Unrest {4}{R} #2947
8 combos Renata, Called to the Hunt {2}{G}{G} #2830
decklist: /home/markdoeswork/mtg/reaper-king-no-more/decks/low-curve/decklist.txt | source: data/variants.json (108,535 combos)

View file

@ -0,0 +1,92 @@
# low-curve
# Avg MV is 3.02 and the engine lands ~T6. Cut the top of the curve entirely -- does the deck come online sooner and win more?
# Commander
1 The Reaper, King No More
# Main
1 Hapatra, Vizier of Poisons
1 Blowfly Infestation
1 Nest of Scarabs
1 Necroskitter
1 Yawgmoth, Thran Physician
1 Flourishing Defenses
1 Obelisk Spider
1 Plague Belcher
1 Contagion Clasp
1 Black Sun's Zenith
1 Murderous Redcap
1 Putrid Goblin
1 Viscera Seer
1 Carrion Feeder
1 Ashnod's Altar
1 Phyrexian Altar
1 Goblin Bombardment
1 Yahenni, Undying Partisan
1 Woe Strider
1 Blood Artist
1 Zulaport Cutthroat
1 Vengeful Bloodwitch
1 Poison-Tip Archer
1 Mirkwood Bats
1 Mayhem Devil
1 Syr Konrad, the Grim
1 Bastion of Remembrance
1 Mazirek, Kraul Death Priest
1 The Meathook Massacre
1 Massacre Girl, Known Killer
1 Humble Defector
1 Midnight Reaper
1 Grim Haruspex
1 Village Rites
1 Deadly Dispute
1 Greater Good
1 Beast Within
1 Chaos Warp
1 Terminate
1 Bedevil
1 Assassin's Trophy
1 Damnation
1 Toxic Deluge
1 Vandalblast
1 Cultivate
1 Kodama's Reach
1 Farseek
1 Nature's Lore
1 Three Visits
1 Birds of Paradise
1 Sakura-Tribe Elder
1 Persistent Constrictor
1 Skullclamp
1 Rampant Growth
1 Harrow
1 Wood Elves
1 Springbloom Druid
1 Binding the Old Gods
1 Malakir Cullblade
1 Slaughter Specialist
1 Bloodchief Ascension
1 Nurgle's Rot
1 Chevill, Bane of Monsters
1 Command Tower
1 Path of Ancestry
1 Exotic Orchard
1 Blood Crypt
1 Overgrown Tomb
1 Stomping Ground
1 Blackcleave Cliffs
1 Blooming Marsh
1 Copperline Gorge
1 Savage Lands
1 Jungle Hollow
1 Bloodfell Caves
1 Rugged Highlands
1 Ziatora's Proving Ground
1 Bojuka Bog
1 Castle Locthwain
1 Llanowar Wastes
1 Karplusan Forest
1 Yavimaya, Cradle of Growth
8 Swamp
5 Forest
4 Mountain

View file

@ -0,0 +1,32 @@
# mikaeus
_generated 2026-09-07 15:51Z by `tools/variant.py`_
- **bracket 3: FAIL** (two-card vacuum combos: 7)
- 86 lines in `decklist.txt`
## files
| file | what it is |
| --- | --- |
| `decklist.txt` | the deck, `N Card Name` per line |
| `bracket.txt` | bracket-3 + house-rule check |
| `combos.txt` | combos in the deck, and one card away |
| `sim/` | Forge runs — `.log` raw, `.txt` report, `.json` data |
## two-card vacuum combos (house-rule violations)
These go infinite with no third card and no board state:
- Mikaeus, the Unhallowed + Carrion Feeder
- Mikaeus, the Unhallowed + Woe Strider
- Mikaeus, the Unhallowed + Ashnod's Altar
- Mikaeus, the Unhallowed + Phyrexian Altar
- Mikaeus, the Unhallowed + Viscera Seer
- Mikaeus, the Unhallowed + Yahenni, Undying Partisan
- Mikaeus, the Unhallowed + Goblin Bombardment
## simulation runs
_none yet — run with `--sim 24`_

View file

@ -0,0 +1,31 @@
COMMANDER: The Reaper, King No More
DECK SIZE: 99 + 1 commander = 100
GAME CHANGERS: 0/3 OK
MASS LAND DENIAL: 0 OK
EXTRA TURNS: 0 OK
TWO-CARD INFINITE COMBOS IN A VACUUM: 7 !! HOUSE RULE VIOLATION
- Mikaeus, the Unhallowed + Carrion Feeder
- Mikaeus, the Unhallowed + Woe Strider
- Mikaeus, the Unhallowed + Ashnod's Altar
- Mikaeus, the Unhallowed + Phyrexian Altar
- Mikaeus, the Unhallowed + Viscera Seer
- Mikaeus, the Unhallowed + Yahenni, Undying Partisan
- Mikaeus, the Unhallowed + Goblin Bombardment
two-card combos needing board state (ALLOWED, 3):
- Blowfly Infestation + Hapatra, Vizier of Poisons
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Flourishing Defenses
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Nest of Scarabs
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
==========================================================
BRACKET 3: FAIL -- see !! above

View file

@ -0,0 +1,202 @@
==================================================================
COMBOS ALREADY IN THE DECK: 39
==================================================================
[E] Mikaeus, the Unhallowed + Yahenni, Undying Partisan
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite creature sacrifice triggers
[S] Mikaeus, the Unhallowed + Ashnod's Altar
-> Infinite colorless mana
-> Infinite creature ETB
-> Infinite creature LTB
[S] Mikaeus, the Unhallowed + Phyrexian Altar
-> Infinite colored mana
-> Infinite creature ETB
-> Infinite creature LTB
[S] Mikaeus, the Unhallowed + Goblin Bombardment
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite creature sacrifice triggers
[O] Mikaeus, the Unhallowed + Carrion Feeder
-> Infinite +1/+1 counters on a creature
-> Infinite creature ETB
-> Infinite creature LTB
[E] Mikaeus, the Unhallowed + Viscera Seer
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite creature sacrifice triggers
[E] Mikaeus, the Unhallowed + Woe Strider
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite creature sacrifice triggers
[E] Blowfly Infestation + Flourishing Defenses
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite death triggers
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Nest of Scarabs
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Hapatra, Vizier of Poisons
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
[O] Mikaeus, the Unhallowed + The Reaper, King No More + Yahenni, Undying Partisan
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite death triggers
[S] Mikaeus, the Unhallowed + Phyrexian Altar + The Reaper, King No More
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite colored mana
[O] Mikaeus, the Unhallowed + Woe Strider + The Reaper, King No More
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite death triggers
[S] Mikaeus, the Unhallowed + Ashnod's Altar + The Reaper, King No More
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite colorless mana
[O] Mikaeus, the Unhallowed + Viscera Seer + The Reaper, King No More
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite death triggers
[S] Mikaeus, the Unhallowed + Goblin Bombardment + The Reaper, King No More
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite damage
[O] Mikaeus, the Unhallowed + The Reaper, King No More + Carrion Feeder
-> Infinite +1/+1 counters on a creature
-> Infinite creature ETB
-> Infinite creature LTB
[E] Mikaeus, the Unhallowed + Woe Strider + Plague Belcher
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite death triggers
[E] Mikaeus, the Unhallowed + Plague Belcher + Yahenni, Undying Partisan
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite death triggers
[S] Mikaeus, the Unhallowed + Goblin Bombardment + Plague Belcher
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite damage
[E] Mikaeus, the Unhallowed + Grim Poppet + Yahenni, Undying Partisan
-> Infinite creature LTB
-> Infinite creature ETB
-> Infinite creature sacrifice triggers
[E] Mikaeus, the Unhallowed + Woe Strider + Grim Poppet
-> Infinite creature LTB
-> Infinite creature ETB
-> Infinite creature sacrifice triggers
[S] Mikaeus, the Unhallowed + Grim Poppet + Goblin Bombardment
-> Infinite creature LTB
-> Infinite creature ETB
-> Infinite creature sacrifice triggers
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Obelisk Spider
-> Near-infinite lifeloss
-> Near-infinite lifegain triggers
-> Near-infinite creature ETB
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[E] Yawgmoth, Thran Physician + Nest of Scarabs + Blood Artist
-> Near-infinite -1/-1 counters
-> Near-infinite card draw
-> Near-infinite death triggers
requires: Your life total is at least 2.
requires: You control at least one additional creature.
requires: There is at least one other creature on the battlefield.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Blood Artist
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Zulaport Cutthroat
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[S] Mikaeus, the Unhallowed + Ashnod's Altar + Plague Belcher
-> Infinite colorless mana
-> Infinite death triggers
-> Infinite creature ETB
[S] Mikaeus, the Unhallowed + Phyrexian Altar + Plague Belcher
-> Infinite colored mana
-> Infinite death triggers
-> Infinite creature ETB
[O] Mikaeus, the Unhallowed + Plague Belcher + Carrion Feeder
-> Infinite +1/+1 counters on a creature
-> Infinite death triggers
-> Infinite creature ETB
[E] Mikaeus, the Unhallowed + Viscera Seer + Plague Belcher
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
[S] Mikaeus, the Unhallowed + Ashnod's Altar + Grim Poppet
-> Infinite -1/-1 counters
-> Infinite colorless mana
-> Infinite death triggers
[S] Mikaeus, the Unhallowed + Phyrexian Altar + Grim Poppet
-> Infinite -1/-1 counters
-> Infinite colored mana
-> Infinite death triggers
[O] Mikaeus, the Unhallowed + Grim Poppet + Carrion Feeder
-> Infinite -1/-1 counters
-> Infinite +1/+1 counters on a creature
-> Infinite death triggers
[E] Mikaeus, the Unhallowed + Viscera Seer + Grim Poppet
-> Infinite -1/-1 counters
-> Infinite death triggers
-> Infinite creature ETB
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Woe Strider
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Viscera Seer
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Ashnod's Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colorless mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Phyrexian Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colored mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
==================================================================
ONE CARD AWAY: 550 combos, 134 distinct cards
==================================================================
12 combos First Day of Class {1}{R} #10147
10 combos Host of the Hereafter {2}{B}{G} #7758
9 combos Rhythm of the Wild {1}{R}{G} #216
9 combos Grumgully, the Generous {1}{R}{G} #4341
8 combos Veinwitch Coven {2}{B} #4179
8 combos Thran Vigil {1}{B} #6285
8 combos Rocksteady, Mutant Marauder {2}{G} #10233
8 combos Support Mission {2}{G} #31928
8 combos Captain Kathryn Janeway {3}{G} #26133
8 combos Surrak and Goreclaw {4}{G}{G} #1600
8 combos Railway Brawler {3}{G}{G} #2493
8 combos Warden of the Grove {2}{G} #2262
8 combos Uncivil Unrest {4}{R} #2947
8 combos Renata, Called to the Hunt {2}{G}{G} #2830
8 combos Arwen, Weaver of Hope {1}{G}{G} #1868
decklist: /home/markdoeswork/mtg/reaper-king-no-more/decks/mikaeus/decklist.txt | source: data/variants.json (108,535 combos)

View file

@ -0,0 +1,92 @@
# mikaeus
# Does the highest-leverage combo card (28 combos) stay legal? Expected FAIL: goes infinite with every sac outlet.
# Commander
1 The Reaper, King No More
# Main
1 Hapatra, Vizier of Poisons
1 Blowfly Infestation
1 Nest of Scarabs
1 Necroskitter
1 Yawgmoth, Thran Physician
1 Flourishing Defenses
1 Obelisk Spider
1 Plague Belcher
1 Archfiend of Ifnir
1 Grim Poppet
1 Contagion Clasp
1 Black Sun's Zenith
1 Murderous Redcap
1 Putrid Goblin
1 Cauldron of Souls
1 Viscera Seer
1 Carrion Feeder
1 Ashnod's Altar
1 Phyrexian Altar
1 Goblin Bombardment
1 Yahenni, Undying Partisan
1 Woe Strider
1 Blood Artist
1 Zulaport Cutthroat
1 Vengeful Bloodwitch
1 Poison-Tip Archer
1 Mirkwood Bats
1 Mayhem Devil
1 Syr Konrad, the Grim
1 Bastion of Remembrance
1 Mazirek, Kraul Death Priest
1 The Meathook Massacre
1 Massacre Wurm
1 Massacre Girl, Known Killer
1 Midnight Reaper
1 Grim Haruspex
1 Village Rites
1 Deadly Dispute
1 Greater Good
1 Beast Within
1 Chaos Warp
1 Terminate
1 Bedevil
1 Assassin's Trophy
1 Damnation
1 Toxic Deluge
1 Vandalblast
1 Cultivate
1 Kodama's Reach
1 Farseek
1 Nature's Lore
1 Three Visits
1 Birds of Paradise
1 Sakura-Tribe Elder
1 Persistent Constrictor
1 Overseer of the Damned
1 Skullclamp
1 Rampant Growth
1 Harrow
1 Wood Elves
1 Springbloom Druid
1 Binding the Old Gods
1 Mikaeus, the Unhallowed
1 Command Tower
1 Path of Ancestry
1 Exotic Orchard
1 Blood Crypt
1 Overgrown Tomb
1 Stomping Ground
1 Blackcleave Cliffs
1 Blooming Marsh
1 Copperline Gorge
1 Savage Lands
1 Jungle Hollow
1 Bloodfell Caves
1 Rugged Highlands
1 Ziatora's Proving Ground
1 Bojuka Bog
1 Castle Locthwain
1 Llanowar Wastes
1 Karplusan Forest
1 Yavimaya, Cradle of Growth
8 Swamp
5 Forest
4 Mountain

View file

@ -0,0 +1,20 @@
# no-mikaeus
_generated 2026-09-07 15:56Z by `tools/variant.py`_
- **bracket 3: PASS** (two-card vacuum combos: 0)
- 86 lines in `decklist.txt`
## files
| file | what it is |
| --- | --- |
| `decklist.txt` | the deck, `N Card Name` per line |
| `bracket.txt` | bracket-3 + house-rule check |
| `combos.txt` | combos in the deck, and one card away |
| `sim/` | Forge runs — `.log` raw, `.txt` report, `.json` data |
## simulation runs
- `sim/20260907T153709Z.txt` — our deck : 7/24 (29.2%) [random baseline in a 4-pod = 25%]

View file

@ -0,0 +1,24 @@
COMMANDER: The Reaper, King No More
DECK SIZE: 99 + 1 commander = 100
GAME CHANGERS: 0/3 OK
MASS LAND DENIAL: 0 OK
EXTRA TURNS: 0 OK
TWO-CARD INFINITE COMBOS IN A VACUUM: 0 OK
two-card combos needing board state (ALLOWED, 3):
- Blowfly Infestation + Nest of Scarabs
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Hapatra, Vizier of Poisons
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Flourishing Defenses
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
==========================================================
BRACKET 3: PASS

View file

@ -0,0 +1,90 @@
==================================================================
COMBOS ALREADY IN THE DECK: 11
==================================================================
[E] Blowfly Infestation + Flourishing Defenses
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite death triggers
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Nest of Scarabs
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Hapatra, Vizier of Poisons
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Obelisk Spider
-> Near-infinite lifeloss
-> Near-infinite lifegain triggers
-> Near-infinite creature ETB
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[E] Yawgmoth, Thran Physician + Nest of Scarabs + Blood Artist
-> Near-infinite -1/-1 counters
-> Near-infinite card draw
-> Near-infinite death triggers
requires: Your life total is at least 2.
requires: You control at least one additional creature.
requires: There is at least one other creature on the battlefield.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Blood Artist
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Zulaport Cutthroat
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Woe Strider
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Viscera Seer
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Ashnod's Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colorless mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Phyrexian Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colored mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
==================================================================
ONE CARD AWAY: 354 combos, 81 distinct cards
==================================================================
28 combos Mikaeus, the Unhallowed {3}{B}{B}{B} #1306
12 combos First Day of Class {1}{R} #10147
10 combos Host of the Hereafter {2}{B}{G} #7758
9 combos Rhythm of the Wild {1}{R}{G} #216
9 combos Grumgully, the Generous {1}{R}{G} #4341
8 combos Veinwitch Coven {2}{B} #4179
8 combos Thran Vigil {1}{B} #6285
8 combos Rocksteady, Mutant Marauder {2}{G} #10233
8 combos Support Mission {2}{G} #31928
8 combos Captain Kathryn Janeway {3}{G} #26133
8 combos Surrak and Goreclaw {4}{G}{G} #1600
8 combos Railway Brawler {3}{G}{G} #2493
8 combos Warden of the Grove {2}{G} #2262
8 combos Uncivil Unrest {4}{R} #2947
8 combos Renata, Called to the Hunt {2}{G}{G} #2830
decklist: /home/markdoeswork/mtg/reaper-king-no-more/decks/no-mikaeus/decklist.txt | source: data/variants.json (108,535 combos)

View file

@ -0,0 +1,92 @@
# no-mikaeus
# Baseline. Aristocrats + -1/-1, every combo needs board state.
# Commander
1 The Reaper, King No More
# Main
1 Hapatra, Vizier of Poisons
1 Blowfly Infestation
1 Nest of Scarabs
1 Necroskitter
1 Yawgmoth, Thran Physician
1 Flourishing Defenses
1 Obelisk Spider
1 Plague Belcher
1 Archfiend of Ifnir
1 Grim Poppet
1 Contagion Clasp
1 Black Sun's Zenith
1 Murderous Redcap
1 Putrid Goblin
1 Cauldron of Souls
1 Viscera Seer
1 Carrion Feeder
1 Ashnod's Altar
1 Phyrexian Altar
1 Goblin Bombardment
1 Yahenni, Undying Partisan
1 Woe Strider
1 Blood Artist
1 Zulaport Cutthroat
1 Vengeful Bloodwitch
1 Poison-Tip Archer
1 Mirkwood Bats
1 Mayhem Devil
1 Syr Konrad, the Grim
1 Bastion of Remembrance
1 Mazirek, Kraul Death Priest
1 The Meathook Massacre
1 Massacre Wurm
1 Massacre Girl, Known Killer
1 Humble Defector
1 Midnight Reaper
1 Grim Haruspex
1 Village Rites
1 Deadly Dispute
1 Greater Good
1 Beast Within
1 Chaos Warp
1 Terminate
1 Bedevil
1 Assassin's Trophy
1 Damnation
1 Toxic Deluge
1 Vandalblast
1 Cultivate
1 Kodama's Reach
1 Farseek
1 Nature's Lore
1 Three Visits
1 Birds of Paradise
1 Sakura-Tribe Elder
1 Persistent Constrictor
1 Overseer of the Damned
1 Skullclamp
1 Rampant Growth
1 Harrow
1 Wood Elves
1 Springbloom Druid
1 Binding the Old Gods
1 Command Tower
1 Path of Ancestry
1 Exotic Orchard
1 Blood Crypt
1 Overgrown Tomb
1 Stomping Ground
1 Blackcleave Cliffs
1 Blooming Marsh
1 Copperline Gorge
1 Savage Lands
1 Jungle Hollow
1 Bloodfell Caves
1 Rugged Highlands
1 Ziatora's Proving Ground
1 Bojuka Bog
1 Castle Locthwain
1 Llanowar Wastes
1 Karplusan Forest
1 Yavimaya, Cradle of Growth
8 Swamp
5 Forest
4 Mountain

View file

@ -0,0 +1,583 @@
{
"log": "decks/reaper-king-no-more/decks/no-mikaeus/sim/20260907T153709Z.log",
"games": 24,
"base_win_rate": 0.2916666666666667,
"cards": [
{
"card": "Contagion Clasp",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Overseer of the Damned",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Mayhem Devil",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Beast Within",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Chaos Warp",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Necroskitter",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Cauldron of Souls",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Mirkwood Bats",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Grim Haruspex",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Putrid Goblin",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Bedevil",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Woe Strider",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Assassin's Trophy",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Birds of Paradise",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Massacre Wurm",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Greater Good",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Poison-Tip Archer",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Grim Poppet",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Massacre Girl, Known Killer",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Hapatra, Vizier of Poisons",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Ashnod's Altar",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Wood Elves",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Zulaport Cutthroat",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Farseek",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Yahenni, Undying Partisan",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Damnation",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Village Rites",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Cultivate",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Plague Belcher",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Bastion of Remembrance",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Toxic Deluge",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Springbloom Druid",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Blowfly Infestation",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Archfiend of Ifnir",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Blood Artist",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Yawgmoth, Thran Physician",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Flourishing Defenses",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Vengeful Bloodwitch",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Humble Defector",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "The Meathook Massacre",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Rampant Growth",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Deadly Dispute",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Binding the Old Gods",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Black Sun's Zenith",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Viscera Seer",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Persistent Constrictor",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Goblin Bombardment",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Mazirek, Kraul Death Priest",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Murderous Redcap",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Sakura-Tribe Elder",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Midnight Reaper",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Nature's Lore",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Syr Konrad, the Grim",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Three Visits",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Obelisk Spider",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Harrow",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Skullclamp",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "The Reaper, King No More",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Phyrexian Altar",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Terminate",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Carrion Feeder",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Vandalblast",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Nest of Scarabs",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
},
{
"card": "Kodama's Reach",
"games_cast": 0,
"cast_rate": 0.0,
"avg_turn": null,
"win_rate_when_cast": null,
"delta": null,
"total_casts": 0
}
]
}

View file

@ -0,0 +1,510 @@
{
"meta": {
"generated": "20260907T155608Z",
"engine": "Forge 2.0.14",
"format": "Commander, 4 players",
"games_requested": "24",
"games_completed": 24,
"seed": "20260907",
"decklist_file": "decks/no-mikaeus/decklist.txt",
"log_file": "decks/no-mikaeus/sim/20260907T153709Z.log",
"caveat": "Forge AI is weak at combo decks; treat win rate as a floor"
},
"win_counts": {
"Reaper King No More": 7,
"Faceless Menace [C19] [2019]": 4,
"Merciless Rage [C19] [2019]": 8,
"Arcane Maelstrom [C20] [2020]": 5
},
"our_win_rate": 0.2916666666666667,
"games": [
{
"turns": 27,
"winner": "Faceless Menace [C19] [2019]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 1,
"ms": 79475
},
{
"turns": 24,
"winner": "Arcane Maelstrom [C20] [2020]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 2,
"ms": 20544
},
{
"turns": 23,
"winner": "Reaper King No More",
"losers": [
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 3,
"ms": 59015
},
{
"turns": 31,
"winner": "Merciless Rage [C19] [2019]",
"losers": [
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 4,
"ms": 120000
},
{
"turns": 35,
"winner": "Merciless Rage [C19] [2019]",
"losers": [
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 5,
"ms": 47560
},
{
"turns": 28,
"winner": "Merciless Rage [C19] [2019]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 6,
"ms": 29406
},
{
"turns": 34,
"winner": "Faceless Menace [C19] [2019]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 7,
"ms": 54239
},
{
"turns": 23,
"winner": "Merciless Rage [C19] [2019]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 8,
"ms": 19414
},
{
"turns": 26,
"winner": "Faceless Menace [C19] [2019]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 9,
"ms": 41602
},
{
"turns": 23,
"winner": "Faceless Menace [C19] [2019]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 10,
"ms": 77465
},
{
"turns": 27,
"winner": "Merciless Rage [C19] [2019]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 11,
"ms": 26776
},
{
"turns": 23,
"winner": "Arcane Maelstrom [C20] [2020]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 12,
"ms": 16887
},
{
"turns": 27,
"winner": "Arcane Maelstrom [C20] [2020]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 13,
"ms": 36025
},
{
"turns": 33,
"winner": "Merciless Rage [C19] [2019]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 14,
"ms": 50074
},
{
"turns": 21,
"winner": "Reaper King No More",
"losers": [
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 15,
"ms": 25103
},
{
"turns": 28,
"winner": "Reaper King No More",
"losers": [
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 16,
"ms": 61150
},
{
"turns": 35,
"winner": "Arcane Maelstrom [C20] [2020]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 17,
"ms": 48858
},
{
"turns": 24,
"winner": "Merciless Rage [C19] [2019]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 18,
"ms": 25471
},
{
"turns": 27,
"winner": "Arcane Maelstrom [C20] [2020]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 19,
"ms": 32030
},
{
"turns": 24,
"winner": "Reaper King No More",
"losers": [
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 20,
"ms": 24173
},
{
"turns": 30,
"winner": "Reaper King No More",
"losers": [
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 21,
"ms": 73454
},
{
"turns": 36,
"winner": "Reaper King No More",
"losers": [
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 22,
"ms": 53834
},
{
"turns": 30,
"winner": "Merciless Rage [C19] [2019]",
"losers": [
{
"player": "Reaper King No More",
"reason": "life total reached 0"
},
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 23,
"ms": 71382
},
{
"turns": 21,
"winner": "Reaper King No More",
"losers": [
{
"player": "Faceless Menace [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Merciless Rage [C19] [2019]",
"reason": "life total reached 0"
},
{
"player": "Arcane Maelstrom [C20] [2020]",
"reason": "life total reached 0"
}
],
"win_reason": "all opponents have lost",
"game": 24,
"ms": 28748
}
]
}

View file

@ -0,0 +1,609 @@
Error handling registered!
11:37:10 [INFO ] GuiBase: ##########################################
11:37:10 [INFO ] GuiBase: APP: Forge v.2.0.14-SNAPSHOT-08.08
11:37:10 [INFO ] GuiBase: Java: 26.0.2.1 (Arch Linux)
11:37:10 [INFO ] GuiBase: OS: Linux 7.1.9-arch1-2 amd64
11:37:10 [INFO ] GuiBase: RAM: 4096 MB max, 20 CPUs
11:37:10 [INFO ] GuiBase: ##########################################
Language 'en-US' loaded successfully.
(ThreadUtil first call): Running with priority 5
Read cards: 33617 archived files in 0 ms (25 parts) using thread pool
Read cards: 836 files in 0 ms (8 parts) using thread pool
Simulation mode
Ai(1)-Reaper King No More vs Ai(2)-Faceless Menace [C19] [2019] vs Ai(3)-Merciless Rage [C19] [2019] vs Ai(4)-Arcane Maelstrom [C20] [2020] - twenty four games of Commander seed 20260907
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Comet Storm (307) - [Couldn't add to stack, failed to target] - Choose any target, then choose another target for each time this spell was kicked. CARDNAME deals X damage to each of them.[[Overseer of the Damned (50)]]
Correcting zone for Grismold, the Dreadsower (142)
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Correcting zone for Grismold, the Dreadsower (142)
Game Outcome: Turn 27
Game Outcome: Ai(1)-Reaper King No More has lost because life total reached 0
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has won because all opponents have lost
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 0 Ai(2)-Faceless Menace [C19] [2019]: 1 Ai(3)-Merciless Rage [C19] [2019]: 0 Ai(4)-Arcane Maelstrom [C20] [2020]: 0
Game Result: Game 1 ended in 79475 ms. Ai(2)-Faceless Menace [C19] [2019] has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of chooseSinglePlayer is used by Boneyard Parley for forge.ai.ability.TwoPilesAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Correcting zone for Carrion Feeder (22)
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of chooseSinglePlayer is used by Jace, Architect of Thought for forge.ai.ability.TwoPilesAi. Consider declaring an overloaded method
Game Outcome: Turn 24
Game Outcome: Ai(1)-Reaper King No More has lost because life total reached 0
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has won because all opponents have lost
Match Result: Ai(1)-Reaper King No More: 0 Ai(2)-Faceless Menace [C19] [2019]: 1 Ai(3)-Merciless Rage [C19] [2019]: 0 Ai(4)-Arcane Maelstrom [C20] [2020]: 1
Game Result: Game 2 ended in 20544 ms. Ai(4)-Arcane Maelstrom [C20] [2020] has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Moving spell to Library
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Game Outcome: Turn 23
Game Outcome: Ai(1)-Reaper King No More has won because all opponents have lost
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 1 Ai(2)-Faceless Menace [C19] [2019]: 1 Ai(3)-Merciless Rage [C19] [2019]: 0 Ai(4)-Arcane Maelstrom [C20] [2020]: 1
Game Result: Game 3 ended in 59015 ms. Ai(1)-Reaper King No More has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
java.util.concurrent.TimeoutException
at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:206)
at forge.ai.AiController.chooseSpellAbilityToPlayFromList(AiController.java:1696)
at forge.ai.AiController.getSpellAbilityToPlay(AiController.java:1583)
at forge.ai.AiController.chooseSpellAbilityToPlay(AiController.java:1403)
at forge.ai.PlayerControllerAi.chooseSpellAbilityToPlay(PlayerControllerAi.java:832)
at forge.game.phase.PhaseHandler.mainLoopStep(PhaseHandler.java:1056)
at forge.game.phase.PhaseHandler.mainGameLoop(PhaseHandler.java:1035)
at forge.game.phase.PhaseHandler.startFirstTurn(PhaseHandler.java:1029)
at forge.game.GameAction.startGame(GameAction.java:2373)
at forge.game.Match.startGame(Match.java:92)
at forge.game.Match.startGame(Match.java:77)
at forge.view.SimulateMatch.lambda$simulateSingleMatch$0(SimulateMatch.java:213)
at forge.view.TimeLimitedCodeBlock.lambda$runWithTimeout$0(TimeLimitedCodeBlock.java:18)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:330)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
at java.base/java.lang.Thread.run(Thread.java:1516)
AI eval thread at timeout:
at com.google.common.collect.AbstractMapBasedMultimap$Itr.hasNext(AbstractMapBasedMultimap.java:1174)
at forge.game.keyword.KeywordCollection.applyStaticAbility(KeywordCollection.java:207)
at forge.game.card.Card.updateStaticAbilities(Card.java:7014)
at forge.game.card.CardState.getStaticAbilities(CardState.java:712)
at forge.game.card.Card.getStaticAbilities(Card.java:6993)
at forge.ai.ComputerUtilCombat.predictPowerBonusOfBlocker(ComputerUtilCombat.java:891)
at forge.ai.ComputerUtilCombat.canDestroyAttacker(ComputerUtilCombat.java:1687)
at forge.ai.AiBlockController.getKillingBlockers(AiBlockController.java:120)
at forge.ai.AiBlockController.makeTradeBlocks(AiBlockController.java:618)
at forge.ai.AiBlockController.assignBlockers(AiBlockController.java:1089)
at forge.ai.AiBlockController.assignBlockersForCombat(AiBlockController.java:1014)
at forge.ai.ComputerUtil.predictNextCombatsRemainingLife(ComputerUtil.java:3214)
at forge.ai.ComputerUtil.predictNextCombatsRemainingLife(ComputerUtil.java:3179)
at forge.ai.AiAttackController.notNeededAsBlockers(AiAttackController.java:426)
at forge.ai.AiAttackController.declareAttackers(AiAttackController.java:1279)
at forge.ai.ComputerUtilCard.doesSpecifiedCreatureAttackAI(ComputerUtilCard.java:820)
at forge.ai.ComputerUtilCard.shouldPumpCard(ComputerUtilCard.java:1557)
at forge.ai.ComputerUtilCard.shouldPumpCard(ComputerUtilCard.java:1446)
at forge.ai.ability.PumpAllAi.lambda$checkApiLogic$2(PumpAllAi.java:132)
at java.base/java.util.stream.MatchOps$1MatchSink.accept(MatchOps.java:90)
at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1701)
at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:147)
at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:588)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:574)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:560)
at java.base/java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230)
at java.base/java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:265)
at java.base/java.util.stream.ReferencePipeline.anyMatch(ReferencePipeline.java:668)
at forge.util.collect.FCollection.anyMatch(FCollection.java:622)
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Active player is no longer in the game...
Stopping slow match as draw
Game Outcome: Turn 31
Game Outcome: Ai(1)-Reaper King No More has won because all opponents have lost
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has won because all opponents have lost
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has won because all opponents have lost
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 1 Ai(2)-Faceless Menace [C19] [2019]: 1 Ai(3)-Merciless Rage [C19] [2019]: 1 Ai(4)-Arcane Maelstrom [C20] [2020]: 1
Game Result: Game 4 ended in 120000 ms. Ai(3)-Merciless Rage [C19] [2019] has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Correcting zone for Humble Defector (18)
Correcting zone for Humble Defector (18)
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Moving spell to Library
AI Attack declaration invalid, defaulting to: {Kalamax, the Stormsire (403)=Ai(1)-Reaper King No More}
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Correcting zone for Kalamax, the Stormsire (403)
Correcting zone for Kalamax, the Stormsire (403)
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Game Outcome: Turn 35
Game Outcome: Ai(1)-Reaper King No More has lost due to accumulation of 21 damage from generals
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has won because all opponents have lost
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 1 Ai(2)-Faceless Menace [C19] [2019]: 1 Ai(3)-Merciless Rage [C19] [2019]: 2 Ai(4)-Arcane Maelstrom [C20] [2020]: 1
Game Result: Game 5 ended in 47560 ms. Ai(3)-Merciless Rage [C19] [2019] has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Moving spell to Library
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of chooseSinglePlayer is used by Boneyard Parley for forge.ai.ability.TwoPilesAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Game Outcome: Turn 28
Game Outcome: Ai(1)-Reaper King No More has lost because life total reached 0
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has won because all opponents have lost
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 1 Ai(2)-Faceless Menace [C19] [2019]: 1 Ai(3)-Merciless Rage [C19] [2019]: 3 Ai(4)-Arcane Maelstrom [C20] [2020]: 1
Game Result: Game 6 ended in 29406 ms. Ai(3)-Merciless Rage [C19] [2019] has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Game Outcome: Turn 34
Game Outcome: Ai(1)-Reaper King No More has lost because life total reached 0
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has won because all opponents have lost
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 1 Ai(2)-Faceless Menace [C19] [2019]: 2 Ai(3)-Merciless Rage [C19] [2019]: 3 Ai(4)-Arcane Maelstrom [C20] [2020]: 1
Game Result: Game 7 ended in 54239 ms. Ai(2)-Faceless Menace [C19] [2019] has won!
Correcting zone for The Reaper, King No More (100)
Correcting zone for The Reaper, King No More (100)
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
No AI assigned for API: null
java.util.concurrent.ExecutionException: java.lang.NullPointerException: Cannot invoke "Object.getClass()" because "key" is null
at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:124)
at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:207)
at forge.ai.AiController.chooseSpellAbilityToPlayFromList(AiController.java:1696)
at forge.ai.AiController.getSpellAbilityToPlay(AiController.java:1583)
at forge.ai.AiController.chooseSpellAbilityToPlay(AiController.java:1403)
at forge.ai.PlayerControllerAi.chooseSpellAbilityToPlay(PlayerControllerAi.java:832)
at forge.game.phase.PhaseHandler.mainLoopStep(PhaseHandler.java:1056)
at forge.game.phase.PhaseHandler.mainGameLoop(PhaseHandler.java:1035)
at forge.game.phase.PhaseHandler.startFirstTurn(PhaseHandler.java:1029)
at forge.game.GameAction.startGame(GameAction.java:2373)
at forge.game.Match.startGame(Match.java:92)
at forge.game.Match.startGame(Match.java:77)
at forge.view.SimulateMatch.lambda$simulateSingleMatch$0(SimulateMatch.java:213)
at forge.view.TimeLimitedCodeBlock.lambda$runWithTimeout$0(TimeLimitedCodeBlock.java:18)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:330)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
at java.base/java.lang.Thread.run(Thread.java:1516)
Caused by: java.lang.NullPointerException: Cannot invoke "Object.getClass()" because "key" is null
at java.base/java.util.EnumMap.typeCheck(EnumMap.java:740)
at java.base/java.util.EnumMap.put(EnumMap.java:268)
at java.base/java.util.EnumMap.put(EnumMap.java:81)
at forge.ai.SpellApiToAi.get(SpellApiToAi.java:235)
at forge.ai.ability.CopySpellAbilityAi.checkApiLogic(CopySpellAbilityAi.java:76)
at forge.ai.SpellAbilityAi.canPlayWithoutRestrict(SpellAbilityAi.java:98)
at forge.ai.SpellAbilityAi.canPlay(SpellAbilityAi.java:76)
at forge.ai.SpellAbilityAi.canPlayWithSubs(SpellAbilityAi.java:55)
at forge.ai.AiController.canPlaySa(AiController.java:909)
at forge.ai.AiController.canPlayAndPayForFace(AiController.java:855)
at forge.ai.AiController.canPlayAndPayFor(AiController.java:833)
at forge.ai.AiController.lambda$chooseSpellAbilityToPlayFromList$9(AiController.java:1675)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:330)
... 1 more
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Game Outcome: Turn 23
Game Outcome: Ai(1)-Reaper King No More has lost because life total reached 0
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has won because all opponents have lost
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 1 Ai(2)-Faceless Menace [C19] [2019]: 2 Ai(3)-Merciless Rage [C19] [2019]: 4 Ai(4)-Arcane Maelstrom [C20] [2020]: 1
Game Result: Game 8 ended in 19414 ms. Ai(3)-Merciless Rage [C19] [2019] has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of chooseSinglePlayer is used by Jace, Architect of Thought for forge.ai.ability.TwoPilesAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
No AI assigned for API: null
java.util.concurrent.ExecutionException: java.lang.NullPointerException
at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:124)
at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:207)
at forge.ai.AiController.chooseSpellAbilityToPlayFromList(AiController.java:1696)
at forge.ai.AiController.getSpellAbilityToPlay(AiController.java:1583)
at forge.ai.AiController.chooseSpellAbilityToPlay(AiController.java:1403)
at forge.ai.PlayerControllerAi.chooseSpellAbilityToPlay(PlayerControllerAi.java:832)
at forge.game.phase.PhaseHandler.mainLoopStep(PhaseHandler.java:1056)
at forge.game.phase.PhaseHandler.mainGameLoop(PhaseHandler.java:1035)
at forge.game.phase.PhaseHandler.startFirstTurn(PhaseHandler.java:1029)
at forge.game.GameAction.startGame(GameAction.java:2373)
at forge.game.Match.startGame(Match.java:92)
at forge.game.Match.startGame(Match.java:77)
at forge.view.SimulateMatch.lambda$simulateSingleMatch$0(SimulateMatch.java:213)
at forge.view.TimeLimitedCodeBlock.lambda$runWithTimeout$0(TimeLimitedCodeBlock.java:18)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:330)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
at java.base/java.lang.Thread.run(Thread.java:1516)
Caused by: java.lang.NullPointerException
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
No AI assigned for API: null
java.util.concurrent.ExecutionException: java.lang.NullPointerException
at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:124)
at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:207)
at forge.ai.AiController.chooseSpellAbilityToPlayFromList(AiController.java:1696)
at forge.ai.AiController.getSpellAbilityToPlay(AiController.java:1583)
at forge.ai.AiController.chooseSpellAbilityToPlay(AiController.java:1403)
at forge.ai.PlayerControllerAi.chooseSpellAbilityToPlay(PlayerControllerAi.java:832)
at forge.game.phase.PhaseHandler.mainLoopStep(PhaseHandler.java:1056)
at forge.game.phase.PhaseHandler.mainGameLoop(PhaseHandler.java:1035)
at forge.game.phase.PhaseHandler.startFirstTurn(PhaseHandler.java:1029)
at forge.game.GameAction.startGame(GameAction.java:2373)
at forge.game.Match.startGame(Match.java:92)
at forge.game.Match.startGame(Match.java:77)
at forge.view.SimulateMatch.lambda$simulateSingleMatch$0(SimulateMatch.java:213)
at forge.view.TimeLimitedCodeBlock.lambda$runWithTimeout$0(TimeLimitedCodeBlock.java:18)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:330)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
at java.base/java.lang.Thread.run(Thread.java:1516)
Caused by: java.lang.NullPointerException
No AI assigned for API: null
java.util.concurrent.ExecutionException: java.lang.NullPointerException
at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:124)
at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:207)
at forge.ai.AiController.chooseSpellAbilityToPlayFromList(AiController.java:1696)
at forge.ai.AiController.getSpellAbilityToPlay(AiController.java:1583)
at forge.ai.AiController.chooseSpellAbilityToPlay(AiController.java:1403)
at forge.ai.PlayerControllerAi.chooseSpellAbilityToPlay(PlayerControllerAi.java:832)
at forge.game.phase.PhaseHandler.mainLoopStep(PhaseHandler.java:1056)
at forge.game.phase.PhaseHandler.mainGameLoop(PhaseHandler.java:1035)
at forge.game.phase.PhaseHandler.startFirstTurn(PhaseHandler.java:1029)
at forge.game.GameAction.startGame(GameAction.java:2373)
at forge.game.Match.startGame(Match.java:92)
at forge.game.Match.startGame(Match.java:77)
at forge.view.SimulateMatch.lambda$simulateSingleMatch$0(SimulateMatch.java:213)
at forge.view.TimeLimitedCodeBlock.lambda$runWithTimeout$0(TimeLimitedCodeBlock.java:18)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:330)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
at java.base/java.lang.Thread.run(Thread.java:1516)
Caused by: java.lang.NullPointerException
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Correcting zone for Pendant of Prosperity (133)
Game Outcome: Turn 26
Game Outcome: Ai(1)-Reaper King No More has lost because life total reached 0
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has won because all opponents have lost
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 1 Ai(2)-Faceless Menace [C19] [2019]: 3 Ai(3)-Merciless Rage [C19] [2019]: 4 Ai(4)-Arcane Maelstrom [C20] [2020]: 1
Game Result: Game 9 ended in 41602 ms. Ai(2)-Faceless Menace [C19] [2019] has won!
Game Outcome: Turn 23
Game Outcome: Ai(1)-Reaper King No More has lost because life total reached 0
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has won because all opponents have lost
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 1 Ai(2)-Faceless Menace [C19] [2019]: 4 Ai(3)-Merciless Rage [C19] [2019]: 4 Ai(4)-Arcane Maelstrom [C20] [2020]: 1
Game Result: Game 10 ended in 77465 ms. Ai(2)-Faceless Menace [C19] [2019] has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of chooseSinglePlayer is used by Boneyard Parley for forge.ai.ability.TwoPilesAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Moving spell to Library
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of chooseSinglePlayer is used by Boneyard Parley for forge.ai.ability.TwoPilesAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Game Outcome: Turn 27
Game Outcome: Ai(1)-Reaper King No More has lost because life total reached 0
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has won because all opponents have lost
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 1 Ai(2)-Faceless Menace [C19] [2019]: 4 Ai(3)-Merciless Rage [C19] [2019]: 5 Ai(4)-Arcane Maelstrom [C20] [2020]: 1
Game Result: Game 11 ended in 26776 ms. Ai(3)-Merciless Rage [C19] [2019] has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Correcting zone for Kalamax, the Stormsire (403)
Correcting zone for Kalamax, the Stormsire (403)
Warning: default (ie. inherited from base class) implementation of chooseSinglePlayer is used by Jace, Architect of Thought for forge.ai.ability.TwoPilesAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Game Outcome: Turn 23
Game Outcome: Ai(1)-Reaper King No More has lost because life total reached 0
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has won because all opponents have lost
Match Result: Ai(1)-Reaper King No More: 1 Ai(2)-Faceless Menace [C19] [2019]: 4 Ai(3)-Merciless Rage [C19] [2019]: 5 Ai(4)-Arcane Maelstrom [C20] [2020]: 2
Game Result: Game 12 ended in 16887 ms. Ai(4)-Arcane Maelstrom [C20] [2020] has won!
Correcting zone for Humble Defector (18)
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Correcting zone for Solemn Simulacrum (322)
No AI assigned for API: null
java.util.concurrent.ExecutionException: java.lang.NullPointerException
at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:124)
at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:207)
at forge.ai.AiController.chooseSpellAbilityToPlayFromList(AiController.java:1696)
at forge.ai.AiController.getSpellAbilityToPlay(AiController.java:1583)
at forge.ai.AiController.chooseSpellAbilityToPlay(AiController.java:1403)
at forge.ai.PlayerControllerAi.chooseSpellAbilityToPlay(PlayerControllerAi.java:832)
at forge.game.phase.PhaseHandler.mainLoopStep(PhaseHandler.java:1056)
at forge.game.phase.PhaseHandler.mainGameLoop(PhaseHandler.java:1035)
at forge.game.phase.PhaseHandler.startFirstTurn(PhaseHandler.java:1029)
at forge.game.GameAction.startGame(GameAction.java:2373)
at forge.game.Match.startGame(Match.java:92)
at forge.game.Match.startGame(Match.java:77)
at forge.view.SimulateMatch.lambda$simulateSingleMatch$0(SimulateMatch.java:213)
at forge.view.TimeLimitedCodeBlock.lambda$runWithTimeout$0(TimeLimitedCodeBlock.java:18)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:330)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1090)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:614)
at java.base/java.lang.Thread.run(Thread.java:1516)
Caused by: java.lang.NullPointerException
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Game Outcome: Turn 27
Game Outcome: Ai(1)-Reaper King No More has lost because life total reached 0
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has won because all opponents have lost
Match Result: Ai(1)-Reaper King No More: 1 Ai(2)-Faceless Menace [C19] [2019]: 4 Ai(3)-Merciless Rage [C19] [2019]: 5 Ai(4)-Arcane Maelstrom [C20] [2020]: 3
Game Result: Game 13 ended in 36025 ms. Ai(4)-Arcane Maelstrom [C20] [2020] has won!
Moving spell to Library
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Correcting zone for Humble Defector (18)
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Game Outcome: Turn 33
Game Outcome: Ai(1)-Reaper King No More has lost because life total reached 0
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has won because all opponents have lost
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 1 Ai(2)-Faceless Menace [C19] [2019]: 4 Ai(3)-Merciless Rage [C19] [2019]: 6 Ai(4)-Arcane Maelstrom [C20] [2020]: 3
Game Result: Game 14 ended in 50074 ms. Ai(3)-Merciless Rage [C19] [2019] has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Game Outcome: Turn 21
Game Outcome: Ai(1)-Reaper King No More has won because all opponents have lost
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 2 Ai(2)-Faceless Menace [C19] [2019]: 4 Ai(3)-Merciless Rage [C19] [2019]: 6 Ai(4)-Arcane Maelstrom [C20] [2020]: 3
Game Result: Game 15 ended in 25103 ms. Ai(1)-Reaper King No More has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Correcting zone for Skullclamp (3)
Correcting zone for Ash Barrens (144)
Correcting zone for Humble Defector (18)
Correcting zone for Humble Defector (18)
Game Outcome: Turn 28
Game Outcome: Ai(1)-Reaper King No More has won because all opponents have lost
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 3 Ai(2)-Faceless Menace [C19] [2019]: 4 Ai(3)-Merciless Rage [C19] [2019]: 6 Ai(4)-Arcane Maelstrom [C20] [2020]: 3
Game Result: Game 16 ended in 61150 ms. Ai(1)-Reaper King No More has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Correcting zone for Deathmist Raptor (158)
Correcting zone for Deathmist Raptor (158)
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Game Outcome: Turn 35
Game Outcome: Ai(1)-Reaper King No More has lost because life total reached 0
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has won because all opponents have lost
Match Result: Ai(1)-Reaper King No More: 3 Ai(2)-Faceless Menace [C19] [2019]: 4 Ai(3)-Merciless Rage [C19] [2019]: 6 Ai(4)-Arcane Maelstrom [C20] [2020]: 4
Game Result: Game 17 ended in 48858 ms. Ai(4)-Arcane Maelstrom [C20] [2020] has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Game Outcome: Turn 24
Game Outcome: Ai(1)-Reaper King No More has lost because life total reached 0
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has won because all opponents have lost
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 3 Ai(2)-Faceless Menace [C19] [2019]: 4 Ai(3)-Merciless Rage [C19] [2019]: 7 Ai(4)-Arcane Maelstrom [C20] [2020]: 4
Game Result: Game 18 ended in 25471 ms. Ai(3)-Merciless Rage [C19] [2019] has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of chooseSinglePlayer is used by Boneyard Parley for forge.ai.ability.TwoPilesAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Correcting zone for Sagu Mauler (164)
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Game Outcome: Turn 27
Game Outcome: Ai(1)-Reaper King No More has lost because life total reached 0
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost due to accumulation of 21 damage from generals
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has won because all opponents have lost
Match Result: Ai(1)-Reaper King No More: 3 Ai(2)-Faceless Menace [C19] [2019]: 4 Ai(3)-Merciless Rage [C19] [2019]: 7 Ai(4)-Arcane Maelstrom [C20] [2020]: 5
Game Result: Game 19 ended in 32030 ms. Ai(4)-Arcane Maelstrom [C20] [2020] has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Correcting zone for Humble Defector (18)
Correcting zone for Humble Defector (18)
Game Outcome: Turn 24
Game Outcome: Ai(1)-Reaper King No More has won because all opponents have lost
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 4 Ai(2)-Faceless Menace [C19] [2019]: 4 Ai(3)-Merciless Rage [C19] [2019]: 7 Ai(4)-Arcane Maelstrom [C20] [2020]: 5
Game Result: Game 20 ended in 24173 ms. Ai(1)-Reaper King No More has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Correcting zone for Humble Defector (18)
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Correcting zone for Humble Defector (18)
Correcting zone for Humble Defector (18)
Correcting zone for Humble Defector (18)
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Comet Storm (307) - [Couldn't add to stack, failed to target] - Choose any target, then choose another target for each time this spell was kicked. CARDNAME deals X damage to each of them.[[Thousand Winds (172)]]
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of chooseSinglePlayer is used by Jace, Architect of Thought for forge.ai.ability.TwoPilesAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Correcting zone for Pendant of Prosperity (133)
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Game Outcome: Turn 30
Game Outcome: Ai(1)-Reaper King No More has won because all opponents have lost
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 5 Ai(2)-Faceless Menace [C19] [2019]: 4 Ai(3)-Merciless Rage [C19] [2019]: 7 Ai(4)-Arcane Maelstrom [C20] [2020]: 5
Game Result: Game 21 ended in 73454 ms. Ai(1)-Reaper King No More has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Game Outcome: Turn 36
Game Outcome: Ai(1)-Reaper King No More has won because all opponents have lost
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 6 Ai(2)-Faceless Menace [C19] [2019]: 4 Ai(3)-Merciless Rage [C19] [2019]: 7 Ai(4)-Arcane Maelstrom [C20] [2020]: 5
Game Result: Game 22 ended in 53834 ms. Ai(1)-Reaper King No More has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of chooseSinglePlayer is used by Jace, Architect of Thought for forge.ai.ability.TwoPilesAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Game Outcome: Turn 30
Game Outcome: Ai(1)-Reaper King No More has lost because life total reached 0
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has won because all opponents have lost
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 6 Ai(2)-Faceless Menace [C19] [2019]: 4 Ai(3)-Merciless Rage [C19] [2019]: 8 Ai(4)-Arcane Maelstrom [C20] [2020]: 5
Game Result: Game 23 ended in 71382 ms. Ai(3)-Merciless Rage [C19] [2019] has won!
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kadena, Slinking Sorcerer for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Kalamax, the Stormsire for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Warning: default (ie. inherited from base class) implementation of confirmAction is used by Anje Falkenrath for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Correcting zone for Kadena, Slinking Sorcerer (201)
Correcting zone for Grave Scrabbler (297)
Correcting zone for Face-down card (H7)
Correcting zone for Face-down card (H8)
Warning: default (ie. inherited from base class) implementation of confirmAction is used by The Reaper, King No More for forge.ai.ability.PermanentCreatureAi. Consider declaring an overloaded method
Game Outcome: Turn 21
Game Outcome: Ai(1)-Reaper King No More has won because all opponents have lost
Game Outcome: Ai(2)-Faceless Menace [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(3)-Merciless Rage [C19] [2019] has lost because life total reached 0
Game Outcome: Ai(4)-Arcane Maelstrom [C20] [2020] has lost because life total reached 0
Match Result: Ai(1)-Reaper King No More: 7 Ai(2)-Faceless Menace [C19] [2019]: 4 Ai(3)-Merciless Rage [C19] [2019]: 8 Ai(4)-Arcane Maelstrom [C20] [2020]: 5
Game Result: Game 24 ended in 28748 ms. Ai(1)-Reaper King No More has won!

View file

@ -0,0 +1,47 @@
====================================================================
FORGE SIMULATION REPORT — 4-player Commander pod
====================================================================
games completed : 24 (requested 24) seed: 20260907
decklist : decks/no-mikaeus/decklist.txt (full 100 cards)
engine : Forge 2.0.14, full rules, AI vs AI
WIN RATE
--------------------------------------------------------------------
our deck : 7/24 (29.2%) [random baseline in a 4-pod = 25%]
all players:
Merciless Rage [C19] [2019] 8 (33.3%) ##########
Reaper King No More 7 (29.2%) ######## <-- ours
Arcane Maelstrom [C20] [2020] 5 (20.8%) ######
Faceless Menace [C19] [2019] 4 (16.7%) #####
GAME LENGTH
--------------------------------------------------------------------
turns median 27 min 21 max 36
seconds median 45 total 18.7 min
HOW OUR DECK LOST
--------------------------------------------------------------------
15x life total reached 0
WHO BEAT US (winner, in games our deck lost)
--------------------------------------------------------------------
6x Merciless Rage [C19] [2019]
5x Arcane Maelstrom [C20] [2020]
4x Faceless Menace [C19] [2019]
CAVEAT — READ THIS BEFORE TRUSTING THE WIN RATE
--------------------------------------------------------------------
Forge's AI is heuristic and, by its own documentation, WEAK AT COMBO
decks. Ours is a combo/aristocrats deck, so the AI systematically
under-plays it: it will miss sac-loop lines a human would see.
Read this as a FLOOR on the deck's power, and as proof the deck
functions and its cards interact — not as a power rating.
Opponents are stock precons, which are roughly bracket 2.
====================================================================
decklist : decks/no-mikaeus/decklist.txt
full log : decks/no-mikaeus/sim/20260907T153709Z.log (every game, all Forge output)
raw data : decks/no-mikaeus/sim/20260907T153709Z.json
this report: decks/no-mikaeus/sim/20260907T153709Z.txt
====================================================================

View file

@ -0,0 +1,21 @@
# opponent-facing
_generated 2026-09-07 23:37Z by `tools/variant.py`_
- **bracket 3: PASS** (two-card vacuum combos: 0)
- 86 lines in `decklist.txt`
## files
| file | what it is |
| --- | --- |
| `decklist.txt` | the deck, `N Card Name` per line |
| `bracket.txt` | bracket-3 + house-rule check |
| `combos.txt` | combos in the deck, and one card away |
| `sim/` | Forge runs — `.log` raw, `.txt` report, `.json` data |
| `card_stats.txt` | per-card cast rate, avg round, win% (newest sim) |
## simulation runs
_none yet — run with `--sim 24`_

View file

@ -0,0 +1,24 @@
COMMANDER: The Reaper, King No More
DECK SIZE: 99 + 1 commander = 100
GAME CHANGERS: 0/3 OK
MASS LAND DENIAL: 0 OK
EXTRA TURNS: 0 OK
TWO-CARD INFINITE COMBOS IN A VACUUM: 0 OK
two-card combos needing board state (ALLOWED, 3):
- Blowfly Infestation + Flourishing Defenses
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Nest of Scarabs
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Hapatra, Vizier of Poisons
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
==========================================================
BRACKET 3: PASS

View file

@ -0,0 +1,78 @@
==================================================================
COMBOS ALREADY IN THE DECK: 9
==================================================================
[E] Blowfly Infestation + Flourishing Defenses
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite death triggers
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Nest of Scarabs
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Hapatra, Vizier of Poisons
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Yawgmoth, Thran Physician + Nest of Scarabs + Blood Artist
-> Near-infinite -1/-1 counters
-> Near-infinite card draw
-> Near-infinite death triggers
requires: Your life total is at least 2.
requires: You control at least one additional creature.
requires: There is at least one other creature on the battlefield.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Blood Artist
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Zulaport Cutthroat
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Viscera Seer
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Ashnod's Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colorless mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Phyrexian Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colored mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
==================================================================
ONE CARD AWAY: 287 combos, 88 distinct cards
==================================================================
15 combos Mikaeus, the Unhallowed {3}{B}{B}{B} #1306
10 combos First Day of Class {1}{R} #10147
8 combos Veinwitch Coven {2}{B} #4179
8 combos Host of the Hereafter {2}{B}{G} #7758
7 combos Rhythm of the Wild {1}{R}{G} #216
7 combos Grumgully, the Generous {1}{R}{G} #4341
7 combos Scurry Oak {2}{G} #2259
6 combos Thran Vigil {1}{B} #6285
6 combos Rocksteady, Mutant Marauder {2}{G} #10233
6 combos Support Mission {2}{G} #31928
6 combos Captain Kathryn Janeway {3}{G} #26133
6 combos Surrak and Goreclaw {4}{G}{G} #1600
6 combos Warden of the Grove {2}{G} #2262
6 combos Railway Brawler {3}{G}{G} #2493
6 combos Uncivil Unrest {4}{R} #2947
decklist: /home/markdoeswork/mtg/reaper-king-no-more/decks/opponent-facing/decklist.txt | source: data/variants.json (108,535 combos)

View file

@ -0,0 +1,95 @@
# opponent-facing
# The commander only steals from OPPONENTS' creatures. Maximise cards that trigger on their deaths and put counters on their board.
# generated by tools/generate.py from decks/no-mikaeus
# roles: {'opp_death': 5, 'removal_spot': 2, 'sac_outlet': -3, 'ramp': -2, 'minus_engine': -2}
# Commander
1 The Reaper, King No More
# Main
1 Archfiend of Ifnir
1 Ashnod's Altar
1 Assassin's Trophy
1 Bastion of Remembrance
1 Beast Within
1 Bedevil
1 Birds of Paradise
1 Black Sun's Zenith
1 Blackcleave Cliffs
1 Blood Artist
1 Blood Crypt
1 Bloodchief Ascension
1 Bloodfell Caves
1 Blooming Marsh
1 Blowfly Infestation
1 Bojuka Bog
1 Carrion Feeder
1 Castle Locthwain
1 Cauldron of Souls
1 Chaos Warp
1 Command Tower
1 Contagion Clasp
1 Copperline Gorge
1 Cultivate
1 Damnation
1 Deadly Dispute
1 Deadly Rollick
1 Exotic Orchard
1 Farseek
1 Feed the Swarm
1 Flourishing Defenses
1 Goblin Bombardment
1 Grim Haruspex
1 Hapatra, Vizier of Poisons
1 Humble Defector
1 Jungle Hollow
1 Karplusan Forest
1 Kodama's Reach
1 Llanowar Wastes
1 Mari, the Killing Quill
1 Massacre Girl, Known Killer
1 Massacre Wurm
1 Mayhem Devil
1 Mazirek, Kraul Death Priest
1 Midnight Reaper
1 Mirkwood Bats
1 Murderous Redcap
1 Nature's Lore
1 Necroskitter
1 Nest of Scarabs
1 Overgrown Tomb
1 Overseer of the Damned
1 Path of Ancestry
1 Persistent Constrictor
1 Phyrexian Altar
1 Plague Belcher
1 Poison-Tip Archer
1 Putrid Goblin
1 Rampant Growth
1 Revel in Riches
1 Rugged Highlands
1 Sakura-Tribe Elder
1 Sangromancer
1 Savage Lands
1 Skullclamp
1 Spiteful Banditry
1 Springbloom Druid
1 Stomping Ground
1 Syr Konrad, the Grim
1 Terminate
1 The Meathook Massacre
1 Three Visits
1 Toxic Deluge
1 Vandalblast
1 Vengeful Bloodwitch
1 Village Rites
1 Viscera Seer
1 Wood Elves
1 Yavimaya, Cradle of Growth
1 Yawgmoth, Thran Physician
1 Ziatora's Proving Ground
1 Zulaport Cutthroat
8 Swamp
5 Forest
4 Mountain

View file

@ -0,0 +1,21 @@
# proliferate
_generated 2026-09-07 23:38Z by `tools/variant.py`_
- **bracket 3: PASS** (two-card vacuum combos: 0)
- 86 lines in `decklist.txt`
## files
| file | what it is |
| --- | --- |
| `decklist.txt` | the deck, `N Card Name` per line |
| `bracket.txt` | bracket-3 + house-rule check |
| `combos.txt` | combos in the deck, and one card away |
| `sim/` | Forge runs — `.log` raw, `.txt` report, `.json` data |
| `card_stats.txt` | per-card cast rate, avg round, win% (newest sim) |
## simulation runs
_none yet — run with `--sim 24`_

View file

@ -0,0 +1,24 @@
COMMANDER: The Reaper, King No More
DECK SIZE: 99 + 1 commander = 100
GAME CHANGERS: 0/3 OK
MASS LAND DENIAL: 0 OK
EXTRA TURNS: 0 OK
TWO-CARD INFINITE COMBOS IN A VACUUM: 0 OK
two-card combos needing board state (ALLOWED, 3):
- Blowfly Infestation + Flourishing Defenses
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Nest of Scarabs
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
- Blowfly Infestation + Hapatra, Vizier of Poisons
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
==========================================================
BRACKET 3: PASS

View file

@ -0,0 +1,85 @@
==================================================================
COMBOS ALREADY IN THE DECK: 10
==================================================================
[E] Blowfly Infestation + Flourishing Defenses
-> Infinite creature ETB
-> Infinite creature LTB
-> Infinite death triggers
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Nest of Scarabs
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to 1.
requires: You have a way to put a -1/-1 counter on a creature.
[E] Blowfly Infestation + Hapatra, Vizier of Poisons
-> Infinite death triggers
-> Infinite creature ETB
-> Infinite creature LTB
requires: You control at least two other creatures with toughness equal to one.
requires: You have a way to put a -1/-1 counter on a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Obelisk Spider
-> Near-infinite lifeloss
-> Near-infinite lifegain triggers
-> Near-infinite creature ETB
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[E] Yawgmoth, Thran Physician + Nest of Scarabs + Blood Artist
-> Near-infinite -1/-1 counters
-> Near-infinite card draw
-> Near-infinite death triggers
requires: Your life total is at least 2.
requires: You control at least one additional creature.
requires: There is at least one other creature on the battlefield.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Blood Artist
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[S] Hapatra, Vizier of Poisons + Yawgmoth, Thran Physician + Zulaport Cutthroat
-> Destroy all creatures opponents control
-> Destroy each creature that enters the battlefield under an opponent's control
-> Infinite -1/-1 counters
requires: You control at least one additional creature.
requires: Your life total is at least 2.
requires: An opponent controls a creature.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Viscera Seer
-> Infinite +1/+1 counters on most creatures you control
-> Infinite death triggers
-> Infinite creature ETB
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Ashnod's Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colorless mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
[E] Mazirek, Kraul Death Priest + Putrid Goblin + Phyrexian Altar
-> Infinite +1/+1 counters on most creatures you control
-> Infinite colored mana
-> Infinite death triggers
requires: Putrid Goblin does not have a -1/-1 counter on it.
==================================================================
ONE CARD AWAY: 293 combos, 92 distinct cards
==================================================================
20 combos Mikaeus, the Unhallowed {3}{B}{B}{B} #1306
10 combos First Day of Class {1}{R} #10147
8 combos Veinwitch Coven {2}{B} #4179
8 combos Host of the Hereafter {2}{B}{G} #7758
7 combos Rhythm of the Wild {1}{R}{G} #216
7 combos Grumgully, the Generous {1}{R}{G} #4341
7 combos Scurry Oak {2}{G} #2259
6 combos Thran Vigil {1}{B} #6285
6 combos Rocksteady, Mutant Marauder {2}{G} #10233
6 combos Support Mission {2}{G} #31928
6 combos Captain Kathryn Janeway {3}{G} #26133
6 combos Surrak and Goreclaw {4}{G}{G} #1600
6 combos Warden of the Grove {2}{G} #2262
6 combos Railway Brawler {3}{G}{G} #2493
6 combos Uncivil Unrest {4}{R} #2947
decklist: /home/markdoeswork/mtg/reaper-king-no-more/decks/proliferate/decklist.txt | source: data/variants.json (108,535 combos)

View file

@ -0,0 +1,95 @@
# proliferate
# Proliferate multiplies -1/-1 counters, turning one trigger into many. A different engine for the same theme.
# generated by tools/generate.py from decks/no-mikaeus
# roles: {'proliferate': 5, 'minus_engine': 1, 'ramp': -3, 'sac_outlet': -3}
# Commander
1 The Reaper, King No More
# Main
1 Archfiend of Ifnir
1 Ashnod's Altar
1 Assassin's Trophy
1 Bastion of Remembrance
1 Beast Within
1 Bedevil
1 Birds of Paradise
1 Black Sun's Zenith
1 Blackcleave Cliffs
1 Blood Artist
1 Blood Crypt
1 Bloodfell Caves
1 Blooming Marsh
1 Blowfly Infestation
1 Bojuka Bog
1 Bristly Bill, Spine Sower
1 Carrion Feeder
1 Castle Locthwain
1 Cauldron of Souls
1 Chaos Warp
1 Command Tower
1 Contagion Clasp
1 Copperline Gorge
1 Cultivate
1 Damnation
1 Evolution Sage
1 Exotic Orchard
1 Farseek
1 Flourishing Defenses
1 Goblin Bombardment
1 Grim Haruspex
1 Grim Poppet
1 Hapatra, Vizier of Poisons
1 Humble Defector
1 Jungle Hollow
1 Kalonian Hydra
1 Karplusan Forest
1 Kodama's Reach
1 Llanowar Wastes
1 Massacre Girl, Known Killer
1 Massacre Wurm
1 Mayhem Devil
1 Mazirek, Kraul Death Priest
1 Midnight Reaper
1 Mirkwood Bats
1 Murderous Redcap
1 Nature's Lore
1 Necroskitter
1 Nest of Scarabs
1 Obelisk Spider
1 Overgrown Tomb
1 Overseer of the Damned
1 Path of Ancestry
1 Persistent Constrictor
1 Phyrexian Altar
1 Plague Belcher
1 Poison-Tip Archer
1 Putrid Goblin
1 Rampant Growth
1 Rugged Highlands
1 Sakura-Tribe Elder
1 Savage Lands
1 Skullclamp
1 Springbloom Druid
1 Staff of Compleation
1 Stomping Ground
1 Syr Konrad, the Grim
1 Terminate
1 The Meathook Massacre
1 Three Visits
1 Toxic Deluge
1 Triumph of the Hordes
1 Vandalblast
1 Vengeful Bloodwitch
1 Village Rites
1 Viscera Seer
1 Vraska, Betrayal's Sting
1 Wood Elves
1 Yavimaya, Cradle of Growth
1 Yawgmoth, Thran Physician
1 Ziatora's Proving Ground
1 Zulaport Cutthroat
8 Swamp
5 Forest
4 Mountain

View file

@ -0,0 +1,39 @@
# Combo.ai -- an AI profile for piloting an aristocrats / sacrifice deck.
#
# Sparse by design: AiProfileUtil falls back to AiProps defaults for any key not
# listed, so this file contains ONLY deliberate deviations from Default.ai. Each
# one has a mechanistic reason -- a change a competent human pilot would obviously
# also make. Changes that only move win rate without such a story are overfitting
# to Forge's evaluation function and are NOT included.
#
# Use for OUR seat only (-a Combo Default Default Default). Tuning opponents too
# would just shift the baseline and teach us nothing.
# --- Sacrifice: the core of the archetype -------------------------------------
# Default ships ENABLE=false, which disables the GENERIC sacrifice fallback: any
# sac outlet lacking a card-specific `AIPreference:SacCost` hint is then simply
# never fed. For a deck built on sacrificing creatures this is fatal.
SACRIFICE_DEFAULT_PREF_ENABLE=true
SACRIFICE_DEFAULT_PREF_MIN_CMC=0
# Default 2 -- covers everything in the deck, not just cheap creatures.
SACRIFICE_DEFAULT_PREF_MAX_CMC=6
SACRIFICE_DEFAULT_PREF_ALLOW_TOKENS=true
# Default 135 is roughly a vanilla 1/2: anything better than a token was ineligible
# as fodder. 400 lets the AI feed real creatures to Yawgmoth and Carrion Feeder,
# which is the entire point of the deck.
SACRIFICE_DEFAULT_PREF_MAX_CREATURE_EVAL=400
# --- Tokens are fuel ----------------------------------------------------------
# Token bodies are sac fodder here, not board presence. Always make them.
TOKEN_GENERATION_ABILITY_CHANCE=100
# --- Trading is upside, not a cost -------------------------------------------
# A normal deck avoids trades; an aristocrats deck WANTS its creatures to die,
# because dying is what triggers the payoffs. Default is 0.
CHANCE_TO_ATTACK_INTO_TRADE=60
ATTACK_INTO_TRADE_WHEN_TAPPED_OUT=true
RANDOMLY_ATKTRADE_ONLY_ON_LOWER_LIFE_PRESSURE=false
# --- Don't hoard mana for combat tricks we don't run --------------------------
# Default 100 holds mana for Main 2. This deck would rather deploy the engine.
RESERVE_MANA_FOR_MAIN2_CHANCE=0

View file

@ -0,0 +1,17 @@
# OVERRIDE of Forge's stock script. Changes vs stock:
# 1. removed `AI:RemoveDeck:All`
# 2. added `SVar:AIPreference:SacCost$Creature.Other` so the AI knows what to feed it
#
# HIGHER RISK than the Viscera Seer override, and tested separately for that reason.
# Blasting Station and Barrage of Expendables are functionally identical free sac-damage
# outlets and are ALSO `AI:RemoveDeck:All` -- the flag is systematic across this whole
# card class, which suggests Forge genuinely mis-values repeatable sac-for-damage.
# Watch for the AI sacrificing its own board to ping a player for 1: check our creature
# count and game length in the A/B before trusting this one.
Name:Goblin Bombardment
ManaCost:1 R
Types:Enchantment
A:AB$ DealDamage | Cost$ Sac<1/Creature.Other/another creature> | ValidTgts$ Any | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target.
SVar:AIPreference:SacCost$Creature.Other
DeckHas:Ability$Sacrifice
Oracle:Sacrifice a creature: Goblin Bombardment deals 1 damage to any target.

View file

@ -0,0 +1,21 @@
# OVERRIDE of Forge's stock script. Changes vs stock:
# 1. removed `AI:RemoveDeck:All` -- stock Forge is forbidden from ever playing this
# 2. added `AILogic$ AtOppEOT` -- copied from Woe Strider (w/woe_strider.txt), which
# has the IDENTICAL "AB$ Scry | Cost$ Sac<1/Creature>" ability and is NOT blocked.
# That card is the proof this pattern is pilotable by the AI.
# 3. added `SVar:AIPreference:SacCost$Creature.Other` -- tells the AI WHAT to feed it
# (pattern from c/carrion_feeder.txt, which works today)
# 4. restricted the sac cost to `Creature.Other`
#
# RULES DEVIATION (deliberate, documented): stock Viscera Seer can sacrifice ITSELF.
# This override cannot. Woe Strider is likewise `.Other`. Allowing self-sacrifice
# risks the AI eating its own outlet. The deviation is small but it IS a deviation --
# per-card results for Viscera Seer are correspondingly less exact.
Name:Viscera Seer
ManaCost:B
Types:Creature Vampire Wizard
PT:1/1
A:AB$ Scry | Cost$ Sac<1/Creature.Other/another creature> | ScryNum$ 1 | AILogic$ AtOppEOT | SpellDescription$ Scry 1. (Look at the top card of your library. You may put that card on the bottom.)
SVar:AIPreference:SacCost$Creature.Other
DeckHas:Ability$Sacrifice
Oracle:Sacrifice a creature: Scry 1. (Look at the top card of your library. You may put that card on the bottom.)

View file

@ -0,0 +1,520 @@
# Plan: The Reaper, King No More — Bracket 3
How to use AI + local tooling to find cards, test them, and simulate the deck
entirely on this machine.
## 0. Read this first: the commander's actual text
Scryfall oracle text (verified 2026-09-07):
> **The Reaper, King No More** — {2/B}{2/R}{2/G}
> Legendary Artifact Creature — Scarecrow
> When The Reaper enters, put a -1/-1 counter on each of up to two target creatures.
> Whenever a creature an opponent controls with a -1/-1 counter on it dies, you may
> put that card onto the battlefield under your control. **Do this only once each turn.**
Three consequences that shape the whole build, and one correction to the README:
1. **Color identity is Jund (B/R/G)**, and the hybrid {2/X} cost means it can be
cast off any 6 lands — it is castable in any deck, but our identity is BRG.
2. **"Do this only once each turn" hard-caps the commander as a combo engine.**
An infinite -1/-1 loop does *not* produce infinite steals off The Reaper. The
loop's payoff has to come from somewhere else (a sac outlet + drain, Nest of
Scarabs tokens, Blood Artist-style drains).
3. **The steal trigger only reads creatures an _opponent_ controls.** So the deck
wants ways to spread -1/-1 counters onto *their* board, not just ours. This is a
real tension with the Hapatra/Blowfly engine, which mostly counters our own stuff.
The README's framing — "infinite combo with aristocrats ETB + -1/-1 synergy" — is
sound, but the commander is a *value/removal* engine, not the combo's payoff.
Build it as: aristocrats combo deck that happens to be in Jund, with The Reaper as a
repeatable one-per-turn removal-plus-theft engine on top.
## 1. Bracket 3 constraints (the guardrails every tool must enforce)
From the official brackets article:
| Rule | Bracket 3 |
| --- | --- |
| Game Changers | **Up to 3** |
| Mass land denial | **None** |
| Extra turns | Sparse, no chaining/looping |
| Two-card infinite combos | **None that go off cheaply within ~the first 6 turns** |
| Tutors | Not explicitly limited (but keep them honest) |
The Game Changers list is 53 cards as of 2026-09-06 and is queryable on Scryfall as
`is:gamechanger` — so bracket legality is fully scriptable, no manual list to maintain.
**Our house rule, stricter and simpler than the official wording: no two-card
infinite combos that work in a vacuum.** If two cards go infinite with no third
enabler and no board state required, they're out. Two-card lines that need an
existing creature, a sac outlet, or a specific board are fine, as are 3+ card combos.
This is checkable directly against the offline combo DB by filtering `len(uses) == 2`.
**Good news for the README's plan: the Blowfly package passes this rule.** Checked
against the offline DB — both `Blowfly Infestation + Hapatra` and
`Blowfly Infestation + Nest of Scarabs` list identical `notablePrerequisites`:
> You control at least two other creatures with toughness equal to 1.
> You have a way to put a -1/-1 counter on a creature.
So they are two *named* cards but four moving parts, needing a real board and a third
enabler. That is a build-around engine, not a vacuum combo — exactly the kind of thing
bracket 3 is meant to allow. Keep the package. The rule to enforce instead: **don't
add tutors that assemble it**, and don't add a genuine 2-card-in-a-vacuum line
alongside it.
## 1b. The blacklist — cards I won't play
Separate from legality and separate from bracket rules: `blacklist.txt` holds cards
excluded **by preference**, each with a reason. Format is `Card Name | reason`.
```
Sol Ring | boycott, not a power-level call
Talisman of Indulgence | prefer land ramp
Arcane Signet | prefer land ramp
```
Two categories so far:
- **Boycott.** Sol Ring is out for personal reasons. No game-logic justification is
needed or implied, and the tooling should never argue about it.
- **Playstyle: ramp with lands, not rocks.** We're in green, so use it. All the
Talismans, Signet, Mind Stone, Fellwar Stone, Chromatic Lantern etc. are out. This
one *does* have a cost — see below.
This is wired into both halves of the toolchain, which is the point of keeping it in
one file:
1. `bracket_check.py` reports blacklisted cards **in their own section**, clearly
marked "personal preference, not a bracket rule", so they never get confused with
an actual bracket-3 violation.
2. `db.tagged()` filters them out of every search, so they don't get re-suggested
later. Verified: `db.tagged("mana-rock")` no longer returns Sol Ring.
**The honest tradeoff on cutting rocks:** land ramp is a turn slower and Sol Ring is
the single best accelerant in the format. The deck swapped 5 rocks for Rampant Growth,
Harrow, Wood Elves, Springbloom Druid, and Binding the Old Gods. Average MV went
2.92 → 3.02 and the deck is measurably slower out of the gate. Two things soften it:
Wood Elves and Springbloom Druid are *creatures*, so they feed the sacrifice theme
that rocks never would, and Binding the Old Gods is removal stapled to a fetch.
**Measured, so it's settled.** 20,000 games each, identical seed, the only change
being 5 rocks (incl. Sol Ring) swapped for the 5 land-ramp spells:
| build | commander by T6 | engine assembled | -1/-1 online | 3+ lands on T4 |
| --- | --- | --- | --- | --- |
| land ramp (current) | **46.9%** | **35.7%** | median T6 | 95.5% |
| rocks (blacklisted) | 54.8% | 34.6% | median T6 | 95.2% |
The cost is real but small: **~8 percentage points on casting the commander by T6**,
and essentially nothing everywhere else — engine assembly is actually a hair *better*
with land ramp, and the -1/-1 engine comes online on the same turn. Sol Ring costs
you a bit of explosiveness, not the deck's function. Blacklist stands, no regrets.
## 2. Tooling: what to install and what each thing is for
Everything runs locally. Local runtimes present: Python 3.13, Node 25, Java 26
(Forge targets 17 — a newer JRE runs it fine), cargo.
### Layer A — Bulk data (download once, query offline forever)
**No live API calls in the build loop.** Every dataset below is a static file. Total
~1.2GB on disk; refresh with a single `make data` when a set drops. All sizes and
schemas below were verified by actually downloading them on 2026-09-07.
| File | Size | Source | What it gives us |
| --- | --- | --- | --- |
| `oracle-cards.jsonl.gz` | 23MB | Scryfall bulk | One object per unique card: oracle text, mana cost, CI, `legalities`, `is:gamechanger` |
| `oracle-tags.jsonl.gz` | 5.6MB | Scryfall bulk | **4,524 community tags** + full hierarchy |
| `rulings.jsonl.gz` | 5.1MB | Scryfall bulk | Every ruling, joined by `oracle_id` |
| `variants.json` | 646MB | Commander Spellbook | **108,535 combos**, each with `bracketTag` |
| `AtomicCards.json.gz` | 51MB | MTGJSON | `edhrecRank` (popularity sanity check only) |
| `embeddings.npz` | 64MB | **generated locally** | 35,312 × 768-dim mechanics vectors (see Layer B) |
Endpoints (note: Scryfall bulk is **JSONL now**, the field is `jsonl_download_uri`,
not the older `download_uri` — `GET api.scryfall.com/bulk-data` for current URLs):
```
https://data.scryfall.io/oracle-cards/oracle-cards-<ts>.jsonl.gz
https://data.scryfall.io/oracle-tags/oracle-tags-<ts>.jsonl.gz
https://json.commanderspellbook.com/variants.json # whole combo DB, no API
https://mtgjson.com/api/v5/AtomicCards.json.gz
```
**The Scryfall Tagger data is the best part of this**, and it's the thing you can't
reconstruct from oracle text with regex. 4,524 hand-curated tags, with `parent_ids` /
`child_ids` forming a hierarchy. Tags that are directly load-bearing for this deck
(counts are real, from the downloaded file):
| Tag | Cards | Why it matters here |
| --- | --- | --- |
| `death-trigger-opponent` | 73 | **Triggers off an _opponent's_ creature dying** — maps exactly onto the commander's steal clause |
| `free-sacrifice-outlet` | 192 | Sac outlets with no mana cost — the aristocrats core |
| `sacrifice-outlet-universal` | 53 | Sac any permanent type |
| `your-sacrifice-matters` | 122 | Payoffs for your own sacrifices |
| `death-trigger-self` | 709 | Dies-triggers |
| `repeatable-proliferate` | 43 | Repeatable -1/-1 counter multiplication |
| `pseudo-proliferate` | 44 | Near-proliferate effects |
| `shrink` | 107 | Toughness reduction |
| `persist` / `gives-persist` | 26 / 7 | Persist + -1/-1 is the classic engine |
`death-trigger-opponent` at 73 cards is the highest-signal query in the whole project.
Grepping oracle text for that concept is miserable; the tag is exact. Read it as
"the shortlist of cards that do what my commander does."
Joining all three files (tags ∩ Jund identity ∩ commander-legal, sorted by
`edhrecRank`) — run locally, output verbatim — yields **55 cards**, top of list:
```
#511 The Meathook Massacre #1031 Yahenni, Undying Partisan
#512 Massacre Wurm #1695 Massacre Girl, Known Killer
#753 Bloodchief Ascension #2536 Mari, the Killing Quill
#2944 Necroskitter #3511 Overseer of the Damned
```
That's a real shortlist for "cards that care when an opponent's creature dies,"
produced in about a second with no network. This is the whole argument for Layer A.
**Combos, fully offline.** The entire Spellbook DB is one JSON download — no
`find-my-combos` POSTs. Verified locally: 108,535 combos, **24,699 within Jund
identity**, and **30 that use The Reaper itself**. Each combo carries `uses`,
`produces`, `identity`, `legalities`, `popularity`, and a `bracketTag`
(E/S/P/O/R/B/C) we can filter on directly for bracket-3 policing.
A real result from the offline file — the commander's own combos are mostly
Mikaeus, the Unhallowed shells:
```
O [Mikaeus, the Unhallowed, The Reaper, Bloodthrone Vampire] => Infinite -1/-1 counters, Infinite creature ETB
O [Mikaeus, the Unhallowed, Spawning Pit, The Reaper] => Infinite -1/-1 counters
```
Reimplementing `find-my-combos` offline is ~15 lines: index combos by card name, then
`included` = combos whose `uses` ⊆ deck, `almostIncluded` = combos missing exactly one.
### Layer B — Semantic search ("try other cards")
**Short answer to "how do I get all the cards": you generate them yourself, in 82
seconds, and you already have.** Don't download `minimaxir/mtg-embeddings` — it's
stale (through Aetherdrift, Feb 2024) and, verified, **does not contain The Reaper**.
Instead run the same model over our own current `oracle-cards.jsonl`:
```
python3 tools/embed.py # -> data/embeddings.npz
```
That encodes every card with `Alibaba-NLP/gte-modernbert-base` (the same model the HF
dataset used) and writes a 64MB `.npz`. On this box (RTX 3060, 12GB) it took **1m22s
for 35,312 cards**. It is a `pip install sentence-transformers` and one script — no
account, no download, and it re-runs whenever a set drops. This is strictly better
than the HF file in every dimension, which is why Layer B is now "build", not "fetch".
**Two things I got wrong on the first pass, both worth knowing:**
1. **Don't put the card's name in the embedded text.** With `name` included, querying
The Reaper returned Midnight Reaper, Reaper of the Wilds, Grim Reaper, Slum Reaper,
Cemetery Reaper — it matched the *word* "Reaper", not the mechanics. `embed.py`
deliberately omits the name field.
2. **Card-to-card similarity matches a card's overall _shape_, not its key ability.**
With names removed, The Reaper's neighbors became Scarecrone, Grim Poppet,
Blazethorn Scarecrow, Jousting Dummy — the model correctly saw "artifact creature
Scarecrow" and matched creature type. Useless for deckbuilding.
**So query by ability text, not by card.** That's what actually works:
```
python3 tools/similar_text.py "whenever a creature an opponent controls with a -1/-1 counter dies, put that card onto the battlefield under your control"
```
```
0.897 Instill Infection 0.891 Make Obsolete 0.890 Cower in Fear
0.882 Shrivel 0.880 Persist 0.876 Hazardous Conditions
0.874 Gnarled Effigy 0.872 Consumptive Goo 0.871 Quillspike
```
Genuine -1/-1 cards. Both scripts filter to Jund identity + commander-legal.
**It's still fuzzy** — it ranks by "reads like", so it surfaces candidates, not
recommendations. Use embeddings to *generate* a candidate list, then filter it through
the Tagger tags and legality from Layer A. Tags are precise but only cover concepts
someone thought to tag; embeddings cover anything but imprecisely. They fail in
opposite directions, which is why the plan uses both.
### Layer C — Popularity / prior art
MTGJSON `AtomicCards.json` (verified current: 2026-09-06, 35,022 cards) carries
`edhrecRank` per card — no EDHREC scraping needed. Use rank only as a loose "how
normal is this inclusion" sanity check. We are **not** tracking saltiness and not
scoring the deck on it.
The one power-level rule we *do* enforce mechanically: **no two-card-in-a-vacuum
infinite combos.** Two cards that go infinite by themselves, with no third
enabler and no board state required, are out — that's the bracket-3 line and it's
checkable directly against the offline combo DB (`len(uses) == 2`). Longer combos,
or two-card lines that need an existing creature / sac outlet / specific board, are
fine. See §1 for how this lands on the Blowfly package.
### Layer D — Simulation (Forge)
**Forge is the simulator. We are not writing our own.** A hand-rolled goldfish sim
models mana and curve but not the game — no blockers, no interaction, no stack, no
opponents. For a deck whose whole point is death triggers and sacrifice loops, that
misses everything that matters. Forge implements the actual rules.
**Installed and working:** Forge 2.0.14, `~/forge`, from the prebuilt
`forge-installer-2.0.14.tar.bz2` (no Maven needed — the release ships a fat jar).
Java 26 runs it fine despite the project targeting 17. It loads 33,617 cards.
Exact syntax, from `SimulateMatch.java` and confirmed against the running binary:
```
sh forge.sh sim -d <deck1.dck> ... <deckX.dck> -f Commander -n <games> -s <seed> -q
```
- `-d` decks (quote names with spaces) · `-f Commander` **required**, else constructed
- `-n` games · `-m` best-of-M match · `-s` RNG seed (use it — reproducible runs)
- `-a` AI profile per player · `-c` seconds before a draw (default 120) · `-q` quiet
**Two gotchas that cost time, both now handled by the tooling:**
1. **Commander decks must live in `~/.forge/decks/commander/`.** The `-D` flag did
*not* work for Commander format — Forge looks in its own profile directory and
otherwise reports `Could not load deck`. `run_forge.sh` writes there directly.
2. **With one deck, Forge "wins" on turn 0 in 300ms** — no opponents, no game. You
need real opponents. Forge ships **173 Commander precons** in
`res/quest/commanderprecons/`; we use three (Faceless Menace C19, Merciless Rage
C19, Arcane Maelstrom C20) for a 4-player pod. They're roughly bracket 2.
Real 4-player games run ~31 turns in ~60 seconds each, so a 24-game batch is ~25 min.
**The AI caveat is not a footnote.** Per Forge's own wiki the AI is heuristic, not
trained: decent at aggro/midrange, moderate at control, **weak at combo decks**. Ours
is a combo deck, so the AI systematically under-plays it and will miss sac-loop lines
a human would take. Every report prints this. Read Forge's win rate as a **floor** and
as proof the deck functions and its cards interact — never as a power rating.
## 3. The build loop
Card selection is offline and instant. Simulation is Forge, and it's the slow step —
~60s per 4-player game — so it runs in batches, not on every edit.
```
make data (once/per set) ──► data/*.jsonl, variants.json, AtomicCards.json
│
decklist.txt ─────────────────────────► │ blacklist.txt ──┐
│ │ │
├─► bracket_check.py ── game changers, MLD, vacuum combos, blacklist ──┐
├─► combos.py ── included / almostIncluded (offline) ──────────┤
├─► tags.py ── death-trigger-opponent, sac outlets ──────────┼─► out/
├─► similar_text.py ── "cards whose text reads like ..." ──────────┤
│ │
└─► to_dck.py ──► run_forge.sh ──► forge_report.py ─────────────────────┘
(validates names) (24 games, 4-player pod) (.txt + .json + .log)
```
Every simulation run writes a timestamped triple into `out/`: the full Forge `.log`,
a human `.txt` report, and a `.json` artifact — and the report footer names
`decklist.txt`, the log, the JSON, and itself, so any number is traceable.
## 4. Repo layout
```
reaper-king-no-more/
decklist.txt # working deck, "1 Card Name" per line
blacklist.txt # cards I won't play, "Card Name | reason"
plan.md
data/ # ~1.2GB, all gitignored
oracle-cards.jsonl oracle-tags.jsonl rulings.jsonl
variants.json AtomicCards.json embeddings.npz (generated)
decks/ # RESULTS, one dir per archetype variant
README.md
no-mikaeus/ # decklist.txt, bracket.txt, combos.txt,
mikaeus/ # README.md, sim/<stamp>.{log,txt,json}
tools/
cards.py # shared index: oracle+tags+edhrec+combos+blacklist
bracket_check.py # game changers, MLD, vacuum combos, blacklist
combos.py # offline included / almostIncluded (no API)
embed.py # generate embeddings.npz on GPU (~82s)
similar.py # "cards like <card>"
similar_text.py # "cards whose text reads like <query>"
to_dck.py # decklist -> forge .dck, validates names vs Forge
run_forge.sh # batch 4-player sim into decks/<variant>/sim/
forge_report.py # Forge log -> .txt report + .json artifact
variant.py # run the whole suite for one variant
```
**Variants are the unit of work.** A variant is one answer to "what if the deck were
built this way" — its own 100 cards, its own legality verdict, its own combo profile,
its own simulation history. Regenerate one with:
```
python3 tools/variant.py no-mikaeus # analysis only, ~10s
python3 tools/variant.py mikaeus --sim 24 # + 24 Forge games, ~25 min
```
Analysis files are rewritten each run; sim runs are additive, so every batch is kept
and runs stay comparable.
External: `~/forge` (Forge 2.0.14) and `~/.forge/decks/commander/` (where Forge
insists Commander decks live).
## 5. Build order
1. ~~`fetch_data.py`~~ — **done**, six files in `data/` (1.1GB).
2. ~~`cards.py`~~ — **done.** oracle + 4,369 tags + edhrecRank + combos + blacklist.
3. ~~`bracket_check.py`~~ — **done and passing.**
4. ~~`embed.py` / `similar.py` / `similar_text.py`~~ — **done** (Layer B).
5. ~~Draft the 100~~ — **done**, `decklist.txt`.
6. ~~Forge installed + `to_dck.py` + `run_forge.sh` + `forge_report.py`~~ — **done.**
4-player pod vs precons, reproducible by seed.
7. Iterate on the list using Forge results + the offline combo/tag tools.
**Dropped: the hand-rolled goldfish sim.** It was written and worked, but it models
mana and curve only — no interaction, no blockers, no stack. For an aristocrats combo
deck that's the wrong abstraction, and maintaining a second simulator that disagrees
with the real one is worse than having one. Forge is the simulator. (`goldfish.py`
and its `out/goldfish-*` runs are removed.)
**Report convention** (every tool): a timestamped `.txt` human report plus a `.json`
artifact in `out/`, with the report footer naming `decklist.txt`, the raw log, the
JSON, and itself.
## 6. Deck skeleton to draft against
Rough shape, ~99 + commander:
- **Lands 36–37** (hybrid commander is easy to cast; the rest of the deck is greedy)
- **Ramp 10** — Jund has good rocks + Cultivate/Farseek effects
- **-1/-1 engines** — Hapatra, Blowfly Infestation, Nest of Scarabs, Yawgmoth,
Necroskitter (steals like the commander!), Contagion Clasp/Engine, Archfiend of Ifnir
- **Sac outlets** — free ones matter: Viscera Seer, Carrion Feeder, Ashnod's Altar
- **Drain payoffs** — Blood Artist, Zulaport Cutthroat, Bastion of Remembrance
- **Removal/interaction 8–10** — bracket 3 pods interact
- **One-offs that love the commander** — Humble Defector (per README), and note
**Necroskitter** is close to a second copy of the commander's steal ability
- **Game Changers: pick ≤3, deliberately.** Check with `bracket_check.py`.
`Necroskitter` came straight out of the Scryfall query in §2 and is arguably the
best non-commander card for this exact deck — good sign the search approach works.
## 6b. Variants — the unit of work
Six variants, each a falsifiable hypothesis rather than a taste preference. All are
generated from one spec (`tools/make_variants.py`) as cut/add lists against the
baseline, so changing the baseline propagates everywhere.
| variant | bracket 3 | vacuum | combos | outlets | cmdr synergy | avg MV |
| --- | --- | --- | --- | --- | --- | --- |
| **no-mikaeus** (baseline) | PASS | 0 | 11 | 8 | 6 | 3.02 |
| lean-outlets | PASS | 0 | 10 | 5 | 7 | 2.97 |
| commander-focus | PASS | 0 | 7 | 7 | 10 | 3.03 |
| heavy-removal | PASS | 0 | 7 | 8 | 8 | 2.95 |
| low-curve | PASS | 0 | 11 | 8 | 9 | 2.67 |
| mikaeus | **FAIL** | **7** | 39 | 8 | 6 | 3.08 |
The hypotheses:
- **lean-outlets** — 8 sac outlets is more than the deck needs. Cut 3 for interaction
and card advantage; does consistency actually drop?
- **commander-focus** — the commander only steals from *opponents'* creatures, but our
-1/-1 engine mostly counters our own. Push counters onto their board instead.
(Raises synergy cards 6 → 10, at the cost of 4 combos.)
- **heavy-removal** — bracket 3 pods interact. Trade combo redundancy for removal:
does surviving longer beat assembling faster?
- **low-curve** — the engine lands ~T6. Cut the top of the curve entirely (MV 3.02 →
**2.67**) and see if coming online sooner wins more.
- **mikaeus** — the control case. Confirms the house rule catches what it should.
**Mikaeus is settled — the answer is no.** Adding it creates **7 two-card vacuum
combos**, because it goes infinite with *every sac outlet in the deck*:
```
Mikaeus + Ashnod's Altar Mikaeus + Carrion Feeder
Mikaeus + Phyrexian Altar Mikaeus + Viscera Seer
Mikaeus + Goblin Bombardment Mikaeus + Woe Strider
Mikaeus + Yahenni, Undying Partisan
```
Two cards, no third enabler, no board state — exactly what the house rule targets.
Its combo count jumps 11 → 39, which is the same problem counted a different way.
Kept as a variant so the comparison stays visible rather than buried in a chat log.
**What the baseline's own numbers say:** `combos.py` finds 11 combos in the deck, all
requiring board state — redundant three-card engines, no vacuum lines. That is the
deck working as designed.
## 6c. How to design variants, and what to do with the results
### Designing variants
A variant is only worth running if it can be **wrong**. The rule I'm using: each one
states a hypothesis, changes 3-5 cards, and holds everything else constant. Anything
bigger and you can't attribute the result; anything vaguer and there's no result to
attribute.
Where the hypotheses come from, in rough order of value:
1. **Structural facts about the list.** Count things and look for outliers. "8 sac
outlets when 5 would do" and "22 three-drops, 5 of them ramp" both came from
counting, not intuition. This is the best source.
2. **Loss data from previous sims.** 15 of 17 losses were life hitting 0 against
aggro → that's `heavy-removal` and `low-curve`.
3. **Tension in the deck's own design.** The commander only steals from *opponents'*
creatures while our engine counters our own → `commander-focus`.
4. **Control cases.** `mikaeus` exists to prove the house rule catches what it should.
A test suite needs a case that fails on purpose.
All of it lives in `tools/make_variants.py` as cut/add lists against the baseline, so
changing the baseline propagates everywhere and no two lists silently drift apart.
The generator refuses to add a card already in the deck (it caught three of my own
mistakes) and validates every name against Forge's database before simming.
### Card-level weights from simulation data
Run Forge **without `-q`** and it logs the whole game, attributed by player:
```
Add To Stack: Ai(1)-Reaper King No More cast Terminate targeting [Face-down card (H4)]
Zone Change: Zulaport Cutthroat (33) was put into Graveyard from Battlefield.
Life: Ai(2)-Faceless Menace 40 > 39
```
`tools/card_stats.py` turns that into per-card numbers: how often a card was cast,
the average turn it landed, and the deck's win rate in games where it was cast. That
last column is the "weight".
**What it's legitimately good for:**
- **Cards never cast in any game.** The single most actionable output. A card that
never gets played across dozens of games is dead weight, uncastable by the AI, or
too expensive — all worth investigating.
- **Average turn played** — measures whether the curve behaves as intended.
- **Cast rate** — is this card doing anything, or is it a 100th-card filler?
**What it is NOT:** a fitness function you can optimize against. Four reasons, all
real:
1. **Sample size.** A card cast in 5 games has a +/-40% win-rate swing from noise.
2. **"Never cast" is three different failures wearing a trenchcoat** — bad card, card
the AI can't pilot, card never drawn. They need opposite fixes.
3. **Correlation, not causation.** Cards cast in long games look good because long
games are ones we *survived*. The card didn't cause the win; surviving did.
4. **The AI is weak at combo**, so it systematically under-casts our combo pieces —
exactly the cards we care most about.
So: use card stats to generate *hypotheses* (this card never gets cast — why?), then
test the hypothesis with a variant. Don't let a win-rate column pick the deck. The
loop is **stats -> hypothesis -> variant -> sim -> stats**, with a human deciding at
each arrow.
## 7. Open questions
- **Which variant is actually best?** Five pass bracket 3 and differ meaningfully on
paper. Forge decides this, not argument — each needs a 24-game batch.
- What's the primary wincon — a drain loop off infinite death triggers, or grinding
value off stolen creatures? The commander's once-per-turn clause means it can't be
the payoff, so something else has to close.
- Do we want any Game Changers at all? Bracket 3 allows 3; running 0 is also fine and
makes the deck's bracket unambiguous.
- Is `commander-focus` right that the deck under-uses its own commander? It nearly
doubles opponent-facing -1/-1 effects (6 → 10) but loses 4 combos. That trade is
the single most interesting question in the list.

View file

@ -0,0 +1,42 @@
# Simulation-only card substitutions.
#
# Some cards are `AI:RemoveDeck:All` in Forge because the AI genuinely cannot
# evaluate them -- not because nobody wrote logic. Forcing those on makes the AI
# play them badly, which is worse than not playing them. Instead we swap in a
# functionally similar card the AI CAN pilot, so the deck's SHAPE is simulated
# correctly (the removal slot still does removal) even though the specific card
# differs.
#
# decklist.txt remains the source of truth. This map applies ONLY when building
# the .dck for simulation, and every substitution is recorded in the run's JSON
# metadata and printed in reports.
#
# IMPORTANT: per-card statistics for a substituted card describe the STAND-IN,
# not the real card. Never read "Terminate had a 40% win rate" as a fact about
# Beast Within. This trades per-card precision for whole-deck realism.
substitutions:
# Blocked because it gives the opponent a 3/3 -- the AI can't weigh that downside,
# even though it already has working targeting logic (AITgts$ Card.cmcGE4).
# Feed the Swarm is the same slot: cheap unconditional removal, and it also hits
# enchantments, so it is closer to Beast Within's flexibility than Terminate.
# DEVIATION: Beast Within hits ANY permanent at instant speed; Feed the Swarm is
# a sorcery limited to creatures/enchantments and costs life.
Beast Within: Feed the Swarm
# Blocked because of `Cost$ 2 B PayLife<X>` -- an X-cost paid with LIFE, which
# the AI has no logic to size. Blasphemous Edict is a fixed-cost mass sacrifice.
# DEVIATION: Deluge is scalable, symmetric and dodges indestructible; the Edict
# is an edict effect that opponents choose for, so it kills different creatures.
Toxic Deluge: Blasphemous Edict
# Blocked because "draw X, then discard 3" is a symmetrical drawback it can't
# evaluate. Umbral Collar Zealot is a repeatable sac-for-value outlet the AI can
# pilot, keeping the "sacrifice converts to cards" slot filled.
# DEVIATION: far smaller effect, and a creature rather than an enchantment.
Greater Good: Umbral Collar Zealot
# Black Sun's Zenith and Cauldron of Souls are also AI-blocked but are NOT
# substituted: no close AI-playable analogue exists, and swapping them would
# distort the -1/-1 theme more than leaving the slot inert. They stay in the
# deck, remain uncast, and are reported as "never cast (AI-blocked)".

View file

@ -0,0 +1,141 @@
# Variant recipes for tools/generate.py -- role-budget reallocation hypotheses.
#
# Each recipe is a reallocation: shift N slots from one role to another, then
# let tools/generate.py pick which specific cards to cut and add. Cuts come
# from the weakest cards in the over-served role; adds come from the best
# unused cards in the under-served one.
#
# Deltas for each recipe must sum to zero so the deck stays at 100 cards.
#
# python3 tools/generate.py --deck decks/reaper-king-no-more --list
# python3 tools/generate.py --deck decks/reaper-king-no-more
# python3 tools/generate.py --deck decks/reaper-king-no-more --only aggro-hate
recipes:
aggro-hate:
why: >
15 of 17 losses were life hitting 0 against aggro. Trade combo
redundancy for sweepers and spot removal.
deltas:
removal_mass: 3
removal_spot: 2
minus_engine: -3
sac_outlet: -2
card-engine:
why: >
Only 1 real draw engine in 99 cards. An aristocrats deck that draws
off its own deaths should never run out of gas.
deltas:
draw: 5
death_trigger: 2
minus_engine: -4
ramp: -3
opponent-facing:
why: >
The commander only steals from OPPONENTS' creatures. Maximise cards
that trigger on their deaths and put counters on their board.
deltas:
opp_death: 5
removal_spot: 2
sac_outlet: -3
ramp: -2
minus_engine: -2
go-wide:
why: >
Token swarms feed sac outlets and the -1/-1 engine simultaneously.
Tests whether bodies beat individually stronger cards.
deltas:
tokens: 5
sac_payoff: 2
minus_engine: -3
removal_spot: -2
ramp: -2
proliferate:
why: >
Proliferate multiplies -1/-1 counters, turning one trigger into many.
A different engine for the same theme.
deltas:
proliferate: 5
minus_engine: 1
ramp: -3
sac_outlet: -3
grindy:
why: >
Recursion + drain: never combo, just refuse to lose and bleed the
table out. Tests whether this deck wants to be a value pile.
deltas:
reanimate: 3
drain: 3
draw: 2
minus_engine: -4
sac_outlet: -2
ramp: -2
# Hand-curated variants for tools/make_variants.py -- explicit cut/add lists
# against the baseline, rather than a role-budget reallocation. Each is a
# specific hypothesis about specific cards (see plan.md section 6b/6c for
# how these were chosen).
#
# python3 tools/make_variants.py --deck decks/reaper-king-no-more --list
# python3 tools/make_variants.py --deck decks/reaper-king-no-more
handwritten:
no-mikaeus:
why: "Baseline. Aristocrats + -1/-1, every combo needs board state."
cut: []
add: []
mikaeus:
why: >
Does the highest-leverage combo card (28 combos) stay legal?
Expected FAIL: goes infinite with every sac outlet.
cut: ["Humble Defector"]
add: ["Mikaeus, the Unhallowed"]
lean-outlets:
why: >
The deck runs 8 sac outlets and probably needs ~5. Cut 3 for
interaction and card advantage -- does consistency actually drop?
cut: ["Woe Strider", "Yahenni, Undying Partisan", "Greater Good"]
add: ["Bloodchief Ascension", "Toshiro Umezawa", "Fiery Cannonade"]
commander-focus:
why: >
The commander only steals from OPPONENTS' creatures, but the deck's
-1/-1 engine mostly counters our own. Push counters onto their board.
cut: ["Putrid Goblin", "Cauldron of Souls", "Murderous Redcap", "Woe Strider"]
add: ["Mari, the Killing Quill", "Sangromancer", "Patron of the Vein",
"Slaughter Specialist"]
heavy-removal:
why: >
Bracket 3 pods interact. Trade combo redundancy for removal and see
whether surviving longer beats assembling faster.
cut: ["Flourishing Defenses", "Nest of Scarabs", "Obelisk Spider",
"Persistent Constrictor"]
add: ["Fiery Cannonade", "Vraska, the Silencer", "Meathook Massacre II",
"Go for the Throat"]
fast-ramp:
why: >
6 of 10 ramp pieces cost 3+, and the deck already has 22 three-drops.
T3 ramp means NOT deploying an engine piece. Swap the 3-mana fetch
spells for 1-mana dorks -- which are also creatures, so they feed the
sac outlets and the -1/-1 engine instead of being do-nothing sorceries.
cut: ["Cultivate", "Kodama's Reach", "Springbloom Druid", "Wood Elves",
"Binding the Old Gods"]
add: ["Llanowar Elves", "Elvish Mystic", "Fyndhorn Elves",
"Ignoble Hierarch", "Delighted Halfling"]
low-curve:
why: >
Avg MV is 3.02 and the engine lands ~T6. Cut the top of the curve
entirely -- does the deck come online sooner and win more?
cut: ["Massacre Wurm", "Overseer of the Damned", "Archfiend of Ifnir",
"Grim Poppet", "Cauldron of Souls"]
add: ["Malakir Cullblade", "Slaughter Specialist", "Bloodchief Ascension",
"Nurgle's Rot", "Chevill, Bane of Monsters"]

Some files were not shown because too many files have changed in this diff Show more