Skip to content

Quoted grants of replacement-shaped abilities ("if it would leave the battlefield, exile it instead") parse to an inert GrantAbility and never fire #6566

Description

@michiot05

Summary

A quoted ability grant of a replacement-shaped effect — e.g. it gains "If this creature would leave the battlefield, exile it instead of putting it anywhere else" — currently parses to an inert ContinuousModification::GrantAbility. The concretized ability body is pushed into obj.abilities (crates/engine/src/game/layers.rs), never into replacement_definitions, so the replacement never fires — the redirect is silently a no-op. Affected entries also carry a SwallowedClause / Replacement_Instead parse warning.

Surfaced during review of #6538 (unearth's standalone leave-battlefield exile rider); the granted variant is a distinct, pre-existing gap and was correctly held out of that PR.

Affected cards (5 — verified against card-data.json)

Exactly the cards that carry the Replacement_Instead warning and an inert GrantAbility for this rider:

  • Elemental Expressionist — grants it until end of turn (must lapse at cleanup, CR 611.2a / 514.2).
  • Geth, Thane of Contracts — permanent grant on a reanimation ability. (Correction: my initial draft named "Geth, Lord of the Vault" — that printing has no such rider; the matching card is Thane of Contracts.)
  • Llanowar Greenwidow — permanent (also has a separate unimplemented cost-reduction clause, out of scope).
  • Realmbreaker, the Invasion Tree — permanent.
  • Spirit-Sister's Call — permanent.

Out of scope / separate gaps

  • Magar of the Magic Strings and The Eighth Doctor — their whole granting clause is Effect::Unimplemented (a face-down-manifest body / a play-from-graveyard permission), so they never reach the GrantAbility seam; separate parser gaps.
  • Geth, Lord of the Vault — no such rider on its current printing.

Expected

A quoted grant of a replacement-shaped ability should install a granted, duration-bound replacement effect that (a) redirects the event while active, and (b) honors the grant's stated duration (lapses at cleanup for until end of turn; persists for permanent grants — CR 611.2a) via the layer system, not the object-lifetime host stamp used for standalone reanimation riders (#6538).

Seam

oracle_static::classify_quoted_inner must recognize a quoted replacement clause and route it to a granted ReplacementDefinition (a new ContinuousModification::GrantReplacement) re-applied each layer pass (CR 613.1f), rather than collapsing it to an inert GrantAbility. Runtime install: the Layer-6 apply in layers.rs.

Repro (Elemental Expressionist): grant the rider to a creature, then destroy/sacrifice it within the turn → it should be exiled, not sent to the graveyard; after cleanup the rider should be gone.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions