Summary
sideboard_matrix produces output where every cell is FLEX, regardless of card or matchup. The matrix is well-formed (correct columns, auto-detected matchups from metagame data) but the per-cell IN/OUT/FLEX classification is uniform, making the output non-actionable.
Per #50 spec, cells should indicate IN (bring in), OUT (cut), or FLEX (context-dependent). In practice everything resolves to FLEX.
Reproduction
Tuned Legacy Izzet Tempo list with a Legacy-typical sideboard:
sideboard_matrix(
format="Legacy",
decklist=[
"4 Dragon's Rage Channeler", "3 Murktide Regent", "1 Subtlety",
"4 Force of Will", "2 Force of Negation", "4 Daze", "2 Spell Pierce",
"4 Stifle", "4 Brainstorm", "4 Ponder", "4 Mishra's Bauble",
"3 Lightning Bolt", "1 Unholy Heat", "1 Consign to Memory",
"4 Wasteland", "4 Volcanic Island", "3 Scalding Tarn", "3 Polluted Delta",
"2 Misty Rainforest", "1 Otawara, Soaring City", "1 Mystic Sanctuary",
"1 Thundering Falls"
],
sideboard=[
"3 Pyroblast", "1 Red Elemental Blast", "2 Hydroblast",
"2 Force of Negation", "2 Surgical Extraction", "2 Disruptor Flute",
"1 Meltdown", "1 Pyroclasm", "1 Tormod's Crypt"
],
)
Actual output
| Card | Dimir Tempo | Sneak and Show | Oops! All | Ocelot Pride | Izzet Delver | Eldrazi |
|---------------------|-------------|----------------|-----------|--------------|--------------|---------|
| Pyroblast | FLEX | FLEX | FLEX | FLEX | FLEX | FLEX |
| Red Elemental Blast | FLEX | FLEX | FLEX | FLEX | FLEX | FLEX |
| Hydroblast | FLEX | FLEX | FLEX | FLEX | FLEX | FLEX |
| Force of Negation | FLEX | FLEX | FLEX | FLEX | FLEX | FLEX |
| Surgical Extraction | FLEX | FLEX | FLEX | FLEX | FLEX | FLEX |
| Disruptor Flute | FLEX | FLEX | FLEX | FLEX | FLEX | FLEX |
| Meltdown | FLEX | FLEX | FLEX | FLEX | FLEX | FLEX |
| Pyroclasm | FLEX | FLEX | FLEX | FLEX | FLEX | FLEX |
| Tormod's Crypt | FLEX | FLEX | FLEX | FLEX | FLEX | FLEX |
The metagame auto-detection works (top-6 Legacy archetypes are correctly populated as columns). The classification step is what fails.
Expected output
A reasonable Legacy player would expect, for example:
- Pyroblast / REB →
IN vs Dimir Tempo, Sneak and Show, mirror, Doomsday; OUT vs Eldrazi, Ocelot Pride (no blue targets).
- Hydroblast →
IN vs Painter (white-bordered Painter combos with red), Burn-adjacent decks; OUT vs Lands.
- Surgical Extraction →
IN vs Oops! All Spells, Doomsday, Sneak and Show; OUT vs Ocelot Pride, Eldrazi.
- Pyroclasm →
IN vs Ocelot Pride, Goblins, Merfolk; OUT vs combo, Eldrazi.
These distinctions don't require tournament data — most are decidable from card oracle text + archetype color/strategy class.
Suspected root cause
Likely candidates (without source access):
- The matchup-classification heuristic isn't being invoked per cell — output may be initialized to
FLEX and never updated.
- The archetype identifier passed into the heuristic isn't matching the known-archetype table, so every cell falls through to the default.
- The function reads metagame data successfully (columns are populated) but the role-mapping step between "archetype X" and "card Y matches role Z" isn't running.
Worth checking whether any cell ever resolves to IN or OUT in any test fixture.
Cross-reference
Originating feature: #50
Environment
- Server: live Smithery deployment (
mtg-mcp-server.fastmcp.app/mcp)
- Format tested: Legacy
- Date: 2026-05-03
Summary
sideboard_matrixproduces output where every cell isFLEX, regardless of card or matchup. The matrix is well-formed (correct columns, auto-detected matchups from metagame data) but the per-cell IN/OUT/FLEX classification is uniform, making the output non-actionable.Per #50 spec, cells should indicate
IN(bring in),OUT(cut), orFLEX(context-dependent). In practice everything resolves toFLEX.Reproduction
Tuned Legacy Izzet Tempo list with a Legacy-typical sideboard:
Actual output
The metagame auto-detection works (top-6 Legacy archetypes are correctly populated as columns). The classification step is what fails.
Expected output
A reasonable Legacy player would expect, for example:
INvs Dimir Tempo, Sneak and Show, mirror, Doomsday;OUTvs Eldrazi, Ocelot Pride (no blue targets).INvs Painter (white-bordered Painter combos with red), Burn-adjacent decks;OUTvs Lands.INvs Oops! All Spells, Doomsday, Sneak and Show;OUTvs Ocelot Pride, Eldrazi.INvs Ocelot Pride, Goblins, Merfolk;OUTvs combo, Eldrazi.These distinctions don't require tournament data — most are decidable from card oracle text + archetype color/strategy class.
Suspected root cause
Likely candidates (without source access):
FLEXand never updated.Worth checking whether any cell ever resolves to
INorOUTin any test fixture.Cross-reference
Originating feature: #50
Environment
mtg-mcp-server.fastmcp.app/mcp)