mtg/decks/reaper-king-no-more/decks/aggro-hate/card_stats.txt
mark rosenberg d4a8a587f0 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
2026-09-12 00:37:42 -04:00

86 lines
3.5 KiB
Text

==========================================================================
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