fix(engine): fifteen M19 cards did not match the card that was printed - #829
Merged
Merged
Conversation
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>
This was referenced Aug 8, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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)
dismissive_pyromancer{2}{R}, 2/1{1}{R}, 2/2enigma_drake{2}{U}{R}{1}{U}{R}gargoyle_sentinelghastbark_twins{4}{G}, 5/5{5}{G}{G}, 7/7goblin_trashmaster["Goblin"]["Goblin","Warrior"]goreclaw_terror_of_qal_sisma{4}{G}, 4/4{3}{G}, 4/3hired_blademagistrate_s_scepter{4}{3}marauder_s_axe{3}{2}mistcaller{1}{U},["Spirit"], 2/1{U},["Merfolk","Wizard"], 1/1regal_bloodlord{3}{B}{B}, mono-black,["Vampire","Noble"]{3}{W}{B}, W+B,["Vampire","Soldier"]runic_armasaur{2}{G}, 1/5{1}{G}{G}, 2/5enigma_drakeprints*; base 0 plusdefined_poweris 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 Goblinis the whole cost.ravenous_harpy— cost{B}instead of{1}, plus again_lifeeffect 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— aflashkeyword it never had.sigiled_sword_of_valeron— the Knight arrivedtapped; 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.rshad 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.rsleaned 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:
What this does not fix
resplendent_angel(a whole ability missing) andskyrider_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 verifygreen — includinge2e-smokeandcargo deny.make compatshows no drift.🤖 Generated with Claude Code