Skip to content

fix(engine): fifteen M19 cards did not match the card that was printed - #829

Merged
ninthworld merged 1 commit into
mainfrom
fix/m19-card-accuracy
Aug 8, 2026
Merged

ninthworld merged 1 commit into
mainfrom
fix/m19-card-accuracy

Conversation

@ninthworld

Copy link
Copy Markdown
Owner

Closes #820. Part of #819.

Diffed all 299 catalog definitions against the real set data — printed characteristics mechanically, ability text by reading each definition beside its Oracle text. Fifteen cards were wrong, and every one passed make check.

Printed characteristics (12)

Card Field Was Printed
dismissive_pyromancer cost, P/T {2}{R}, 2/1 {1}{R}, 2/2
enigma_drake cost {2}{U}{R} {1}{U}{R}
gargoyle_sentinel toughness 3/4 3/3
ghastbark_twins cost, P/T {4}{G}, 5/5 {5}{G}{G}, 7/7
goblin_trashmaster subtypes ["Goblin"] ["Goblin","Warrior"]
goreclaw_terror_of_qal_sisma cost, P/T {4}{G}, 4/4 {3}{G}, 4/3
hired_blade power 2/2 3/2
magistrate_s_scepter cost {4} {3}
marauder_s_axe cost {3} {2}
mistcaller cost, subtypes, power {1}{U}, ["Spirit"], 2/1 {U}, ["Merfolk","Wizard"], 1/1
regal_bloodlord cost, colours, subtypes {3}{B}{B}, mono-black, ["Vampire","Noble"] {3}{W}{B}, W+B, ["Vampire","Soldier"]
runic_armasaur cost, power {2}{G}, 1/5 {1}{G}{G}, 2/5

enigma_drake prints *; base 0 plus defined_power is the catalog's way of saying that and stays. Only its cost changed.

Costs, amounts, trigger scopes (8)

  • dismissive_pyromancer{R} missing from the draw ability's cost, {T} missing from the damage ability's. The second was activatable while tapped and the turn it landed.
  • goblin_trashmaster — a {1}{R} the card does not print. Sacrifice a Goblin is the whole cost.
  • ravenous_harpy — cost {B} instead of {1}, plus a gain_life effect the card does not have.
  • gift_of_paradise — gained 2, prints 3.
  • marauder_s_axe — granted +2/+1, prints +2/+0.
  • regal_bloodlord — watched only its controller's end step (prints each), and made a 2/2 (prints 1/1).
  • mistcaller — a flash keyword it never had.
  • sigiled_sword_of_valeron — the Knight arrived tapped; the card says only "that's attacking", and the token has vigilance precisely so it does not tap.

Tests

The suites asserted against the definitions, so they cemented the bugs. Every one is corrected rather than relaxed:

  • issue_740_gift_of_paradise_enchants_a_land_and_gains_two_life..._three_life, for a card that gains three.
  • m19_mistcaller.rs had a flash test on a card with no flash. Inverted: Mistcaller is now the control that is bound by the sorcery-speed gate, with Hired Blade as the card that isn't. Hired Blade's own file already owns the keyword's positive coverage.
  • blocking_an_additional_creature.rs leaned on the Twins being a 5/5 in four assertions. At 7/7 the spread numbers move (3+4 instead of 3+2), and one attacker now dies where it used to survive — which is a better demonstration that the damage-assignment order is load-bearing. Two tests needed an attacker bigger than the blocker to stay meaningful and use Aggressive Mammoth, with the reason stated in each.

Six tests added, stating the printed cost directly — an offer is where a wrong cost is visible, because a missing symbol makes an ability cheaper and cheap is the direction nothing else complains about:

  • the Pyromancer's draw ability is not offered off an empty pool, and is off one red
  • the Pyromancer's damage ability is not offered while tapped, nor the turn it arrived
  • the Trashmaster's ability is offered off an empty pool
  • the Harpy costs one generic and gains no life
  • the Bloodlord fires on an opponent's end step and makes a 1/1
  • the Sigiled Sword's Knight arrives attacking and untapped

What this does not fix

resplendent_angel (a whole ability missing) and skyrider_patrol (two target slots for one printed target) need vocabulary the IR does not have. They are #821.

Nothing here would have been caught by a machine. #822 is the gate that changes that.

make verify green — including e2e-smoke and cargo deny. make compat shows no drift.

🤖 Generated with Claude Code

Diffed every one of the 299 catalog definitions against the real set data:
printed characteristics mechanically, ability text by reading each definition
beside its Oracle text. Fifteen cards were wrong and every one of them passed
`make check` (#819).

Twelve had wrong printed characteristics — mana cost, power/toughness,
subtypes, colours. Regal Bloodlord was the worst of them: a mono-black card in
the catalog and a white-black gold card in the set, so it was castable off the
wrong mana.

Eight had wrong costs, amounts, or trigger scopes. Dismissive Pyromancer was
missing the {R} from one ability's cost and the {T} from the other's; Goblin
Trashmaster carried a {1}{R} the card does not print; Ravenous Harpy cost {B}
and gained a life the card does not give; Gift of Paradise gained two; the Axe
granted +2/+1; Regal Bloodlord watched only its controller's end step and made
a 2/2; Mistcaller had a flash it never had; the Sigiled Sword's Knight arrived
tapped where the card says only "attacking".

The tests asserted against the definitions rather than against the cards, so
they cemented the bugs rather than catching them — one was named
`..._gains_two_life` for a card that gains three. Each is corrected here, not
relaxed, and where a test used a wrong number as a convenient fixture the
numbers moved with it: the Twins are a 7/7 now, so the combat-spread tests that
leaned on 5 power say 7, and the two that needed an attacker bigger than the
blocker use an 8/8.

Six new tests state the printed cost directly, because an offer is where a
wrong cost is visible — a missing symbol makes an ability cheaper, and cheap is
the direction nothing else complains about.

Closes #820. Part of #819.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ninthworld
ninthworld merged commit 9296aa6 into main Aug 8, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(engine): fifteen M19 cards do not match the card that was printed

1 participant