Read docs/work-queue.md and do the next unchecked batch. For each batch:
mtg-engine/src/abilities.rs, mtg-engine/src/game.rs) to understand current Effect/StaticEffect variantsgame.rs mod tests)cargo check -p mtg-cards && cargo test --libdocs/{fdn,tla,tdm,ecl}-remediation.md, update ROADMAP.mddocs/work-queue.md with today's dateIf a batch turns out to be wrong or more complex than described, update the queue with what you learned and move on to the next one.
I'll start by reading the work queue to find the next unchecked batch.
The next unchecked batch is Batch 6: Enters-tapped-unless (conditional ETB tapped). Let me read the engine files and investigate the cards.
Now let me look at how EntersTapped is handled in game.rs and the full card context in TDM.
Let me check if there are more "enters tapped unless" cards across all sets, and look at the Java implementations for reference.
I found the two TDM cards listed in Batch 6. I also spotted a related ECL card (Blood Crypt with "Pay 2 life or enters tapped"). Let me check if there are more conditional taplands across all sets.
Good. There are 3 conditional taplands: 2 in TDM (the "unless you control" type) and 1 in ECL (the shockland "pay 2 life" type). The Blood Crypt is a different pattern — it's a choice (pay life or enter tapped), not a land-check. I'll note it but keep it separate from this batch since the condition type is different.
Now let me implement this. The approach is straightforward — similar to how Ward was done in Batch 5: add a StaticEffect::EntersTappedUnless variant with a condition string, add a builder, add a test, and swap the Custom strings.
Now add the builder method next to the ward() builder.
Now add a test for the new builder, extending the static_effect_builders test.
Now fix the two TDM cards. Let me update them to use the new typed variant.
Verify the changes look correct.
Good. Now let me build and test.
All 19 tests pass (note: test count seems to be running just mtg-ai tests here). Let me run the full test suite to make sure.
All 249 tests pass. Now let me update the docs. First, the work queue.
Now update the TDM remediation doc.
Now check if Dalkovan Encampment has a separate broken entry or was already listed as working.
Dalkovan Encampment was already marked as working in the remediation doc, but it had a Custom static effect. The entry says it's working because the mana + create token parts were good. It didn't mention the Custom enters-tapped-unless part. The card was already checked, so no change needed there — the fix was incremental.
Now let me also check if the Dalkovan Encampment entry needs to be noted as having previously-Custom that's now fixed. Let me look for it in the broken section.
Only one entry and it was already checked — it was counted as "working" since its main effects (mana + tokens) functioned. The enters-tapped-unless was a minor Custom. That's fine.
Now update ROADMAP.md.
Batch 6 is done. Now let me continue to the next batch — Batch 7: Mass keyword grant until EOT. This one is more substantial.
Let me look at the actual card implementations for these 5 cards.
Let me look at how the single-target BoostUntilEndOfTurn and GainKeywordUntilEndOfTurn are implemented in game.rs.
Let me check how DestroyAll implements its filter matching to follow the same pattern.
Now let me check the matches_filter function to understand how it works with "creatures you control" style filters.
Good. Now I have a clear picture. I need two new Effect variants:
BoostAllUntilEndOfTurn { filter, power, toughness } — mass P/T buff until EOTGrantKeywordAllUntilEndOfTurn { filter, keyword } — mass keyword grant until EOTLet me implement them.
Now add the constructors.
Now implement the match arms in game.rs. Let me find where the existing single-target versions are handled.
I need to find a good spot to add the new match arms. Let me look at where the BoostPermanent arm is and add the mass versions nearby.
I'll add the new match arms right before the catch-all _ => {}. Let me also check what controller variable is available — the effect handler needs to know who controls the creatures.
The controller parameter is available. Now I'll add the mass effect implementations.
Good. Now let me add a test in game.rs. Let me find the test module.
Now let me add a test for the mass effects. I'll add it at the end of the test module.
Good, I have the test helpers. Now let me add the test.
Now let me check if has_keyword exists on Permanent.
Good, it exists. Let me compile.
Now fix the 5 FDN cards. Let me use sed for each one.
Now fix Balmor — this one has a compound Custom string.
Now let me verify all the fixes look correct and compile.
All 5 cards fixed. Let me also search for any other cards across all sets that could use these new effects.
Found more cards using these patterns! Let me check which are simple enough to fix.
I can fix these 3 additional cards too. Let me also check what card the FDN one is.
Found 3 more fixable cards:
+2/+2 until EOT+1/+1 until EOT+1/+1 and haste until EOTNow fix the haste part of Catharsis.
The sed didn't match because the string had "and gain haste" appended. Let me fix this one specifically.
Let me verify the Timid Shieldbearer fix worked too.
Good. Now check for any other mass grant patterns across other sets.
The remaining ones are complex (variable X, compound conditional, modal) — can't be fixed with simple substitution. Let me also check TLA.
Good, no TLA mass buffs using Custom. Now compile and test.
There's a compilation error in the test. Let me see what it is.
The Game::new constructor doesn't exist — the existing tests must use a different pattern. Let me look at how other tests create games.
I need to use Game::new_two_player instead. Let me check the signature.
Let me look at how the existing tests build the game to follow the same pattern.
I see — I need to use GameConfig and PlayerConfig. Let me fix my test.
Now let me check if GameConfig and PlayerConfig are imported in the test module.
The test module uses super::* so GameConfig and PlayerConfig are available. Let me compile.
161 tests pass (was 160 before — +1 for new test). Now run the full suite.
All 250 tests pass. Now update the docs. First the work queue.
Now update ROADMAP.md.
Now update the per-set remediation docs. Let me check the FDN ones first.