Skip to content

fix(engine): resolve triaged card interaction bugs#5353

Merged
matthewevans merged 9 commits into
mainfrom
ship/fix-engine-triaged-card-bugs
Jul 8, 2026
Merged

fix(engine): resolve triaged card interaction bugs#5353
matthewevans merged 9 commits into
mainfrom
ship/fix-engine-triaged-card-bugs

Conversation

@matthewevans

Copy link
Copy Markdown
Member

No description provided.

@matthewevans matthewevans enabled auto-merge July 8, 2026 01:33

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request transitions graveyard-to-hand returns from Effect::Bounce to Effect::ChangeZone, implements permission pruning for same-source exile grants, adds support for Last Known Information (LKI) in shared quality filters, and introduces parsing for possessive P/T comparisons and same-source exile invalidation riders. The review feedback primarily highlights style guide violations, specifically missing mandatory CR annotations (Rule R6) across several new engine functions and the use of verbatim string matching (Rule R1) in the new exile invalidation parser, which should be refactored to use modular nom combinators.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment on lines +263 to +267
fn prune_replaced_play_from_exile_permissions(
state: &mut GameState,
target_id: crate::types::identifiers::ObjectId,
granted: &CastingPermission,
) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

[MEDIUM] Missing mandatory CR annotation for game-rule implementation.

Evidence: crates/engine/src/game/effects/grant_permission.rs:263.

Why it matters: Every rules-touching line of engine code must carry a verified CR <number>: <description> comment per repository style guide rule R6.

Suggested fix: Add a comment citing CR 611.2a above the function.

// CR 611.2a: Furious Rise-class permissions last until a source-specific invalidation event.
fn prune_replaced_play_from_exile_permissions(
    state: &mut GameState,
    target_id: crate::types::identifiers::ObjectId,
    granted: &CastingPermission,
) {
References
  1. Every rules-touching line of engine code must carry a comment of the form CR : . (link)

let values =
object_shared_quality_values(reference_obj, quality, &state.all_creature_types);
.any(|reference_id| {
let values = state

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

[MEDIUM] Missing mandatory CR annotation for LKI lookup.

Evidence: crates/engine/src/game/filter.rs:5025.

Why it matters: Every rules-touching line of engine code must carry a verified CR <number>: <description> comment per repository style guide rule R6.

Suggested fix: Add a comment citing CR 608.2h for Last Known Information (LKI) lookup.

Suggested change
let values = state
// CR 608.2h: If an object is no longer in the expected zone, the effect uses its last known information (LKI).
let values = state
References
  1. Every rules-touching line of engine code must carry a comment of the form CR : . (link)

Comment on lines +943 to +949
let (input, _) = alt((
tag::<_, _, OracleError<'_>>("~"),
tag("this enchantment"),
tag("this artifact"),
tag("this creature"),
tag("this permanent"),
))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

[MEDIUM] Avoid verbatim string equality for parsing Oracle phrases like 'this '.

Why it matters: Verbatim string equality bypasses the robust nom-based parser and creates fragile matches. Instead, decompose compound phrases into modular, reusable parsers for constituent parts (e.g., 'this' followed by a card type) and compose them using idiomatic combinator aggregates to prevent combinatorial explosion and improve maintainability.

Suggested fix: Decompose the phrase by parsing 'this ' followed by a modular card type parser.

    let (input, _) = alt((
        tag::<_, _, OracleError<'_>>("~"),
        preceded(tag("this "), card_type),
    ))
References
  1. Avoid verbatim string equality for parsing Oracle phrases as it bypasses the robust nom-based parser and creates fragile matches. Instead, decompose compound phrases into modular, reusable parsers for constituent parts (e.g., subjects, conjunctions) and compose them using idiomatic combinator aggregates (like nested alt and tag sequences) to prevent combinatorial explosion and improve maintainability.

Comment on lines +1648 to +1650
fn lift_shared_quality_parent_target_to_triggering_source_in_ability(
ability: &mut AbilityDefinition,
) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

[MEDIUM] Missing mandatory CR annotation for trigger-source target lifting.

Evidence: crates/engine/src/parser/oracle_trigger.rs:1648.

Why it matters: Every rules-touching line of engine code must carry a verified CR <number>: <description> comment per repository style guide rule R6.

Suggested fix: Add a comment citing CR 608.2c above the function.

Suggested change
fn lift_shared_quality_parent_target_to_triggering_source_in_ability(
ability: &mut AbilityDefinition,
) {
// CR 608.2c: Lift shared quality parent target references to the triggering source when no fresh target is introduced.
fn lift_shared_quality_parent_target_to_triggering_source_in_ability(
ability: &mut AbilityDefinition,
) {
References
  1. Every rules-touching line of engine code must carry a comment of the form CR : . (link)

})
}

fn parse_cost_paid_object_possessive_pt_comparison(lower: &str) -> Option<AbilityCondition> {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

[MEDIUM] Missing mandatory CR annotation for cost-paid object P/T comparison parser.

Evidence: crates/engine/src/parser/oracle_effect/conditions.rs:5713.

Why it matters: Every rules-touching line of engine code must carry a verified CR <number>: <description> comment per repository style guide rule R6.

Suggested fix: Add a comment citing CR 608.2h above the function.

Suggested change
fn parse_cost_paid_object_possessive_pt_comparison(lower: &str) -> Option<AbilityCondition> {
// CR 608.2h: Parse comparisons against the last known power/toughness of a cost-paid object.
fn parse_cost_paid_object_possessive_pt_comparison(lower: &str) -> Option<AbilityCondition> {
References
  1. Every rules-touching line of engine code must carry a comment of the form CR : . (link)

@github-actions

github-actions Bot commented Jul 8, 2026

Copy link
Copy Markdown

Parse changes introduced by this PR · 642 card(s), 455 signature(s) (baseline: main 4668beaf6821)

80 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control creature)

Examples: Aerith, Last Ancient, Aid the Fallen, Alter Fate (+77 more)

80 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control creature, to=hand)

Examples: Aerith, Last Ancient, Aid the Fallen, Alter Fate (+77 more)

49 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=self)

Examples: A-Earthquake Dragon, Abzan Devotee, Altar of the Wretched (+46 more)

49 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, kind=activated, target=self, to=hand)

Examples: A-Earthquake Dragon, Abzan Devotee, Altar of the Wretched (+46 more)

38 card(s) · ability/Bounce · removed: Bounce (target=self)

Examples: Adéwalé, Breaker of Chains, Aurora Eidolon, Aurora Phoenix (+35 more)

38 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=self, to=hand)

