Skip to content

Event-less effect heads publish an empty tracked set: DoublePTAll (God-Eternal Rhonas) and siblings #7481

Description

@lgray

🤖 AI text below 🤖

Summary

The tracked-set publish authority affected_objects_from_events (crates/engine/src/game/effects/mod.rs) is head-by-head: an effect head that affects objects without emitting a per-object event needs an explicit arm, or it falls through to the _ => ZoneChanged harvest and publishes an empty set. Every downstream anaphor ("Those creatures…", "Untap them") then binds nothing and is silently a no-op.

PR for #6857 fixes three such heads (PumpAll, GoadAll, GiveControl) — the heads whose every row could be dispositioned by runtime measurement. This issue records the remaining heads with the identical defect, so the class is on file rather than rediscovered.

No follow-up work is scheduled. This is the record.

Live instance: God-Eternal Rhonas

Oracle text (verbatim from card-data.json, not recalled):

When God-Eternal Rhonas enters, double the power of each other creature you control until end of turn. Those creatures gain vigilance until end of turn.

That is the population-head + plural-anaphor shape exactly. Measured:

  • The head is DoublePTAll, dispatched to pump::resolve_double_pt_all.
  • resolve_double_pt_all pushes only GameEvent::EffectResolved — no per-object event.
  • affected_objects_from_events has no Effect::DoublePTAll arm, so the head falls to _ =>, which harvests only ZoneChanged.

Result: the published set is empty and "Those creatures gain vigilance until end of turn" does nothing. The power-doubling works; the vigilance grant is lost.

DoublePTAll is the closest sibling to the heads already fixed — the arm would be a few lines of a shape that now exists in the same file.

Same-shape heads (census)

Measured over the corpus for heads that affect objects without a per-object event and can reach a tracked-set consumer:

head rows
PhaseOut 5 (teferi timeless voyager, oubliette, out of time, the pandorica, the doctor's childhood barn)
Attach 15
BecomeCopy 4
ApplyPerpetual 5
Goad (single-target) 2 (sontaran general, ood sphere)
Bolster 1 (optimus prime)
DoublePT 1 (neyith)
DoublePTAll God-Eternal Rhonas (above)

These were already broken before the #6857 work and are unchanged by it — no regression is introduced. They are listed so that the next person to touch this authority knows the shape is a class, not a one-off.

Why they were not fixed in the #6857 PR

Scope there was deliberately contracted to the measured core: heads every one of whose rows could be dispositioned by runtime measurement against the production predicate. Extending to these heads would have meant shipping rows on inference, which that PR explicitly avoided. The trade-off was disclosed in its Scope Expansion section rather than left implicit.

Suggested approach if picked up

Add a typed arm per head returning the head's own frozen population — the same pattern the #6857 PR uses, where the arm calls the producer's own enumeration function rather than a second hand-written scan. Each head needs its rows dispositioned by measurement (fix / preserved) before its arm ships, since some rows are declined by the sole-producer guard for legitimate reasons.

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