Skip to content

[Card Bug] Grub's Command: tracked-set anaphor drops its card-type restriction ("each Goblin card milled this way")Β #7500

Description

@lgray

πŸ€– AI text below πŸ€–

Card(s)

Grub's Command (mode 4). Class-wide: any tracked-set ("… this way") anaphor carrying a card-type restriction.

Build/version

Measured on main at 77e686cae, and confirmed pre-existing against a card-data corpus generated before that (see Evidence).

Game mode

Solo/goldfish

Actual behavior

The parser drops the card-type restriction from a tracked-set anaphor filter.

Oracle text (mode 4), verbatim:

Target player mills five cards, then puts each Goblin card milled this way into their hand.

Parsed AST for that mode's second instruction:

{ "type": "ChangeZone",
  "target": { "type": "TrackedSetFiltered", "id": 0, "filter": { "type": "Any" } } }

filter is Any. The Goblin restriction is gone, so the instruction means "put each card milled this way into their hand" β€” all five milled cards, regardless of type.

Expected behavior

filter should restrict to the Goblin subtype, so only Goblin cards among the five milled are moved to hand (CR 608.2c β€” follow the instructions in the order written, applying the rules of English; the restrictive modifier "Goblin" is part of the instruction).

Evidence

1. It is pre-existing, not introduced by any in-flight parser work. A card-data corpus generated before the current parser changes (file mtime 2026-08-15 11:43, predating parser commit 3f7537e99 dated 2026-08-16) already contains:

[{"type":"TrackedSetFiltered","id":0,"filter":{"type":"Any"}}]

2. It is specific to the tracked-set filter, not a missing subtype. The string Goblin does parse elsewhere on this same card β€” mode 1 is "Create a token that's a copy of target Goblin you control" and retains its subtype filter. So the parser can represent the subtype; it drops it only when building the TrackedSetFiltered anaphor.

⚠️ Unmask ordering β€” please read before fixing the sibling defect

This bug is currently masked by a second, independent defect: a singular Effect::ChangeZone whose target is a tracked-set filter is inert at runtime. Measured on a real cast of this card, the milled cards produced zero ZoneChanged events and the hand stayed empty. Nothing moves today, so the dropped filter has no visible effect.

Consequence: fixing the inert singular-ChangeZone defect alone makes this bug live and strictly worse than the current behavior β€” instead of moving nothing, the card would move all five milled cards to hand instead of only the Goblins.

These two defects must be fixed together, or the filter fix must land first. A changelog entry reading "fixed ChangeZone with tracked-set targets" that ships without the filter fix would be a regression in play terms, even though it repairs a real defect.

Scope

Reported from the #6857 / #7484 lane (mode-scoped tracked-set handoff) but out of that PR's scope β€” that work changes which objects a tracked set publishes, not how a member filter is parsed. Filed separately rather than folded in.

Related: #7501 (add-engine-variant checklist gap), filed alongside this one.

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