Examples: Adéwalé, Breaker of Chains, Aurora Eidolon, Aurora Phoenix (+35 more)

29 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control instant or in graveyard you control sorcery)

Examples: Archaeomancer, Ardent Elementalist, Call to Mind (+26 more)

29 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control instant or in graveyard you control sorcery, to=hand)

Examples: Archaeomancer, Ardent Elementalist, Call to Mind (+26 more)

28 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control card)

Examples: Auroral Procession, Bala Ged Recovery, Charnelhoard Wurm (+25 more)

28 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control card, to=hand)

Examples: Auroral Procession, Bala Ged Recovery, Charnelhoard Wurm (+25 more)

23 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control permanent)

Examples: Acolyte of Affliction, Aether Helix, Ancestral Communion (+20 more)

23 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control permanent, to=hand)

Examples: Acolyte of Affliction, Aether Helix, Ancestral Communion (+20 more)

22 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control creature, targets=0-2)

Examples: Another Chance, Back for Seconds, Baloth Null (+19 more)

22 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control creature, targets=0-2, to=hand)

Examples: Another Chance, Back for Seconds, Baloth Null (+19 more)

19 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control artifact)

Examples: Archaeomender, Call Damage Control, Catch-Up Mechanic (+16 more)

19 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control artifact, to=hand)

Examples: Archaeomender, Call Damage Control, Catch-Up Mechanic (+16 more)

12 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control creature)

Examples: Adun Oakenshield, Cabal Surgeon, Draugr Recruiter (+9 more)

12 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, kind=activated, target=in graveyard you control creature, to=hand)

Examples: Adun Oakenshield, Cabal Surgeon, Draugr Recruiter (+9 more)

9 card(s) · ability/Bounce · removed: Bounce (conditional=previous effect outcome, target=self)

Examples: Centaur Vinecrasher, Erebos's Titan, Furious Forebear (+6 more)

9 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control creature, targets=0-1)

Examples: A-Fates' Reversal, Courier Bat, Fates' Reversal (+6 more)

9 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control enchantment)

Examples: Auramancer, Call Damage Control, Dawn to Dusk (+6 more)

9 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control land)

Examples: A-Circle of the Land Druid, Call Damage Control, Cartographer (+6 more)

9 card(s) · ability/ChangeZone · added: ChangeZone (conditional=previous effect outcome, from=graveyard, target=self, to=hand)

Examples: Centaur Vinecrasher, Erebos's Titan, Furious Forebear (+6 more)

