Skip to content

sideboard_matrix returns FLEX for every card across every matchup #63

@j4th

Description

@j4th

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 / REBIN vs Dimir Tempo, Sneak and Show, mirror, Doomsday; OUT vs Eldrazi, Ocelot Pride (no blue targets).
  • HydroblastIN vs Painter (white-bordered Painter combos with red), Burn-adjacent decks; OUT vs Lands.
  • Surgical ExtractionIN vs Oops! All Spells, Doomsday, Sneak and Show; OUT vs Ocelot Pride, Eldrazi.
  • PyroclasmIN 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):

  1. The matchup-classification heuristic isn't being invoked per cell — output may be initialized to FLEX and never updated.
  2. The archetype identifier passed into the heuristic isn't matching the known-archetype table, so every cell falls through to the default.
  3. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions