mtg/decks/reaper-king-no-more/decks/fast-ramp/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

58 lines
3 KiB
Text

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