9 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control creature, targets=0-1, to=hand)

Examples: A-Fates' Reversal, Courier Bat, Fates' Reversal (+6 more)

9 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control enchantment, to=hand)

Examples: Auramancer, Call Damage Control, Dawn to Dusk (+6 more)

… 430 more signature(s) (649 card-changes) — see parse-diff.json
  • 9 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control land, to=hand)
  • 5 card(s) · ability/Bounce · removed: Bounce (conditional=when you do, target=in graveyard you control creature)
  • 5 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control artifact)
  • 5 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control card)
  • 5 card(s) · ability/Bounce · removed: Bounce (target=in graveyard creature)
  • 5 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control artifact or in graveyard you control enchantment)
  • 5 card(s) · ability/Bounce · removed: Bounce (target=mv 3- in graveyard you control creature)
  • 5 card(s) · ability/ChangeZone · added: ChangeZone (conditional=when you do, from=graveyard, target=in graveyard you control creature, to=hand)
  • 5 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, kind=activated, target=in graveyard you control artifact, to=hand)
  • 5 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, kind=activated, target=in graveyard you control card, to=hand)
  • 5 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard creature, to=hand)
  • 5 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control artifact or in graveyard you control enchantment, to=hand)
  • 5 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=mv 3- in graveyard you control creature, to=hand)
  • 4 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=self, timing=sorcery speed)
  • 4 card(s) · ability/Bounce · removed: Bounce (target=another in graveyard you control creature)
  • 4 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control artifact or in graveyard you control creature)
  • 4 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control creature or in graveyard you control land)
  • 4 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control permanent, targets=0-1)
  • 4 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control permanent, targets=0-2)
  • 4 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control sorcery)
  • 4 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, kind=activated, target=self, timing=sorcery speed, to=hand)
  • 4 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=another in graveyard you control creature, to=hand)
  • 4 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control artifact or in graveyard you control creature, to=hand)
  • 4 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control creature or in graveyard you control land, to=hand)
  • 4 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control permanent, targets=0-1, to=hand)
  • 4 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control permanent, targets=0-2, to=hand)
  • 4 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control sorcery, to=hand)
  • 3 card(s) · ability/Bounce · removed: Bounce (conditional=additional cost was paid, target=in graveyard you control creature)
  • 3 card(s) · ability/Bounce · removed: Bounce (conditional=additional cost was paid, target=in graveyard you control instant or in graveyard you control sorcery)
  • 3 card(s) · ability/Bounce · removed: Bounce (conditional=previous effect outcome, target=in graveyard you control creature)
  • 3 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=another in graveyard you control creature)
  • 3 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control creature, timing=sorcery speed)
  • 3 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control enchantment)
  • 3 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control instant or in graveyard you control sorcery)
  • 3 card(s) · ability/Bounce · removed: Bounce (target=another in graveyard you control artifact)
  • 3 card(s) · ability/Bounce · removed: Bounce (target=creature, targets=0-1)
  • 3 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control Aura or in graveyard you control Equipment)
  • 3 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control creature or in graveyard you control planeswalker)
  • 3 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control creature, targets=X-X)
  • 3 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control instant or in graveyard you control sorcery, targets=0-2)
  • 3 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control instant)
  • 3 card(s) · ability/Bounce · removed: Bounce (target=mv 3- in graveyard you control permanent)
  • 3 card(s) · ability/Bounce · removed: Bounce (target=shares creature type in graveyard you control creature, targets=2-2)
  • 3 card(s) · ability/ChangeZone · added: ChangeZone (conditional=additional cost was paid, from=graveyard, target=in graveyard you control creature, to=hand)
  • 3 card(s) · ability/ChangeZone · added: ChangeZone (conditional=additional cost was paid, from=graveyard, target=in graveyard you control instant or in graveyard you control sorcery, to=hand)
  • 3 card(s) · ability/ChangeZone · added: ChangeZone (conditional=previous effect outcome, from=graveyard, target=in graveyard you control creature, to=hand)
  • 3 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, kind=activated, target=another in graveyard you control creature, to=hand)
  • 3 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, kind=activated, target=in graveyard you control creature, timing=sorcery speed, to=hand)
  • 3 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, kind=activated, target=in graveyard you control enchantment, to=hand)
  • 3 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, kind=activated, target=in graveyard you control instant or in graveyard you control sorcery, to=hand)
  • 3 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=another in graveyard you control artifact, to=hand)
  • 3 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=creature, targets=0-1, to=hand)
  • 3 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control Aura or in graveyard you control Equipment, to=hand)
  • 3 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control creature or in graveyard you control planeswalker, to=hand)
  • 3 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control creature, targets=X-X, to=hand)
  • 3 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control instant or in graveyard you control sorcery, targets=0-2, to=hand)
  • 3 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control instant, to=hand)
  • 3 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=mv 3- in graveyard you control permanent, to=hand)
  • 3 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=shares creature type in graveyard you control creature, targets=2-2, to=hand)
  • 3 card(s) · ability/ChangeZoneAll · field target: parent targetAura
  • 3 card(s) · ability/TargetOnly · added: TargetOnly (target=player)
  • 2 card(s) · ability/Bounce · removed: Bounce (conditional=previous effect outcome, target=in graveyard you control instant or in graveyard you control sorcery)
  • 2 card(s) · ability/Bounce · removed: Bounce (conditional=when you do, target=in graveyard you control instant or in graveyard you control sorcery)
  • 2 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=card)
  • 2 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control creature, targets=0-2)
  • 2 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control creature, targets=0-3)
  • 2 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control instant or in graveyard you control sorcery, timing=sorcery speed)
  • 2 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control land)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=another in graveyard you control Elf)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=any)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=card, targets=0+)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=creature)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=historic in graveyard you control card)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control Goblin)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control Villain)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control card non-creature non-land)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control card, targets=X-X)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control creature or in graveyard you control enchantment)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control creature, targets=1-2)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control creature, targets=2-2)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control instant or in graveyard you control sorcery, targets=0-1)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control land, targets=0-3)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control permanent, targets=1-2)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=instant or sorcery)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=instant, targets=0-1)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=mv 2- in graveyard you control creature)
  • 2 card(s) · ability/Bounce · removed: Bounce (target=scoped player controls in graveyard creature)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (conditional=previous effect outcome, from=graveyard, target=in graveyard you control instant or in graveyard you control sorcery, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (conditional=when you do, from=graveyard, target=in graveyard you control instant or in graveyard you control sorcery, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, kind=activated, target=card, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, kind=activated, target=in graveyard you control creature, targets=0-2, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, kind=activated, target=in graveyard you control creature, targets=0-3, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, kind=activated, target=in graveyard you control instant or in graveyard you control sorcery, timing=sorcery speed, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, kind=activated, target=in graveyard you control land, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=another in graveyard you control Elf, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=any, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=card, targets=0+, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=creature, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=historic in graveyard you control card, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control Goblin, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control Villain, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control card non-creature non-land, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control card, targets=X-X, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control creature or in graveyard you control enchantment, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control creature, targets=1-2, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control creature, targets=2-2, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control instant or in graveyard you control sorcery, targets=0-1, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control land, targets=0-3, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=in graveyard you control permanent, targets=1-2, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=instant or sorcery, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=instant, targets=0-1, to=hand)
  • 2 card(s) · ability/ChangeZone · added: ChangeZone (from=graveyard, target=mv 2- in graveyard you control creature, to=hand)
  • 2 card(s) · ability/ChangeZone · field target: parent targetcard
  • 2 card(s) · ability/ChangeZone · field target: parent targetin graveyard you control creature
  • 1 card(s) · ability/Attach · field target: selflast created
  • 1 card(s) · ability/Bounce · removed: Bounce (conditional=# of power ≥4 in battlefield you control creature ≥ 1, target=in graveyard you control creature, targets=0-1)
  • 1 card(s) · ability/Bounce · removed: Bounce (conditional=additional cost was paid, target=card)
  • 1 card(s) · ability/Bounce · removed: Bounce (conditional=additional cost was paid, target=in graveyard you control artifact)
  • 1 card(s) · ability/Bounce · removed: Bounce (conditional=cost-paid object is permanent, target=another in graveyard you control permanent)
  • 1 card(s) · ability/Bounce · removed: Bounce (conditional=previous effect outcome, target=another in graveyard you control Elf or in graveyard another you control Tyvar)
  • 1 card(s) · ability/Bounce · removed: Bounce (conditional=previous effect outcome, target=another in graveyard you control creature)
  • 1 card(s) · ability/Bounce · removed: Bounce (conditional=previous effect outcome, target=in graveyard you control Spirit, targets=0+)
  • 1 card(s) · ability/Bounce · removed: Bounce (conditional=previous effect outcome, target=in graveyard you control artifact or in graveyard you control enchantment)
  • 1 card(s) · ability/Bounce · removed: Bounce (conditional=previous effect outcome, target=in graveyard you control card)
  • 1 card(s) · ability/Bounce · removed: Bounce (conditional=previous effect outcome, target=in graveyard you control creature Rat, targets=0-2)
  • 1 card(s) · ability/Bounce · removed: Bounce (conditional=previous effect outcome, target=triggering source)
  • 1 card(s) · ability/Bounce · removed: Bounce (conditional=when you do, target=another in graveyard you control permanent)
  • 1 card(s) · ability/Bounce · removed: Bounce (conditional=when you do, target=in graveyard you control card, targets=0-# of each opponent whose PlayerCounter { kind: Poison, scope: ScopedPlayer } G…
  • 1 card(s) · ability/Bounce · removed: Bounce (conditional=when you do, target=in graveyard you control creature or in graveyard you control land)
  • 1 card(s) · ability/Bounce · removed: Bounce (conditional=when you do, target=in graveyard you control instant or in graveyard you control sorcery, targets=0-2)
  • 1 card(s) · ability/Bounce · removed: Bounce (conditional=when you do, target=in graveyard you control permanent non-land, targets=0-event amount)
  • 1 card(s) · ability/Bounce · removed: Bounce (conditional=when you do, target=in graveyard you control permanent)
  • 1 card(s) · ability/Bounce · removed: Bounce (duration=until end of combat, target=in graveyard you control creature or in graveyard you control planeswalker)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=another in graveyard you control Aura or in graveyard another you control Equipment)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=artifact, targets=0-1)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=basic in graveyard you control land)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=black in graveyard you control card)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=card + cards exiled by source)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=chosen card type in graveyard you control card)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=creature, targets=0-1)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=historic in graveyard you control card)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=historic in graveyard you control card, targets=0-1)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard creature, timing=sorcery speed)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control Arcane)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control Bat or in graveyard you control Lizard or in graveyard you control Rat or in graveyard you control Squi…
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control Dinosaur)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control Equipment or in graveyard you control Vehicle)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control Myr)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control Zombie)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control artifact creature)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control artifact or in graveyard you control enchantment)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control artifact, timing=sorcery speed)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control card, timing=sorcery speed)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control creature Dragon or in graveyard you control planeswalker Ugin)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control creature, targets=0-1)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control creature, targets=0-1, timing=sorcery speed)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control enchantment creature)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control land, targets=0-1, timing=sorcery speed)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=in graveyard you control permanent, timing=sorcery speed)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=multicolored in graveyard you control card, timing=sorcery speed)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=mv 1- in graveyard you control artifact)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=non-legendary in graveyard you control card, targets=X-X)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=with flashback you control in exile card)
  • 1 card(s) · ability/Bounce · removed: Bounce (kind=activated, target=you control card + cards exiled by source)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=another creature, targets=0-1)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=another permanent)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=any, targets=0-2)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=artifact, targets=0-1)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=black in graveyard you control creature)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=blue in graveyard you control creature or red in graveyard you control creature)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=blue in graveyard you control instant)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=blue scoped player controls in graveyard card)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=card + cards exiled by source)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=card)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=card, targets=0-event amount)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=card, targets=X-X)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=chosen card type scoped player controls in graveyard card)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=creature non-Avatar)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=creature, targets=0-# of named "~" in graveyard card+1)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=creature, targets=0-3)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=green in graveyard you control card)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=historic in graveyard you control card non-Assassin)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=in graveyard artifact or in graveyard enchantment)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=in graveyard card)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=in graveyard creature or in graveyard land)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=in graveyard instant or in graveyard sorcery or in graveyard creature)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=in graveyard instant or in graveyard sorcery, targets=0-1)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control Arcane)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control Assassin or Mercenary or Pirate or Rogue or Warlock card)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control Aura or in graveyard you control Equipment, targets=0-1)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control Cleric)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control Elf)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control Goblin, targets=0-1)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control Griffin)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control Hero)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control Knight)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control Mercenary)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control Ninja or in graveyard you control creature Rogue, targets=0-1)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control Pirate)
  • 1 card(s) · ability/Bounce · removed: Bounce (target=in graveyard you control Pirate, targets=2-2)

2 card(s) had Oracle-text changes (errata/reprint) — excluded as non-parser.

@matthewevans matthewevans added this pull request to the merge queue Jul 8, 2026
@matthewevans matthewevans removed this pull request from the merge queue due to a manual request Jul 8, 2026
@matthewevans matthewevans merged commit 3cc85ae into main Jul 8, 2026
13 checks passed
@matthewevans matthewevans deleted the ship/fix-engine-triaged-card-bugs branch July 8, 2026 04:09
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.

1 participant