Skip to content

Reflexive "when you do" fires when its mandatory parent did nothing (Cemetery Desecrator; #7414 remainder) #7511

Description

@cuinhellcat

A reflexive "when you do" fires even when its mandatory parent instruction did nothing. #7414 closed this for optional parents ("you may … When you do"); its description named the mandatory case as the remaining gap. This is that case, now with a paper card and a measurement.

Reproduction

Cemetery Desecrator — "When this creature enters or dies, exile another card from a graveyard. When you do, choose one — • Remove X counters from target permanent, where X is the mana value of the exiled card. • Target creature an opponent controls gets -X/-X until end of turn, where X is the mana value of the exiled card."

Board: Desecrator enters, opponent controls one creature, every graveyard empty. Nothing can be exiled.

Reported from a real game first; the attached-style save shows both graveyards at 0 with the trigger having asked. Reproduced in the engine as an integration test (cemetery_desecrator_reflexive_without_exile.rs, red against f7c44692f).

graveyards prompts the resolution asks
one card to exile (control) AbilityModeChoice, UnlessPayment
all empty AbilityModeChoice, UnlessPayment

The two rows are byte-identical today. That identity is the defect: the control is correct and the empty row must ask nothing at all.

Why this is not a cosmetic prompt

CR 603.12: a reflexive triggered ability triggers "based on whether the trigger event or events occurred earlier during the resolution of the spell or ability that created them". No card was exiled, so there is no event and the ability must never be created.

The second prompt in the row above is the consequence. UnlessPayment is ward on the opponent's creature: CR 702.21a — "Whenever this permanent becomes the target of a spell or ability an opponent controls, counter that spell or ability unless that player pays [cost]." So the false ability really targets, and its controller is really made to pay {2} — or lose an ability that should never have existed. A player pays a real cost because of this bug.

The same shape reaches further than one card. Anything with "become the target of" triggers fires falsely. And on the same class, Vhal, Scholar of Mortality ("remove all study counters from it. When you do, put target creature card with mana value less than or equal to the number of study counters removed this way from a graveyard onto the battlefield") turns it into a gain rather than a cost: zero removed means mana value ≤ 0, so a 0-cost creature in a graveyard is a legal target and gets reanimated for free.

Why it was left open in #7414

Quoting that PR:

A mandatory parent that silently does nothing still fires its reflexive — Vhal, Scholar of Elements … with no study counters. Closing that needs a per-effect did-anything-happen record, which does not exist; the observable damage there is 0.

That reasoning still holds for the mechanism. What has changed is the evidence: the "observable damage is 0" argument does not survive contact with Cemetery Desecrator, where the observable result is a paid ward cost, or with Scholar of Mortality, where it is a free reanimation.

The question

The optional case is gated on a record of whether the action was taken. The mandatory case has no equivalent, because no effect currently reports whether it did anything.

Is a per-effect "did this instruction change anything" record something you want in the engine — and if so, at which seam? That is an architectural decision rather than a fix, which is why this is an issue and not a PR. I have the reproduction test ready and am happy to build whatever shape you name; I did not want to invent that record unilaterally.

Two shapes I can see, without a recommendation between them:

  1. A did-anything-happen flag recorded per resolved instruction, consulted by the reflexive gate the way optional_action_not_taken already is.
  2. The reflexive gate asking the specific instruction kinds it can be attached to — narrower, no new global record, but it is a list, and lists only cover what was thought of.

Not covered here

  • I have not surveyed how many shipped cards have a mandatory parent that can no-op. Cemetery Desecrator, Vhal, Scholar of Elements / Mortality / Tactics are the ones I confirmed by text; the Vhal cards are digital-only.
  • The mill-based ones (Wick's Patrol, Yathan Roadwatcher, The Last Ronin, Kraven's Last Hunt) have the same shape but only misbehave on an empty library, which ends the game anyway.

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