From 5417a057371459c0832daae1f40630a34911b7c0 Mon Sep 17 00:00:00 2001 From: matthewevans Date: Sun, 9 Aug 2026 17:34:07 -0700 Subject: [PATCH 01/15] release: v0.49.1 --- Cargo.lock | 26 +++++++++++++------------- Cargo.toml | 2 +- client/package.json | 2 +- client/src-tauri/Cargo.lock | 2 +- client/src-tauri/Cargo.toml | 2 +- client/src-tauri/tauri.conf.json | 2 +- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6981294682..290fcde2e0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -728,7 +728,7 @@ checksum = "780955b8b195a21ab8e4ac6b60dd1dbdcec1dc6c51c0617964b08c81785e12c9" [[package]] name = "draft-core" -version = "0.49.0" +version = "0.49.1" dependencies = [ "phase-engine", "rand 0.9.4", @@ -740,7 +740,7 @@ dependencies = [ [[package]] name = "draft-wasm" -version = "0.49.0" +version = "0.49.1" dependencies = [ "console_error_panic_hook", "draft-core", @@ -812,7 +812,7 @@ dependencies = [ [[package]] name = "engine-inventory-gen" -version = "0.49.0" +version = "0.49.1" dependencies = [ "anyhow", "proc-macro2", @@ -825,7 +825,7 @@ dependencies = [ [[package]] name = "engine-wasm" -version = "0.49.0" +version = "0.49.1" dependencies = [ "console_error_panic_hook", "getrandom 0.3.4", @@ -877,7 +877,7 @@ checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "feed-scraper" -version = "0.49.0" +version = "0.49.1" dependencies = [ "clap", "reqwest", @@ -1683,7 +1683,7 @@ checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "lobby-broker" -version = "0.49.0" +version = "0.49.1" dependencies = [ "phase-engine", "serde", @@ -1720,7 +1720,7 @@ checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" [[package]] name = "manabrew-compat" -version = "0.49.0" +version = "0.49.1" dependencies = [ "manabrew-protocol", "phase-engine", @@ -1837,7 +1837,7 @@ dependencies = [ [[package]] name = "mtgish-import" -version = "0.49.0" +version = "0.49.1" dependencies = [ "anyhow", "phase-engine", @@ -2065,7 +2065,7 @@ dependencies = [ [[package]] name = "phase-ai" -version = "0.49.0" +version = "0.49.1" dependencies = [ "flate2", "mimalloc", @@ -2083,7 +2083,7 @@ dependencies = [ [[package]] name = "phase-engine" -version = "0.49.0" +version = "0.49.1" dependencies = [ "assert_matches", "flate2", @@ -2115,7 +2115,7 @@ dependencies = [ [[package]] name = "phase-server" -version = "0.49.0" +version = "0.49.1" dependencies = [ "axum", "clap", @@ -2835,7 +2835,7 @@ dependencies = [ [[package]] name = "seat-reducer" -version = "0.49.0" +version = "0.49.1" dependencies = [ "phase-ai", "phase-engine", @@ -3024,7 +3024,7 @@ dependencies = [ [[package]] name = "server-core" -version = "0.49.0" +version = "0.49.1" dependencies = [ "draft-core", "lobby-broker", diff --git a/Cargo.toml b/Cargo.toml index b7b39b0c5a..3efb7a8112 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ members = ["crates/*"] exclude = ["client/src-tauri", "lobby-worker/broker-wasm"] [workspace.package] -version = "0.49.0" +version = "0.49.1" license = "MIT OR Apache-2.0" [workspace.dependencies] diff --git a/client/package.json b/client/package.json index feea715da0..13fbb6e3a5 100644 --- a/client/package.json +++ b/client/package.json @@ -1,7 +1,7 @@ { "name": "phase-rs-client", "private": true, - "version": "0.49.0", + "version": "0.49.1", "type": "module", "scripts": { "dev": "vite", diff --git a/client/src-tauri/Cargo.lock b/client/src-tauri/Cargo.lock index 35d45cf22c..8df07c132e 100644 --- a/client/src-tauri/Cargo.lock +++ b/client/src-tauri/Cargo.lock @@ -2616,7 +2616,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "phase-tauri" -version = "0.49.0" +version = "0.49.1" dependencies = [ "futures-util", "minisign-verify", diff --git a/client/src-tauri/Cargo.toml b/client/src-tauri/Cargo.toml index 777ed770e7..b9f6832e3b 100644 --- a/client/src-tauri/Cargo.toml +++ b/client/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "phase-tauri" -version = "0.49.0" +version = "0.49.1" edition = "2021" license = "MIT OR Apache-2.0" diff --git a/client/src-tauri/tauri.conf.json b/client/src-tauri/tauri.conf.json index 247dbbe8b9..0aa671161a 100644 --- a/client/src-tauri/tauri.conf.json +++ b/client/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://raw.githubusercontent.com/tauri-apps/tauri/dev/crates/tauri-cli/config.schema.json", "productName": "Phase", - "version": "0.49.0", + "version": "0.49.1", "identifier": "rs.phase.app", "build": { "frontendDist": "../bootstrap/dist", From 907d219c7ae3c9780ea49b2afe4106b94288c47c Mon Sep 17 00:00:00 2001 From: Matt Evans <1388610+matthewevans@users.noreply.github.com> Date: Sun, 9 Aug 2026 18:02:38 -0700 Subject: [PATCH 02/15] fix(coverage): traverse direct effect payloads (#7137) * fix(coverage): traverse direct effect payloads * fix(coverage): make direct payload traversal exhaustive --------- Co-authored-by: matthewevans --- crates/engine/src/game/coverage.rs | 825 ++++++++++++++++++++++++++--- 1 file changed, 744 insertions(+), 81 deletions(-) diff --git a/crates/engine/src/game/coverage.rs b/crates/engine/src/game/coverage.rs index 752df35b28..ee446f9006 100644 --- a/crates/engine/src/game/coverage.rs +++ b/crates/engine/src/game/coverage.rs @@ -26,7 +26,7 @@ use crate::types::ability::{ QuantityExpr, QuantityRef, ReplacementCondition, ReplacementDefinition, ReplacementMode, SeatDirection, SharedQuality, SharedQualityRelation, SpeedDelta, SpellCastingOption, SpellCastingOptionKind, SpellStackToGraveyardReplacement, StaticCondition, StaticDefinition, - TapStateChange, TargetFilter, TriggerDefinition, TypeFilter, TypedFilter, ZoneRef, + TapStateChange, TargetFilter, TriggerDefinition, TypeFilter, TypedFilter, VoteSubject, ZoneRef, }; use crate::types::card::CardFace; use crate::types::card_type::CoreType; @@ -4816,37 +4816,9 @@ fn build_ability_item(def: &AbilityDefinition) -> ParsedItem { children.push(build_ability_item(mode_ability)); } - // CR 705.2 (#5601): coin-flip branch effects are embedded `AbilityDefinition`s - // (not `sub_ability` links), so — like the sub-ability / else / modal chains - // above — recurse into them here. Without this the win/lose branch parse - // signatures are swallowed by the bare `("win"/"lose", "yes")` presence - // markers in `effect_details`, making a real parser change inside a branch - // (e.g. Desperate Gambit's lose-branch `damage_source_filter` flipping - // `SelfRef` → `ChosenDamageSource`) invisible to the coverage parse-diff. - // Same swallowed-structure class as #5492/#5495/#5501. - match &*def.effect { - Effect::FlipCoin { - win_effect, - lose_effect, - .. - } - | Effect::FlipCoins { - win_effect, - lose_effect, - .. - } => { - if let Some(win) = win_effect { - children.push(build_ability_item(win)); - } - if let Some(lose) = lose_effect { - children.push(build_ability_item(lose)); - } - } - Effect::FlipCoinUntilLose { win_effect } => { - children.push(build_ability_item(win_effect)); - } - _ => {} - } + visit_direct_effect_ability_payloads(&def.effect, |_, payload| { + children.push(build_ability_item(payload)); + }); ParsedItem { category: ParseCategory::Ability, @@ -6257,6 +6229,341 @@ fn visit_face_modifications(face: &CardFace, visit: &mut impl FnMut(&ContinuousM } } +/// Direct `Effect` fields that carry executable ability definitions. +/// +/// These payloads are neither ordinary ability chains nor grants inside a +/// `GenericEffect`. Consumers that need to inspect an ability tree use this +/// enumeration in addition to their existing traversal for those separate +/// structures. +#[derive(Copy, Clone, Debug, Eq, PartialEq)] +enum DirectEffectPayloadEdge { + VotePerChoice, + VoteObjectOutcome, + SeparateIntoPilesChosen, + SeparateIntoPilesUnchosen, + RevealFromHandOnDecline, + CreateDelayedTriggerEffect, + RollDieResult, + FlipCoinWin, + FlipCoinLose, + FlipCoinsWin, + FlipCoinsLose, + FlipCoinUntilLoseWin, + ChooseOneOfBranch, +} + +/// Visits the one-level executable ability payloads embedded directly in an effect. +fn visit_direct_effect_ability_payloads<'a>( + effect: &'a Effect, + mut visit: impl FnMut(DirectEffectPayloadEdge, &'a AbilityDefinition), +) { + match effect { + Effect::Vote { + per_choice_effect, + subject, + .. + } => { + for effect in per_choice_effect { + visit(DirectEffectPayloadEdge::VotePerChoice, effect); + } + if let VoteSubject::Objects { + outcome_template, .. + } = subject + { + visit(DirectEffectPayloadEdge::VoteObjectOutcome, outcome_template); + } + } + Effect::SeparateIntoPiles { + chosen_pile_effect, + unchosen_pile_effect, + .. + } => { + visit( + DirectEffectPayloadEdge::SeparateIntoPilesChosen, + chosen_pile_effect, + ); + if let Some(unchosen_pile_effect) = unchosen_pile_effect { + visit( + DirectEffectPayloadEdge::SeparateIntoPilesUnchosen, + unchosen_pile_effect, + ); + } + } + Effect::RevealFromHand { + on_decline: Some(on_decline), + .. + } => { + visit(DirectEffectPayloadEdge::RevealFromHandOnDecline, on_decline); + } + Effect::CreateDelayedTrigger { effect, .. } => { + visit(DirectEffectPayloadEdge::CreateDelayedTriggerEffect, effect); + } + Effect::RollDie { results, .. } => { + for result in results { + visit(DirectEffectPayloadEdge::RollDieResult, &result.effect); + } + } + Effect::FlipCoin { + win_effect, + lose_effect, + .. + } => { + if let Some(win_effect) = win_effect { + visit(DirectEffectPayloadEdge::FlipCoinWin, win_effect); + } + if let Some(lose_effect) = lose_effect { + visit(DirectEffectPayloadEdge::FlipCoinLose, lose_effect); + } + } + Effect::FlipCoins { + win_effect, + lose_effect, + .. + } => { + if let Some(win_effect) = win_effect { + visit(DirectEffectPayloadEdge::FlipCoinsWin, win_effect); + } + if let Some(lose_effect) = lose_effect { + visit(DirectEffectPayloadEdge::FlipCoinsLose, lose_effect); + } + } + Effect::FlipCoinUntilLose { win_effect } => { + visit(DirectEffectPayloadEdge::FlipCoinUntilLoseWin, win_effect); + } + Effect::ChooseOneOf { branches, .. } => { + for branch in branches { + visit(DirectEffectPayloadEdge::ChooseOneOfBranch, branch); + } + } + // Keep this exhaustive: direct ability payloads must be classified above + // when a new `Effect` variant is introduced. + Effect::StartYourEngines { .. } + | Effect::ChangeSpeed { .. } + | Effect::DealDamage { .. } + | Effect::ApplyPostReplacementDamage { .. } + | Effect::EachDealsDamageEqualToPower { .. } + | Effect::EachSourceDealsDamage { .. } + | Effect::Draw { .. } + | Effect::Pump { .. } + | Effect::PairWith { .. } + | Effect::Destroy { .. } + | Effect::Regenerate { .. } + | Effect::RemoveAllDamage { .. } + | Effect::Counter { .. } + | Effect::CounterAll { .. } + | Effect::Token { .. } + | Effect::GainLife { .. } + | Effect::LoseLife { .. } + | Effect::SetTapState { .. } + | Effect::RemoveCounter { .. } + | Effect::Sacrifice { .. } + | Effect::DiscardCard { .. } + | Effect::Mill { .. } + | Effect::Scry { .. } + | Effect::PumpAll { .. } + | Effect::DamageAll { .. } + | Effect::DamageEachPlayer { .. } + | Effect::DestroyAll { .. } + | Effect::ChangeZone { .. } + | Effect::ChangeZoneAll { .. } + | Effect::Dig { .. } + | Effect::GainControl { .. } + | Effect::GainControlAll { .. } + | Effect::ControlNextTurn { .. } + | Effect::Attach { .. } + | Effect::UnattachAll { .. } + | Effect::Surveil { .. } + | Effect::Fight { .. } + | Effect::Bounce { .. } + | Effect::BounceAll { .. } + | Effect::Explore + | Effect::ExploreAll { .. } + | Effect::Investigate + | Effect::Tribute { .. } + | Effect::TimeTravel + | Effect::BecomeMonarch + | Effect::NoOp + | Effect::Proliferate + | Effect::ProliferateTarget { .. } + | Effect::Populate + | Effect::Clash + | Effect::Behold { .. } + | Effect::EndTheTurn + | Effect::EndCombatPhase + | Effect::SwitchPT { .. } + | Effect::CopySpell { .. } + | Effect::EpicCopy { .. } + | Effect::CastCopyOfCard { .. } + | Effect::CopyTokenOf { .. } + | Effect::CreateTokenCopyFromPool { .. } + | Effect::Myriad + | Effect::Encore + | Effect::CombineHost { .. } + | Effect::ChooseAugmentAndCombineWithHost { .. } + | Effect::Meld { .. } + | Effect::ExileHaunting { .. } + | Effect::HideawayConceal { .. } + | Effect::CopyTokenBlockingAttacker { .. } + | Effect::BecomeCopy { .. } + | Effect::ChoosePermanent { .. } + | Effect::GainActivatedAbilitiesOfTarget { .. } + | Effect::ChooseCard { .. } + | Effect::PutCounter { .. } + | Effect::ChooseCounterKind { .. } + | Effect::PutChosenCounter { .. } + | Effect::PutCounterAll { .. } + | Effect::MultiplyCounter { .. } + | Effect::ChooseCounterAdjustment { .. } + | Effect::DoublePT { .. } + | Effect::DoublePTAll { .. } + | Effect::MoveCounters { .. } + | Effect::ReproduceEventCounters { .. } + | Effect::Animate { .. } + | Effect::ReturnAsAura { .. } + | Effect::RegisterBending { .. } + | Effect::GenericEffect { .. } + | Effect::Cleanup { .. } + | Effect::Mana { .. } + | Effect::Discard { .. } + | Effect::Shuffle { .. } + | Effect::Transform { .. } + | Effect::FlipPermanent { .. } + | Effect::SearchLibrary { .. } + | Effect::SearchOutsideGame { .. } + | Effect::RevealHand { .. } + | Effect::RevealFromHand { + on_decline: None, .. + } + | Effect::Reveal { .. } + | Effect::RevealTop { .. } + | Effect::ExileTop { .. } + | Effect::ExileFaceDownPile { .. } + | Effect::TargetOnly { .. } + | Effect::Choose { .. } + | Effect::OpponentGuess { .. } + | Effect::SwapChosenLabels { .. } + | Effect::ChooseDamageSource { .. } + | Effect::Suspect { .. } + | Effect::Unsuspect { .. } + | Effect::Connive { .. } + | Effect::PhaseOut { .. } + | Effect::PhaseIn { .. } + | Effect::ForceBlock { .. } + | Effect::ForceAttack { .. } + | Effect::SolveCase + | Effect::BecomePrepared { .. } + | Effect::BecomeUnprepared { .. } + | Effect::BecomeSaddled { .. } + | Effect::SetClassLevel { .. } + | Effect::AddTargetReplacement { .. } + | Effect::AddRestriction { .. } + | Effect::ReduceNextSpellCost { .. } + | Effect::GrantNextSpellAbility { .. } + | Effect::AddPendingETBCounters { .. } + | Effect::AddPendingEntersModifications { .. } + | Effect::CreateEmblem { .. } + | Effect::PayCost { .. } + | Effect::CastFromZone { .. } + | Effect::FreeCastFromZones { .. } + | Effect::ExileResolvingSpellInsteadOfGraveyard { .. } + | Effect::PreventDamage { .. } + | Effect::CreateDamageReplacement { .. } + | Effect::CreateDrawReplacement { .. } + | Effect::CreatePlaneswalkReplacement { .. } + | Effect::LoseTheGame { .. } + | Effect::WinTheGame { .. } + | Effect::RingTemptsYou + | Effect::VentureIntoDungeon + | Effect::VentureInto { .. } + | Effect::TakeTheInitiative + | Effect::ArrangePlanarDeckTop { .. } + | Effect::Planeswalk + | Effect::ChaosEnsues + | Effect::ReverseTurnOrder + | Effect::RedistributeLifeTotals + | Effect::OpenAttractions { .. } + | Effect::RollToVisitAttractions + | Effect::AssembleContraptions { .. } + | Effect::AssembleContraptionsFromRollDifference + | Effect::CrankContraptions { .. } + | Effect::ReassembleContraption { .. } + | Effect::AssembleContraptionOnSprocket { .. } + | Effect::ReassembleContraptionOnSprocket { .. } + | Effect::PutSticker { .. } + | Effect::ApplySticker { .. } + | Effect::ProcessRadCounters + | Effect::GrantCastingPermission { .. } + | Effect::ChooseFromZone { .. } + | Effect::RememberCard { .. } + | Effect::NoteManaSpent + | Effect::ForEachCategory { .. } + | Effect::ChooseObjectsIntoTrackedSet { .. } + | Effect::ChooseAndSacrificeRest { .. } + | Effect::EachPlayerCopyChosen { .. } + | Effect::Exploit { .. } + | Effect::GainEnergy { .. } + | Effect::GivePlayerCounter { .. } + | Effect::LoseAllPlayerCounters { .. } + | Effect::ExileFromTopUntil { .. } + | Effect::RevealUntil { .. } + | Effect::Discover { .. } + | Effect::Heist { .. } + | Effect::HeistExile + | Effect::Cascade + | Effect::Ripple { .. } + | Effect::MiracleCast { .. } + | Effect::MadnessCast { .. } + | Effect::PutAtLibraryPosition { .. } + | Effect::ChooseDrawnThisTurnPayOrTopdeck { .. } + | Effect::PutOnTopOrBottom { .. } + | Effect::GiftDelivery { .. } + | Effect::Goad { .. } + | Effect::GoadAll { .. } + | Effect::Detain { .. } + | Effect::SetRoomDoorLock { .. } + | Effect::ExchangeControl { .. } + | Effect::ChangeTargets { .. } + | Effect::Manifest { .. } + | Effect::ManifestDread + | Effect::Cloak { .. } + | Effect::TurnFaceUp { .. } + | Effect::TurnFaceDown { .. } + | Effect::ExtraTurn { .. } + | Effect::GrantExtraLoyaltyActivations { .. } + | Effect::SkipNextTurn { .. } + | Effect::SkipNextStep { .. } + | Effect::AdditionalPhase { .. } + | Effect::Double { .. } + | Effect::RuntimeHandled { .. } + | Effect::Incubate { .. } + | Effect::Amass { .. } + | Effect::Monstrosity { .. } + | Effect::Specialize + | Effect::Renown { .. } + | Effect::Bolster { .. } + | Effect::Adapt { .. } + | Effect::Learn + | Effect::Forage + | Effect::Harness + | Effect::CollectEvidence { .. } + | Effect::Endure { .. } + | Effect::BlightEffect { .. } + | Effect::Seek { .. } + | Effect::SetLifeTotal { .. } + | Effect::ExchangeLifeWithStat { .. } + | Effect::ExchangeLifeTotals { .. } + | Effect::SetDayNight { .. } + | Effect::GiveControl { .. } + | Effect::RemoveFromCombat { .. } + | Effect::BecomeBlocked { .. } + | Effect::Conjure { .. } + | Effect::ApplyPerpetual { .. } + | Effect::Intensify { .. } + | Effect::DraftFromSpellbook { .. } + | Effect::Unimplemented { .. } => {} + } +} + /// Recursively visit modifications inside an ability's effect graph. /// Descends into `GenericEffect.static_abilities` (the typical carrier of /// continuous modifications emitted from animations), sub-abilities, and @@ -6284,6 +6591,9 @@ fn visit_ability_modifications( for mode_ability in &def.mode_abilities { visit_ability_modifications(mode_ability, visit); } + visit_direct_effect_ability_payloads(&def.effect, |_, payload| { + visit_ability_modifications(payload, visit); + }); } /// Validate every `AddSubtype` modification on the face against the lexicon @@ -6455,6 +6765,13 @@ fn ability_definition_has_unimplemented_parts(def: &AbilityDefinition) -> bool { .mode_abilities .iter() .any(ability_definition_has_unimplemented_parts) + || { + let mut has_unimplemented_parts = false; + visit_direct_effect_ability_payloads(&def.effect, |_, payload| { + has_unimplemented_parts |= ability_definition_has_unimplemented_parts(payload); + }); + has_unimplemented_parts + } } fn additional_cost_has_unimplemented_parts(additional_cost: &AdditionalCost) -> bool { @@ -6503,6 +6820,10 @@ fn collect_ability_missing_parts(def: &AbilityDefinition, missing: &mut Vec bool { return false; } } + let mut supported = true; + visit_direct_effect_ability_payloads(&def.effect, |_, payload| { + supported &= is_ability_supported(payload); + }); + if !supported { + return false; + } true } @@ -7327,6 +7655,9 @@ fn extract_ability_features( for mode_ab in &def.mode_abilities { extract_ability_features(mode_ab, features); } + visit_direct_effect_ability_payloads(&def.effect, |_, payload| { + extract_ability_features(payload, features); + }); } /// Extract QuantityRef variants from within conditions. @@ -7927,48 +8258,12 @@ fn ability_tree_any(def: &AbilityDefinition, pred: &impl Fn(&AbilityDefinition) return true; } } - // Compound effects that embed AbilityDefinitions - match &*def.effect { - Effect::FlipCoin { - win_effect, - lose_effect, - .. - } - | Effect::FlipCoins { - win_effect, - lose_effect, - .. - } => { - if let Some(ref w) = win_effect { - if ability_tree_any(w, pred) { - return true; - } - } - if let Some(ref l) = lose_effect { - if ability_tree_any(l, pred) { - return true; - } - } - } - Effect::FlipCoinUntilLose { win_effect } if ability_tree_any(win_effect, pred) => { - return true; - } - Effect::RollDie { results, .. } => { - for branch in results { - if ability_tree_any(&branch.effect, pred) { - return true; - } - } - } - Effect::ChooseOneOf { branches, .. } - if branches.iter().any(|branch| ability_tree_any(branch, pred)) => - { - return true; - } - Effect::CreateDelayedTrigger { effect, .. } if ability_tree_any(effect, pred) => { - return true; - } - _ => {} + let mut found = false; + visit_direct_effect_ability_payloads(&def.effect, |_, payload| { + found |= ability_tree_any(payload, pred); + }); + if found { + return true; } // ContinuousModification::GrantAbility inside GenericEffect if let Effect::GenericEffect { @@ -8803,11 +9098,9 @@ fn audit_card_lines(oracle_text: &str, face: &CardFace) -> Vec if let Some(else_ab) = &def.else_ability { push_ability_tree(else_ab, out); } - if let Effect::ChooseOneOf { branches, .. } = def.effect.as_ref() { - for branch in branches { - push_ability_tree(branch, out); - } - } + visit_direct_effect_ability_payloads(&def.effect, |_, payload| { + push_ability_tree(payload, out); + }); } for a in face.abilities.iter() { push_ability_tree(a, &mut elements); @@ -11021,8 +11314,10 @@ mod tests { use crate::database::legality::{legalities_to_export_map, LegalityStatus}; use crate::parser::oracle_ir::diagnostic::{CascadeSlot, OracleDiagnostic}; use crate::types::ability::{ - AbilityKind, CounterTransferMode, Effect, PreventionAmount, PreventionScope, - ReplacementCondition, TargetFilter, + AbilityCondition, AbilityKind, ContinuousModification, ControllerRef, CounterTransferMode, + DieResultBranch, Effect, PileSource, PlayerFilter, PlayerScope, PreventionAmount, + PreventionScope, ReplacementCondition, StaticDefinition, TargetFilter, VoteTally, + VoteVisibility, VoterScope, }; use crate::types::card_type::CardType; use crate::types::identifiers::{CardId, ObjectId}; @@ -11937,6 +12232,374 @@ mod tests { } } + fn delayed_trigger_payload(effect: Effect) -> AbilityDefinition { + AbilityDefinition::new( + AbilityKind::Spell, + Effect::CreateDelayedTrigger { + condition: DelayedTriggerCondition::AtNextPhase { phase: Phase::End }, + effect: Box::new(AbilityDefinition::new(AbilityKind::Spell, effect)), + uses_tracked_set: false, + }, + ) + } + + fn direct_effect_payload_matrix() -> Vec { + let payload = |name: &str| { + let mut payload = AbilityDefinition::new( + AbilityKind::Spell, + Effect::unimplemented(name, format!("unsupported {name}")), + ); + payload.condition = Some(AbilityCondition::HasMaxSpeed); + Box::new(payload) + }; + + vec![ + AbilityDefinition::new( + AbilityKind::Spell, + Effect::Vote { + choices: vec!["choice one".into(), "choice two".into()], + per_choice_effect: vec![ + payload("vote_per_choice_one"), + payload("vote_per_choice_two"), + ], + starting_with: ControllerRef::You, + voter_scope: VoterScope::AllPlayers, + tally_mode: VoteTally::PerVote, + subject: VoteSubject::Named, + visibility: VoteVisibility::Open, + }, + ), + AbilityDefinition::new( + AbilityKind::Spell, + Effect::Vote { + choices: vec![], + per_choice_effect: vec![], + starting_with: ControllerRef::You, + voter_scope: VoterScope::AllPlayers, + tally_mode: VoteTally::PerVote, + subject: VoteSubject::Objects { + candidate_filter: TargetFilter::Any, + outcome_template: payload("vote_object_outcome"), + }, + visibility: VoteVisibility::Open, + }, + ), + AbilityDefinition::new( + AbilityKind::Spell, + Effect::SeparateIntoPiles { + partition_subject: VoterScope::EachOpponent, + object_filter: TargetFilter::Any, + chooser: PlayerScope::Controller, + chosen_pile_effect: payload("separate_chosen"), + pile_source: PileSource::Battlefield, + unchosen_pile_effect: Some(payload("separate_unchosen")), + }, + ), + AbilityDefinition::new( + AbilityKind::Spell, + Effect::RevealFromHand { + filter: TargetFilter::Any, + on_decline: Some(payload("reveal_decline")), + }, + ), + AbilityDefinition::new( + AbilityKind::Spell, + Effect::CreateDelayedTrigger { + condition: DelayedTriggerCondition::AtNextPhase { phase: Phase::End }, + effect: payload("delayed_trigger"), + uses_tracked_set: false, + }, + ), + AbilityDefinition::new( + AbilityKind::Spell, + Effect::RollDie { + count: QuantityExpr::Fixed { value: 1 }, + sides: 6, + results: vec![ + DieResultBranch { + min: 1, + max: 1, + effect: payload("roll_die_result_one"), + }, + DieResultBranch { + min: 2, + max: 2, + effect: payload("roll_die_result_two"), + }, + ], + modifier: None, + }, + ), + AbilityDefinition::new( + AbilityKind::Spell, + Effect::FlipCoin { + win_effect: Some(payload("flip_coin_win")), + lose_effect: None, + flipper: TargetFilter::Controller, + }, + ), + AbilityDefinition::new( + AbilityKind::Spell, + Effect::FlipCoin { + win_effect: None, + lose_effect: Some(payload("flip_coin_lose")), + flipper: TargetFilter::Controller, + }, + ), + AbilityDefinition::new( + AbilityKind::Spell, + Effect::FlipCoins { + count: QuantityExpr::Fixed { value: 2 }, + win_effect: Some(payload("flip_coins_win")), + lose_effect: None, + flipper: TargetFilter::Controller, + }, + ), + AbilityDefinition::new( + AbilityKind::Spell, + Effect::FlipCoins { + count: QuantityExpr::Fixed { value: 2 }, + win_effect: None, + lose_effect: Some(payload("flip_coins_lose")), + flipper: TargetFilter::Controller, + }, + ), + AbilityDefinition::new( + AbilityKind::Spell, + Effect::FlipCoinUntilLose { + win_effect: payload("flip_until_lose_win"), + }, + ), + AbilityDefinition::new( + AbilityKind::Spell, + Effect::ChooseOneOf { + chooser: PlayerFilter::Controller, + branches: vec![ + *payload("choose_one_branch_one"), + *payload("choose_one_branch_two"), + ], + }, + ), + ] + } + + #[test] + fn direct_effect_payload_edges_reach_coverage_consumers() { + let mut all_edges = Vec::new(); + for definition in direct_effect_payload_matrix() { + let mut visited = Vec::new(); + visit_direct_effect_ability_payloads(&definition.effect, |actual_edge, payload| { + let Effect::Unimplemented { name, .. } = payload.effect.as_ref() else { + panic!("payload matrix must contain an unimplemented leaf"); + }; + visited.push((actual_edge, name.clone())); + }); + let expected_names: Vec<_> = visited.iter().map(|(_, name)| name.clone()).collect(); + let projected = build_ability_item(&definition); + assert_eq!( + projected + .children + .iter() + .map(|child| child.label.clone()) + .collect::>(), + expected_names, + "the parse-details report must project every direct payload" + ); + assert!(ability_definition_has_unimplemented_parts(&definition)); + assert!(!is_ability_supported(&definition)); + for (_, name) in &visited { + assert!(ability_tree_any(&definition, &|payload| { + matches!(payload.effect.as_ref(), Effect::Unimplemented { name: payload_name, .. } if payload_name == name) + })); + } + + let mut missing = Vec::new(); + collect_ability_missing_parts(&definition, &mut missing); + let expected_gaps: Vec<_> = visited + .iter() + .map(|(_, name)| format!("Effect:{name}")) + .collect(); + assert_eq!(missing, expected_gaps); + + let mut face = make_face(); + face.abilities.push(definition.clone()); + assert_eq!( + card_face_gaps(&face), + expected_gaps, + "the card-face gap report must include every direct payload" + ); + assert!(card_face_has_unimplemented_parts(&face)); + + let mut features = HashMap::new(); + extract_ability_features(&definition, &mut features); + assert!(features.contains_key("condition:HasMaxSpeed")); + all_edges.extend(visited.into_iter().map(|(edge, _)| edge)); + } + assert_eq!( + all_edges, + vec![ + DirectEffectPayloadEdge::VotePerChoice, + DirectEffectPayloadEdge::VotePerChoice, + DirectEffectPayloadEdge::VoteObjectOutcome, + DirectEffectPayloadEdge::SeparateIntoPilesChosen, + DirectEffectPayloadEdge::SeparateIntoPilesUnchosen, + DirectEffectPayloadEdge::RevealFromHandOnDecline, + DirectEffectPayloadEdge::CreateDelayedTriggerEffect, + DirectEffectPayloadEdge::RollDieResult, + DirectEffectPayloadEdge::RollDieResult, + DirectEffectPayloadEdge::FlipCoinWin, + DirectEffectPayloadEdge::FlipCoinLose, + DirectEffectPayloadEdge::FlipCoinsWin, + DirectEffectPayloadEdge::FlipCoinsLose, + DirectEffectPayloadEdge::FlipCoinUntilLoseWin, + DirectEffectPayloadEdge::ChooseOneOfBranch, + DirectEffectPayloadEdge::ChooseOneOfBranch, + ] + ); + } + + #[test] + fn direct_effect_payload_controls_are_empty_or_supported() { + let empty = AbilityDefinition::new( + AbilityKind::Spell, + Effect::FlipCoin { + win_effect: None, + lose_effect: None, + flipper: TargetFilter::Controller, + }, + ); + let mut visited = Vec::new(); + visit_direct_effect_ability_payloads(&empty.effect, |edge, _| visited.push(edge)); + assert!(visited.is_empty()); + assert!(build_ability_item(&empty).children.is_empty()); + assert!(!ability_definition_has_unimplemented_parts(&empty)); + assert!(is_ability_supported(&empty)); + + let supported = AbilityDefinition::new( + AbilityKind::Spell, + Effect::ChooseOneOf { + chooser: PlayerFilter::Controller, + branches: vec![AbilityDefinition::new( + AbilityKind::Spell, + Effect::Draw { + count: QuantityExpr::Fixed { value: 1 }, + target: TargetFilter::Controller, + }, + )], + }, + ); + assert!(is_ability_supported(&supported)); + assert!(!ability_definition_has_unimplemented_parts(&supported)); + let mut missing = Vec::new(); + collect_ability_missing_parts(&supported, &mut missing); + assert!(missing.is_empty()); + } + + #[test] + fn direct_effect_payloads_reach_modification_visitors() { + let definition = AbilityDefinition::new( + AbilityKind::Spell, + Effect::RevealFromHand { + filter: TargetFilter::Any, + on_decline: Some(Box::new(AbilityDefinition::new( + AbilityKind::Spell, + Effect::GenericEffect { + static_abilities: vec![StaticDefinition::continuous().modifications(vec![ + ContinuousModification::AddSubtype { + subtype: "Wizard".into(), + }, + ])], + duration: None, + target: None, + end_cost: None, + }, + ))), + }, + ); + let mut subtypes = Vec::new(); + visit_ability_modifications(&definition, &mut |modification| { + if let ContinuousModification::AddSubtype { subtype } = modification { + subtypes.push(subtype.clone()); + } + }); + assert_eq!(subtypes, vec!["Wizard"]); + } + + #[test] + fn delayed_trigger_payload_projects_and_reports_unimplemented_parts() { + let unsupported = delayed_trigger_payload(Effect::unimplemented( + "delayed_payload", + "unsupported delayed effect", + )); + let projected = build_ability_item(&unsupported); + assert_eq!( + projected.children.len(), + 1, + "a delayed trigger's executable payload must appear in its parse signature" + ); + assert_eq!(projected.children[0].label, "delayed_payload"); + + let mut unsupported_face = make_face(); + unsupported_face.abilities.push(unsupported); + assert!( + card_face_gaps(&unsupported_face) + .iter() + .any(|gap| gap == "Effect:delayed_payload"), + "an unimplemented delayed payload must be reported as a card-face gap" + ); + assert!( + card_face_has_unimplemented_parts(&unsupported_face), + "an unimplemented delayed payload must make the card face unsupported" + ); + + let mut supported_face = make_face(); + supported_face + .abilities + .push(delayed_trigger_payload(Effect::Draw { + count: QuantityExpr::Fixed { value: 1 }, + target: TargetFilter::Controller, + })); + assert!( + card_face_gaps(&supported_face).is_empty(), + "a supported delayed payload must not create a card-face gap" + ); + assert!( + !card_face_has_unimplemented_parts(&supported_face), + "a supported delayed payload must keep the card face supported" + ); + } + + #[test] + fn replacement_execute_projects_delayed_trigger_payload_support() { + let replacement_supported = |payload| { + let mut face = make_face(); + face.replacements.push( + ReplacementDefinition::new(ReplacementEvent::Draw) + .execute(delayed_trigger_payload(payload)), + ); + build_parse_details_for_face(&face) + .into_iter() + .find(|item| item.category == ParseCategory::Replacement) + .expect("replacement must be projected") + .supported + }; + + assert!( + !replacement_supported(Effect::unimplemented( + "delayed_replacement_payload", + "unsupported replacement payload", + )), + "an unimplemented delayed payload must make replacement execution unsupported" + ); + assert!( + replacement_supported(Effect::Draw { + count: QuantityExpr::Fixed { value: 1 }, + target: TargetFilter::Controller, + }), + "a supported delayed payload must keep replacement execution supported" + ); + } + #[test] fn card_face_with_nested_mode_unimplemented_is_detected() { let mut face = make_face(); From d7d589597589e24f75a74f30b4ab14f04c597b80 Mon Sep 17 00:00:00 2001 From: Matt Evans <1388610+matthewevans@users.noreply.github.com> Date: Sun, 9 Aug 2026 19:41:49 -0700 Subject: [PATCH 03/15] docs(skill): review non-frontier PRs on merit (#7138) Co-authored-by: matthewevans --- .claude/skills/pr-review-loop/SKILL.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.claude/skills/pr-review-loop/SKILL.md b/.claude/skills/pr-review-loop/SKILL.md index eae3e4adb5..d1d2bb4411 100644 --- a/.claude/skills/pr-review-loop/SKILL.md +++ b/.claude/skills/pr-review-loop/SKILL.md @@ -62,7 +62,11 @@ At sweep start, read `.agents/pr-review/campaign-hotspots.toml` if present (lead **Public-disposition completion gate:** local events and a zero `review` count are necessary but insufficient. For every PR inspected or reviewed this sweep, live-check GitHub before declaring it processed. A substantive blocker must have a current-head formal `CHANGES_REQUESTED` review, unless an existing current-head requested-changes review already states the same unresolved finding. A non-substantive hold must have a current-head maintainer comment explaining the exact external condition and next step. An approval/enqueue must be live-verified as `APPROVED` plus the expected queue/auto-merge state. Do not let a local `blocked`/`held` event substitute for a visible maintainer response. 3. Every packet (and `recommend` output) carries an advisory `contributor` block — standing, scrutiny, `scrutiny_reasons`, `recurrence`, `first_contribution` — derived from the local event log plus `contributor_standing` overrides; it is `null` only when the PR has no author login. Scale review depth by it: `first_contribution` → full evidence bar, and point the author at the `docs/AI-CONTRIBUTOR.md` gates in the first review comment; `elevated` → dig specifically into the recurring signals named in `scrutiny_reasons`; `maintainer_attention` → include the contributor in the sweep report for the maintainer. `light_touch_eligible` permits a lighter pass only while scrutiny is `normal`. -**Model tier is a hard gate; the agentic harness is a scrutiny signal.** `docs/AI-CONTRIBUTOR.md` §0.1.1 accepts **Frontier tier only**. A PR whose canonical `Model:` line names a non-Frontier model (`claude-sonnet-*`, `claude-haiku-*`, `composer-*`, `gpt-5-4` or below, `codex-5-4` or below), or whose commits show one, is closed as out-of-policy without an implementation review. Separately, a `Co-authored-by: Cursor ` trailer is **not** grounds to close on its own — it raises scrutiny to the full evidence bar and forfeits light-touch, because the observed failure mode is CI-as-correction-loop rather than the harness itself. Judge the PR on its merits; good work under Cursor is still good work. +**Model declarations route review depth; they do not authorize an automatic close.** Frontier remains the requested contribution floor in `docs/AI-CONTRIBUTOR.md`, but a non-Frontier declaration or trailer is an elevated-scrutiny signal, never a `decline` by itself. Do not close a PR merely because its stated model falls below that floor. + +For a non-Frontier PR, require the full evidence bar: accurate model declaration, concrete `/engine-implementer` (or a specific `not-applicable`) method record, current-head Gate A and final `review-impl` evidence when applicable, relevant anchors, required verification, and a manual implementation review. A PR with that evidence must be reviewed on its merits. If the evidence is incomplete, request the missing proof or hold it; do not replace the review with a model-policy closure. An explicit maintainer message inviting continued review or asking the contributor to proceed also routes the current head to review, even if older prose describes a model-tier close. + +A `Co-authored-by: Cursor ` trailer remains a scrutiny signal, not a closure reason. The behavioural CI-farming pattern — pushing unverified diagnostic commits or deleting passing assertions to obtain green CI — is review evidence on the current diff, not account-level or batch-close evidence. This maintainer-review rule intentionally overrides older automatic-close wording in `docs/AI-CONTRIBUTOR.md` for this workflow. Check both surfaces, and read what actually matched before acting — a bare `rg cursor` hits `WordCursor` and other identifiers: @@ -253,6 +257,8 @@ When the user explicitly authorizes maintainer actions, the loop may pass clean When delegating labeling, require the handler to classify by the actual diff: ordinary additive engine, parser, or tooling capabilities are **enhancement** by default, even when they touch several files. Reserve **feature** for a genuinely broad mechanic or product change spanning distinct subsystems (for example, a combo workflow that jointly changes engine rules, priority handling, UI, and AI). Never infer `feature` from a `feat:` title, file count, or author identity. +When delegating a PR with a non-Frontier declaration, state explicitly that the declaration is an elevated-scrutiny signal, **not** a decline authorization. The handler must review the current head against the evidence bar above and may only close for a diff-based or independently enforced reason. + Do not perform GitHub mutations from this skill except ordinary review/comment actions explicitly required by the current sweep and policy-configured deferral labels. Approval, queue, update-branch, dequeue, and merge execution still belongs to `pr-contribution-handler`. ## Drift Rule From 0880698736f9a7d222edbeb731170babfd3772e9 Mon Sep 17 00:00:00 2001 From: Matt Evans <1388610+matthewevans@users.noreply.github.com> Date: Sun, 9 Aug 2026 20:53:45 -0700 Subject: [PATCH 04/15] ship/sealed pack opening (#7149) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(draft): reveal sealed packs before deckbuilding * chore(changelog): publish entry #189 — Sealed packs and Marvel heroes * fix(draft): address sealed pool review feedback * test(draft): complete pool view fixture * test(draft): cover grouped pool transport --------- Co-authored-by: matthewevans --- client/public/changelog-meta.json | 2 +- client/public/changelog.json | 14 + .../adapter/__tests__/draftPodAdapter.test.ts | 6 + .../__tests__/server-draft-adapter.test.ts | 2 + client/src/adapter/draft-adapter.ts | 62 ++++ client/src/adapter/p2p-draft-host.ts | 3 +- client/src/components/draft/DraftSteps.tsx | 1 + client/src/components/draft/PoolPanel.tsx | 173 ++------- .../components/draft/SealedPackOpening.tsx | 220 ++++++++++++ .../__tests__/LimitedDeckBuilder.test.tsx | 6 + .../draft/__tests__/PackDisplay.pod.test.tsx | 6 + .../__tests__/SealedPackOpening.test.tsx | 109 ++++++ .../src/components/draft/poolGroupLabels.ts | 27 ++ client/src/i18n/locales/de/draft.json | 44 ++- client/src/i18n/locales/en/draft.json | 44 ++- client/src/i18n/locales/es/draft.json | 44 ++- client/src/i18n/locales/fr/draft.json | 44 ++- client/src/i18n/locales/it/draft.json | 44 ++- client/src/i18n/locales/pl/draft.json | 44 ++- client/src/i18n/locales/pt/draft.json | 44 ++- .../network/__tests__/draftProtocol.test.ts | 126 ++++++- client/src/network/draftProtocol.ts | 3 +- client/src/pages/DraftLandingPage.tsx | 20 +- client/src/pages/DraftPage.tsx | 67 ++-- client/src/services/quickDraftPersistence.ts | 2 +- .../__tests__/multiplayerDraftStore.test.ts | 6 + client/src/stores/draftStore.ts | 31 +- crates/draft-core/src/view.rs | 331 ++++++++++++++++++ crates/server-core/src/protocol.rs | 52 ++- scripts/changelog/state.json | 4 +- 30 files changed, 1363 insertions(+), 218 deletions(-) create mode 100644 client/src/components/draft/SealedPackOpening.tsx create mode 100644 client/src/components/draft/__tests__/SealedPackOpening.test.tsx create mode 100644 client/src/components/draft/poolGroupLabels.ts diff --git a/client/public/changelog-meta.json b/client/public/changelog-meta.json index 3a09029e60..5620a59b26 100644 --- a/client/public/changelog-meta.json +++ b/client/public/changelog-meta.json @@ -1,3 +1,3 @@ { - "latestId": 188 + "latestId": 189 } diff --git a/client/public/changelog.json b/client/public/changelog.json index 174887d065..49dd689147 100644 --- a/client/public/changelog.json +++ b/client/public/changelog.json @@ -1,5 +1,19 @@ { "entries": [ + { + "id": 189, + "date": "2026-08-09", + "title": "Sealed packs and Marvel heroes", + "tags": [ + "new-cards", + "card-fixes", + "gameplay", + "interface", + "ai" + ], + "body": "✨ New Cards & Mechanics\n• Sealed is now a peer of Quick Draft and Cube Draft: open six packs one at a time, see each pack’s pulls, then review a pool grouped by card type before building\n• Captain Marvel, Apex Avenger; Conduit of Worlds; Galactus; and Avenge now have their core card interactions supported\n\n🛠️ Cards That Now Work Right\n• Brainspoil, Hawkeye, Dwarven Armorer, Archnemesis, Batroc the Leaper, Doom’s Time Platform, Dragon Man, Black Bolt, Galvanic Iteration, and Endless Ranks of HYDRA now follow more of their printed targets, costs, counters, or trigger conditions\n• Delayed-trigger payloads retain their following instructions in the correct order, fixing affected multi-clause cards such as Codie and Power Pack\n• Mana abilities that move cards to or from a library are no longer treated as mana abilities\n\n⚔️ Combat & Gameplay\n• Conditional forced-attack requirements such as Galactus’s now parse and enforce the correct defender choices\n• Cleanup discard triggers, player choices, and restored game state retain their correct game context more reliably\n\n🖥️ Interface\n• The game timeline is easier to act on, and remote scry outcomes no longer get lost when several finish together\n\n🤖 AI\n• AI keeps its choices within the actions the engine issued, handles target-dependent optional costs more safely, and recovers gracefully if an AI worker times out", + "discordUrl": "https://discord.com/channels/1485498006781427802/1486432040332296424/1536203698454274138" + }, { "id": 188, "date": "2026-08-08", diff --git a/client/src/adapter/__tests__/draftPodAdapter.test.ts b/client/src/adapter/__tests__/draftPodAdapter.test.ts index 312cab04b1..04ba6e049d 100644 --- a/client/src/adapter/__tests__/draftPodAdapter.test.ts +++ b/client/src/adapter/__tests__/draftPodAdapter.test.ts @@ -112,6 +112,12 @@ function mockView(status: string): DraftPlayerView { pass_direction: "Left", current_pack: null, pool: [], + pool_groups: { + color_groups: [], + type_groups: [], + cmc_groups: [], + color_counts: { white: 0, blue: 0, black: 0, red: 0, green: 0 }, + }, seats: [], cards_per_pack: 14, pack_count: 3, diff --git a/client/src/adapter/__tests__/server-draft-adapter.test.ts b/client/src/adapter/__tests__/server-draft-adapter.test.ts index e3014665cf..a42de47ff9 100644 --- a/client/src/adapter/__tests__/server-draft-adapter.test.ts +++ b/client/src/adapter/__tests__/server-draft-adapter.test.ts @@ -1,5 +1,6 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; +import { EMPTY_DRAFT_POOL_GROUPS } from "../draft-adapter"; import { ServerDraftAdapter } from "../server-draft-adapter"; import { PROTOCOL_VERSION } from "../ws-adapter"; import type { DraftPlayerView } from "../draft-adapter"; @@ -66,6 +67,7 @@ function createMockDraftView(overrides: Partial = {}): DraftPla pass_direction: "Left", current_pack: null, pool: [], + pool_groups: EMPTY_DRAFT_POOL_GROUPS, seats: [], cards_per_pack: 14, pack_count: 3, diff --git a/client/src/adapter/draft-adapter.ts b/client/src/adapter/draft-adapter.ts index 134730ebf7..c949679498 100644 --- a/client/src/adapter/draft-adapter.ts +++ b/client/src/adapter/draft-adapter.ts @@ -14,6 +14,64 @@ export interface DraftCardInstance { type_line: string; } +export type DraftPoolGroupKind = + | "white" + | "blue" + | "black" + | "red" + | "green" + | "multicolor" + | "colorless" + | "creature" + | "instant" + | "sorcery" + | "enchantment" + | "artifact" + | "planeswalker" + | "land" + | "other" + | "mana_value0" + | "mana_value1" + | "mana_value2" + | "mana_value3" + | "mana_value4" + | "mana_value5" + | "mana_value6_plus"; + +export interface DraftPoolEntry { + card: DraftCardInstance; + count: number; +} + +export interface DraftPoolGroup { + kind: DraftPoolGroupKind; + total: number; + cards: DraftPoolEntry[]; +} + +export interface DraftPoolColorCounts { + white: number; + blue: number; + black: number; + red: number; + green: number; +} + +export interface DraftPoolGroups { + color_groups: DraftPoolGroup[]; + type_groups: DraftPoolGroup[]; + cmc_groups: DraftPoolGroup[]; + color_counts: DraftPoolColorCounts; +} + +/** Empty engine-shaped pool data for a lobby before a draft session exists. */ +export const EMPTY_DRAFT_POOL_GROUPS: DraftPoolGroups = { + color_groups: [], + type_groups: [], + cmc_groups: [], + color_counts: { white: 0, blue: 0, black: 0, red: 0, green: 0 }, +}; + // @sync-with: crates/draft-core/src/view.rs export interface SeatPublicView { seat_index: number; @@ -111,6 +169,10 @@ export interface DraftPlayerView { pass_direction: "Left" | "Right"; current_pack: DraftCardInstance[] | null; pool: DraftCardInstance[]; + /** Engine-owned grouping, ordering, and duplicate counts for the pool. */ + pool_groups: DraftPoolGroups; + /** Engine-provided sealed packs in opening order. Absent for draft events. */ + sealed_packs?: DraftCardInstance[][] | null; seats: SeatPublicView[]; cards_per_pack: number; pack_count: number; diff --git a/client/src/adapter/p2p-draft-host.ts b/client/src/adapter/p2p-draft-host.ts index 79c2292475..bce95698d5 100644 --- a/client/src/adapter/p2p-draft-host.ts +++ b/client/src/adapter/p2p-draft-host.ts @@ -12,7 +12,7 @@ import type Peer from "peerjs"; import type { DataConnection } from "peerjs"; -import { DraftAdapter } from "./draft-adapter"; +import { DraftAdapter, EMPTY_DRAFT_POOL_GROUPS } from "./draft-adapter"; import type { DraftPlayerView, MultiplayerSeatDescriptor, PairingView, PoolInput, SeatPublicView } from "./draft-adapter"; import type { PodPolicy, TournamentFormat } from "./draft-adapter"; import { @@ -2015,6 +2015,7 @@ export class P2PDraftHost { pass_direction: "Left", current_pack: null, pool: [], + pool_groups: EMPTY_DRAFT_POOL_GROUPS, seats: this.buildSeatPublicViews(), cards_per_pack: 14, pack_count: 3, diff --git a/client/src/components/draft/DraftSteps.tsx b/client/src/components/draft/DraftSteps.tsx index 5994c83182..018e635cb0 100644 --- a/client/src/components/draft/DraftSteps.tsx +++ b/client/src/components/draft/DraftSteps.tsx @@ -10,6 +10,7 @@ const STEP_KEYS = ["chooseSet", "draft", "buildDeck", "play"] as const; const PHASE_STEP: Record = { setup: 0, drafting: 1, + opening: 1, deckbuilding: 2, launching: 3, playing: 3, diff --git a/client/src/components/draft/PoolPanel.tsx b/client/src/components/draft/PoolPanel.tsx index 46f485fab9..c4f5140b23 100644 --- a/client/src/components/draft/PoolPanel.tsx +++ b/client/src/components/draft/PoolPanel.tsx @@ -1,131 +1,26 @@ -import { useMemo } from "react"; import { useTranslation } from "react-i18next"; import { useDraftStore } from "../../stores/draftStore"; import type { PoolSortMode } from "../../stores/draftStore"; -import type { DraftCardInstance, DraftPlayerView } from "../../adapter/draft-adapter"; +import type { DraftPoolColorCounts, DraftPlayerView } from "../../adapter/draft-adapter"; import type { CardHoverInfo } from "../card/CardPreview"; - -// ── Sorting helpers ───────────────────────────────────────────────────── -// These are display-layer grouping of engine-provided enriched fields -// (DraftCardInstance.colors, cmc, type_line) — not game logic computation. - -function colorGroupKey(card: DraftCardInstance): string { - if (card.colors.length === 0) return "Colorless"; - if (card.colors.length > 1) return "Multicolor"; - return card.colors[0]; -} - -const COLOR_GROUP_ORDER: Record = { - W: 0, U: 1, B: 2, R: 3, G: 4, Multicolor: 5, Colorless: 6, +import { POOL_GROUP_LABEL_KEYS } from "./poolGroupLabels"; + +const EMPTY_COLOR_COUNTS: DraftPoolColorCounts = { + white: 0, + blue: 0, + black: 0, + red: 0, + green: 0, }; -const COLOR_GROUP_LABELS: Record = { - W: "White", U: "Blue", B: "Black", R: "Red", G: "Green", - Multicolor: "Multicolor", Colorless: "Colorless", -}; - -function primaryType(typeLine: string): string { - const lower = typeLine.toLowerCase(); - if (lower.includes("creature")) return "Creature"; - if (lower.includes("instant")) return "Instant"; - if (lower.includes("sorcery")) return "Sorcery"; - if (lower.includes("enchantment")) return "Enchantment"; - if (lower.includes("artifact")) return "Artifact"; - if (lower.includes("planeswalker")) return "Planeswalker"; - if (lower.includes("land")) return "Land"; - return "Other"; -} - -const TYPE_ORDER: Record = { - Creature: 0, Instant: 1, Sorcery: 2, Enchantment: 3, - Artifact: 4, Planeswalker: 5, Land: 6, Other: 7, -}; - -interface PoolEntry { - card: DraftCardInstance; - count: number; -} - -interface CardGroup { - label: string; - cards: PoolEntry[]; -} - -function dedup(cards: DraftCardInstance[]): PoolEntry[] { - const map = new Map(); - for (const card of cards) { - const existing = map.get(card.name); - if (existing) { - existing.count++; - } else { - map.set(card.name, { card, count: 1 }); - } - } - return [...map.values()]; -} - -function sortWithinGroup(cards: DraftCardInstance[]): PoolEntry[] { - const sorted = [...cards].sort((a, b) => a.cmc - b.cmc || a.name.localeCompare(b.name)); - return dedup(sorted); -} - -function groupByColor(pool: DraftCardInstance[]): CardGroup[] { - const groups = new Map(); - for (const card of pool) { - const key = colorGroupKey(card); - const list = groups.get(key) ?? []; - list.push(card); - groups.set(key, list); - } - return [...groups.entries()] - .sort(([a], [b]) => (COLOR_GROUP_ORDER[a] ?? 99) - (COLOR_GROUP_ORDER[b] ?? 99)) - .map(([key, cards]) => ({ - label: COLOR_GROUP_LABELS[key] ?? key, - cards: sortWithinGroup(cards), - })); -} - -function groupByType(pool: DraftCardInstance[]): CardGroup[] { - const groups = new Map(); - for (const card of pool) { - const key = primaryType(card.type_line); - const list = groups.get(key) ?? []; - list.push(card); - groups.set(key, list); - } - return [...groups.entries()] - .sort(([a], [b]) => (TYPE_ORDER[a] ?? 99) - (TYPE_ORDER[b] ?? 99)) - .map(([key, cards]) => ({ - label: key, - cards: sortWithinGroup(cards), - })); -} - -function groupByCmc(pool: DraftCardInstance[]): CardGroup[] { - const groups = new Map(); - for (const card of pool) { - const key = card.cmc >= 6 ? "6+" : String(card.cmc); - const list = groups.get(key) ?? []; - list.push(card); - groups.set(key, list); - } - const cmcOrder = ["0", "1", "2", "3", "4", "5", "6+"]; - return cmcOrder - .filter((k) => groups.has(k)) - .map((key) => ({ - label: `${key} CMC`, - cards: dedup([...groups.get(key)!].sort((a, b) => a.name.localeCompare(b.name))), - })); -} - -function groupPool(pool: DraftCardInstance[], mode: PoolSortMode): CardGroup[] { - switch (mode) { - case "color": return groupByColor(pool); - case "type": return groupByType(pool); - case "cmc": return groupByCmc(pool); - } -} +const COLOR_COUNT_KEYS = { + W: "white", + U: "blue", + B: "black", + R: "red", + G: "green", +} as const; // ── Rarity badge ──────────────────────────────────────────────────────── @@ -190,25 +85,15 @@ export function PoolPanel({ onCardHover, view: viewOverride }: PoolPanelProps = const togglePoolPanel = useDraftStore((s) => s.togglePoolPanel); const view = viewOverride !== undefined ? viewOverride : quickView; - const pool = useMemo(() => view?.pool ?? [], [view?.pool]); - - const groups = useMemo( - () => groupPool(pool, poolSortMode), - [pool, poolSortMode], - ); - - // WUBRG pool tally — a multicolor card counts toward each of its colors - // (standard draft-tracker convention), so the strip reads as "how deep am I - // in each color" rather than a mono-only count. - const colorCounts = useMemo(() => { - const counts: Record = { W: 0, U: 0, B: 0, R: 0, G: 0 }; - for (const card of pool) { - for (const color of card.colors) { - if (color in counts) counts[color]++; - } - } - return counts; - }, [pool]); + const pool = view?.pool ?? []; + const groups = view + ? poolSortMode === "color" + ? view.pool_groups.color_groups + : poolSortMode === "type" + ? view.pool_groups.type_groups + : view.pool_groups.cmc_groups + : []; + const colorCounts = view?.pool_groups.color_counts ?? EMPTY_COLOR_COUNTS; return (
@@ -235,8 +120,8 @@ export function PoolPanel({ onCardHover, view: viewOverride }: PoolPanelProps = {(["W", "U", "B", "R", "G"] as const).map((c) => (
- - {colorCounts[c]} + + {colorCounts[COLOR_COUNT_KEYS[c]]}
))} @@ -262,9 +147,9 @@ export function PoolPanel({ onCardHover, view: viewOverride }: PoolPanelProps = {/* Card groups */}
{groups.map((group) => ( -
+
- {group.label} ({group.cards.length}) + {t(POOL_GROUP_LABEL_KEYS[group.kind])} ({group.total})
{group.cards.map(({ card, count }) => ( diff --git a/client/src/components/draft/SealedPackOpening.tsx b/client/src/components/draft/SealedPackOpening.tsx new file mode 100644 index 0000000000..8157e9e2fb --- /dev/null +++ b/client/src/components/draft/SealedPackOpening.tsx @@ -0,0 +1,220 @@ +import { useEffect, useState } from "react"; +import { AnimatePresence, motion, useReducedMotion } from "framer-motion"; +import { useTranslation } from "react-i18next"; + +import type { DraftCardInstance, DraftPoolGroup, DraftPlayerView } from "../../adapter/draft-adapter"; +import { useCardImage } from "../../hooks/useCardImage"; +import { menuButtonClass } from "../menu/buttonStyles"; +import { POOL_GROUP_LABEL_KEYS } from "./poolGroupLabels"; + +interface SealedPackOpeningProps { + view: DraftPlayerView; + onComplete: () => void; +} + +function PullCard({ card, index }: { card: DraftCardInstance; index: number }) { + const { src, isLoading } = useCardImage(card.name, { + size: "normal", + sourcePrinting: { setCode: card.set_code, collectorNumber: card.collector_number }, + }); + const reduceMotion = useReducedMotion(); + + return ( + + {isLoading || !src ? ( +
+ {card.name} +
+ ) : ( + {card.name} + )} +
+ {card.name} +
+
+ ); +} + +function PackBack({ onOpen, packNumber, packCount }: { + onOpen: () => void; + packNumber: number; + packCount: number; +}) { + const { t } = useTranslation("draft"); + const reduceMotion = useReducedMotion(); + + return ( + +

+ {t("sealedOpening.packProgress", { current: packNumber, total: packCount })} +

+ + + + + ✦ + + + +
+ ); +} + +function OpenedPack({ cards, packNumber, packCount, onNext }: { + cards: DraftCardInstance[]; + packNumber: number; + packCount: number; + onNext: () => void; +}) { + const { t } = useTranslation("draft"); + + return ( + +
+
+

+ {t("sealedOpening.packProgress", { current: packNumber, total: packCount })} +

+

{t("sealedOpening.pulls")}

+
+ {t("pack.cardsInPack", { count: cards.length })} +
+
+ {cards.map((card, index) => )} +
+
+ +
+
+ ); +} + +function SealedPoolReview({ groups, poolSize, onComplete }: { + groups: DraftPoolGroup[]; + poolSize: number; + onComplete: () => void; +}) { + const { t } = useTranslation("draft"); + + return ( + +
+

{t("sealedOpening.poolTitle")}

+

{t("sealedOpening.poolSubtitle", { count: poolSize })}

+
+ {groups.map((group) => ( +
+

+ {t(POOL_GROUP_LABEL_KEYS[group.kind])} ({group.total}) +

+
+ {group.cards.map(({ card, count }, index) => ( +
+ + {count > 1 && ( + + {count} + + )} +
+ ))} +
+
+ ))} +
+ +
+
+ ); +} + +/** Displays the engine-provided sealed packs one at a time before deckbuilding. */ +export function SealedPackOpening({ view, onComplete }: SealedPackOpeningProps) { + const { t } = useTranslation("draft"); + const packs = view.sealed_packs ?? []; + const [packIndex, setPackIndex] = useState(0); + const [opened, setOpened] = useState(false); + + useEffect(() => { + setOpened(false); + }, [packIndex]); + + if (packs.length === 0) return null; + + const packNumber = packIndex + 1; + const showReview = packIndex >= packs.length; + const advance = () => setPackIndex((current) => current + 1); + + return ( +
+ {!showReview && ( +
+

{t("sealedOpening.title")}

+

{t("sealedOpening.subtitle")}

+
+ )} + + {showReview ? ( + + ) : opened ? ( + + ) : ( + setOpened(true)} + /> + )} + +
+ ); +} diff --git a/client/src/components/draft/__tests__/LimitedDeckBuilder.test.tsx b/client/src/components/draft/__tests__/LimitedDeckBuilder.test.tsx index 938368b17f..2120fc78ec 100644 --- a/client/src/components/draft/__tests__/LimitedDeckBuilder.test.tsx +++ b/client/src/components/draft/__tests__/LimitedDeckBuilder.test.tsx @@ -48,6 +48,12 @@ const TEST_VIEW: BuilderView = { type_line: "Creature - Drake", }, ], + pool_groups: { + color_groups: [], + type_groups: [], + cmc_groups: [], + color_counts: { white: 0, blue: 1, black: 0, red: 0, green: 0 }, + }, seats: [], cards_per_pack: 14, pack_count: 3, diff --git a/client/src/components/draft/__tests__/PackDisplay.pod.test.tsx b/client/src/components/draft/__tests__/PackDisplay.pod.test.tsx index 5c3957301c..d6b7efbd17 100644 --- a/client/src/components/draft/__tests__/PackDisplay.pod.test.tsx +++ b/client/src/components/draft/__tests__/PackDisplay.pod.test.tsx @@ -39,6 +39,12 @@ const view: DraftPlayerView = { }, ], pool: [], + pool_groups: { + color_groups: [], + type_groups: [], + cmc_groups: [], + color_counts: { white: 0, blue: 0, black: 0, red: 0, green: 0 }, + }, seats: [], cards_per_pack: 14, pack_count: 3, diff --git a/client/src/components/draft/__tests__/SealedPackOpening.test.tsx b/client/src/components/draft/__tests__/SealedPackOpening.test.tsx new file mode 100644 index 0000000000..9ec752417b --- /dev/null +++ b/client/src/components/draft/__tests__/SealedPackOpening.test.tsx @@ -0,0 +1,109 @@ +import { describe, expect, it, vi } from "vitest"; +import { fireEvent, render, screen } from "@testing-library/react"; + +import { SealedPackOpening } from "../SealedPackOpening"; +import type { DraftPlayerView } from "../../../adapter/draft-adapter"; + +vi.mock("../../../hooks/useCardImage", () => ({ + useCardImage: () => ({ src: null, isLoading: false }), +})); + +const VIEW: DraftPlayerView = { + status: "Deckbuilding", + kind: "Sealed", + current_pack_number: 0, + pick_number: 0, + pass_direction: "Left", + current_pack: null, + pool: [ + { + instance_id: "creature", + name: "Silvercoat Lion", + set_code: "m19", + collector_number: "31", + rarity: "common", + colors: ["W"], + cmc: 2, + type_line: "Creature — Cat", + }, + { + instance_id: "instant", + name: "Shock", + set_code: "m19", + collector_number: "156", + rarity: "common", + colors: ["R"], + cmc: 1, + type_line: "Instant", + }, + ], + pool_groups: { + color_groups: [], + type_groups: [ + { kind: "creature", total: 1, cards: [{ card: { + instance_id: "creature", + name: "Silvercoat Lion", + set_code: "m19", + collector_number: "31", + rarity: "common", + colors: ["W"], + cmc: 2, + type_line: "Creature — Cat", + }, count: 1 }] }, + { kind: "instant", total: 1, cards: [{ card: { + instance_id: "instant", + name: "Shock", + set_code: "m19", + collector_number: "156", + rarity: "common", + colors: ["R"], + cmc: 1, + type_line: "Instant", + }, count: 1 }] }, + ], + cmc_groups: [], + color_counts: { white: 1, blue: 0, black: 0, red: 1, green: 0 }, + }, + sealed_packs: [], + seats: [], + cards_per_pack: 1, + pack_count: 2, + min_deck_size: 40, + addable_cards: ["Plains"], + timer_remaining_ms: null, + standings: [], + current_round: 0, + tournament_format: "Swiss", + pod_policy: "Competitive", + pairings: [], + match_config: { match_type: "Bo1" }, +}; + +describe("SealedPackOpening", () => { + it("reveals each engine-provided pack before showing the type-grouped pool", async () => { + const onComplete = vi.fn(); + render( + , + ); + + expect(screen.getByText("Pack 1 of 2")).toBeInTheDocument(); + fireEvent.click(screen.getByRole("button", { name: "Open pack" })); + expect(await screen.findAllByText("Silvercoat Lion")).toHaveLength(2); + + fireEvent.click(screen.getByRole("button", { name: "Next pack" })); + expect(await screen.findByText("Pack 2 of 2")).toBeInTheDocument(); + fireEvent.click(screen.getByRole("button", { name: "Open pack" })); + expect(await screen.findAllByText("Shock")).toHaveLength(2); + + fireEvent.click(screen.getByRole("button", { name: "View your pool" })); + expect(await screen.findByRole("heading", { name: "Your sealed pool" })).toBeInTheDocument(); + expect(screen.getByText("Creature (1)")).toBeInTheDocument(); + expect(screen.getByText("Instant (1)")).toBeInTheDocument(); + + fireEvent.click(screen.getByRole("button", { name: "Build deck" })); + expect(onComplete).toHaveBeenCalledOnce(); + }); +}); diff --git a/client/src/components/draft/poolGroupLabels.ts b/client/src/components/draft/poolGroupLabels.ts new file mode 100644 index 0000000000..c5c4be670d --- /dev/null +++ b/client/src/components/draft/poolGroupLabels.ts @@ -0,0 +1,27 @@ +import type { DraftPoolGroupKind } from "../../adapter/draft-adapter"; + +/** Translation keys for the engine-defined limited-pool group categories. */ +export const POOL_GROUP_LABEL_KEYS: Record = { + white: "pool.groups.white", + blue: "pool.groups.blue", + black: "pool.groups.black", + red: "pool.groups.red", + green: "pool.groups.green", + multicolor: "pool.groups.multicolor", + colorless: "pool.groups.colorless", + creature: "pool.groups.creature", + instant: "pool.groups.instant", + sorcery: "pool.groups.sorcery", + enchantment: "pool.groups.enchantment", + artifact: "pool.groups.artifact", + planeswalker: "pool.groups.planeswalker", + land: "pool.groups.land", + other: "pool.groups.other", + mana_value0: "pool.groups.manaValue0", + mana_value1: "pool.groups.manaValue1", + mana_value2: "pool.groups.manaValue2", + mana_value3: "pool.groups.manaValue3", + mana_value4: "pool.groups.manaValue4", + mana_value5: "pool.groups.manaValue5", + mana_value6_plus: "pool.groups.manaValue6Plus", +}; diff --git a/client/src/i18n/locales/de/draft.json b/client/src/i18n/locales/de/draft.json index a75048b85c..ab871af69e 100644 --- a/client/src/i18n/locales/de/draft.json +++ b/client/src/i18n/locales/de/draft.json @@ -82,12 +82,49 @@ "picking": "Wird ausgewählt…", "autoPick": "Auto-Pick" }, + "sealedOpening": { + "title": "Öffne deinen Sealed-Pool", + "subtitle": "Öffne sechs Booster, einen nach dem anderen.", + "packProgress": "Booster {{current}} von {{total}}", + "openPack": "Booster öffnen", + "openPackArt": "Booster-Artwork öffnen", + "pulls": "Deine Karten", + "nextPack": "Nächster Booster", + "viewPool": "Pool ansehen", + "poolTitle": "Dein Sealed-Pool", + "poolSubtitle": "Alle {{count}} Karten, nach Typ gruppiert.", + "buildDeck": "Deck bauen" + }, "pool": { "cardsDrafted": "{{count}} Karten gedraftet", "empty": "Noch keine Karten gedraftet", "sortColor": "Farbe", "sortType": "Typ", - "sortCmc": "CMC" + "sortCmc": "CMC", + "groups": { + "white": "Weiß", + "blue": "Blau", + "black": "Schwarz", + "red": "Rot", + "green": "Grün", + "multicolor": "Mehrfarbig", + "colorless": "Farblos", + "creature": "Kreatur", + "instant": "Spontanzauber", + "sorcery": "Hexerei", + "enchantment": "Verzauberung", + "artifact": "Artefakt", + "planeswalker": "Planeswalker", + "land": "Land", + "other": "Andere", + "manaValue0": "0 CMC", + "manaValue1": "1 CMC", + "manaValue2": "2 CMC", + "manaValue3": "3 CMC", + "manaValue4": "4 CMC", + "manaValue5": "5 CMC", + "manaValue6Plus": "6+ CMC" + } }, "standings": { "title": "Tabelle — Runde {{round}}", @@ -129,6 +166,10 @@ "title": "Quick Draft", "description": "Drafte 3 Booster mit 7 KI-Draftern, baue ein 40-Karten-Deck und spiele dann eine Bo1-Partie gegen einen von ihnen." }, + "sealed": { + "title": "Sealed", + "description": "Öffne sechs Booster, sieh dir den vollständigen Pool an und baue dann ein 40-Karten-Deck für eine Bo1-Partie." + }, "cubeDraft": { "title": "Cube Draft", "description": "Füge eine Cube-Liste ein oder lade sie, passe Booster- und Deckregeln an und drafte dann schnell gegen KI-Bots." @@ -159,6 +200,7 @@ }, "quickPhase": { "drafting": "Draften", + "opening": "Booster öffnen", "deckbuilding": "Deckbau", "matchRecord": "Partie {{number}} — {{wins}}S-{{losses}}N", "record": "{{wins}}S-{{losses}}N", diff --git a/client/src/i18n/locales/en/draft.json b/client/src/i18n/locales/en/draft.json index 15adb96b4e..58c87cc82a 100644 --- a/client/src/i18n/locales/en/draft.json +++ b/client/src/i18n/locales/en/draft.json @@ -82,12 +82,49 @@ "picking": "Picking…", "autoPick": "Auto-pick" }, + "sealedOpening": { + "title": "Open your sealed pool", + "subtitle": "Open six packs, one at a time.", + "packProgress": "Pack {{current}} of {{total}}", + "openPack": "Open pack", + "openPackArt": "Open pack artwork", + "pulls": "Your pulls", + "nextPack": "Next pack", + "viewPool": "View your pool", + "poolTitle": "Your sealed pool", + "poolSubtitle": "All {{count}} cards, grouped by type.", + "buildDeck": "Build deck" + }, "pool": { "cardsDrafted": "{{count}} cards drafted", "empty": "No cards drafted yet", "sortColor": "Color", "sortType": "Type", - "sortCmc": "CMC" + "sortCmc": "CMC", + "groups": { + "white": "White", + "blue": "Blue", + "black": "Black", + "red": "Red", + "green": "Green", + "multicolor": "Multicolor", + "colorless": "Colorless", + "creature": "Creature", + "instant": "Instant", + "sorcery": "Sorcery", + "enchantment": "Enchantment", + "artifact": "Artifact", + "planeswalker": "Planeswalker", + "land": "Land", + "other": "Other", + "manaValue0": "0 CMC", + "manaValue1": "1 CMC", + "manaValue2": "2 CMC", + "manaValue3": "3 CMC", + "manaValue4": "4 CMC", + "manaValue5": "5 CMC", + "manaValue6Plus": "6+ CMC" + } }, "standings": { "title": "Standings — Round {{round}}", @@ -129,6 +166,10 @@ "title": "Quick Draft", "description": "Draft 3 packs with 7 AI drafters, build a 40-card deck, then play a Bo1 match against one of them." }, + "sealed": { + "title": "Sealed", + "description": "Open six packs, review the full pool, then build a 40-card deck for a Bo1 match." + }, "cubeDraft": { "title": "Cube Draft", "description": "Paste or load a cube list, tune pack and deck rules, then quick draft against AI bots." @@ -159,6 +200,7 @@ }, "quickPhase": { "drafting": "Drafting", + "opening": "Opening Packs", "deckbuilding": "Deck Building", "matchRecord": "Match {{number}} — {{wins}}W-{{losses}}L", "record": "{{wins}}W-{{losses}}L", diff --git a/client/src/i18n/locales/es/draft.json b/client/src/i18n/locales/es/draft.json index 4b6f23707a..dc31c30b4c 100644 --- a/client/src/i18n/locales/es/draft.json +++ b/client/src/i18n/locales/es/draft.json @@ -82,12 +82,49 @@ "picking": "Eligiendo…", "autoPick": "Elección automática" }, + "sealedOpening": { + "title": "Abre tu pool de sellado", + "subtitle": "Abre seis sobres, uno a la vez.", + "packProgress": "Sobre {{current}} de {{total}}", + "openPack": "Abrir sobre", + "openPackArt": "Abrir ilustración del sobre", + "pulls": "Tus cartas", + "nextPack": "Siguiente sobre", + "viewPool": "Ver tu pool", + "poolTitle": "Tu pool de sellado", + "poolSubtitle": "Las {{count}} cartas, agrupadas por tipo.", + "buildDeck": "Construir mazo" + }, "pool": { "cardsDrafted": "{{count}} cartas drafteadas", "empty": "Aún no se ha drafteado ninguna carta", "sortColor": "Color", "sortType": "Tipo", - "sortCmc": "CMC" + "sortCmc": "CMC", + "groups": { + "white": "Blanco", + "blue": "Azul", + "black": "Negro", + "red": "Rojo", + "green": "Verde", + "multicolor": "Multicolor", + "colorless": "Incoloro", + "creature": "Criatura", + "instant": "Instantáneo", + "sorcery": "Conjuro", + "enchantment": "Encantamiento", + "artifact": "Artefacto", + "planeswalker": "Planeswalker", + "land": "Tierra", + "other": "Otro", + "manaValue0": "0 CMC", + "manaValue1": "1 CMC", + "manaValue2": "2 CMC", + "manaValue3": "3 CMC", + "manaValue4": "4 CMC", + "manaValue5": "5 CMC", + "manaValue6Plus": "6+ CMC" + } }, "standings": { "title": "Clasificación — Ronda {{round}}", @@ -129,6 +166,10 @@ "title": "Draft Rápido", "description": "Draftea 3 sobres con 7 drafters de IA, construye un mazo de 40 cartas y luego juega una partida Bo1 contra uno de ellos." }, + "sealed": { + "title": "Sealed", + "description": "Abre seis sobres, revisa el pool completo y luego construye un mazo de 40 cartas para una partida al mejor de uno." + }, "cubeDraft": { "title": "Cube Draft", "description": "Pega o carga una lista de cube, ajusta las reglas de sobres y mazo, y luego draftea rápido contra bots de IA." @@ -159,6 +200,7 @@ }, "quickPhase": { "drafting": "Drafteando", + "opening": "Abriendo sobres", "deckbuilding": "Construcción de mazo", "matchRecord": "Partida {{number}} — {{wins}}V-{{losses}}D", "record": "{{wins}}V-{{losses}}D", diff --git a/client/src/i18n/locales/fr/draft.json b/client/src/i18n/locales/fr/draft.json index 2df4798af2..456a9fc74e 100644 --- a/client/src/i18n/locales/fr/draft.json +++ b/client/src/i18n/locales/fr/draft.json @@ -82,12 +82,49 @@ "picking": "Sélection…", "autoPick": "Sélection auto" }, + "sealedOpening": { + "title": "Ouvrez votre pool scellé", + "subtitle": "Ouvrez six boosters, un à la fois.", + "packProgress": "Booster {{current}} sur {{total}}", + "openPack": "Ouvrir le booster", + "openPackArt": "Ouvrir l’illustration du booster", + "pulls": "Vos cartes", + "nextPack": "Booster suivant", + "viewPool": "Voir votre pool", + "poolTitle": "Votre pool scellé", + "poolSubtitle": "Les {{count}} cartes, regroupées par type.", + "buildDeck": "Construire le deck" + }, "pool": { "cardsDrafted": "{{count}} cartes draftées", "empty": "Aucune carte draftée pour l'instant", "sortColor": "Couleur", "sortType": "Type", - "sortCmc": "CMC" + "sortCmc": "CMC", + "groups": { + "white": "Blanc", + "blue": "Bleu", + "black": "Noir", + "red": "Rouge", + "green": "Vert", + "multicolor": "Multicolore", + "colorless": "Incolore", + "creature": "Créature", + "instant": "Éphémère", + "sorcery": "Rituel", + "enchantment": "Enchantement", + "artifact": "Artefact", + "planeswalker": "Planeswalker", + "land": "Terrain", + "other": "Autre", + "manaValue0": "0 CMC", + "manaValue1": "1 CMC", + "manaValue2": "2 CMC", + "manaValue3": "3 CMC", + "manaValue4": "4 CMC", + "manaValue5": "5 CMC", + "manaValue6Plus": "6+ CMC" + } }, "standings": { "title": "Classement — Manche {{round}}", @@ -129,6 +166,10 @@ "title": "Quick Draft", "description": "Draftez 3 boosters avec 7 drafteurs IA, construisez un deck de 40 cartes, puis jouez un match Bo1 contre l'un d'eux." }, + "sealed": { + "title": "Sealed", + "description": "Ouvrez six boosters, consultez le pool complet, puis construisez un deck de 40 cartes pour un match en une partie." + }, "cubeDraft": { "title": "Cube Draft", "description": "Collez ou chargez une liste de cube, ajustez les règles de booster et de deck, puis faites un quick draft contre des bots IA." @@ -159,6 +200,7 @@ }, "quickPhase": { "drafting": "Draft", + "opening": "Ouverture des boosters", "deckbuilding": "Construction de deck", "matchRecord": "Match {{number}} — {{wins}}V-{{losses}}D", "record": "{{wins}}V-{{losses}}D", diff --git a/client/src/i18n/locales/it/draft.json b/client/src/i18n/locales/it/draft.json index f67fa1a48a..b70e7e0f83 100644 --- a/client/src/i18n/locales/it/draft.json +++ b/client/src/i18n/locales/it/draft.json @@ -82,12 +82,49 @@ "picking": "Scelta…", "autoPick": "Scelta automatica" }, + "sealedOpening": { + "title": "Apri il tuo pool Sealed", + "subtitle": "Apri sei buste, una alla volta.", + "packProgress": "Busta {{current}} di {{total}}", + "openPack": "Apri busta", + "openPackArt": "Apri l’illustrazione della busta", + "pulls": "Le tue carte", + "nextPack": "Busta successiva", + "viewPool": "Vedi il tuo pool", + "poolTitle": "Il tuo pool Sealed", + "poolSubtitle": "Tutte le {{count}} carte, raggruppate per tipo.", + "buildDeck": "Costruisci il mazzo" + }, "pool": { "cardsDrafted": "{{count}} carte draftate", "empty": "Nessuna carta ancora draftata", "sortColor": "Colore", "sortType": "Tipo", - "sortCmc": "CMC" + "sortCmc": "CMC", + "groups": { + "white": "Bianco", + "blue": "Blu", + "black": "Nero", + "red": "Rosso", + "green": "Verde", + "multicolor": "Multicolore", + "colorless": "Incolore", + "creature": "Creatura", + "instant": "Istantaneo", + "sorcery": "Stregoneria", + "enchantment": "Incantesimo", + "artifact": "Artefatto", + "planeswalker": "Planeswalker", + "land": "Terra", + "other": "Altro", + "manaValue0": "0 CMC", + "manaValue1": "1 CMC", + "manaValue2": "2 CMC", + "manaValue3": "3 CMC", + "manaValue4": "4 CMC", + "manaValue5": "5 CMC", + "manaValue6Plus": "6+ CMC" + } }, "standings": { "title": "Classifica — Round {{round}}", @@ -129,6 +166,10 @@ "title": "Quick Draft", "description": "Drafta 3 buste con 7 draftatori IA, costruisci un mazzo da 40 carte, poi gioca una partita Bo1 contro uno di loro." }, + "sealed": { + "title": "Sealed", + "description": "Apri sei buste, esamina il pool completo e poi costruisci un mazzo da 40 carte per una partita Bo1." + }, "cubeDraft": { "title": "Cube Draft", "description": "Incolla o carica una lista cube, regola le regole di busta e mazzo, poi fai un quick draft contro i bot IA." @@ -159,6 +200,7 @@ }, "quickPhase": { "drafting": "Draft", + "opening": "Apertura buste", "deckbuilding": "Costruzione mazzo", "matchRecord": "Partita {{number}} — {{wins}}V-{{losses}}S", "record": "{{wins}}V-{{losses}}S", diff --git a/client/src/i18n/locales/pl/draft.json b/client/src/i18n/locales/pl/draft.json index 31212af48a..5fc02033aa 100644 --- a/client/src/i18n/locales/pl/draft.json +++ b/client/src/i18n/locales/pl/draft.json @@ -82,12 +82,49 @@ "picking": "Wybieranie…", "autoPick": "Wybór automatyczny" }, + "sealedOpening": { + "title": "Otwórz swoją pulę Sealed", + "subtitle": "Otwórz sześć boosterów, po jednym na raz.", + "packProgress": "Booster {{current}} z {{total}}", + "openPack": "Otwórz booster", + "openPackArt": "Otwórz grafikę boostera", + "pulls": "Twoje karty", + "nextPack": "Następny booster", + "viewPool": "Zobacz swoją pulę", + "poolTitle": "Twoja pula Sealed", + "poolSubtitle": "Wszystkie {{count}} karty, pogrupowane według typu.", + "buildDeck": "Zbuduj talię" + }, "pool": { "cardsDrafted": "{{count}} wybranych kart", "empty": "Nie wybrano jeszcze żadnych kart", "sortColor": "Kolor", "sortType": "Typ", - "sortCmc": "CMC" + "sortCmc": "CMC", + "groups": { + "white": "Biały", + "blue": "Niebieski", + "black": "Czarny", + "red": "Czerwony", + "green": "Zielony", + "multicolor": "Wielokolorowy", + "colorless": "Bezkolorowy", + "creature": "Stworzenie", + "instant": "Instant", + "sorcery": "Sorcery", + "enchantment": "Enchantment", + "artifact": "Artefakt", + "planeswalker": "Planeswalker", + "land": "Ląd", + "other": "Inne", + "manaValue0": "0 CMC", + "manaValue1": "1 CMC", + "manaValue2": "2 CMC", + "manaValue3": "3 CMC", + "manaValue4": "4 CMC", + "manaValue5": "5 CMC", + "manaValue6Plus": "6+ CMC" + } }, "standings": { "title": "Klasyfikacja — Runda {{round}}", @@ -129,6 +166,10 @@ "title": "Szybki draft", "description": "Zdraftuj 3 boostery z 7 botami, zbuduj talię z 40 kart, a potem rozegraj mecz Bo1 przeciwko jednemu z nich." }, + "sealed": { + "title": "Sealed", + "description": "Otwórz sześć boosterów, przejrzyj całą pulę, a potem zbuduj talię z 40 kart na mecz Bo1." + }, "cubeDraft": { "title": "Draft kostki", "description": "Wklej lub wczytaj listę kostki, dostosuj zasady boosterów i talii, a potem zdraftuj szybko przeciwko botom." @@ -159,6 +200,7 @@ }, "quickPhase": { "drafting": "Draftowanie", + "opening": "Otwieranie boosterów", "deckbuilding": "Budowanie talii", "matchRecord": "Mecz {{number}} — {{wins}}W-{{losses}}P", "record": "{{wins}}W-{{losses}}P", diff --git a/client/src/i18n/locales/pt/draft.json b/client/src/i18n/locales/pt/draft.json index ff2a1c3602..96672f5996 100644 --- a/client/src/i18n/locales/pt/draft.json +++ b/client/src/i18n/locales/pt/draft.json @@ -82,12 +82,49 @@ "picking": "Escolhendo…", "autoPick": "Escolha automática" }, + "sealedOpening": { + "title": "Abra seu pool de Selado", + "subtitle": "Abra seis boosters, um de cada vez.", + "packProgress": "Booster {{current}} de {{total}}", + "openPack": "Abrir booster", + "openPackArt": "Abrir arte do booster", + "pulls": "Suas cartas", + "nextPack": "Próximo booster", + "viewPool": "Ver seu pool", + "poolTitle": "Seu pool de Selado", + "poolSubtitle": "Todas as {{count}} cartas, agrupadas por tipo.", + "buildDeck": "Montar deck" + }, "pool": { "cardsDrafted": "{{count}} cartas draftadas", "empty": "Nenhuma carta draftada ainda", "sortColor": "Cor", "sortType": "Tipo", - "sortCmc": "CMC" + "sortCmc": "CMC", + "groups": { + "white": "Branco", + "blue": "Azul", + "black": "Preto", + "red": "Vermelho", + "green": "Verde", + "multicolor": "Multicolorido", + "colorless": "Incolor", + "creature": "Criatura", + "instant": "Mágica instantânea", + "sorcery": "Feitiço", + "enchantment": "Encantamento", + "artifact": "Artefato", + "planeswalker": "Planeswalker", + "land": "Terreno", + "other": "Outro", + "manaValue0": "0 CMC", + "manaValue1": "1 CMC", + "manaValue2": "2 CMC", + "manaValue3": "3 CMC", + "manaValue4": "4 CMC", + "manaValue5": "5 CMC", + "manaValue6Plus": "6+ CMC" + } }, "standings": { "title": "Classificação — Rodada {{round}}", @@ -129,6 +166,10 @@ "title": "Quick Draft", "description": "Drafte 3 boosters com 7 draftadores de IA, monte um deck de 40 cartas e jogue uma partida Bo1 contra um deles." }, + "sealed": { + "title": "Sealed", + "description": "Abra seis boosters, revise o pool completo e depois monte um deck de 40 cartas para uma partida Bo1." + }, "cubeDraft": { "title": "Cube Draft", "description": "Cole ou carregue uma lista de Cube, ajuste as regras de booster e deck e depois faça um quick draft contra bots de IA." @@ -159,6 +200,7 @@ }, "quickPhase": { "drafting": "Draftando", + "opening": "Abrindo boosters", "deckbuilding": "Montagem de Deck", "matchRecord": "Partida {{number}} — {{wins}}V-{{losses}}D", "record": "{{wins}}V-{{losses}}D", diff --git a/client/src/network/__tests__/draftProtocol.test.ts b/client/src/network/__tests__/draftProtocol.test.ts index d65794b2a5..27ef27db6e 100644 --- a/client/src/network/__tests__/draftProtocol.test.ts +++ b/client/src/network/__tests__/draftProtocol.test.ts @@ -10,8 +10,8 @@ import type { DraftP2PMessage } from "../draftProtocol"; describe("draftProtocol", () => { describe("DRAFT_PROTOCOL_VERSION", () => { - it("is version 8", () => { - expect(DRAFT_PROTOCOL_VERSION).toBe(8); + it("is version 9", () => { + expect(DRAFT_PROTOCOL_VERSION).toBe(9); }); }); @@ -108,8 +108,8 @@ describe("draftProtocol", () => { it("round-trips a large message (gzip path)", async () => { // Build a message large enough to trigger compression const longView = { - status: "Drafting", - kind: "Premier", + status: "Deckbuilding", + kind: "Sealed", current_pack_number: 1, pick_number: 3, pass_direction: "Left", @@ -123,7 +123,119 @@ describe("draftProtocol", () => { cmc: i % 7, type_line: "Creature - Human Wizard", })), - pool: [], + pool: [ + { + instance_id: "pack-1-card-1", + name: "First Pull", + set_code: "TST", + collector_number: "101", + rarity: "common", + colors: ["W"], + cmc: 1, + type_line: "Creature — Test", + }, + { + instance_id: "pack-2-card-1", + name: "Second Pull", + set_code: "TST", + collector_number: "102", + rarity: "uncommon", + colors: ["U"], + cmc: 2, + type_line: "Instant", + }, + ], + pool_groups: { + color_groups: [ + { kind: "white", total: 1, cards: [{ card: { + instance_id: "pack-1-card-1", + name: "First Pull", + set_code: "TST", + collector_number: "101", + rarity: "common", + colors: ["W"], + cmc: 1, + type_line: "Creature — Test", + }, count: 1 }] }, + { kind: "blue", total: 1, cards: [{ card: { + instance_id: "pack-2-card-1", + name: "Second Pull", + set_code: "TST", + collector_number: "102", + rarity: "uncommon", + colors: ["U"], + cmc: 2, + type_line: "Instant", + }, count: 1 }] }, + ], + type_groups: [ + { kind: "creature", total: 1, cards: [{ card: { + instance_id: "pack-1-card-1", + name: "First Pull", + set_code: "TST", + collector_number: "101", + rarity: "common", + colors: ["W"], + cmc: 1, + type_line: "Creature — Test", + }, count: 1 }] }, + { kind: "instant", total: 1, cards: [{ card: { + instance_id: "pack-2-card-1", + name: "Second Pull", + set_code: "TST", + collector_number: "102", + rarity: "uncommon", + colors: ["U"], + cmc: 2, + type_line: "Instant", + }, count: 1 }] }, + ], + cmc_groups: [ + { kind: "mana_value1", total: 1, cards: [{ card: { + instance_id: "pack-1-card-1", + name: "First Pull", + set_code: "TST", + collector_number: "101", + rarity: "common", + colors: ["W"], + cmc: 1, + type_line: "Creature — Test", + }, count: 1 }] }, + { kind: "mana_value2", total: 1, cards: [{ card: { + instance_id: "pack-2-card-1", + name: "Second Pull", + set_code: "TST", + collector_number: "102", + rarity: "uncommon", + colors: ["U"], + cmc: 2, + type_line: "Instant", + }, count: 1 }] }, + ], + color_counts: { white: 1, blue: 1, black: 0, red: 0, green: 0 }, + }, + sealed_packs: [ + [{ + instance_id: "pack-1-card-1", + name: "First Pull", + set_code: "TST", + collector_number: "101", + rarity: "common", + colors: ["W"], + cmc: 1, + type_line: "Creature — Test", + }], + [{ + instance_id: "pack-2-card-1", + name: "Second Pull", + set_code: "TST", + collector_number: "102", + rarity: "uncommon", + colors: ["U"], + cmc: 2, + type_line: "Instant", + }], + ], seats: [], cards_per_pack: 14, pack_count: 3, @@ -141,6 +253,10 @@ describe("draftProtocol", () => { const decoded = await decodeDraftWireMessage(encoded); expect(decoded).toEqual(msg); + if (decoded.type === "draft_state_update") { + expect(decoded.view.sealed_packs).toEqual(longView.sealed_packs); + expect(decoded.view.pool_groups).toEqual(longView.pool_groups); + } }); it("round-trips a deck-carrying draft match start message", async () => { diff --git a/client/src/network/draftProtocol.ts b/client/src/network/draftProtocol.ts index 8b82e5fdd3..8cfea18f8f 100644 --- a/client/src/network/draftProtocol.ts +++ b/client/src/network/draftProtocol.ts @@ -39,8 +39,9 @@ import type { * 6 — durable authorized Bo3 intergame command ledger * 7 — forward authenticated match-host between-games observations * 8 — add Sealed event kind and deckbuilding-first start flow + * 9 — add engine-owned limited-pool presentation groups */ -export const DRAFT_PROTOCOL_VERSION = 8 as const; +export const DRAFT_PROTOCOL_VERSION = 9 as const; /** * Typed reason for a draft pause, used over the wire and on the i18n key path. diff --git a/client/src/pages/DraftLandingPage.tsx b/client/src/pages/DraftLandingPage.tsx index 829c23c971..a8effbee07 100644 --- a/client/src/pages/DraftLandingPage.tsx +++ b/client/src/pages/DraftLandingPage.tsx @@ -93,7 +93,7 @@ export function DraftLandingPage() { {/* Same bento action tiles as the home dashboard — one accent tone per mode — so the draft landing shares the home card grammar. */} -
+
} onClick={() => navigate("/draft/quick")} /> + } + onClick={() => navigate("/draft/quick?mode=sealed")} + />
)} @@ -485,6 +473,13 @@ export function DraftPage() { )} + {phase === "opening" && draftView && ( + useDraftStore.getState().completeSealedOpening()} + /> + )} + {phase === "launching" && ( Promise; startSealedDraft: (setPoolJson: string, setCode: string, setName: string, difficulty: number) => Promise; startCubeDraft: (cubeListText: string, cubeName: string, settings: CubeDraftSettings, difficulty: number) => Promise; + completeSealedOpening: () => void; resumeDraft: () => Promise; abandonDraft: () => Promise; pickCard: (cardInstanceId: string) => Promise; @@ -182,6 +183,15 @@ function persistDraftDebounced(): void { debounceTimer = setTimeout(persistDraft, 500); } +function phaseForView(view: DraftPlayerView, persistedPhase: DraftPhase): DraftPhase { + if (view.status === "Deckbuilding") { + return view.kind === "Sealed" && persistedPhase === "opening" + ? "opening" + : "deckbuilding"; + } + return view.status === "Pairing" ? "launching" : persistedPhase; +} + /** Apply an updated draft view after a pick (manual or auto) and persist. */ function applyPickResult(view: DraftPlayerView): void { const nextPhase: DraftPhase = @@ -249,7 +259,7 @@ export const useDraftStore = create()( draftId, adapter, view, - phase: view.status === "Deckbuilding" ? "deckbuilding" : "drafting", + phase: "opening", difficulty, selectedSet: setCode, selectedSetName: setName, @@ -296,6 +306,11 @@ export const useDraftStore = create()( persistDraft(); }, + completeSealedOpening: () => { + set({ phase: "deckbuilding" }); + persistDraft(); + }, + resumeDraft: async () => { const meta = loadActiveQuickDraft(); if (!meta) return; @@ -331,11 +346,7 @@ export const useDraftStore = create()( draftId: meta.id, adapter, view, - phase: view.status === "Deckbuilding" - ? "deckbuilding" - : view.status === "Pairing" - ? "launching" - : meta.phase, + phase: phaseForView(view, meta.phase), difficulty: meta.difficulty, selectedSet: meta.setCode, selectedSetName: meta.setName ?? null, @@ -372,11 +383,7 @@ export const useDraftStore = create()( draftId: meta.id, adapter, view, - phase: view.status === "Deckbuilding" - ? "deckbuilding" - : view.status === "Pairing" - ? "launching" - : meta.phase, + phase: phaseForView(view, meta.phase), difficulty: meta.difficulty, selectedSet: meta.setCode, selectedSetName: meta.setName ?? null, diff --git a/crates/draft-core/src/view.rs b/crates/draft-core/src/view.rs index 46f3c54f09..b5ce3a4a8a 100644 --- a/crates/draft-core/src/view.rs +++ b/crates/draft-core/src/view.rs @@ -44,6 +44,83 @@ pub struct SeatPublicView { pub pick_status: PickStatus, } +/// A stable, engine-defined category for a limited pool display group. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +pub enum DraftPoolGroupKind { + White, + Blue, + Black, + Red, + Green, + Multicolor, + Colorless, + Creature, + Instant, + Sorcery, + Enchantment, + Artifact, + Planeswalker, + Land, + Other, + ManaValue0, + ManaValue1, + ManaValue2, + ManaValue3, + ManaValue4, + ManaValue5, + ManaValue6Plus, +} + +/// One distinct card and the number of copies in a pool group. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct DraftPoolEntry { + pub card: DraftCardInstance, + pub count: usize, +} + +/// One ordered display group in a limited pool. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct DraftPoolGroup { + pub kind: DraftPoolGroupKind, + /// Number of physical cards before duplicate entries are collapsed. + pub total: usize, + pub cards: Vec, +} + +/// WUBRG card totals for the pool header. Multicolor cards count toward every +/// color they contain. +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub struct DraftPoolColorCounts { + pub white: usize, + pub blue: usize, + pub black: usize, + pub red: usize, + pub green: usize, +} + +/// Pre-grouped, ordered presentation data for a player's limited pool. +#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] +pub struct DraftPoolGroups { + pub color_groups: Vec, + pub type_groups: Vec, + pub cmc_groups: Vec, + pub color_counts: DraftPoolColorCounts, +} + +impl DraftPoolGroups { + /// Builds the engine-owned ordering, grouping, and duplicate counts for a + /// limited pool display. + pub fn from_pool(pool: &[DraftCardInstance]) -> Self { + Self { + color_groups: groups_for(pool, &COLOR_GROUP_ORDER, color_group, true), + type_groups: groups_for(pool, &TYPE_GROUP_ORDER, type_group, true), + cmc_groups: groups_for(pool, &CMC_GROUP_ORDER, mana_value_group, false), + color_counts: color_counts(pool), + } + } +} + /// Filtered draft state for a specific player. Built from scratch (not a reference /// into DraftSession) to prevent accidental hidden state leakage. #[derive(Debug, Clone, Serialize, Deserialize)] @@ -62,6 +139,13 @@ pub struct DraftPlayerView { pub current_pack: Option>, /// The viewer's drafted pool pub pool: Vec, + /// Engine-defined groups for displaying the viewer's pool without client-side + /// card classification, ordering, or deduplication. + pub pool_groups: DraftPoolGroups, + /// Each of the viewer's sealed packs, in opening order. Present only for + /// sealed events so clients can present the engine-generated pulls without + /// reconstructing packs from a flattened pool. + pub sealed_packs: Option>>, /// Public info for all seats pub seats: Vec, /// Total cards per pack (for UI progress display) @@ -238,6 +322,12 @@ pub fn filter_for_player(session: &DraftSession, seat_index: u8) -> DraftPlayerV .map(|p| p.0.clone()); let pool = session.pools.get(idx).cloned().unwrap_or_default(); + let sealed_packs = (session.kind == DraftKind::Sealed).then(|| { + pool.chunks(usize::from(session.config.cards_per_pack)) + .map(ToOwned::to_owned) + .collect() + }); + let pool_groups = DraftPoolGroups::from_pool(&pool); let is_drafting = session.status == DraftStatus::Drafting; @@ -298,6 +388,8 @@ pub fn filter_for_player(session: &DraftSession, seat_index: u8) -> DraftPlayerV pass_direction: session.pass_direction, current_pack, pool, + pool_groups, + sealed_packs, seats, cards_per_pack: session.config.cards_per_pack, pack_count: session.config.pack_count, @@ -313,6 +405,151 @@ pub fn filter_for_player(session: &DraftSession, seat_index: u8) -> DraftPlayerV } } +const COLOR_GROUP_ORDER: [DraftPoolGroupKind; 7] = [ + DraftPoolGroupKind::White, + DraftPoolGroupKind::Blue, + DraftPoolGroupKind::Black, + DraftPoolGroupKind::Red, + DraftPoolGroupKind::Green, + DraftPoolGroupKind::Multicolor, + DraftPoolGroupKind::Colorless, +]; + +const TYPE_GROUP_ORDER: [DraftPoolGroupKind; 8] = [ + DraftPoolGroupKind::Creature, + DraftPoolGroupKind::Instant, + DraftPoolGroupKind::Sorcery, + DraftPoolGroupKind::Enchantment, + DraftPoolGroupKind::Artifact, + DraftPoolGroupKind::Planeswalker, + DraftPoolGroupKind::Land, + DraftPoolGroupKind::Other, +]; + +const CMC_GROUP_ORDER: [DraftPoolGroupKind; 7] = [ + DraftPoolGroupKind::ManaValue0, + DraftPoolGroupKind::ManaValue1, + DraftPoolGroupKind::ManaValue2, + DraftPoolGroupKind::ManaValue3, + DraftPoolGroupKind::ManaValue4, + DraftPoolGroupKind::ManaValue5, + DraftPoolGroupKind::ManaValue6Plus, +]; + +fn groups_for( + pool: &[DraftCardInstance], + order: &[DraftPoolGroupKind], + classify: fn(&DraftCardInstance) -> DraftPoolGroupKind, + sort_by_cmc: bool, +) -> Vec { + order + .iter() + .filter_map(|kind| { + let cards: Vec<_> = pool + .iter() + .filter(|card| classify(card) == *kind) + .cloned() + .collect(); + let total = cards.len(); + (!cards.is_empty()).then(|| DraftPoolGroup { + kind: *kind, + total, + cards: sorted_entries(cards, sort_by_cmc), + }) + }) + .collect() +} + +fn sorted_entries(mut cards: Vec, sort_by_cmc: bool) -> Vec { + cards.sort_by(|left, right| { + if sort_by_cmc { + left.cmc + .cmp(&right.cmc) + .then_with(|| left.name.cmp(&right.name)) + } else { + left.name.cmp(&right.name) + } + }); + + let mut entries: Vec = Vec::new(); + for card in cards { + if let Some(entry) = entries + .last_mut() + .filter(|entry| entry.card.name == card.name) + { + entry.count += 1; + } else { + entries.push(DraftPoolEntry { card, count: 1 }); + } + } + entries +} + +fn color_group(card: &DraftCardInstance) -> DraftPoolGroupKind { + match card.colors.as_slice() { + [] => DraftPoolGroupKind::Colorless, + [_color, _second, ..] => DraftPoolGroupKind::Multicolor, + [color] => match color.as_str() { + "W" => DraftPoolGroupKind::White, + "U" => DraftPoolGroupKind::Blue, + "B" => DraftPoolGroupKind::Black, + "R" => DraftPoolGroupKind::Red, + "G" => DraftPoolGroupKind::Green, + _ => DraftPoolGroupKind::Colorless, + }, + } +} + +fn type_group(card: &DraftCardInstance) -> DraftPoolGroupKind { + let type_line = card.type_line.to_ascii_lowercase(); + if type_line.contains("creature") { + DraftPoolGroupKind::Creature + } else if type_line.contains("instant") { + DraftPoolGroupKind::Instant + } else if type_line.contains("sorcery") { + DraftPoolGroupKind::Sorcery + } else if type_line.contains("enchantment") { + DraftPoolGroupKind::Enchantment + } else if type_line.contains("artifact") { + DraftPoolGroupKind::Artifact + } else if type_line.contains("planeswalker") { + DraftPoolGroupKind::Planeswalker + } else if type_line.contains("land") { + DraftPoolGroupKind::Land + } else { + DraftPoolGroupKind::Other + } +} + +fn mana_value_group(card: &DraftCardInstance) -> DraftPoolGroupKind { + match card.cmc { + 0 => DraftPoolGroupKind::ManaValue0, + 1 => DraftPoolGroupKind::ManaValue1, + 2 => DraftPoolGroupKind::ManaValue2, + 3 => DraftPoolGroupKind::ManaValue3, + 4 => DraftPoolGroupKind::ManaValue4, + 5 => DraftPoolGroupKind::ManaValue5, + _ => DraftPoolGroupKind::ManaValue6Plus, + } +} + +fn color_counts(pool: &[DraftCardInstance]) -> DraftPoolColorCounts { + let mut counts = DraftPoolColorCounts::default(); + for card in pool { + for color in &card.colors { + match color.as_str() { + "W" => counts.white += 1, + "U" => counts.blue += 1, + "B" => counts.black += 1, + "R" => counts.red += 1, + "G" => counts.green += 1, + _ => {} + } + } + } + counts +} + fn compute_standings(session: &DraftSession) -> Vec { if session.pairings.is_empty() { return Vec::new(); @@ -467,6 +704,19 @@ mod tests { .unwrap(); } + fn draft_card(name: &str, colors: &[&str], cmc: u8, type_line: &str) -> DraftCardInstance { + DraftCardInstance { + instance_id: name.to_string(), + name: name.to_string(), + set_code: "TST".to_string(), + collector_number: "1".to_string(), + rarity: "common".to_string(), + colors: colors.iter().map(ToString::to_string).collect(), + cmc, + type_line: type_line.to_string(), + } + } + #[test] fn view_contains_viewers_current_pack() { let (mut session, source) = test_session(8); @@ -493,6 +743,87 @@ mod tests { assert_eq!(view.pool[0].instance_id, session.pools[0][0].instance_id); } + #[test] + fn sealed_view_preserves_the_viewers_pack_boundaries() { + let (mut session, source) = test_session(2); + session.kind = DraftKind::Sealed; + session.config.kind = DraftKind::Sealed; + session.config.pack_count = 6; + session::apply(&mut session, DraftAction::StartDraft, Some(&source)).unwrap(); + + let view = filter_for_player(&session, 0); + let sealed_packs = view + .sealed_packs + .expect("sealed view includes opening packs"); + + assert_eq!(sealed_packs.len(), 6); + assert!(sealed_packs.iter().all(|pack| pack.len() == 14)); + assert_eq!(sealed_packs.concat(), view.pool); + } + + #[test] + fn pool_groups_are_engine_ordered_and_deduplicated() { + let pool = vec![ + draft_card("Adept", &["W"], 2, "Artifact Creature — Wizard"), + draft_card("Adept", &["W"], 2, "Artifact Creature — Wizard"), + draft_card("Bolt", &["R"], 1, "Instant"), + draft_card("Charm", &["U", "R"], 3, "Sorcery"), + draft_card("Field", &[], 0, "Land"), + ]; + + let groups = DraftPoolGroups::from_pool(&pool); + + assert_eq!( + groups + .color_groups + .iter() + .map(|group| group.kind) + .collect::>(), + vec![ + DraftPoolGroupKind::White, + DraftPoolGroupKind::Red, + DraftPoolGroupKind::Multicolor, + DraftPoolGroupKind::Colorless, + ] + ); + assert_eq!(groups.color_groups[0].cards[0].count, 2); + assert_eq!(groups.color_groups[0].total, 2); + assert_eq!( + groups + .type_groups + .iter() + .map(|group| group.kind) + .collect::>(), + vec![ + DraftPoolGroupKind::Creature, + DraftPoolGroupKind::Instant, + DraftPoolGroupKind::Sorcery, + DraftPoolGroupKind::Land, + ] + ); + assert_eq!(groups.type_groups[0].cards[0].card.name, "Adept"); + assert_eq!(groups.type_groups[0].cards[0].count, 2); + assert_eq!(groups.color_counts.white, 2); + assert_eq!(groups.color_counts.red, 2); + } + + #[test] + fn mana_value_group_kinds_match_the_wire_contract() { + let values = [ + (DraftPoolGroupKind::ManaValue0, "mana_value0"), + (DraftPoolGroupKind::ManaValue1, "mana_value1"), + (DraftPoolGroupKind::ManaValue2, "mana_value2"), + (DraftPoolGroupKind::ManaValue3, "mana_value3"), + (DraftPoolGroupKind::ManaValue4, "mana_value4"), + (DraftPoolGroupKind::ManaValue5, "mana_value5"), + (DraftPoolGroupKind::ManaValue6Plus, "mana_value6_plus"), + ]; + + for (kind, expected) in values { + assert_eq!(serde_json::to_value(kind).unwrap(), expected); + } + } + #[test] fn view_contains_public_status_fields() { let (mut session, source) = test_session(8); diff --git a/crates/server-core/src/protocol.rs b/crates/server-core/src/protocol.rs index dc5cc18763..724f871074 100644 --- a/crates/server-core/src/protocol.rs +++ b/crates/server-core/src/protocol.rs @@ -2085,16 +2085,40 @@ mod tests { #[test] fn server_message_draft_state_update_roundtrips() { use draft_core::types::*; - use draft_core::view::DraftPlayerView; - + use draft_core::view::{DraftPlayerView, DraftPoolGroups}; + + let first_pull = DraftCardInstance { + instance_id: "pack-1-card-1".to_string(), + name: "First Pull".to_string(), + set_code: "TST".to_string(), + collector_number: "1".to_string(), + rarity: "common".to_string(), + colors: vec!["W".to_string()], + cmc: 1, + type_line: "Creature — Test".to_string(), + }; + let second_pull = DraftCardInstance { + instance_id: "pack-2-card-1".to_string(), + name: "Second Pull".to_string(), + set_code: "TST".to_string(), + collector_number: "2".to_string(), + rarity: "uncommon".to_string(), + colors: vec!["U".to_string()], + cmc: 2, + type_line: "Instant".to_string(), + }; + let pool = vec![first_pull.clone(), second_pull.clone()]; + let pool_groups = DraftPoolGroups::from_pool(&pool); let view = DraftPlayerView { - status: DraftStatus::Drafting, - kind: DraftKind::Premier, + status: DraftStatus::Deckbuilding, + kind: DraftKind::Sealed, current_pack_number: 0, pick_number: 2, pass_direction: PassDirection::Left, current_pack: None, - pool: Vec::new(), + pool, + pool_groups, + sealed_packs: Some(vec![vec![first_pull], vec![second_pull]]), seats: Vec::new(), cards_per_pack: 14, pack_count: 3, @@ -2106,16 +2130,30 @@ mod tests { tournament_format: TournamentFormat::Swiss, pod_policy: PodPolicy::Competitive, pairings: Vec::new(), - match_config: DraftKind::Premier.match_config(), + match_config: DraftKind::Sealed.match_config(), }; let msg = ServerMessage::DraftStateUpdate { view: view.clone() }; let json = serde_json::to_string(&msg).unwrap(); let parsed: ServerMessage = serde_json::from_str(&json).unwrap(); match parsed { ServerMessage::DraftStateUpdate { view: v } => { - assert_eq!(v.status, DraftStatus::Drafting); + assert_eq!(v.status, DraftStatus::Deckbuilding); assert_eq!(v.pick_number, 2); assert_eq!(v.timer_remaining_ms, Some(5000)); + assert_eq!(v.pool_groups, view.pool_groups); + assert_eq!( + v.sealed_packs + .as_ref() + .expect("sealed packs survive JSON transport") + .iter() + .map(|pack| { + pack.iter() + .map(|card| card.instance_id.as_str()) + .collect::>() + }) + .collect::>(), + vec![vec!["pack-1-card-1"], vec!["pack-2-card-1"]] + ); } _ => panic!("wrong variant"), } diff --git a/scripts/changelog/state.json b/scripts/changelog/state.json index bb04d28076..dcf6d0a306 100644 --- a/scripts/changelog/state.json +++ b/scripts/changelog/state.json @@ -1,4 +1,4 @@ { - "lastTip": "19031cf857", - "lastPostedId": 188 + "lastTip": "907d219c7a", + "lastPostedId": 189 } From 82318ccfd75f0a8f9794a9f1f416d4213bbb5329 Mon Sep 17 00:00:00 2001 From: Jacob Woodson <38709105+JacobWoodson@users.noreply.github.com> Date: Sun, 9 Aug 2026 23:04:12 -0500 Subject: [PATCH 05/15] fix(parser): keep shared-event subject disjunctions as one trigger (#7186) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `split_cross_subject_event_compound` decides whether "Whenever A or B " is two events or one event shared by two subjects. It gated only the SECOND half on containing an event verb, so a subject disjunction whose second subject happens to be followed by an active-voice verb was split as if it were a cross-subject compound. The leading subject was then stranded in a trigger with no event at all — an `Unknown("Whenever ~")` husk — and its leg silently never fired. Ironsoul Enforcer ("Whenever this creature or a commander you control attacks alone, return target artifact card from your graveyard to the battlefield") is the clearest case: "a commander you control" is followed by "attacks", so the line split into a dead husk plus a working commander leg, and the Enforcer's own attack never triggered. Add the symmetric gate. CR 603.1: a genuine cross-subject compound carries an event on BOTH sides of the "or" (Norin the Wary: "a player casts a spell" / "a creature attacks"); a subject disjunction has a bare noun phrase on the left. `parse_trigger_subject` already folds the latter into a single `TargetFilter::Or` subject, which is the CR-correct shape. The gate uses the WIDE `parse_event_head_start` deliberately, so a state-change or passive leading leg ("becomes tapped or a creature you control attacks") is still recognized as an event and still splits. Measured over the MTGJSON corpus this recovers the dropped leading leg on seven cards across four event families — Ironsoul Enforcer (Attacks), Campsite Cuisine / Shipwreck Sifters / Long Feng (ChangesZone), Calix and Syr Carah (DamageDone), Surrak (BecomesTarget) — and splits zero lines it split before. Donna Noble and The Bus Runner never reach this arm and are unaffected; Norin the Wary still splits into two triggers. Not fixed here: Leovold / Rayne / Parnesse / Unsettled Mariner lose the husk but their "you" (player) leg is still dropped by the subject parser, so only the permanent leg fires. Tests: parser AST shape, production-path no-split for two distinct event families (Attacks + ETB), and a four-case runtime test covering commander attacks alone / source attacks alone / two attackers / unflagged creature. Co-authored-by: Claude Opus 5 --- crates/engine/src/parser/oracle_trigger.rs | 34 ++++- .../engine/src/parser/oracle_trigger_tests.rs | 131 ++++++++++++++++++ ...onsoul_enforcer_commander_attacks_alone.rs | 120 ++++++++++++++++ crates/engine/tests/integration/main.rs | 1 + 4 files changed, 285 insertions(+), 1 deletion(-) create mode 100644 crates/engine/tests/integration/ironsoul_enforcer_commander_attacks_alone.rs diff --git a/crates/engine/src/parser/oracle_trigger.rs b/crates/engine/src/parser/oracle_trigger.rs index 75df6f4562..8e57131a91 100644 --- a/crates/engine/src/parser/oracle_trigger.rs +++ b/crates/engine/src/parser/oracle_trigger.rs @@ -7893,7 +7893,7 @@ fn split_cross_subject_event_compound(cond_lower: &str, condition: &str) -> Opti if is_enters_or_haunted_creature_dies_compound(cond_lower) { return None; } - let (after_lower, _) = parse_cross_subject_or_split(cond_lower).ok()?; + let (after_lower, before_lower) = parse_cross_subject_or_split(cond_lower).ok()?; let (after_original, before_original) = parse_cross_subject_or_split(condition).ok()?; // Check if what follows " or " starts with a valid subject phrase @@ -7923,6 +7923,38 @@ fn split_cross_subject_event_compound(cond_lower: &str, condition: &str) -> Opti // Both yield a bogus first half with no event at all. scan_preceded(after_trimmed, |i| parse_event_verb_start(i))?; + // CR 603.1 + CR 603.2: symmetric gate — a genuine CROSS-SUBJECT compound + // carries an event on BOTH sides of the "or" (Norin the Wary: "a player + // casts a spell" / "a creature attacks"). A SUBJECT disjunction shares one + // event between two subjects, so its first half is a bare noun phrase + // ("whenever ~", "whenever this creature"). Splitting that strands the + // leading subject in a trigger with no event at all and silently drops the + // self leg, so the card fires only for its second subject. + // + // This is the same `Unknown("Whenever ~")` husk the comment above keeps the + // SECOND-half gate narrow to avoid; the two gates close the failure from + // opposite sides. Donna Noble and The Bus Runner never reach this arm (their + // second half carries no narrow-lexicon verb, so the gate above already + // declines) and are unaffected here. What slips past that gate is a subject + // disjunction whose second subject IS followed by an active-voice verb — + // Ironsoul Enforcer's "or a commander you control attacks alone", which the + // scan above cannot tell apart from a second event. + // `parse_trigger_subject` already folds these into one `TargetFilter::Or` + // subject, which is the CR 603.1-correct single trigger. + // + // Measured over the MTGJSON corpus, this recovers the dropped leading leg on + // Ironsoul Enforcer, Campsite Cuisine, Calix, Syr Carah, Shipwreck Sifters, + // Long Feng and Surrak — four distinct event families (Attacks, ChangesZone, + // DamageDone, BecomesTarget) — and splits zero lines it split before. + // + // This gate uses the WIDE `parse_event_head_start` on purpose: it must + // decline only when the leading half has NO event of any kind. A + // state-change or passive leading leg ("whenever ~ becomes tapped or a + // creature you control attacks") is still a real two-event compound and + // must keep splitting, so narrowing this to `parse_event_verb_start` would + // collapse it into a bogus single trigger. + scan_preceded(before_lower.trim(), |i| parse_event_head_start(i))?; + let (_, keyword) = parse_trigger_keyword_prefix(cond_lower).ok()?; let first = before_original.trim().to_string(); diff --git a/crates/engine/src/parser/oracle_trigger_tests.rs b/crates/engine/src/parser/oracle_trigger_tests.rs index c73a6d1bdf..dbadaab783 100644 --- a/crates/engine/src/parser/oracle_trigger_tests.rs +++ b/crates/engine/src/parser/oracle_trigger_tests.rs @@ -4088,6 +4088,93 @@ fn trigger_attacks_you_or_planeswalker_not_split() { ); } +/// CR 603.1 + CR 603.2: a SUBJECT disjunction (" or ") is +/// one trigger with an `Or` subject, not a cross-subject compound. The +/// second-half event-verb gate in `split_cross_subject_event_compound` cannot +/// tell the two apart on its own — Ironsoul Enforcer's second subject is +/// followed by "attacks", a narrow-lexicon active-voice verb — so the split +/// also requires an event in the FIRST half. Without that symmetric gate the +/// line splits into `Unknown("Whenever ~")` + the commander leg, silently +/// dropping the self leg so the card never fires off its own attack. +/// +/// This is the production path (`parse_trigger_lines`); `parse_trigger_line` +/// alone never reaches the splitter and so cannot catch the regression. +#[test] +fn trigger_self_or_class_subject_disjunction_not_split() { + let triggers = parse_trigger_lines( + "Whenever this creature or a commander you control attacks alone, return target artifact card from your graveyard to the battlefield.", + "Ironsoul Enforcer", + ); + assert_eq!( + triggers.len(), + 1, + "a shared-event subject disjunction must stay one trigger: {:?}", + triggers.iter().map(|t| &t.mode).collect::>() + ); + assert_eq!(triggers[0].mode, TriggerMode::Attacks); + let Some(TargetFilter::Or { filters }) = triggers[0].valid_card.as_ref() else { + panic!("expected an Or subject, got {:?}", triggers[0].valid_card); + }; + assert_eq!(filters.len(), 2, "one leg per subject: {filters:?}"); + assert_eq!(filters[0], TargetFilter::SelfRef); + assert!( + matches!(&filters[1], TargetFilter::Typed(tf) + if tf.properties.contains(&FilterProp::IsCommander)), + "CR 903.3: second leg must carry IsCommander, got {:?}", + filters[1] + ); + assert_eq!( + triggers[0].condition, + Some(TriggerCondition::Not { + condition: Box::new(TriggerCondition::MinCoAttackers { + minimum: 1, + filter: None, + }), + }), + "CR 506.5: the alone gate applies to whichever subject attacked" + ); +} + +/// CR 603.1: the same gate, a different event family — the fix must be +/// class-level, not attack-specific. Campsite Cuisine's "this enchantment or a +/// legendary creature you control enters" shares one ETB event between two +/// subjects; before the first-half gate it split into `Unknown("Whenever ~")` +/// plus the legendary-creature leg, so the enchantment's own ETB never fired. +#[test] +fn trigger_self_or_class_subject_disjunction_not_split_etb() { + let triggers = parse_trigger_lines( + "Whenever this enchantment or a legendary creature you control enters, create a Food token.", + "Campsite Cuisine", + ); + assert_eq!( + triggers.len(), + 1, + "a shared-ETB subject disjunction must stay one trigger: {:?}", + triggers.iter().map(|t| &t.mode).collect::>() + ); + assert_eq!(triggers[0].mode, TriggerMode::ChangesZone); + assert_eq!(triggers[0].destination, Some(Zone::Battlefield)); + let Some(TargetFilter::Or { filters }) = triggers[0].valid_card.as_ref() else { + panic!("expected an Or subject, got {:?}", triggers[0].valid_card); + }; + assert_eq!(filters.len(), 2, "one leg per subject: {filters:?}"); + assert_eq!( + filters[0], + TargetFilter::SelfRef, + "the source's own ETB leg must survive the split gate" + ); + assert!( + matches!(&filters[1], TargetFilter::Typed(tf) + if tf.controller == Some(ControllerRef::You) + && tf.type_filters == vec![TypeFilter::Creature] + && tf.properties.contains(&FilterProp::HasSupertype { + value: Supertype::Legendary + })), + "second leg must be a legendary creature you control, got {:?}", + filters[1] + ); +} + #[test] fn trigger_counter_put_on_self() { let def = parse_trigger_line( @@ -14835,6 +14922,50 @@ fn trigger_dragon_you_control_attacks() { ); } +/// CR 506.5 + CR 903.3: a *disjunctive* attacks-alone subject — a +/// self-reference OR'd with a non-self class (Ironsoul Enforcer's "this +/// creature or a commander you control"). Two building blocks must compose: +/// `parse_trigger_subject`'s `" or "` fold must produce an `Or` whose second +/// leg carries `FilterProp::IsCommander` (the CR 903.3 designation, NOT a +/// subtype), and `strip_attack_alone_qualifier` must still gate the whole +/// trigger on zero co-attackers. The alone-gate lives on the condition, not on +/// either leg, so it applies to whichever disjunct matched. +#[test] +fn trigger_self_or_commander_attacks_alone() { + let def = parse_trigger_line( + "Whenever this creature or a commander you control attacks alone, return target artifact card from your graveyard to the battlefield.", + "Ironsoul Enforcer", + ); + assert!(matches!(def.mode, TriggerMode::Attacks)); + let Some(TargetFilter::Or { filters }) = def.valid_card.as_ref() else { + panic!("expected a disjunctive subject, got {:?}", def.valid_card); + }; + assert_eq!(filters.len(), 2, "one leg per disjunct: {filters:?}"); + assert_eq!( + filters[0], + TargetFilter::SelfRef, + "\"this creature\" must bind to the trigger source" + ); + let TargetFilter::Typed(commander) = &filters[1] else { + panic!("expected a typed commander leg, got {:?}", filters[1]); + }; + assert_eq!(commander.controller, Some(ControllerRef::You)); + assert!( + commander.properties.contains(&FilterProp::IsCommander), + "CR 903.3: \"commander\" is the IsCommander designation, not a subtype: {commander:?}" + ); + assert_eq!( + def.condition, + Some(TriggerCondition::Not { + condition: Box::new(TriggerCondition::MinCoAttackers { + minimum: 1, + filter: None, + }), + }), + "CR 506.5: the alone gate must survive the disjunctive subject" + ); +} + #[test] fn trigger_samurai_or_warrior_attacks_alone() { let def = parse_trigger_line( diff --git a/crates/engine/tests/integration/ironsoul_enforcer_commander_attacks_alone.rs b/crates/engine/tests/integration/ironsoul_enforcer_commander_attacks_alone.rs new file mode 100644 index 0000000000..f921e23675 --- /dev/null +++ b/crates/engine/tests/integration/ironsoul_enforcer_commander_attacks_alone.rs @@ -0,0 +1,120 @@ +//! Ironsoul Enforcer — "Whenever this creature or a commander you control +//! attacks alone, return target artifact card from your graveyard to the +//! battlefield." +//! +//! The building block under test is a *disjunctive* attacks-alone trigger +//! subject: a self-reference OR'd with a non-self class (here CR 903.3's +//! commander designation). Two axes must hold together: +//! +//! * CR 506.5 — "attacks alone" is evaluated against the creature that was +//! declared as an attacker, not against the ability's source. When the +//! commander attacks alone the Enforcer is not in combat at all, so the +//! co-attacker tally must exclude the *commander*, not the Enforcer. +//! * CR 903.3 — "commander" is a deck-construction designation carried by +//! `is_commander`, not a creature subtype. A creature that is not flagged +//! must not satisfy the second disjunct. +//! +//! Covers the whole ` or attacks alone` class (Ironsoul Enforcer +//! and any future card whose attacks-alone subject is a disjunction), not just +//! this card. + +use engine::types::phase::Phase; + +use super::rules::{run_combat, GameScenario, P0}; + +const ORACLE: &str = "Whenever this creature or a commander you control attacks alone, return target artifact card from your graveyard to the battlefield."; + +/// Which creatures P0 declares as attackers in the fixture. +#[derive(Clone, Copy)] +enum Attack { + /// The commander attacks by itself; the Enforcer stays home. + CommanderAlone, + /// The Enforcer attacks by itself; the commander stays home. + EnforcerAlone, + /// Both attack — no creature attacks alone. + Both, + /// A non-commander bear attacks by itself — neither disjunct matches. + NonCommanderAlone, +} + +/// Returns whether the graveyard artifact ("Ornithopter") reached the +/// battlefield, i.e. whether the trigger fired and resolved. +fn artifact_returned(attack: Attack) -> bool { + let mut scenario = GameScenario::new(); + scenario.at_phase(Phase::PreCombatMain); + + let enforcer = scenario + .add_creature_from_oracle(P0, "Ironsoul Enforcer", 4, 4, ORACLE) + .id(); + let commander = scenario + .add_creature(P0, "Kediss, Emberclaw Familiar", 2, 2) + .id(); + let bear = scenario.add_creature(P0, "Grizzly Bears", 2, 2).id(); + + // The reanimation target: an artifact card in P0's graveyard. + let ornithopter = scenario + .add_creature_to_graveyard(P0, "Ornithopter", 0, 2) + .as_artifact() + .id(); + + let mut runner = scenario.build(); + + // CR 903.3: the commander designation is a per-object flag, not a subtype. + // Mirrors `make_commander` in `rules/layers.rs` — owner == controller == P0 + // with the object on the battlefield, so `FilterProp::IsCommander` matches. + runner + .state_mut() + .objects + .get_mut(&commander) + .expect("commander object exists") + .is_commander = true; + + let attackers = match attack { + Attack::CommanderAlone => vec![commander], + Attack::EnforcerAlone => vec![enforcer], + Attack::Both => vec![commander, enforcer], + Attack::NonCommanderAlone => vec![bear], + }; + + run_combat(&mut runner, attackers, vec![]); + runner.advance_until_stack_empty(); + + runner.state().battlefield.contains(&ornithopter) +} + +#[test] +fn commander_attacking_alone_fires_while_the_enforcer_stays_home() { + // CR 506.5: the commander is the only declared attacker, so it attacks + // alone even though the trigger's source is not in combat. + assert!( + artifact_returned(Attack::CommanderAlone), + "CR 506.5 + CR 903.3: a lone commander attacker must satisfy the second \ + disjunct and return the graveyard artifact" + ); +} + +#[test] +fn enforcer_attacking_alone_fires_on_the_self_disjunct() { + assert!( + artifact_returned(Attack::EnforcerAlone), + "CR 506.5: the self-reference disjunct must still fire when the source \ + itself is the lone attacker" + ); +} + +#[test] +fn two_attackers_do_not_attack_alone() { + assert!( + !artifact_returned(Attack::Both), + "CR 506.5: with two declared attackers neither creature attacks alone" + ); +} + +#[test] +fn non_commander_attacking_alone_does_not_fire() { + assert!( + !artifact_returned(Attack::NonCommanderAlone), + "CR 903.3: an unflagged creature is not a commander, so a lone \ + non-commander attacker matches neither disjunct" + ); +} diff --git a/crates/engine/tests/integration/main.rs b/crates/engine/tests/integration/main.rs index 92deedaf71..78400aabf6 100644 --- a/crates/engine/tests/integration/main.rs +++ b/crates/engine/tests/integration/main.rs @@ -284,6 +284,7 @@ mod integration_landfall; mod interaction_contract; mod invoke_calamity_free_cast; mod ir_spell_node_readers; +mod ironsoul_enforcer_commander_attacks_alone; mod issue_1005_suffer_the_past; mod issue_1007_fractal_harness_attach; mod issue_1008_korvold_sacrifice_triggers; From 55eb20b48f0771d7551ed7187a90271ea8c447b5 Mon Sep 17 00:00:00 2001 From: Lindsey Gray Date: Mon, 10 Aug 2026 01:29:42 -0500 Subject: [PATCH 06/15] fix(ai): stop proposing strategically vacuous loop-shortcut Shortens (#7101) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(ai): stop proposing strategically vacuous loop-shortcut Shortens `smart_shortcut_response` documented "a way to break the loop" but called `has_meaningful_priority_action` — the auto-pass gate, a strictly weaker predicate it was never meant to reuse. On a real 4p board a seat holding only a basic-land fetch answered Shorten against a mandatory trigger cascade it could not touch: rules-legal under CR 732.2b, strategically vacuous, and paid for with a real priority window. Adds a stage-2 efficacy classifier (`WindowReach`) as a fourth orthogonal axis: controller-relative confinement. A seat whose only actions write inside its own resources Accepts; a seat that can reach past them still Shortens. The wildcard arm is deliberately `MayInterfere` — the opposite of `ability_scan`'s default — because a wrong Accept can lose a game while a wrong Shorten costs a beat. Stage 1 is behaviorally unchanged. No CR licence is claimed for stage 2: CR 732.2b is unconditioned and CR 732.2c requires only a different choice. This is AI policy, and the module doc says so. Stage 2 must classify every action stage 1 counted as meaningful, and at first it did not. Stage 1's second disjunct, `has_activatable_sacrifice_for_mana`, reads the state rather than the action list, and sacrifice-for-mana activations never reach that list — so a seat whose only meaningful action was one of them cleared stage 1 and then had stage 2 fold over a list that did not contain it. A confined remainder meant Accept where the shipped predicate returned Shorten. That is not a wrong classification but an absent one, and a fail-closed wildcard cannot cover a shape it never receives. `stage_two_action_set` is that union, built from the same predicate stage 1 uses so the two cannot drift apart, and a row asserts the membership independently of any verdict so a later reclassification cannot silently retire the invariant. `smart_shortcut_response` serves two prompt shapes, so stage 2 applies at the precast-copy window as well as the ordinary one — the same question deserves the same answer — and a row drives that window through production `ai_support::candidate_actions` rather than leaving it inferred. The `predicted_winner` read is structurally absent there: that variant carries no `proposal` field. The two shortcut windows and the tests' reach-guards share one probe recipe (`ai_support::shortcut_probe`) rather than parallel copies. At base the recipe was inlined at two production sites and no test-side guard existed; early revisions of the new guards drifted, evaluating `has_meaningful_priority_action` against the caller's prompt state, whose `has_activatable_sacrifice_for_mana` rung is gated on `waiting_for == Priority`, so a guard could read false where production reads true. Sharing the recipe removes the class. The second copy is NOT unified: `game::engine::no_living_player_has_meaningful_priority_action` still inlines the same seven statements. Only the shared probe documents the mirroring; that second copy carries no back-reference, so a reader standing there has no pointer to it. Routing it through the shared probe would touch the CR 732.5 mandatory-loop firewall — both its production callers are mandatory-loop gates: the `LoopDetectionMode::On` auto-win block, whose own comment calls it the "entire soundness firewall", and `interactive_loop_bridge`'s `mandatory` binding. That is outside this change's scope, so it stays a follow-up rather than being claimed as done. The confinement guarantee is scoped to what it can actually promise — never a false `Accept` from a shape it does not recognize — and the doc now names the residual it cannot cover. A parser-swallowed clause makes an ability look strictly MORE confined, which is the direction that loses games. Measured on `Invoke Justice`, whose "distribute four +1/+1 counters … target player controls" clause is dropped with no `Unimplemented` marker, leaving a lone graveyard-recursion effect that classifies as confined. `SearchLibrary`'s arm gains a real fold-absorption witness (`Haunting Echoes`, whose `SearchLibrary { target_player: None }` sub-ability classifies confined on its own and is absorbed by its sibling graveyard-exile head). The two library rows already present are both caught by `target_player` directly and never exercised the fold they were cited for. Acceptance rides the real dump (844846 B, sha256 9843d5165cbbf7dd7bca4171c7888c190b7eba7e52a2ed095b44ff76fadd7886) driven through the production restore and `apply()`, not a synthetic scenario. Assisted-by: ClaudeCode:claude-opus-4.8 * fix(ai): stop classifying mana production as a confined own-resource window Stage two classified `Effect::Mana` as `WindowReach::OwnResourcesOnly`, so a seat whose only answer was a ritual -- or an actor-owned sacrifice-for-mana source -- was judged unable to interfere, and the AI accepted a loop shortcut that surrendered a live out. `ShortcutResponse::Shorten` hands the responder a real `Priority` window; inside it, mana is fungible reach. The defect was a CR 106.4 quotation truncated before the clause that refutes it. The arm quoted "that mana goes into a player's mana pool" and concluded board-neutrality implies non-interference. The rule's next sentence is "From there, it can be used to pay costs immediately". Board-neutrality and non-interference are different propositions; a correct citation was attached to the wrong one. `Effect::Mana` now falls through to the fail-closed `_ => MayInterfere` wildcard. The allowlist drops from four shapes to three. The *spending*-side `AbilityCost::Mana` arm deliberately stays -- paying a cost consumes reach, it does not create it -- and the arm now says so, so a future reader does not read its survival as an oversight. Regressions on the real 4p dump, both required by the maintainer: v10a a cast mana spell (Dark Ritual) funding an otherwise-unaffordable Bolt v10b an actor-owned sacrifice-for-mana seat (Lotus Petal, Composite[Tap, Sacrifice{SelfRef}]) re-admitted through `stage_two_action_set` Revert probe executed: restoring the deleted arm flips exactly 3 of 20 rows (the unit row, v10a, v10b) and leaves 17 green -- including both ACCEPT arms, the flagship, v9b, and the positive control -- then the files were restored and verified byte-identical. Two fixture facts are load-bearing and documented at their sizing sites: Lotus Petal's capacity is exactly 1 (`AnyOneColor` yields `vec![type; amount]`), leaving a 1-mana margin over P2's cheapest alternative; and any staged P2 source contributing 2 or more unlocks Angel of the Ruins' plainscycling, which would silently destroy v10b's attribution. Both assertions fail loudly instead. `give_bolt_with_cost` seeds `base_mana_cost` as well as `mana_cost`: `seed_live_characteristics_from_base` reseeds `mana_cost` from the base on every layer pass, and every consumer reaches the object through `shortcut_probe`, which flushes layers -- so setting only `mana_cost` would have made the "otherwise-unaffordable" premise measure nothing. Assisted-by: ClaudeCode:claude-opus-4.8 * fix(ai): correct three justifications the mana-reach review measured as false Review-impl returned Semantic-Impact PASS and Maintainer-Simulation PASS on the parent commit; these are its three [LOW] and two [NIT] items. No classifier logic changes -- with comments stripped, the `shortcut_efficacy.rs` delta is a single assertion-message string. - `give_bolt_with_cost`'s rationale for setting `base_mana_cost` was false for the objects it stages. `reset_recipient_to_base` is reached only over `battlefield_phased_in_ids()`, and the incremental arm's recipient set is battlefield entrants plus attachment hosts -- neither reaches a hand object. `sync_missing_base_characteristics` back-fills base FROM live, the opposite direction. The code is kept because it is defensively correct if the staging zone ever changes; the comment now says that instead of asserting a mechanism that does not fire here. A false justification is worse than none: it gets trusted. - The CR 701.21a quotation began at the rule's second sentence -- the same half-quote shape this branch exists to repair. It now starts at sentence one, "its controller moves it from the battlefield directly to its OWNER's graveyard", which is what bounds the conclusion: `SelfRef` proves control, never ownership, so a controlled-but-not-owned source puts a card in another player's graveyard while the leg still answers `OwnResourcesOnly`. Not repairable at this seam -- the AST carries no ownership -- so the limit is named rather than papered over. - `give_ironworks` had become a byte-equivalent duplicate of `give_parsed_card`; field-by-field equivalence was verified, then it was collapsed to a one-line delegation. The divergence hazard had already fired in the parent commit, where `base_mana_cost` reached one construction path and not the other. - The `v1` NON-VACUITY note credited the wrong assertion: `stage_two_action_set` only appends, so `stage_two == flat` cannot catch a non-sacrifice hand or graveyard mana activation. The `non_pass.len() == 1` reach-guard above does. - `summoning_sick = false` was a proven no-op (`create_object` documents that it does not set the flag; `GameObject::new` defaults it false). Removed, with a comment recording why it is absent so it is not re-added. Assisted-by: ClaudeCode:claude-opus-4.8 * test(ai): close three evidence gaps in the mana-reach shortcut regressions Review-impl r2 passed all five of the maintainer's acceptance criteria and returned no BLOCK; these are its three test-quality [LOW] items. Test-only -- no production seam is touched, and each new assertion has a mutation that was RUN and observed to redden it, not merely derived. - v10b's ordinary-mana-source control rested on two negatives (the Sol Ring activation is absent from the flat list; stage two equals the flat list) whose outcome was dominated by an upstream conjunct. `stage_two_action_set` chains `meaningful_sacrifice_mana_actions` over `activatable_object_mana_actions`, which for a probe at `Priority` is literally `mana_sources::activatable_mana_actions_for_player` -- so a Sol Ring that was never swept is filtered out for a reason the row could not distinguish from the penalty filter it means to measure. MEASURED: with the new guard removed and the Sol Ring tapped, BOTH pre-existing negatives still pass. They were green for the wrong reason. Two guards close it at two different levels. The sweep function is `pub`, so the row now asserts definitionally that the Sol Ring IS in the list stage two filters; and it asserts the consequence the row's own doc already stated as fact but never checked -- that the Sol Ring's capacity of 2 unlocks Angel of the Ruins' {2} plainscycling in the flat list. Swapping in a capacity-1 source reddens only the second, so they are independently breakable rather than redundant. - v10a bounded only its ACCEPT arm. Its SHORTEN arm's discrimination rested on a derived-but-unasserted fact, so a future fixture or capacity change that added one MayInterfere action would over-determine the row silently instead of reddening. It now carries the threshold sentinel its sibling already had. MEASURED at 2 (the Ritual cast plus Terramorphic Expanse); staging one extra two-capacity source makes it 3 and reddens the sentinel. - v10a asserted only that the {B}{B}{B} Bolt is NOT castable, leaving the funding half -- the half its own name claims -- as prose. The row now measures it on the production instrument the way v10b's lemma does: a quarantined clone casts the Ritual through `apply`, drives the stack, and re-probes. A zone reach-guard pins that the Ritual actually resolved (CR 608.2n) before the funding assertion runs. Printing the Bolt at {B}{B}{B}{B} reddens the funding assertion alone; collapsing the drive bound reddens the zone guard alone. The row's doc previously said "The row does NOT assert the post-resolution board". That became false with this change, so it is corrected rather than left to mislead. CR 117.1d, CR 601.2g and CR 608.2n were each grepped from the rules text before being written. The first draft of the last one said 608.2m from memory, which is a different rule ("if it leaves the stack once it starts to resolve, it will continue to resolve fully"); the verification step caught it. Assisted-by: ClaudeCode:claude-opus-4.8 * test(ai): pin membership, not just cardinality, in the mana-reach rows Two review findings, both cases of an assertion claiming more than it measured. The SHORTEN-arm sentinel bounded the action set's COUNT at 2 while its own prose claimed its MEMBERSHIP ("the ACCEPT arm's single fetchland PLUS the Ritual cast, and nothing else"). A fixture or capacity change that dropped the fetchland and added some unrelated MayInterfere action satisfies both `len() == 2` and the ritual reach-guard, so the row would have gone on measuring the wrong pair silently. Partitioning on the Ritual and asserting the remainder equals the ACCEPT arm's set closes that gap and pins the Ritual leg in the same equality: an empty or doubled partition reddens. The Angel guard matched on card name alone, but the fact it exists to establish is specific — that the Sol Ring's two mana unlock the {2} PLAINSCYCLING activation from HAND, which is what makes withholding a verdict assertion below it correct rather than evasive. A bare name match is also satisfied by some other Angel ability or an Angel in another zone. Ability index 0 is measured off the fixture, not assumed: object 210 carries exactly one parsed ability, tagged Cycling with activation_zone Hand. Both tightenings are additive; no existing assertion was weakened. Both were revert-probed, and the SHORTEN probe was chosen to be invisible to the two pre-existing guards so the new assertion is provably the one catching it. Assisted-by: ClaudeCode:claude-opus-5 * fix(ai): require a provably tapped entry before calling a fetch confined The mana-reach fix deleted the `Effect::Mana` allowlist arm because mana produced inside the priority window a Shorten hands the responder can fund an otherwise-unaffordable answer. The same mechanism was still live one arm over: `effect_window_reach` allowlisted ANY library-to-battlefield move as `OwnResourcesOnly`, so an untapped fetch — whose land taps for mana in that same window — read as confined. Measured on the production classifier, Crop Rotation and Nature's Lore both classified `OwnResourcesOnly`. `enter_tapped` was already destructured and ignored in that arm. The gate now requires the AST to PROVE a confined entry rather than merely suggest one (CR 110.5b: permanents enter untapped unless something says otherwise): `EtbTapState::Tapped`, with no conditional `enters_modified_if` rider that could change the arrival (CR 614.12 + CR 614.12a), not `enters_attacking` (CR 508.4), and `enters_under` absent or the actor. `Unspecified` and `Untapped` both fall out to `MayInterfere`. `SearchLibrary`'s `split` is the second door onto the battlefield — it moves its own found cards with no `ChangeZone` node — and is gated the same way. Both edits are conjunctive, so they can only move verdicts toward `MayInterfere`; neither can manufacture a false Accept. The gate is destination-scoped rather than tied to the anaphoric disjunct, because ownership does not stop an untapped land from producing mana. This DOES reclassify a live class, and an earlier revision of this message claimed otherwise. That claim came from a census that counted AST nodes over the whole card document; both halves were wrong. `printed_cards.rs` copies only `card_face.abilities` into `obj.abilities` and the classifier folds over `object.abilities` alone, so nodes in `triggers`/`static_abilities`/ `replacements` never reach it; and a verdict is a fold over a whole ability, so an ability already `MayInterfere` for an unrelated reason cannot flip whatever its `ChangeZone` node says. Re-measured at the enforcement surface — 22,717 top-level abilities in this candidate's own projection — this commit's two conjuncts move 195 of the 522 abilities that were still `OwnResourcesOnly` after the mana arm's deletion (37.4%), all in the `OwnResourcesOnly` -> `MayInterfere` direction, with 0 moving the other way. The `split` conjunct is inert at today's pool (9 of 9 battlefield-primary carriers already print tapped, none routes `rest_destination` to the battlefield); it is in because that door would otherwise stay open for the first card that walks through it. Adds `v10c`, a response-level regression driving the real 4p dump to a real `RespondToShortcut` and asserting on `smart_shortcut_response`, with a tapped control on the same board so the tap axis is what the row measures. Assisted-by: ClaudeCode:claude-opus-5 * fix(ai): never call an object confined when its rules content is unreadable `object_window_reach` folded only `obj.abilities`. `printed_cards.rs` splits one card face into four collections — `abilities`, `replacement_definitions`, `static_definitions` and `base_trigger_definitions` — so a card whose entire function lives in one of the other three was classified from the empty half. Measured witness: Stunning Reversal projects `abilities[0] = ChangeZone{origin: None, destination: Exile, target: SelfRef}`, which is confined on every conjunct this module reads, while its function is `replacements[0] = {event: GameLoss, mode: Mandatory}`. A seat holding it read `OwnResourcesOnly`, so the shortcut window was Accepted for the one card that exists to survive it. Both entry points now return `MayInterfere` on the presence of any of the three collections. The activation path gets the gate for its own reason rather than by symmetry: activating an ability is itself a game event, so a trigger on the same object can fire off the activation (CR 603.2) or off the cost being paid. The gate is presence, not content — this module has no classifier for those definition types, and the named upgrade path is to classify them the way `ability_window_reach` classifies `AbilityDefinition`. Same review round, one door over: `destination: Zone::Hand` leaves the confined set. A card put into hand is a castable card; after the spell that put it there resolves the active player receives priority (CR 117.3b) and priority then passes in turn order (CR 117.3d), so the responding seat gets it back still inside this window and a hand arrival is not provably confined. That hand gate went in on the `ChangeZone` arm only, and a review round found the `SearchLibrary` split still routing cards to hand unchecked. Both doors now go through one `landing_zone_is_confined` authority rather than two call sites answering the same question — two answers is how they drifted apart. The split is destructured `..`-free in the closure pattern for the same reason the `ChangeZone` arm is: a future `rest_enter_tapped` must be a compile error here, not a silently ignored arrival modifier. All changes are strictly narrowing — early returns to the absorbing value and one more conjunct each — so `May -> Own` is 0 by construction, not by census. Corpus, on this candidate's own SHA-bound projection of 22,717 top-level abilities: combined 2600 -> 151 confined (2449 flips, 94.2%, 0 widen); the entry gate alone 522 -> 151 (371, 71.1%). The hand authority accounts for 176 of those, split by door: 166 on `ChangeZone` across 154 cards, 10 on the split across 10 cards. All 12 split carriers route something to hand (9 via `rest_destination`, 3 via `primary_destination`), so Cultivate and its class leave the confined set. At object level, 72 printed cards have a fully-confined ability list and 19 carry an unreadable collection (7 static-only); 53 stay confined. That is a printed-card census and a lower bound on runtime objects — `game/stickers.rs` pushes into all three collections at runtime. The gate's price, stated rather than buried: Diligent Farmhand fetches a basic land TAPPED and flips anyway, on one static scoped `active_zones: ["Graveyard"]` that cannot touch this window. It is the only one of the 19 provably inert by its own zone scope; presence-gating cannot see that, and classifying the collections is what buys it back. Tests: `an_object_whose_rules_content_this_module_cannot_read_is_never_confined` covers all three disjuncts — replacement, trigger (through the real `materialize_base_trigger_definitions()` wiring, with a premise that the field the gate reads is populated) and static — each with the other two cleared first, so every verdict is attributable to one collection. `a_destination_is_confined_only_when_the_seat_cannot_act_on_what_lands_there` walks the destination axis on a real parsed node whose target is `SelfRef`, so destination is the only free variable. The split row asserts Cultivate's real `rest_destination == Hand` premise and mutates that one field as its control: since all 12 carriers touch hand, no real card can serve as the tap-axis positive control, and the test says so instead of implying live coverage. Revert-probed: each gate and each conjunct cut alone from pristine source reds its own row and leaves its neighbours green. Assisted-by: ClaudeCode:claude-opus-4.8 * fix(ai): close the fail-open zone wildcard and widen the unreadable-content gate Review findings against a15f0740e, all reproduced before being fixed. `landing_zone_is_confined` matched `Battlefield`/`Hand` and closed with `_ => true`. `Zone` is a closed seven-variant enum (CR 400.1) and that wildcard was this module's only fail-OPEN default: it silently absorbed `Zone::Stack`, a live `ChangeZone` destination, so a node landing a card on the stack read as confined. CR 405.1 puts a cast spell's card on the stack and CR 608.1 resolves it once all players pass, which is strictly stronger reach than the `Hand` case this same function closed last round. The match is now exhaustive, so adding a `Zone` variant breaks the build. `Zone::Command` joins hand and stack per CR 903.8 (a commander may be cast from the command zone) and CR 114.1 (emblems carry abilities there). The object gate's own doc claimed `printed_cards` splits a card face across four collections. Measured, it writes eight more rules-bearing fields, and `obj.keywords` carries printed Cascade — which never reaches `trigger_definitions` — so a Cascade spell whose printed abilities all read confined was provably `OwnResourcesOnly` while resolving it casts a free spell of arbitrary reach inside the window. Both entry points now route through one `carries_unreadable_rules_content` authority covering every unreadable rules-bearing field rather than a curated subset, since a subset is an allowlist someone has to remember to extend. That argument applies to the list itself, so the list is now compiler-enforced. A new test destructures `CardFace` `..`-free and sorts every field into folded / gated / not-rules-bearing with a reason on each. Writing it immediately found four more unreadable fields no re-reading had surfaced — `case_state`, `class_level`, `intensity` and `attraction_lights` — all now gated. `CardFace` rather than `GameObject` because `GameObject` has 149 fields, mostly runtime state, and destructuring it would be a churn magnet blanket-`..`'d back within a round; `CardFace` has 33 and is the source `printed_cards` actually reads. Scope limit stated in the test: it does not cover `GameObject` fields written outside `printed_cards` (`game::stickers` writes only the three definition collections, which are gated). Measured on this candidate's own projection: ability-level figures are unchanged (2600 -> 151), confirming the zone fix is latent — 0 `Stack` destinations, 1 `Command` (Hellkite Courser, in `triggers`, never folded). Object level moves 72/19/53 to 72/29/43: the widening adds 10 flips (8 keywords, 1 modal, 1 additional_cost). The four fields found by the guard are 0 among survivors and real document-wide (solve conditions 15, Class 38, Case 15, Attraction 35) — latent holes, closed for the same reason as the zone arm. The protected class is untouched — Terramorphic Expanse, Evolving Wilds and Rampant Growth carry none of these fields, asserted in the census as a reach-guard that fails rather than prints. Tests: the destination table now covers all seven zones with a compile-time exhaustiveness guard that is deliberately not a mirror of the production match; the object-gate test gains keyword and spellbook disjuncts with a cleared-field control between each, so no verdict can be a constant. Assisted-by: ClaudeCode:claude-opus-4.8 * fix(ai): gate Room unlock state and test every disjunct of the unreadable-content gate A review round measured three holes in the object-level gate this PR added, all of the same shape: a set that was curated by hand and therefore incomplete. Seven of the gate's disjuncts had neither a test nor a revert-probe -- `modal`, `additional_cost`, `strive_cost`, `cleave_variant`, `casting_restrictions`, `casting_options`, `back_face`. Each occurred exactly once in the file, in the gate itself, so deleting any of them left the whole suite green. Witness coverage was anti-correlated with liveness: `modal` and `additional_cost` are 2 of the 10 cards the widening flips, while all four disjuncts that did have witnesses are inert at today's pool -- witnesses had been written for the newest additions rather than derived from the gate. `every_gated_card_face_field_reaches_the_gate_through_printed_cards` closes that with 12 cases, each mutating a `CardFace` and running the real `apply_card_face_to_object`, which also turns the staleness guard's comment-only CardFace->GameObject mapping into a runnable assertion. CONTROL and witness are separate freshly-created objects because `printed_cards` seeds `class_level` only while `base_characteristics_initialized` is false (CR 716.2b); re-applying to one object would have skipped the field the Class case tests. `back_face` reuses `game::specialize::empty_back_face`, promoted to `pub(crate)`, rather than duplicating a 22-field literal that would go stale the moment `BackFaceData` grew. The staleness guard bound `metadata: _` -- the one field its own comment called "mixed", and the exact path `spellbook` had already used to get into this gate. It now destructures all 8 `CardMetadata` fields with a reason each. The guard's `card_type` bucket reason was measurably wrong: `printed_cards` derives four object-level rules fields from `subtypes` alone (`Class`, `Case`, `Room`, `Attraction`), and `room_unlocks` was the one with no disjunct -- so the bucket whose job is certifying "no gate needed" was certifying a real hole. CR 709.5 makes a shared type line two static abilities that remove each locked half's rules text, and CR 709.5e lets any player unlock a half at any priority, so which halves are unlocked decides what rules text the permanent has and `obj.abilities` cannot express it. Presence gate, strictly narrowing: 0 flips at today's pool (72/29/43 unchanged; of 60 Room faces only two clear every other gate and neither is confined). Assisted-by: ClaudeCode:claude-opus-5 * fix(ai): prove confinement against the live board, not the AST alone `WindowReach::OwnResourcesOnly` was emitted from an AST-only proof whose premises are live-state facts the AST structurally cannot carry. The module was fail-closed on unrecognized *variants* but fail-open on known-incomplete *inputs*. Three gates close three premises, all at `any_action_may_interfere` — the one seam that already holds `&GameState`. Ownership (CR 110.2, CR 109.5, CR 701.21a). `SelfRef`/`Controller` prove CONTROL, never ownership, and a sacrificed permanent goes to its OWNER's graveyard — so a controlled-but-not-owned permanent changes another player's resources while every AST predicate still reads confined. Proven set-level: `TargetFilter::Controller` is a bare unit variant and `Typed` is a set predicate, so per-object threading is structurally impossible. Board observers (CR 603.2, CR 603.6a, CR 113.6). Trigger matching is a board-wide scan; the fold read one object. A tapped, self-targeted fetch was provably confined while an opponent's Hedron Crab ("Landfall — Whenever a land you control enters, target player mills three cards") reached every player. Relief is a disjunction of independently sufficient reliefs, gated zone-of-function first via the existing CR 113.6 authority. The subject carve-out is `SelfRef`-EXACT: reusing `filter_is_actor_owned` returns true for `Typed{controller: You}` — exactly the crab's filter — and provably fails to fix this, which is pinned as a negative control. Parse completeness. A parse cannot testify about its own omissions, so `parse_warnings` now gates confinement and moves from the staleness guard's NOT-RULES-BEARING bucket to GATED. That one line — "parser diagnostics, never consulted at runtime" — was the root cause stated as a certification. The relief predicate lives in `ai_support`, not `game/triggers.rs`: relief is not intrinsic to a trigger, it holds only relative to the confined-action allowlists this module defines. `LifeLost` relief is sound only because `AbilityCost::PayLife` falls to `MayInterfere`; its doc names both allowlists and that witness so widening either forces a re-audit. Measured, not assumed: `Milled*`, `EntersOrAttacks` and `EntersOrHauntedCreatureDies` are NOT relieved — their matchers read a generic `ZoneChanged` that an allowlisted `ChangeZone` emits (CR 701.17a), so relieving them would have been a fresh false-Accept. The flagship acceptance seat keeps `Accept` (171 defs -> 168 zone-gated -> 3 survivors, all relieved); P1 is safe via the stage-1 short-circuit, not because no board fires. All 14 revert-probes executed PASS->FAIL, none non-discriminating. 30 CR numbers verified against the rules text; one self-caught miscite corrected (701.12a is Exchange, not Fight -> 701.14a). Assisted-by: ClaudeCode:claude-opus-4.8 * fix(engine): redact parse_warnings and confine only library-origin entries Three defects found by independent review of the previous commit. Hidden-information leak, introduced by that commit (CR 400.2: a hand and a library are hidden zones). `GameObject::parse_warnings` was not cleared by `hide_card`, so an opponent received a card whose `name` read "Hidden Card" while its diagnostics carried the printed rules text verbatim — and `SwallowedClause.description` IS that text. Because the field is skipped when empty, it appeared on exactly the 891 cards that carry one, making it a per-card fingerprint for reading hands and libraries. The sibling redactor `redact_face_down_identity_from_observer` had the same hole — measured, not assumed: a manifested card's diagnostics survived the face-down transform and reached the observer's payload (CR 708.2, CR 708.5). Both are cleared, each with a matched-pair test: empty for the non-viewer, non-empty for the owner, so the negative arm cannot pass vacuously. The root cause is structural and larger than this field: `hide_card` is an allowlist-shaped problem implemented as a denylist, so any new `GameObject` field defaults to LEAKED. Passing the serialization partition guard proves nothing about visibility. An audit run against the wire found `base_name` (every hidden card's real name), `spellbook`, `unimplemented_mechanics`, `token_rules_text` and the `base_*` characteristics all leaking. Those are PRE-EXISTING and are deliberately NOT fixed here — the correct repair is to project a minimal object rather than extend a hand-maintained clear-list, and that carries its own test matrix and client-consumer audit. A battlefield entry is now confined only from `Zone::Library`. The previous commit's doc claimed the arriving card "is still in the library, so neither input contains it" — false for 46 abilities returning from graveyard, hand or exile, whose objects ARE in `state.objects`. Witness: Helping Hand returning a Fleshbag Marauder is classified confined while making every player sacrifice. The precise fix needs an entering `ObjectId` that does not exist at decision time (`Typed{controller: You}` is an unchosen target), so this narrows the allowlist instead — moving verdicts only toward `MayInterfere` and making the paragraph true rather than retreating from it. Measured cost: of 493 document-wide tapped entries, Library's 247 keep classification; 245 lose it. The flagship fetch rows are untouched — that disjunct already required a library origin. `t2_10`'s decoder pin is now order-insensitive, so reordering `TriggerMode` no longer reds an `ai_support` test. All four revert-probes executed, each the sole failure of its suite. Full engine suite 23,638 passed / 0 failed; workspace check and clippy clean. Assisted-by: ClaudeCode:claude-opus-4.8 * fix(ai): a library fetch is confined only while every selectable card is inert The classifier admitted `Library -> Battlefield` arrivals as confined whenever the permanent entered tapped, on the argument that the card is an unchosen member of a hidden zone and therefore unreadable. That argument is measurably false. CR 701.23a: "To search for a card in a zone, look at all cards in that zone (even if it's a hidden zone)". Probed on the enrolled 4p dump, 91 of 91 library objects resolve in `state.objects` with full parsed rules content — and the hazard is already on that board: the seat's own library holds Bojuka Bog, whose ETB exiles TARGET PLAYER's graveyard. An unrestricted "search for a land card" could select it, so the seat was accepting away the only window that reaches a live cross-player choice. `library_arrivals_are_inert` reads the actor's pooled hidden zones and asks whether every card matching the union of the object's search filters is inert, reusing `carries_unreadable_rules_content` as the single inertness authority rather than growing a second one. It is applied at both entry points beside that gate, not threaded into the AST classifier: two players holding the same printed card get opposite verdicts, so this is a board fact and presenting it as an AST fact would mislabel it. A non-empty pool with an empty match set fails closed — 24 cards carry a search filter that reads the ability's own targets, which this context cannot evaluate, and a false `Accept` is the one outcome not worth risking. No corpus assumption is made. "Basic lands are vanilla" would have been the cheap boundary and it is not proven — a future set can print a Basic land with a trigger. The flagship row survives on measurement instead: Terramorphic searches Basic-only and all 22 basics in that deck are vanilla. Elvish Reclaimer, the card the report named, cannot carry the regression: its `Sacrifice(Typed[Land])` cost is unqualified, so `cost_window_reach` already answers `MayInterfere` and the row reads `Shorten` with and without the new gate. Measured, then replaced with its structural siblings Reshape the Earth and Urza's Cave, which exercise the spell and activated paths respectively. `parse_warnings` now rides `BackFaceData` and all four face-copy paths, so a transform swaps diagnostics with the face they describe instead of leaving a front-clean/back-warning card reading clean. The base-face snapshot line is load-bearing: `apply_face_down_creature_characteristics` blanks name, types, abilities and definitions but not diagnostics, so without it turning face up would have cleared what turning face down preserved — a regression this change would otherwise have introduced. Adding a `BackFaceData` field is compile-forced across 34 struct literals; each is the same single mechanical initializer. Seven revert-probes executed, each observed pass->fail. Engine suite 18,827 lib + 4,790 integration passed, 0 failed; workspace check and clippy clean. One self-caught miscite removed (CR 701.23c is undefined qualities in hidden zones, not a search limit). Assisted-by: ClaudeCode:claude-opus-4.8 * test(PR-7101): preserve face diagnostics across transform --------- Co-authored-by: matthewevans --- crates/engine/src/ai_support/candidates.rs | 1 + crates/engine/src/ai_support/mod.rs | 232 +- .../src/ai_support/shortcut_efficacy.rs | 3992 +++++++++++++++++ crates/engine/src/game/casting_tests.rs | 7 + crates/engine/src/game/day_night.rs | 1 + crates/engine/src/game/effects/become_copy.rs | 1 + crates/engine/src/game/effects/change_zone.rs | 1 + crates/engine/src/game/effects/flip_coin.rs | 1 + .../engine/src/game/effects/flip_permanent.rs | 1 + crates/engine/src/game/effects/prepare.rs | 1 + .../src/game/effects/set_room_door_lock.rs | 1 + crates/engine/src/game/effects/token.rs | 3 + .../src/game/effects/transform_effect.rs | 1 + crates/engine/src/game/engine.rs | 1 + crates/engine/src/game/engine_debug.rs | 1 + .../engine/src/game/engine_mdfc_land_tests.rs | 1 + .../src/game/engine_resolution_choices.rs | 6 +- crates/engine/src/game/engine_tests.rs | 1 + crates/engine/src/game/flip.rs | 1 + crates/engine/src/game/game_object.rs | 63 + crates/engine/src/game/printed_cards.rs | 21 + crates/engine/src/game/specialize.rs | 6 +- crates/engine/src/game/stack.rs | 1 + crates/engine/src/game/transform.rs | 19 + crates/engine/src/game/triggers.rs | 1 + crates/engine/src/game/visibility.rs | 125 + crates/engine/src/game/zones.rs | 2 + .../tests/fixtures/dina_noff_turn5_4p.json.gz | Bin 0 -> 844846 bytes .../azors_gateway_transform_condition.rs | 1 + .../copied_ability_transform_generation.rs | 1 + .../craft_tithing_blade_transform.rs | 1 + .../deterministic_game_state_serde.rs | 1 + .../integration/integration_adventure.rs | 1 + .../issue_2425_fable_chapter_iii_transform.rs | 2 + ...1_frolicking_familiar_adventure_instant.rs | 1 + .../issue_5326_avatar_aang_transform.rs | 1 + .../issue_6403_moonmist_mass_transform.rs | 1 + .../issue_691_sheoldred_saga_lore.rs | 1 + .../tests/integration/kamigawa_flip_cards.rs | 2 + crates/engine/tests/integration/main.rs | 1 + .../integration/room_door_lock_unlock.rs | 1 + .../engine/tests/integration/rules/battle.rs | 1 + .../tests/integration/shorten_efficacy.rs | 3186 +++++++++++++ .../tests/integration/specialize_runtime.rs | 1 + .../tests/integration/std_s07_batch5b.rs | 1 + .../stolen_goodies_zero_targets.rs | 1 + .../tamiyo_inquisitive_student_flip.rs | 1 + .../wedding_announcement_transform.rs | 1 + 48 files changed, 7668 insertions(+), 31 deletions(-) create mode 100644 crates/engine/src/ai_support/shortcut_efficacy.rs create mode 100644 crates/engine/tests/fixtures/dina_noff_turn5_4p.json.gz create mode 100644 crates/engine/tests/integration/shorten_efficacy.rs diff --git a/crates/engine/src/ai_support/candidates.rs b/crates/engine/src/ai_support/candidates.rs index 1a35510ad6..aea648333b 100644 --- a/crates/engine/src/ai_support/candidates.rs +++ b/crates/engine/src/ai_support/candidates.rs @@ -5383,6 +5383,7 @@ mod tests { casting_restrictions: Vec::new(), casting_options: Vec::new(), layout_kind: Some(LayoutKind::Prepare), + parse_warnings: vec![], } } diff --git a/crates/engine/src/ai_support/mod.rs b/crates/engine/src/ai_support/mod.rs index 1f7f720675..3de9b0076d 100644 --- a/crates/engine/src/ai_support/mod.rs +++ b/crates/engine/src/ai_support/mod.rs @@ -6,6 +6,7 @@ mod evoke; pub mod filter; mod payment_continuation; mod prospective_mana; +mod shortcut_efficacy; mod swarm; mod targeted_exchange; @@ -1352,25 +1353,48 @@ fn has_activatable_sacrifice_for_mana(state: &GameState) -> bool { && mana_actions_include_meaningful_sacrifice(state, &activatable_object_mana_actions(state)) } +/// The mana activations [`has_activatable_sacrifice_for_mana`] counts, as +/// items rather than as a yes/no. +/// +/// SINGLE AUTHORITY for the predicate. `smart_shortcut_response`'s stage 2 has +/// to classify exactly the actions stage 1 counted, and stage 1 counts these — +/// which the flat `legal_actions` list structurally cannot contain (they live +/// in `legal_actions_by_object` only). Re-testing the same shape at that call +/// site would be a parallel copy free to drift, so the call site consumes this +/// iterator and `mana_actions_include_meaningful_sacrifice` is defined as its +/// emptiness. +fn meaningful_sacrifice_mana_actions<'a>( + state: &'a GameState, + object_mana_actions: &'a [GameAction], +) -> impl Iterator { + object_mana_actions.iter().filter(move |action| { + matches!( + action, + GameAction::ActivateAbility { + source_id, + ability_index, + } if activate_ability_is_meaningful_priority(state, *source_id, *ability_index) + ) + }) +} + /// Slice-taking core of [`has_activatable_sacrifice_for_mana`]: given a /// precomputed activatable mana-action sweep, true iff any action is a /// meaningful (sacrifice-for-mana) mana activation. Extracted so /// `auto_pass_recommended` can compute the sweep ONCE and share it between the /// G1 beneficial-mana-tap hold (rung 5) and this rung-9 sac check, avoiding the /// PR #5229 double-evaluation of the mana-action sweep. +/// +/// `Iterator::any(p)` and `.filter(p).next().is_some()` agree on every input +/// (both are the first-match short-circuit over the same predicate), so this +/// re-expression leaves the loop-firewall and auto-pass answers unchanged. fn mana_actions_include_meaningful_sacrifice( state: &GameState, object_mana_actions: &[GameAction], ) -> bool { - object_mana_actions.iter().any(|action| { - matches!( - action, - GameAction::ActivateAbility { - source_id, - ability_index, - } if activate_ability_is_meaningful_priority(state, *source_id, *ability_index) - ) - }) + meaningful_sacrifice_mana_actions(state, object_mana_actions) + .next() + .is_some() } /// True when `actions` contains a priority action that materially changes the @@ -1387,24 +1411,22 @@ pub fn has_meaningful_priority_action(state: &GameState, actions: &[GameAction]) || has_activatable_sacrifice_for_mana(state) } -/// PR-7 Phase 4c (LOW-2): CR 732.2b/c + CR 104.4b — an AI opponent polled on an -/// OPTIONAL loop shortcut. The offer is raised only for optional loops the polled -/// player CAN break (a Path A optional drain, `WaitingFor::LoopShortcut`); the win -/// is a loss condition for every polled opponent (single-faller: see -/// `interactive_loop_bridge`'s Path A gate, CR 104.2a). SELF-PRESERVATION: if this -/// player has a meaningful priority action (a way to break the loop), name -/// `Shorten{0}` — the engine realizes Shorten as a real `WaitingFor::Priority` -/// window (`game::engine::apply_action`'s `RespondToShortcut(Shorten)` arm) where -/// it can act — rather than Accept its own loss. No meaningful action ⇒ Accept -/// (nothing to do). Single authority for all 3 `RespondToShortcut` emission sites -/// (engine `candidates.rs` + phase-ai `projection.rs`/`search.rs`) so the -/// self-preservation heuristic can't drift between them. Reuses the exact -/// `no_living_player_has_meaningful_priority_action` probe recipe -/// (`game::engine`), scoped to the single polled player. -pub fn smart_shortcut_response( +/// The probe [`smart_shortcut_response`] folds over: `state` re-parked at +/// `polled_player`'s priority with auto-pass cleared and layers flushed, plus +/// that state's flat priority actions. Mirrors +/// `game::engine`'s `no_living_player_has_meaningful_priority_action` recipe, +/// scoped to the single polled player. +/// +/// Public because the shortcut tests' reach-guards must assert on THIS list and +/// THIS state. A private copy of the recipe in a test silently starts measuring +/// a different action set — and a different `has_meaningful_priority_action` +/// answer, since that predicate's sacrifice-for-mana rung only fires while +/// `waiting_for` is `Priority`, which is true of the probe state and false of +/// the `RespondToShortcut` state the caller holds. +pub fn shortcut_probe( state: &GameState, polled_player: PlayerId, -) -> crate::analysis::loop_check::ShortcutResponse { +) -> (casting::PriorityCastProbe, Vec) { let mut probe_state = state.clone(); probe_state.auto_pass.clear(); probe_state.priority_player = polled_player; @@ -1414,11 +1436,167 @@ pub fn smart_shortcut_response( layers::flush_layers(&mut probe_state); let probe = casting::PriorityCastProbe::from_flushed_state(probe_state, polled_player); let actions = flat_priority_actions_with_probe(probe.state(), Some(&probe)); - if has_meaningful_priority_action(probe.state(), &actions) { + (probe, actions) +} + +/// The actions [`smart_shortcut_response`]'s stage 2 classifies, given a probe +/// state and the flat priority list stage 1 read. +/// +/// COVERAGE INVARIANT — stage 2 must classify every action stage 1 counted as +/// meaningful. The flat list does not satisfy that on its own: +/// [`has_meaningful_priority_action`] is a disjunction, and its second rung +/// ([`has_activatable_sacrifice_for_mana`]) reads `state`, not `actions`, so it +/// counts sacrifice-for-mana activations that `legal_actions` structurally omits +/// (they live in `legal_actions_by_object` only — see issue #544). Folding stage +/// 2 over the flat list alone therefore lets a seat whose ONLY meaningful action +/// is such an activation Accept BY OMISSION: an action stage 2 never sees +/// reaches no arm, so `shortcut_efficacy`'s fail-closed `_ => MayInterfere` +/// default cannot protect it, and a false Accept is the direction the module doc +/// says can lose a game. +/// +/// `activatable_object_mana_actions` is gated on `waiting_for` — the probe state +/// is re-parked at `Priority`, which is the same gate +/// `has_activatable_sacrifice_for_mana` passes there, so the two stages read the +/// SAME sweep. The added items come from +/// [`meaningful_sacrifice_mana_actions`], the single authority stage 1's rung is +/// also defined in terms of; re-testing the shape here would be a parallel copy +/// free to drift. +/// +/// Deliberately does NOT add the whole mana sweep, only the subset stage 1 +/// counts: a plain land tap is not a meaningful priority action to stage 1, and +/// widening past that would buy `Shorten`s stage 1 never asked for. +/// +/// Public for the same reason [`shortcut_probe`] is: the shortcut tests' +/// coverage row must assert on THIS set, and a private copy of the recipe would +/// silently start measuring a different one. +pub fn stage_two_action_set( + probe_state: &GameState, + flat_actions: &[GameAction], +) -> Vec { + let mana_actions = activatable_object_mana_actions(probe_state); + flat_actions + .iter() + .chain(meaningful_sacrifice_mana_actions( + probe_state, + &mana_actions, + )) + .cloned() + .collect() +} + +/// PR-7 Phase 4c (LOW-2): CR 732.2b/c + CR 104.4b — an AI opponent polled on an +/// OPTIONAL or bounded loop shortcut. The win is a loss condition for every +/// polled opponent (single-faller: see `interactive_loop_bridge`'s Path A gate, +/// CR 104.2a). +/// +/// SINGLE AUTHORITY, and what it does NOT cover. MEASURED — production (i.e. +/// non-`#[cfg(test)]`) code under `crates/*/src/` builds a +/// `GameAction::RespondToShortcut` value at exactly four places: +/// * `ai_support::candidates::candidate_actions_broad_with_probe`, +/// * `phase_ai::projection::resolve_choice`, +/// * `phase_ai::search::fallback_action` — these three are AI seats and all +/// route here, so the heuristic cannot drift between them; and +/// * `game::interaction::materialize_shortcut_reply_response`, which turns a +/// HUMAN player's submitted `InteractionShortcutReply` into the action. That +/// one is deliberately NOT covered: running a stated human choice through an +/// AI heuristic would overwrite it. It is also the only site that can emit a +/// non-zero `at_iteration` — every AI site emits `Shorten { at_iteration: 0 }`. +/// +/// `candidate_actions_broad_with_probe` additionally routes +/// `WaitingFor::RespondToPrecastCopyShortcut` here and maps the answer onto +/// `PrecastCopyShortcutResponse`, so this function answers BOTH accept-or-shorten +/// windows. That is intended: both windows ask the identical question — is a real +/// priority window worth taking here — so a seat whose only action cannot touch +/// the loop should decline both. `shorten_efficacy.rs`'s +/// `v8_precast_window_takes_the_same_efficacy_answer` measures that window rather +/// than assuming it. +/// +/// TWO STAGES. +/// +/// **Stage 1 — POSSIBILITY, byte-identical to the shipped predicate.** Reuses +/// the exact `no_living_player_has_meaningful_priority_action` probe recipe +/// (`game::engine`), scoped to the single polled player. No meaningful priority +/// action ⇒ Accept, exactly as before. `has_meaningful_priority_action` is +/// wired into the CR 732.5 NON-COMPULSION rule — +/// "No player can be forced to perform an action that would end a loop other +/// than actions called for by objects involved in the loop" — and is untouched +/// here. +/// +/// **Stage 2 — EFFICACY (AI POLICY, no CR licence claimed).** CR 732.2b grants +/// an unconditioned accept-or-shorten option and CR 732.2c requires only that a +/// shortening player's next choice be +/// *different*, which a fetchland activation already satisfies; nothing in the +/// Comprehensive Rules states an efficacy criterion. This stage is therefore +/// policy, and it declines to burn a real priority window on a response that +/// cannot change the outcome: +/// - arm (A): the offer's own predicted result already crowns this seat, so +/// shortening moves the game away from a win it already holds; +/// - arm (B): every action stage 1 counted as meaningful is confined to this +/// seat's own resources (`shortcut_efficacy::any_action_may_interfere`), so +/// no available choice touches the loop. Scoped to what stage 1 counted, not +/// to "every action this seat could take": the stage-2 set is a SUPERSET of, +/// and never smaller than, what stage 1 counted — the flat list enters +/// whole, so it also carries actions the stage-1 fold +/// (`flat_actions_have_meaningful_priority`) does not count as meaningful, +/// `PassPriority` and mana-ability activations among them, and extra items +/// can only push toward `MayInterfere`. See the coverage invariant at the +/// call below; the wider phrasing would claim coverage of shapes neither +/// stage enumerates. +/// +/// Otherwise the seat still Shortens and gets its window +/// (`game::engine::apply_action`'s `RespondToShortcut(Shorten)` arm). +/// +/// READ-ORDER: the proposal is read off the ORIGINAL `state`, before +/// [`shortcut_probe`] re-parks its clone at `Priority` — the probe state carries +/// no offer at all, so reading the crown from it would make arm (A) dead code. +pub fn smart_shortcut_response( + state: &GameState, + polled_player: PlayerId, +) -> crate::analysis::loop_check::ShortcutResponse { + // Both accept-or-shorten windows are named, so neither is answered by + // accident. The wildcard is not removable — `WaitingFor` has 128 variants and + // enumerating 126 `=> None` arms here would be noise, not a guard — and this + // two-named-arms + `_` shape is the module's existing idiom for the same + // question (`game::precast_copy_shortcut::normalize_untrusted_restore`, + // `::rekey_after_trusted_restore`). + let crowned_winner = match &state.waiting_for { + WaitingFor::RespondToShortcut { proposal, .. } => proposal.predicted_winner, + // STRUCTURAL, not an oversight: `RespondToPrecastCopyShortcut` carries no + // proposal summary and therefore no `predicted_winner` field, so the + // pre-cast route has no crown to read and arm (A) is inapplicable rather + // than skipped. Stage 1 and arm (B) do apply, and both run below. + WaitingFor::RespondToPrecastCopyShortcut { .. } => None, + _ => None, + }; + + let (probe, actions) = shortcut_probe(state, polled_player); + if !has_meaningful_priority_action(probe.state(), &actions) { + // CR 732.2c: nothing to do — agree to take the shortcut. + return crate::analysis::loop_check::ShortcutResponse::Accept; + } + + // Arm (A). Keyed on `predicted_winner`, never `proposer`: CR 732.2a lets a + // player propose a shortcut whose outcome crowns someone else, and the + // proposer is excluded from the APNAP response queue anyway. + if crowned_winner == Some(polled_player) { + return crate::analysis::loop_check::ShortcutResponse::Accept; + } + + // Arm (B). No bounded/unbounded exemption: an `IterationCount::Fixed(n)` + // offer ends the game just as surely as an `UntilLethal` one, so both + // classes take the identical rule. + // + // The fold reads [`stage_two_action_set`], never the bare flat `actions` — + // see that function for the coverage invariant and what folding over the + // flat list alone would silently Accept. + if shortcut_efficacy::any_action_may_interfere( + probe.state(), + polled_player, + &stage_two_action_set(probe.state(), &actions), + ) { // CR 732.2b: name an earlier stopping point — take my window instead of losing. crate::analysis::loop_check::ShortcutResponse::Shorten { at_iteration: 0 } } else { - // CR 732.2c: nothing to do — agree to take the shortcut. crate::analysis::loop_check::ShortcutResponse::Accept } } diff --git a/crates/engine/src/ai_support/shortcut_efficacy.rs b/crates/engine/src/ai_support/shortcut_efficacy.rs new file mode 100644 index 0000000000..ad2fde44da --- /dev/null +++ b/crates/engine/src/ai_support/shortcut_efficacy.rs @@ -0,0 +1,3992 @@ +// engine-citation-gate: symbol anchors only +//! Controller-relative confinement of a polled player's priority window — +//! stage 2 of [`super::smart_shortcut_response`]. +//! +//! CITATION FORM: rule NUMBER only, matching the enrolled test sibling +//! `tests/integration/shorten_efficacy.rs`. The number IS the greppable +//! heading — `grep '^400.1' docs/MagicCompRules.txt` resolves any citation +//! below. `docs/MagicCompRules.txt` is gitignored and re-fetched per checkout, +//! so a line anchor pins a citation to whichever rules revision its author +//! happened to hold. +//! +//! # 1. This is AI POLICY, not a rule +//! +//! CR 732.2b grants an **unconditioned** binary +//! option: "Each other player, in turn order starting after the player who +//! suggested the shortcut, may either accept the proposed sequence, or shorten +//! it by naming a place where they will make a game choice that's different +//! than what's been proposed." There is no criterion, no outcome test, and no +//! efficacy test; the rule explicitly does not even require the shortening +//! player to say what the new choice will be. CR 732.2c adds the only +//! obligation, and it is downstream: "the player who now has priority must make +//! a different game choice than what was originally proposed for that player." +//! Activating a fetchland IS a different game choice, so a fetchland Shorten +//! fully satisfies it. +//! +//! Nothing in the Comprehensive Rules therefore grounds this module's decision. +//! It is an AI policy: a seat whose only available response cannot touch the +//! loop spends its window achieving nothing, and the engine should not burn a +//! real priority window on it. Every CR number below is cited **only for what +//! its text says**, and is used as an *input* the classifier reads (which zones +//! are per-player, who owns what) — never as a licence for the decision. +//! +//! # 2. Fail-closed direction, and why the wildcard is conservative HERE +//! +//! [`WindowReach::MayInterfere`] is the default for every unrecognized shape. +//! That direction is deliberate and is the opposite of the discipline +//! `game::ability_scan` enforces on itself. `ability_scan`'s default is +//! `Axes::NONE` ("this ability reads nothing"), which is its *unsafe* +//! direction — a newly added reader classified inert would ride a false +//! auto-resolution — so that module forbids wildcards outright. Here the +//! default says "this action might interfere", which can produce only a **false +//! `Shorten`** (the polled seat takes a priority window it did not need — it +//! costs beats, never a game) and **never a false `Accept` from a shape it does +//! not recognize** (a seat accepting its own loss while holding a real out). +//! The qualifier is load-bearing; see the residual below. An unknown nesting +//! container is interference regardless of what it nests, so there is no +//! nested-carrier set and no recursion-arm set left to drift, and no +//! hand-maintained allowlist to rot. +//! +//! That argument covers unrecognized *shapes*, and it leaves exactly one +//! residual uncovered: a clause the PARSER silently swallows never becomes a +//! shape here at all, so the ability this module is handed looks strictly MORE +//! confined than the printed card is — and narrowing apparent reach is the +//! dangerous direction, because it produces a false `Accept`, not a false +//! `Shorten`. The residual is stated structurally rather than pinned to a card, +//! because a card witness is only valid until the classifier moves under it: +//! this doc previously named `Invoke Justice[0]` — a lone +//! [`Effect::ChangeZone`] (`origin: Graveyard`, `target: Typed{controller: +//! You}`, no cost, no `sub_ability`) whose printed sentence continues "then +//! distribute four +1/+1 counters among any number of creatures and/or Vehicles +//! target player controls" — and the entry gate added below has since +//! reclassified it `MayInterfere`, because its battlefield entry is not +//! provably tapped. That narrowed the residual; it did not close it. What +//! remains live is the same shape at a destination the entry gate does not +//! constrain: a non-battlefield destination, or a provably tapped entry. No +//! widening of this module can reach any of it — it cannot read a clause that +//! never arrived, so the residual is owned by the parser, not the classifier. +//! +//! The structural guard is the compiler, not a test: +//! [`ability_window_reach`] destructures [`AbilityDefinition`] **without +//! `..`**, and every allowlisted [`Effect`] arm is likewise `..`-free, so a new +//! field on the definition or on an allowlisted variant fails to compile until +//! it is classified. Precedent: `game::ability_scan::ability_definition_axes`. +//! +//! # 3. `analysis::ability_graph::collect_effects` is deliberately NOT used +//! +//! Two independent reasons, one mechanism. Its inner recursion ends `_ => {}` +//! (`analysis/ability_graph.rs`, whose own doc says "a wildcard covers the leaf +//! variants") — silent fail-open. And it walks **4 of `AbilityDefinition`'s 38 +//! fields** (`effect`, `sub_ability`, `else_ability`, `mode_abilities`); it +//! never inspects `cost` at all, so `Sacrifice` / `Discard` / `Mill` / +//! `ExileMaterials` costs — every one of which can reach another player's +//! resources — would be structurally invisible. + +use crate::game::game_object::GameObject; +use crate::types::ability::{ + AbilityCost, AbilityDefinition, ControllerRef, Effect, FilterProp, PlayerFilter, + SearchDestinationSplit, TargetFilter, +}; +use crate::types::actions::GameAction; +use crate::types::game_state::GameState; +use crate::types::identifiers::ObjectId; +use crate::types::player::PlayerId; +use crate::types::zones::{EtbTapState, Zone}; + +/// How far a single available action can reach, relative to the player who +/// would take it. +/// +/// A fourth axis, orthogonal to the three the engine already carries: +/// `ai_support::FlatPriorityActionClass` classifies *action shape*, +/// `game::ability_rw::WriteScope` classifies *object identity*, and +/// `game::ability_scan::Axes` classifies *AST reads*. This one classifies +/// **controller-relative confinement**. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub(crate) enum WindowReach { + /// Everything this action can touch belongs to the player taking it. + OwnResourcesOnly, + /// This action can reach something outside the actor's own resources — + /// or its shape is not recognized, which is treated identically. + MayInterfere, +} + +impl WindowReach { + fn of(own_resources_only: bool) -> Self { + if own_resources_only { + Self::OwnResourcesOnly + } else { + Self::MayInterfere + } + } + + /// Absorbing fold: one interfering component makes the whole interfering. + fn or(self, other: Self) -> Self { + match (self, other) { + (Self::OwnResourcesOnly, Self::OwnResourcesOnly) => Self::OwnResourcesOnly, + _ => Self::MayInterfere, + } + } + + fn may_interfere(self) -> bool { + matches!(self, Self::MayInterfere) + } +} + +/// True only when every object this filter can match is PROVEN to belong to the +/// acting player. +/// +/// CR 400.1: "Each player has their own library, hand, and graveyard. +/// The other zones are shared by all players." A bare `Zone` reference is +/// therefore ambiguous by rule — it can never answer *whose* zone — so the +/// player-qualified authority has to come from the filter. CR 400.3 +/// names exactly three zones ("If an object would go to any library, graveyard, +/// or hand other than its owner's, it goes to its owner's corresponding zone") +/// and CR 108.3 defines the owner, which is why owner/controller, not +/// zone, is the axis this predicate reads. +/// +/// Unproven is not owned: everything else (`Any`, `None`, `Player`, `Opponent`, +/// `ParentTarget*`, anaphors, specific ids) is `false`. +/// +/// SCOPE, and the name is wider than what this proves. Both `true` arms are +/// CONTROL arms, not ownership arms: CR 109.5 defines "you"/"your" on an object +/// as its CONTROLLER, so `SelfRef`, `Controller` and `Typed{controller: You}` all +/// resolve through control, and CR 110.2 makes owner and controller +/// independent. Ownership is proven separately and at BOARD level by +/// [`actor_owns_everything_they_control`], which +/// [`any_action_may_interfere`] applies before it folds any action; this +/// predicate is sound only underneath that conjunct. +fn filter_is_actor_owned(filter: &TargetFilter) -> bool { + match filter { + TargetFilter::SelfRef | TargetFilter::Controller => true, + TargetFilter::Typed(typed) => { + typed.controller == Some(ControllerRef::You) + || typed.properties.iter().any(|prop| { + matches!( + prop, + FilterProp::Owned { + controller: ControllerRef::You + } + ) + }) + } + // An `Or` matches an object when ANY leg does, so every leg must be + // proven; an `And` matches only when ALL legs do, so one proven leg is + // enough. The emptiness guards keep a degenerate `filters: []` from + // being proven by a vacuous `all()`. + TargetFilter::Or { filters } => { + !filters.is_empty() && filters.iter().all(filter_is_actor_owned) + } + TargetFilter::And { filters } => filters.iter().any(filter_is_actor_owned), + _ => false, + } +} + +/// Does the actor OWN every permanent they control? +/// +/// [`filter_is_actor_owned`] proves CONTROL, because CR 109.5 defines "you" and +/// "your" on an object as its controller. CR 110.2 makes owner and controller +/// independent axes ("A permanent's owner is the same as the owner of the card +/// that represents it"), so a controlled-but-not-owned permanent breaks every +/// place this module treats a control proof as a confinement proof. The sharp +/// one is CR 701.21a: "To sacrifice a permanent, its controller moves it from the +/// battlefield directly to its OWNER'S graveyard" — so the allowlisted +/// `AbilityCost::Sacrifice` of a permanent the actor controls but does not own +/// puts a card into ANOTHER player's graveyard, which is that player's own zone +/// per CR 400.1 ("Each player has their own library, hand, and graveyard") and +/// therefore reach by construction. +/// +/// SET-LEVEL BY NECESSITY, not by preference. Threading ownership per matched +/// object is structurally impossible at the filter layer: `TargetFilter::Controller` +/// is a bare unit variant carrying no id at all, and `TargetFilter::Typed` is a +/// SET PREDICATE describing a class rather than naming a member, so neither can be +/// resolved to the objects it would match without evaluating it against the board. +/// The single variant that does carry an id — `SpecificObject { id }` — already +/// falls to `filter_is_actor_owned`'s `_` arm and returns `false`. So the only +/// place the ownership fact can be discharged is the board, once, over every +/// object the actor controls. +/// +/// Board facts are action-independent, so the caller evaluates this ONCE rather +/// than per action. +fn actor_owns_everything_they_control(state: &GameState, actor: PlayerId) -> bool { + state + .objects + .values() + .all(|o| o.controller != actor || o.owner == actor) +} + +/// Is a landing zone confined — i.e. can the seat NOT act on what arrives there, +/// inside the window the Shorten hands back? +/// +/// This is the single authority for that question, and it exists because the two +/// doors out of a library drifted apart exactly once: the `ChangeZone` arm gated +/// `Zone::Hand` while the `SearchLibrary` split arm gated only `Zone::Battlefield`, +/// so a `SearchDestinationSplit` routing cards to hand stayed classified confined. +/// MEASURED at that point: all twelve split carriers in `card-data.json` route +/// something to hand — nine via `rest_destination` (the Cultivate class: land to +/// the battlefield tapped, the REST to hand) and three via `primary_destination` +/// (Final Parting, Fork in the Road, Jarad's Orders). Two call sites answering one +/// question is how that happens, so there is now one function and no second answer. +/// +/// * `Zone::Battlefield` — CR 110.5b: permanents enter untapped unless something +/// says otherwise, and an untapped permanent taps for mana during the very cast +/// it funds (CR 601.2g). Only a PROVABLY tapped arrival is confined. +/// * `Zone::Hand` — a card in hand is a castable card. After the spell that put it +/// there resolves the active player receives priority (CR 117.3b) and priority +/// then passes in turn order (CR 117.3d), so the responding seat gets it back +/// still inside this window. The AST carries nothing that could prove the card +/// uncastable. +/// * `Zone::Stack` — strictly stronger than the hand case, and the one a `_` arm hid. +/// CR 405.1: a cast spell's card is put on the stack; CR 608.1: the object on top +/// of the stack resolves once all players pass. A card that LANDS there is past +/// casting already and resolves inside this very window, so the seat does not even +/// need priority to get its effect. +/// * `Zone::Command` — CR 903.8: "A player may cast a commander they own from the +/// command zone", and CR 114.1 puts emblems there carrying abilities of their own. +/// It is a zone the seat acts FROM, so it belongs with hand rather than with the +/// need-further-permission group this doc previously filed it under. +/// * `Zone::Library` / `Zone::Graveyard` / `Zone::Exile` — the card lands where the +/// actor needs some FURTHER permission to use it, and that permission would itself +/// be an ability this fold already reads. +/// +/// Callers still apply their own extra conjuncts (the battlefield riders on +/// `ChangeZone`); this answers the destination question only. +fn landing_zone_is_confined(destination: Zone, tapped: EtbTapState) -> bool { + // EXHAUSTIVE ON PURPOSE — no wildcard. `Zone` is a closed seven-variant enum + // (CR 400.1), and a `_` arm here is FAIL-OPEN in a module whose every other + // default is fail-closed: it answers "confined" for any variant nobody thought + // about. That is not hypothetical. This function shipped as + // `Battlefield => …, Hand => false, _ => true`, and the `_` silently absorbed + // `Zone::Stack` — a live `ChangeZone` destination (`game::zones`) — so a node + // landing a card on the stack read as confined, contributing `OwnResourcesOnly` to + // a fold whose whole purpose is to decide whether an Accept is safe. (Whether any + // one node's verdict becomes an Accept depends on the rest of the fold; what is + // certain is that this arm was voting the wrong way.) MEASURED at this candidate's + // projection: 0 `Stack` destinations and 1 `Command` (Hellkite Courser, whose node + // lives in `triggers` and is therefore never folded), so the fix is latent today + // and is rated on what it does when reached, not on how often it is reached. + // The doc above listed "graveyard, library, exile, command" as the remainder and + // never mentioned Stack, which is exactly what a wildcard costs you: the arm list + // stops being a claim the compiler checks. Adding a `Zone` variant must break this + // build. + match destination { + Zone::Battlefield => matches!(tapped, EtbTapState::Tapped), + Zone::Hand | Zone::Stack | Zone::Command => false, + Zone::Library | Zone::Graveyard | Zone::Exile => true, + } +} + +/// Reach of one effect node. Three allowlisted shapes; everything else is +/// interference by default (see the module doc, §2). +fn effect_window_reach(effect: &Effect) -> WindowReach { + match effect { + // Absent `target_player` is an engine parser convention for "the + // actor's own library". It is a true description of engine behaviour + // and it is NOT the safety warrant for this arm, because it is NOT + // reliable: MEASURED over `data/card-data.json`, five abilities whose + // Oracle text explicitly names a FOREIGN library still carry a + // `SearchLibrary` node with `target_player: None` — Head Games[0], + // Jester's Mask[0], Haunting Echoes[0], Jace, Architect of Thought[2], + // and the SECOND search of Sadistic Sacrament[0] (whose first search + // does carry a `Typed` target_player). No aggregate count is claimed + // here: "how many abilities name a foreign library" has no + // scope-independent answer, and an unscoped census is worse than none. + // + // What makes the arm safe is the ABSORBING ability-level fold in + // `ability_window_reach`: a foreign-library ability carries some + // sibling effect or cost that folds to `MayInterfere` regardless of + // what `target_player` says. `Haunting Echoes[0]` is the in-suite + // witness for that fold — see + // `a_foreign_library_search_is_confined_alone_then_absorbed`. Bribery[0] + // and Praetor's Grasp[0] are also `MayInterfere`, but they witness the + // OTHER path: both carry `target_player: Typed`, so this arm catches + // them directly and the fold never has to. + // + // CR 400.1 is cited here only for why a bare `Zone::Library` + // reference is ambiguous in the first place. + // + // `split` IS read, and it is the second door into the battlefield. A + // cultivate-class search moves its own found cards + // (`SearchDestinationSplit { primary_destination, primary_enter_tapped, + // rest_destination }`) WITHOUT any `ChangeZone` sub-ability, so the tap + // gate on that arm cannot see it. Same rule (CR 110.5b), same + // fail-closed direction: a split may reach the battlefield only through + // its `primary_destination` and only when `primary_enter_tapped` proves + // `Tapped`. `rest_destination` carries NO tap state at all, so it can + // never be proven tapped and a battlefield `rest_destination` is reach + // by construction. + Effect::SearchLibrary { + source_zones: _, + filter: _, + count: _, + reveal: _, + target_player, + selection_constraint: _, + split, + } => { + // Destructured `..`-free for the same reason `Effect::ChangeZone` is: a + // new field on `SearchDestinationSplit` (a `rest_enter_tapped`, say) must + // be a COMPILE ERROR here rather than a silently ignored arrival modifier. + // Reading the split by `.field` is exactly how the `Hand` hole survived. + let split_entry_is_confined = split.as_ref().is_none_or( + |SearchDestinationSplit { + primary_destination, + primary_count: _, + primary_enter_tapped, + rest_destination, + }| { + // Both destinations go through the SAME authority as the + // `ChangeZone` arm. `rest_destination` carries no tap state at + // all, so it is asked with `Unspecified` and can never be proven + // tapped — a battlefield `rest_destination` is reach by + // construction, and a hand one is reach because hand always is. + landing_zone_is_confined(*primary_destination, *primary_enter_tapped) + && landing_zone_is_confined(*rest_destination, EtbTapState::Unspecified) + }, + ); + WindowReach::of(target_player.is_none() && split_entry_is_confined) + } + + // CR 400.1: a library is a per-player zone, so shuffling is + // confined exactly when the shuffled player is proven to be the actor. + Effect::Shuffle { target } => WindowReach::of(filter_is_actor_owned(target)), + + // CR 400.1 + CR 400.3 + CR 108.3: a zone change is + // confined when the moved object is proven actor-owned. The second + // disjunct is the anaphoric fetch/ramp shape — `Any` is the serde + // default, i.e. "no filter stated" ("put IT onto the battlefield") — + // which carries no player information of its own. Its player-qualified + // authority is the parent `SearchLibrary`, and the ability-level fold + // is what catches a foreign one: Bribery has the identical + // `Library -> Battlefield / Any` node and still folds to + // `MayInterfere` because its parent search carries + // `target_player: Typed{controller: Opponent}`. + // + // OWNERSHIP IS NOT ENOUGH WHEN THE DESTINATION IS THE BATTLEFIELD. + // CR 110.5b: "Permanents enter the battlefield untapped, unflipped, face + // up, and phased in unless a spell or ability says otherwise." A land + // that arrives UNTAPPED taps for mana in the very window the Shorten + // hands the responder — CR 601.2g runs mana abilities during the cast + // they fund, and CR 302.6's summoning-sickness bar is a CREATURE rule + // that never applies to a land. So an untapped fetch is the + // `Effect::Mana` case below with one extra step, and the reasoning that + // refuses to allowlist mana production refuses this too. MEASURED at + // this base on the live parser: `Terramorphic Expanse[0]` and + // `Evolving Wilds[0]` carry `enter_tapped: Tapped`, while + // `Crop Rotation[0]` and `Nature's Lore[0]` — same anaphoric + // `Library -> Battlefield / Any` node, same absent cost — carry + // `Unspecified` and were allowlisted here until this gate. + // + // Fail-closed on the tap axis: ONLY a provably `Tapped` entry stays + // confined, so `Unspecified` (the serde default, i.e. the AST said + // nothing) and `Untapped` both fall out. A conditionally-untapped entry + // (a shock land's pay-life choice, a land-count gate) cannot be proven + // tapped from the AST and is therefore reach, which is the direction + // this module's §2 default exists to take. + // + // TWO destinations are gated, for the same reason and by different + // evidence. The question this module asks is never "is the moved card + // the actor's own?" — the deleted `Effect::Mana` arm is what happens when + // ownership is mistaken for confinement. It is "can the seat DO something + // with the result inside the window the Shorten hands back?" + // + // * `Battlefield` — an untapped permanent taps for mana during the very + // cast it funds (CR 601.2g), so only a PROVABLY tapped arrival is + // confined. This applies to BOTH disjuncts, not just the anaphoric one: + // proven ownership does not stop an untapped land producing mana, so a + // graveyard-recursion shape reaching the battlefield untapped is the + // same defect through the other door. + // * `Hand` — a card put into hand is a CASTABLE card. When the spell that + // put it there finishes resolving, the active player receives priority + // (CR 117.3b) and priority then passes in turn order (CR 117.3d), so the + // responding seat gets it back still inside this window and can cast it. + // That is the `Effect::Mana` argument with one extra step, exactly as the + // untapped fetch was, and the AST carries nothing that could prove the + // returned card uncastable. MEASURED with the hand gate held off, 327 + // abilities are confined and 176 of them move a card to hand — 166 + // through this arm and 10 through the `SearchLibrary` split, which is + // why both doors now share `landing_zone_is_confined`. The witnesses are + // instant-speed: `Auroral Procession` returns ANY graveyard card, + // including an instant. Gating both doors leaves 151 confined abilities, + // 102 of which reach the battlefield, so the flagship tapped-fetch + // Accept is untouched: this closes a door, it does not vacate the + // feature. + // + // No other destination is gated, and that is a claim about what the seat + // can act with, not an oversight: a move to graveyard, library or exile + // puts the card somewhere the actor cannot cast or activate it from + // inside this window without some FURTHER permission, which would itself + // be an ability this fold already reads. + // + // PROVABLY tapped, not NOMINALLY tapped. Three more of this variant's + // fields decide what actually arrives, and each one is read here rather + // than ignored, because `enter_tapped` alone is not proof: + // + // * `enters_modified_if: Some(filter)` makes the tapped rider + // CONDITIONAL on the moved object's characteristics (CR 614.12: check + // the characteristics of the permanent as it would exist on the + // battlefield; CR 614.12a: any choice it requires is made first), so + // an object that fails the filter enters untapped while the field + // still reads `Tapped`. Unprovable from the AST ⇒ reach. + // * `enters_under` (CR 110.2a: "that object enters the battlefield under + // that player's control unless the effect states otherwise") routes the + // entering permanent to whatever controller it names. Anything but the + // actor puts a permanent on ANOTHER player's board, which is reach by + // definition — tapped or not. + // * `enters_attacking` (CR 508.4) puts the creature into combat against + // a defending player, planeswalker or battle. That is the clearest + // possible touch outside the actor's own resources, and a tapped + // attacker is still an attacker. + // + // A FOURTH battlefield conjunct, on a different axis than the three + // above: `origin == Some(Zone::Library)`. Those three ask what ARRIVES; + // this one asks what the arriving CARD is, and it is the only conjunct + // that can be discharged from this seam's inputs at all. + // + // A permanent entering the battlefield brings its whole printed text + // with it, and `carries_unreadable_rules_content` is this module's + // authority on which of that text the fold cannot classify. For the + // object performing the action, both entry points already run that gate + // (`object_window_reach`, `indexed_ability_window_reach`) — so a + // `target: SelfRef` recursion, where the card that arrives IS the source, + // is already covered by it. For every other target shape the arriving + // card is a DIFFERENT object, and the gate has never been run on it. + // + // `Library` narrows that hole but does NOT close it, and the earlier + // version of this comment claimed it did. It argued that CR 400.2 makes a + // library a hidden zone and the card an unchosen member of it, so "the + // seam is handed a `GameState` and a list of `GameAction`s, and the card + // is the subject of neither, so there is nothing to read". The premise is + // wrong as a fact about this engine. MEASURED on the enrolled 4p dump at + // the exact poll this module decides at: the actor's library is 91 cards + // and ALL 91 resolve in `state.objects` carrying full parsed rules + // content — 5 of them with triggers, and one of those is **Bojuka Bog** + // ("This land enters tapped. / When this land enters, exile target + // player's graveyard. / {T}: Add {B}.", Oracle text verified on + // Scryfall), whose ETB exiles a graveyard the actor does not own. + // CR 701.23a is the rule that makes it reachable: "To search for a card + // in a zone, look at all cards in that zone (EVEN IF IT'S A HIDDEN ZONE) + // and find a card that matches the given description." Hidden means the + // opponents cannot see it; it never meant the searcher cannot choose it. + // + // `board_observer_may_react` genuinely cannot catch this, and for a + // CORRECT reason rather than an omission: CR 113.6, via + // `trigger_definition_functions_in_zone`, answers "does not function" for + // a card sitting in a library. That predicate scans triggers that + // function NOW; the hazard is a trigger that will function once the + // search puts the card onto the battlefield. + // + // So the arriving card is classified where it can be: at the object + // level, by `library_arrivals_are_inert`, which runs + // `carries_unreadable_rules_content` over exactly the cards the actor + // could select. That gate is a board fact, not an AST fact, which is why + // it lives at the two entry points instead of in this arm. + // + // A `Graveyard`, `Hand` or `Exile` origin is a DIFFERENT situation and + // was previously admitted on the same warrant. There the arriving card + // IS in `state.objects`, its rules content is readable, and the fold + // simply never looked — so `OwnResourcesOnly` was asserted over text + // nobody had classified. Helping Hand ("Return target creature card with + // mana value 3 or less from your graveyard to the battlefield tapped.", + // Oracle text verified on Scryfall) read `OwnResourcesOnly` while a + // Fleshbag-Marauder-class creature sat in the actor's graveyard, and + // Accepting it hands back a window in which every player sacrifices. + // + // Gating on `Library` closes that without threading state into an + // AST-only function: it can only move a verdict toward `MayInterfere`, + // per §2 the direction that costs efficacy rather than games, and it is + // the same trade the `Hand` destination gate above already made. + // MEASURED on `data/card-data.json`, over every node in the document + // (not the narrower top-level `abilities` list the fold reads) whose + // shape is a tapped, non-attacking, unconditional, You-controlled + // battlefield entry: 493 total — Library 247, origin ABSENT 140, + // Graveyard 74, Hand 25, Exile 6, Battlefield 1. So the flagship + // library-fetch class keeps half the population outright, and the + // absent-origin bucket falls the same way as the named non-library ones, + // for the stronger version of the same reason: the seam cannot even name + // the zone the card comes from. + Effect::ChangeZone { + origin, + destination, + target, + owner_library: _, + enter_transformed: _, + enters_under, + enter_tapped, + enters_attacking, + up_to: _, + enter_with_counters: _, + conditional_enter_with_counters: _, + face_down_profile: _, + enters_modified_if, + } => { + let object_is_confined = filter_is_actor_owned(target) + || (matches!(target, TargetFilter::Any) + && *origin == Some(Zone::Library) + && *destination == Zone::Battlefield); + let entry_is_confined = landing_zone_is_confined(*destination, *enter_tapped) + && (*destination != Zone::Battlefield + || (*origin == Some(Zone::Library) + && enters_modified_if.is_none() + && !*enters_attacking + && matches!(enters_under, None | Some(ControllerRef::You)))); + WindowReach::of(object_is_confined && entry_is_confined) + } + + // NOT allowlisted — and `Effect::Mana` is the case that has to be NAMED + // here rather than left to the reader, because an earlier revision of + // this module allowlisted it. + // + // CR 106.1: "Mana is the primary resource in the game. Players spend + // mana to pay costs, usually when casting spells and activating + // abilities." CR 106.4 is the rule that earlier arm cited, and it quoted + // only the FIRST sentence — "that mana goes into a player's mana pool". + // The second sentence is the one that refutes the inference drawn from + // it: "From there, it can be used to pay costs immediately". CR 601.2g + // then runs mana abilities during the very cast they fund. + // + // So mana is FUNGIBLE REACH, and the earlier arm's inference — + // "producing it removes nothing from the board" — answers where the mana + // LANDS, which is not what this classifier asks. The question is whether + // the action widens what the seat can do inside the window + // `game::engine`'s `RespondToShortcut(Shorten)` arm hands back. + // + // Whether it does is NOT a function of the AST: it depends on the rest of + // the hand, the board, the colors produced, and on what other permanents + // trigger off mana being added (CR 603.2) or off the source leaving the + // battlefield (CR 701.21a). This function reads ONE ability and no other + // object, so `OwnResourcesOnly` here would be a proof it cannot + // discharge — exactly the unknowable this module's §2 default exists for. + // + // It is also the CONSISTENT answer: stage 1 re-admits a sacrifice-for-mana + // activation precisely BECAUSE the sacrifice is board-changing (see + // `types::mana::ManaSourcePenalty::is_meaningful_priority_activation`), so + // classifying that same action as confined here contradicted the stage + // that handed it over. + _ => WindowReach::MayInterfere, + } +} + +/// Reach of an activation cost. `Sacrifice` is the one cost shape that can name +/// somebody else's permanent, so it reads the same owner axis as the effects. +fn cost_window_reach(cost: &AbilityCost) -> WindowReach { + match cost { + // Tapping the source and spending mana from your own pool (CR 106.4) + // touch nothing outside the actor. + // + // The `Mana` arm here is the SPENDING side and it stays allowlisted; + // only PRODUCING mana is reach. Paying a mana cost consumes a resource + // the actor already holds and hands nothing new to the seat, whereas the + // effect-side `_` arm above explains why adding mana widens what the + // seat can do inside the window. Flipping this arm would classify every + // ability with a mana cost as interference and vacate the feature, so + // its absence from that change is deliberate. + AbilityCost::Tap => WindowReach::OwnResourcesOnly, + AbilityCost::Mana { cost: _ } => WindowReach::OwnResourcesOnly, + AbilityCost::Sacrifice(sacrifice) => { + WindowReach::of(filter_is_actor_owned(&sacrifice.target)) + } + AbilityCost::Composite { costs } => costs + .iter() + .fold(WindowReach::OwnResourcesOnly, |acc, sub| { + acc.or(cost_window_reach(sub)) + }), + _ => WindowReach::MayInterfere, + } +} + +/// Reach of a whole ability, folded over every field that can carry a +/// player-qualified authority. +/// +/// The `..`-free destructure is the structural guard (module doc §2): a new +/// `AbilityDefinition` field is a compile error here until it is classified as +/// walked, conservative-when-present, or reasoned read-free. +fn ability_window_reach(def: &AbilityDefinition) -> WindowReach { + let AbilityDefinition { + // ---- walked ---- + effect, + sub_ability, + else_ability, + mode_abilities, + cost, + player_scope, + // ---- conservative-when-present: each can name a player, an object, or + // a payment outside the actor, and none is walked ---- + activator_filter, + starting_with, + target_chooser, + unless_pay, + distribute, + cost_reduction, + condition, + duration, + multi_target, + target_constraints, + modal, + repeat_for, + announced_x, + repeat_until, + optional_for, + iteration_kind_binding, + // ---- read-free ---- + // Ability class (activated/triggered/static); no player reference. + kind: _, + // Display strings only. + description: _, + target_prompt: _, + // Activation gates: when, from which zone, with which mana, and under + // which keyword this ability may be activated. NOT player-free, and the + // earlier "no player reference" claim here was simply false: an + // `ActivationRestriction::RequiresCondition` carries a `ParsedCondition` + // that can name a player, and several do ("Activate only if an opponent + // lost life this turn"). Read-free anyway, which is the load-bearing + // part: a restriction narrows WHEN an ability may be activated, never + // WHAT it reaches. It contributes no effect, no target and no payment, + // so it can only make a window rarer — never wider. + activation_restrictions: _, + activation_mana_payment_restriction: _, + activation_zone: _, + ability_tag: _, + // Booleans and scalars that gate shape, never a player or an object. + optional_targeting: _, + optional: _, + target_choice_timing: _, + min_x_value: _, + cant_be_copied: _, + forward_result: _, + target_selection_mode: _, + sub_link: _, + sibling_condition: _, + } = def; + + let mut acc = effect_window_reach(effect); + if let Some(sub) = sub_ability { + acc = acc.or(ability_window_reach(sub)); + } + if let Some(other) = else_ability { + acc = acc.or(ability_window_reach(other)); + } + for mode in mode_abilities { + acc = acc.or(ability_window_reach(mode)); + } + if let Some(cost) = cost { + acc = acc.or(cost_window_reach(cost)); + } + // CR 400.1: an untargeted mass effect scoped to anyone but the actor + // reaches another player's resources by construction. + if let Some(scope) = player_scope { + acc = acc.or(WindowReach::of(matches!(scope, PlayerFilter::Controller))); + } + + let conservative_when_present = activator_filter.is_some() + || starting_with.is_some() + || target_chooser.is_some() + || unless_pay.is_some() + || distribute.is_some() + || cost_reduction.is_some() + || condition.is_some() + || duration.is_some() + || multi_target.is_some() + || !target_constraints.is_empty() + || modal.is_some() + || repeat_for.is_some() + || announced_x.is_some() + || repeat_until.is_some() + || optional_for.is_some() + || iteration_kind_binding.is_some(); + acc.or(WindowReach::of(!conservative_when_present)) +} + +/// Does this object carry rules content this module cannot classify? +/// +/// Single authority for that question — both entry points route through it, because +/// the previous shape (each entry point spelling out its own three-field check) is how +/// two answers to one question drift apart, and this module has already paid for that +/// once with `landing_zone_is_confined`. +/// +/// The list is deliberately EVERY rules-bearing field `game::printed_cards` writes and +/// `ability_window_reach` cannot read, not a curated subset of the ones known to be +/// dangerous. A curated subset is an allowlist maintained by whoever remembers to +/// update it; MEASURED, the previous three-field version claimed in its own doc comment +/// to cover what `printed_cards` splits a face into, and was wrong by eight fields. +/// `obj.keywords` alone carries printed **Cascade** (`game::triggers`: printed Cascade +/// lives in `obj.keywords` and never reaches `trigger_definitions`), so a Cascade spell +/// whose printed `abilities` all read confined would have been proven +/// `OwnResourcesOnly` while resolving it casts a free spell of arbitrary reach inside +/// the very window the seat just declined to keep. +/// +/// MEASURED cost of widening from three fields to all of them, on this candidate's own +/// projection: of the 53 cards that survived the three-field gate, 10 now flip (8 on +/// `keywords`, 1 `modal`, 1 `additional_cost`), leaving 43. The class this classifier +/// exists to protect is untouched — Terramorphic Expanse, Evolving Wilds and Rampant +/// Growth carry none of these fields. +/// +/// A presence gate is conservative by construction: it can only move a verdict toward +/// `MayInterfere`, which per §2 is the direction that costs efficacy rather than games. +fn carries_unreadable_rules_content(object: &GameObject) -> bool { + !object.trigger_definitions.is_empty() + || !object.replacement_definitions.is_empty() + || !object.static_definitions.is_empty() + // Keywords are rules text the fold never sees; Cascade is the sharp case. + || !object.keywords.is_empty() + // Casting-time modifiers: each one changes what resolving the object does or + // what the seat may do with it, and none is an `AbilityDefinition`. + || object.modal.is_some() + || object.additional_cost.is_some() + || object.strive_cost.is_some() + || object.cleave_variant.is_some() + || !object.casting_restrictions.is_empty() + || !object.casting_options.is_empty() + || !object.spellbook.is_empty() + // A back face is an entire second face of rules content that this fold never + // descends into. 0 carriers among today's confined set, so gating it is free. + || object.back_face.is_some() + // The four below were found by WRITING the staleness guard below, not by reading + // this list again — which is the argument for the guard existing. All four are + // rules-bearing, all four are written by `printed_cards`, and none was gated. + // MEASURED at this candidate's projection: each is 0 among the cards that survive + // the gate, and real document-wide (solve conditions 15, Class 38, Case 15, + // Attraction 35), so they are latent holes rather than live ones — the same shape + // as the `Zone::Stack` arm, and closed for the same reason. + || object.case_state.is_some() + || object.class_level.is_some() + || object.intensity != 0 + || !object.attraction_lights.is_empty() + // CR 709.5: a shared type line is two static abilities that remove the name, mana + // cost and RULES TEXT of each locked half; CR 709.5c names the unlocked + // designations, and CR 709.5e lets any player unlock a half as a special action at + // any priority. So which halves are unlocked decides what rules text the permanent + // has, `obj.abilities` is a flat list that cannot express that, and an opponent can + // change the answer inside the very window this fold is deciding about. + // Found by the same review round that caught the `card_type` bucket below, and it + // is the fourth subtype-derived field of four — the other three were already here, + // which is what made this one's absence a curated subset rather than a set. + || object.room_unlocks.is_some() + // THE PARSER SAID IT COULD NOT READ THIS CARD. Every other disjunct above gates a + // field whose CONTENTS this fold cannot classify; this one gates the parser's own + // report that some printed clause never became a field at all. That is the exact + // residual the module doc's §2 names as the one thing the fail-closed default + // cannot cover — "a clause the PARSER silently swallows never becomes a shape here, + // so the ability this module is handed looks strictly MORE confined than the + // printed card is" — and a diagnostic is the seat's only in-band evidence that it + // happened. Reading `abilities` and ignoring the note saying `abilities` is + // incomplete is proving confinement from the fraction of the card that parsed. + || !object.parse_warnings.is_empty() +} + +/// Is every card the actor could SELECT out of a hidden zone and put onto the +/// battlefield provably inert? +/// +/// The companion to [`carries_unreadable_rules_content`], on the other object. +/// That gate asks "can this fold read the rules content of the card TAKING the +/// action"; this one asks the same question about the card the action would +/// BRING IN. `effect_window_reach`'s `ChangeZone` arm admits a battlefield +/// arrival only from `Zone::Library`, and its own comment used to discharge the +/// arriving card's text with a hidden-zone argument. CR 701.23a refutes it: "To +/// search for a card in a zone, look at all cards in that zone (even if it's a +/// hidden zone) and find a card that matches the given description." A hidden +/// zone hides the cards from the OPPONENTS; the searcher picks whichever member +/// they like, so the selectable set is readable and this fold has to read it. +/// +/// # Why this is a board fact and not an AST fact +/// +/// It lives here, called from the two entry points beside +/// `carries_unreadable_rules_content`, rather than inside `effect_window_reach`. +/// The reason is not convenience: the answer is not a function of the ability at +/// all. Two players holding the identical printed card get opposite verdicts, +/// because the verdict is about what is in the deck behind it. Threading a +/// `GameState` into an AST classifier would present a board-dependent answer as +/// an AST-dependent one. +/// +/// # The selection set, and the direction each approximation errs +/// +/// * **Which cards are in the pool** — every object the actor OWNS in a pooled +/// zone. `game::effects::search_library` reads `owner.library` and matches with +/// `matches_target_filter_in_owner_zone`, so owner (CR 108.3), not controller, +/// is the axis, and this scans `state.objects` for the same set. The pool is +/// `Zone::Library` plus whatever `Effect::SearchLibrary::source_zones` names — +/// the God-Pharaoh's-Gift class searches graveyard and hand as well, and a card +/// fetched from there reaches the same battlefield. +/// * **Which of them are selectable** — the union of every `SearchLibrary` +/// filter the object carries, plus every library→battlefield `ChangeZone` +/// target that is not `TargetFilter::Any`. A UNION over the object's searches +/// rather than a binding of each search to the node that consumes its result: +/// binding would require threading a "search filter currently in scope" through +/// the whole recursive fold, and a union is a SUPERSET of any single search's +/// result, so it errs toward `MayInterfere`. `TargetFilter::Any` is excluded +/// because it is the serde default on the ANAPHORIC node ("put IT onto the +/// battlefield") — it states no restriction of its own and its authority is the +/// parent search, which is already in the union. An object with a +/// library→battlefield arrival and NO search filter at all leaves the union +/// empty, and an empty union means the WHOLE pool is selectable. +/// * **`selection_constraint` and `game::effects::search_library`'s +/// `library_search_top_limit` are ignored.** Both NARROW what may be chosen, so +/// ignoring them over-counts the pool, which is the conservative direction. +/// +/// # The one place this fails closed rather than answering +/// +/// A non-empty union that matches NOTHING returns `false`. That looks like +/// throwing away the free case — a deck with no basic land for its own fetch — +/// and it is deliberate, because this seam cannot tell that case apart from a +/// filter it is unable to evaluate. `FilterContext::from_source_with_controller` +/// carries the acting object but no ability instance, so a filter that reads the +/// ability's own targets matches nothing here for a reason that has nothing to do +/// with the deck. MEASURED over `data/card-data.json`: 24 cards carry such a +/// `SearchLibrary` filter (23 `SameNameAsParentTarget` — Infernal Tutor, Surgical +/// Extraction, Bifurcate, … — and 2 `CanEnchant { target: ParentTarget }`: +/// Auratouched Mage, Sovereigns of Lost Alara, with Canoptek Wraith carrying +/// both properties). Answering "empty match set, therefore inert" for those would +/// be a false `Accept` produced by an unevaluated filter, so the empty result is +/// treated as the unanswerable it is. +fn library_arrivals_are_inert( + state: &GameState, + object: &GameObject, + abilities: &[AbilityDefinition], +) -> bool { + let mut reaches_battlefield = false; + let mut pool_zones = vec![Zone::Library]; + let mut selection: Vec = Vec::new(); + + // `types::ability_visit` is the engine's single complete `AbilityDefinition` + // walk, and its `Effect` match is wildcard-free — a future variant carrying a + // nested effect is a compile error there rather than a silent miss here. A + // hand-rolled second walk beside `ability_window_reach`'s is exactly the + // "two answers to one question" shape this module has already paid for twice + // (`landing_zone_is_confined`, `carries_unreadable_rules_content`). + for def in abilities { + // The visitor never breaks — the union needs every node — so the + // `ControlFlow` it returns is always `Continue`. + let _ = crate::types::ability_visit::visit_ability_def(def, &mut |effect: &Effect| { + match effect { + // `..`-FREE, exactly like `effect_window_reach`'s two arms and for + // the same reason: a new field that changes what a search may FIND + // or where it may PUT it must be a compile error here, not a + // silently unread modifier. `count`/`reveal`/`selection_constraint` + // are bound and unused deliberately — the first two do not change + // WHICH cards match, and the third only narrows (see the doc). + Effect::SearchLibrary { + source_zones, + filter, + count: _, + reveal: _, + target_player: _, + selection_constraint: _, + split, + } => { + selection.push(filter.clone()); + for zone in source_zones { + if !pool_zones.contains(zone) { + pool_zones.push(*zone); + } + } + // Both split destinations, for the same reason the reach fold + // reads both: `rest_destination` lands cards too. + if split.as_ref().is_some_and(|split| { + split.primary_destination == Zone::Battlefield + || split.rest_destination == Zone::Battlefield + }) { + reaches_battlefield = true; + } + } + // The arrival-shape fields are the REACH fold's business; this arm + // only needs to know that a library card can land on the + // battlefield and which filter picks it. + Effect::ChangeZone { + origin: Some(Zone::Library), + destination: Zone::Battlefield, + target, + owner_library: _, + enter_transformed: _, + enters_under: _, + enter_tapped: _, + enters_attacking: _, + up_to: _, + enter_with_counters: _, + conditional_enter_with_counters: _, + face_down_profile: _, + enters_modified_if: _, + } => { + reaches_battlefield = true; + if !matches!(target, TargetFilter::Any) { + selection.push(target.clone()); + } + } + // A node this walk does not recognize contributes nothing to the + // pool, and that is safe only because it is not the last word: + // `effect_window_reach`'s own `_` arm answers `MayInterfere` for + // every unrecognized shape, so a future effect that could put a + // library card onto the battlefield makes the WHOLE verdict + // interference before this pool is ever consulted. + _ => {} + } + std::ops::ControlFlow::Continue(()) + }); + } + + if !reaches_battlefield { + return true; + } + + let actor = object.controller; + let pool: Vec<&GameObject> = state + .objects + .values() + .filter(|candidate| candidate.owner == actor && pool_zones.contains(&candidate.zone)) + .collect(); + // Nothing can be selected out of an empty pool, so nothing arrives. This is + // the one empty set that IS an answer, and it is the opposite of the empty + // match set below: here the filter never ran. + if pool.is_empty() { + return true; + } + + let context = crate::game::filter::FilterContext::from_source_with_controller(object.id, actor); + let selectable: Vec<&&GameObject> = if selection.is_empty() { + pool.iter().collect() + } else { + pool.iter() + .filter(|candidate| { + selection.iter().any(|filter| { + crate::game::filter::matches_target_filter_in_owner_zone( + state, + candidate.id, + filter, + &context, + ) + }) + }) + .collect() + }; + if selectable.is_empty() { + return false; + } + selectable + .iter() + .all(|candidate| !carries_unreadable_rules_content(candidate)) +} + +/// Fold every ability an object carries. A missing object, or one carrying no +/// abilities at all, is `MayInterfere` — the fail-closed direction, and the one +/// that keeps an empty fold from being proven confined by its identity element. +/// +/// `abilities` is NOT the whole of an object's rules content. `game::printed_cards` +/// spreads a card face across many more rules-bearing fields than this module can +/// classify — `carries_unreadable_rules_content` below is the enumerated authority on +/// which, and the one place to look; a count written here would only drift out of step +/// with it. This module classifies exactly one of them, because `ability_window_reach` +/// destructures an `AbilityDefinition` and the rest carry different types entirely. +/// Folding only `abilities` and returning `OwnResourcesOnly` would therefore prove a +/// card confined from whichever fraction of it happens to be ability-shaped. +/// +/// That is not hypothetical. MEASURED on `data/card-data.json`: `Stunning Reversal` +/// projects `abilities` = one `ChangeZone { destination: Exile, target: SelfRef }` +/// — actor-owned, non-battlefield, hence confined on every conjunct this module +/// reads — while its entire function lives in `replacements[0]`, a `GameLoss` +/// replacement ("The next time you would lose the game this turn, instead draw +/// seven cards and your life total becomes 1"). A seat holding it would have read +/// `OwnResourcesOnly` and Accepted the very shortcut the card exists to survive. +/// Per this module's §2 that is the losing direction, and it is the same defect +/// class as the deleted `Effect::Mana` arm: reasoning from the part of the card the +/// classifier can see instead of from what the seat can do. +/// +/// So a non-empty unreadable field is `MayInterfere` — not because its contents are +/// known to interfere, but because this module cannot prove they do not, which is the +/// only warrant `OwnResourcesOnly` ever has. Reading them properly (classifying +/// `TriggerDefinition` / `ReplacementDefinition` / `StaticDefinition` the way +/// `ability_window_reach` classifies an `AbilityDefinition`) is the named upgrade +/// path; until then the gate is presence, and presence is conservative. +fn object_window_reach(state: &GameState, object_id: ObjectId) -> WindowReach { + let Some(object) = state.objects.get(&object_id) else { + return WindowReach::MayInterfere; + }; + if object.abilities.is_empty() { + return WindowReach::MayInterfere; + } + if carries_unreadable_rules_content(object) { + return WindowReach::MayInterfere; + } + if !library_arrivals_are_inert(state, object, &object.abilities) { + return WindowReach::MayInterfere; + } + object + .abilities + .iter() + .fold(WindowReach::OwnResourcesOnly, |acc, ability| { + acc.or(ability_window_reach(ability)) + }) +} + +/// Reach of one indexed activated ability. An unresolvable object or an +/// out-of-range index is `MayInterfere`. +/// +/// Carries the same unreadable-content gate as `object_window_reach`, and for a +/// reason specific to this path rather than by symmetry: activating an ability is +/// itself a game event, so a trigger on the SAME object can fire off the activation +/// (CR 603.2) or off the cost being paid, and a static ability can change what the +/// activation is allowed to do. This module cannot classify any of that, so an object +/// carrying it is not provably confined no matter how confined the indexed ability +/// reads on its own. +fn indexed_ability_window_reach( + state: &GameState, + source_id: ObjectId, + ability_index: usize, +) -> WindowReach { + let Some(object) = state.objects.get(&source_id) else { + return WindowReach::MayInterfere; + }; + if carries_unreadable_rules_content(object) { + return WindowReach::MayInterfere; + } + let Some(ability) = object.abilities.get(ability_index) else { + return WindowReach::MayInterfere; + }; + // Scoped to the ONE ability being activated, unlike the object-level entry + // point: a sibling ability the seat is not activating fetches nothing. + if !library_arrivals_are_inert(state, object, std::slice::from_ref(ability)) { + return WindowReach::MayInterfere; + } + ability_window_reach(ability) +} + +/// CR 603.2: can a CONFINED action's event stream ever match this trigger's +/// trigger event? Returns `true` iff it PROVABLY cannot. +/// +/// # This predicate is NOT a fact about the trigger +/// +/// It is a fact about the trigger RELATIVE TO the confined-action allowlists this +/// module defines, and it lives here for exactly that reason. Relief is not +/// intrinsic to a `TriggerMode`; every arm below is discharged by reading what +/// [`cost_window_reach`] and [`effect_window_reach`] admit, so the premise has to +/// live where those allowlists live. Moving it to `game::triggers` would present +/// it as a CR-grounded property of a trigger and invite reuse by a caller with a +/// different action set, for which every arm below is unproven. +/// +/// ## The soundness contract, named in full +/// +/// Relief holds only while BOTH allowlists stay exactly as they are today: +/// +/// * [`cost_window_reach`] admits `AbilityCost::Tap`, `AbilityCost::Mana`, +/// an actor-owned `AbilityCost::Sacrifice`, and `AbilityCost::Composite` of +/// those. Everything else is `MayInterfere`. +/// * [`effect_window_reach`] admits `Effect::SearchLibrary`, `Effect::Shuffle` +/// and a gated `Effect::ChangeZone`. Everything else is `MayInterfere`. +/// +/// **WIDEN EITHER ALLOWLIST AND YOU MUST RE-AUDIT EVERY ARM BELOW.** The witness +/// that makes that concrete, and the reason the Life family's relief is +/// CONTINGENT rather than structural: `AbilityCost::PayLife` exists +/// (`types::ability`) and a Polluted-Delta-class fetchland pays it — "{T}, Pay 1 +/// life, Sacrifice this land: Search your library …" — squarely inside this +/// predicate's own event boundary, which counts cost payment. Such a card is +/// `MayInterfere` today ONLY because `PayLife` falls to `cost_window_reach`'s +/// fail-closed `_` arm. Allowlist `PayLife` and a Bloodthirsty Conqueror +/// ("Whenever an opponent loses life, you gain that much life") fires through a +/// mode this function has RELIEVED — which is the precise defect the board scan +/// exists to prevent. +/// +/// ## Boundary +/// +/// The classified action set is `GameAction::CastSpell` and +/// `GameAction::ActivateAbility` only; every other `GameAction` already returns +/// `true` in [`any_action_may_interfere`] without consulting this. Events are +/// counted from announcement through full resolution, INCLUDING cost payment +/// (CR 601.2b–i for a spell, CR 602.2b for an activated ability, which routes to +/// the same process). `GameAction::PassPriority` is excluded by construction (it +/// returns `false` before the fold), so phase advance is out of domain and a +/// beginning-of-phase trigger cannot be reached through this predicate's callers. +/// +/// ## Fail-closed +/// +/// Exhaustive dispatch with a `_ => false` arm, mirroring +/// [`crate::game::triggers::trigger_event_unreachable_in_phase`]: a mode this +/// predicate cannot classify KEEPS its veto. A future mode is swallowed into +/// conservatism, never into relief. +fn trigger_event_unreachable_by_confined_action( + def: &crate::types::ability::TriggerDefinition, +) -> bool { + use crate::types::triggers::TriggerMode; + + match def.mode { + // LIFE — CR 119.3: "If an effect causes a player to gain life or lose + // life, that player's life total is adjusted accordingly." No allowlisted + // effect adjusts a life total, and no allowlisted COST pays life. See the + // `AbilityCost::PayLife` witness above: this family is the contingent one. + // `PayEcho`/`PayCumulativeUpkeep` additionally route to `match_phase` + // (`game::trigger_matchers`), i.e. they key on `GameEvent::PhaseChanged`, + // which the turn-structure argument below covers independently. + TriggerMode::LifeGained + | TriggerMode::LifeLost + | TriggerMode::LifeLostAll + | TriggerMode::LifeChanged + | TriggerMode::PayLife + | TriggerMode::PayCumulativeUpkeep + | TriggerMode::PayEcho => true, + + // DAMAGE — CR 120.1: "Objects can deal damage to battles, creatures, + // planeswalkers, and players." Searching, shuffling and moving a card + // deal no damage, and no allowlisted cost does either. `Fight`/`FightOnce` + // are in this family by CR 701.14a (each fighting creature "deals damage equal to its + // power to the other creature") and are + // additionally keyed on `EffectKind::Fight` in `game::trigger_matchers`, + // which no allowlisted effect produces. + TriggerMode::DamageDone + | TriggerMode::DamageDoneOnce + | TriggerMode::DamageAll + | TriggerMode::DamageDealtOnce + | TriggerMode::DamageDoneOnceByController + | TriggerMode::DamageReceived + | TriggerMode::DamagePreventedOnce + | TriggerMode::ExcessDamage + | TriggerMode::ExcessDamageAll + | TriggerMode::Fight + | TriggerMode::FightOnce => true, + + // COMBAT — CR 508.1 and CR 509.1 both open "this turn-based action doesn't + // use the stack": attackers and blockers are declared by the turn-based + // actions of CR 506.1's declare-attackers and declare-blockers steps, not + // by any spell or ability. MEASURED in `game::trigger_matchers`: every mode + // below keys on `GameEvent::AttackersDeclared` or + // `GameEvent::BlockersDeclared`, neither of which a cast or an activation + // emits. + // + // The one allowlisted effect that could otherwise put a creature into + // combat is `Effect::ChangeZone`'s `enters_attacking` rider (CR 508.4), + // and `effect_window_reach` already requires `!enters_attacking` for a + // battlefield arrival to be confined — so this family depends on that + // conjunct and not merely on the turn-based-action argument. + // + // `TriggerMode::EntersOrAttacks` is DELIBERATELY ABSENT — see the excluded + // list below. + TriggerMode::Attacks + | TriggerMode::AttackersDeclared + | TriggerMode::AttackersDeclaredOneTarget + | TriggerMode::YouAttack + | TriggerMode::YouAttackUnblocked + | TriggerMode::AttackerBlocked + | TriggerMode::AttackerBlockedOnce + | TriggerMode::AttackerBlockedByCreature + | TriggerMode::AttackerUnblocked + | TriggerMode::AttackerUnblockedOnce + | TriggerMode::Blocks + | TriggerMode::BlockersDeclared + | TriggerMode::BecomesBlocked + | TriggerMode::AttacksOrBlocks + | TriggerMode::BlocksOrBecomesBlocked => true, + + // TURN STRUCTURE — CR 500.1: "A turn consists of five phases, in this + // order …". A phase or turn begins by turn-based action, never because a + // player cast a spell or activated an ability. `PassPriority` is the + // action that CAN advance a phase and it never reaches this predicate + // (see Boundary above). + TriggerMode::Phase | TriggerMode::TurnBegin | TriggerMode::NewGame => true, + + // CARD FLOW the allowlist cannot cause. + // + // * `Drawn` — CR 121.1: "A player draws a card by putting the top card of + // their library into their hand." Doubly unreachable: `match_drawn` keys + // on the dedicated `GameEvent::CardDrawn`, AND no confined action can put + // a card into a hand at all, because `landing_zone_is_confined` answers + // `false` for `Zone::Hand` on both doors out of a library. + // * `Discarded`/`DiscardedAll` — CR 701.9a: "To discard a card, move it + // from its owner's hand to that player's graveyard." `match_discarded` + // keys on the dedicated `GameEvent::Discarded`, which + // `game::zone_pipeline` emits only for a recorded discard, not for a + // generic hand-to-graveyard move. + // * `TokenCreated`/`TokenCreatedOnce` — CR 111.1: tokens are put onto the + // battlefield by effects that say so. `Effect::Token` is not allowlisted, + // and `match_token_created` keys on the dedicated + // `GameEvent::TokenCreated`. + // + // `Milled`/`MilledOnce`/`MilledAll` are DELIBERATELY ABSENT — see below. + TriggerMode::Drawn + | TriggerMode::Discarded + | TriggerMode::DiscardedAll + | TriggerMode::TokenCreated + | TriggerMode::TokenCreatedOnce => true, + + // ── NOT RELIEVED. Each keeps its veto, with the source that reaches it. ── + // + // Directly produced by casting or activating: + // `SpellCast` CR 601.2i — announcing the spell IS the event + // `AbilityActivated` CR 602.2b — likewise for an activation + // `Taps` / `TapsForMana` / `ManaAdded` — `AbilityCost::Tap` and the mana + // the actor spends + // `PlayerPerformedAction` — `game::search_library` emits it + // `SearchedLibrary` — `Effect::SearchLibrary` itself + // `Shuffled` — `Effect::Shuffle` itself + // Produced by the allowlisted `ChangeZone` / `Sacrifice`: + // `Exiled`, `Sacrificed`, `Destroyed`, `ChangesZone`, `ChangesZoneAll`, + // `LeavesBattlefield`, `Revealed`, `BecomesTarget`, `CounterAdded` + // (`game::zone_pipeline` puts counters on an entering permanent), + // `ChangesController`, `Attached`, `Unattach`. + // Unknowable here: + // `StateCondition` — CR 603.2 state triggers watch a game STATE, not an + // event, so no event-stream argument can relieve one; + // `Unknown(_)` — an unclassified Forge mode string, by definition. + // + // THREE MEASURED EXCLUSIONS from families that otherwise look relieved. + // Each was found by reading the matcher rather than the mode name, and + // each reads a GENERIC `GameEvent::ZoneChanged` that an allowlisted + // `Effect::ChangeZone` really does emit: + // + // * `Milled` / `MilledOnce` / `MilledAll` — CR 701.17a defines milling as + // library-to-graveyard, and `game::trigger_matchers::match_milled` keys + // on `ZoneChanged { from: Some(Library), to: Graveyard }` rather than on + // any mill-specific event. `Effect::ChangeZone { origin: Some(Library), + // destination: Graveyard, target: }` is confined here + // (graveyard is a confined landing zone, the target proves control) and + // emits exactly that event, so relieving the family would be unsound. + // * `EntersOrAttacks` — `match_enters_or_attacks` reads `ZoneChanged`, so + // the flagship's own tapped fetch fires it. It is a combat mode by name + // only. + // * `EntersOrHauntedCreatureDies` — dispatches to `match_changes_zone` + // outright (`game::trigger_matchers`). + // + // Fail-closed: every mode this predicate cannot classify keeps its veto. + _ => false, + } +} + +/// CR 603.2: could ANY trigger anywhere on the board fire off a confined action +/// the actor takes in this window? +/// +/// [`any_action_may_interfere`]'s per-action fold reads the acting object's own +/// AST and nothing else, so it cannot see an OBSERVER — a permanent belonging to +/// somebody else whose triggered ability watches for the very event the confined +/// action produces. The maintainer witness is Hedron Crab: "Landfall — Whenever a +/// land you control enters, target player mills three cards." A seat that +/// confidently cracks its own fetchland in front of an opponent's Crab has just +/// milled a player, and no amount of reading the fetchland proves otherwise. +/// +/// Three INDEPENDENT SUFFICIENT reliefs, applied as a DISJUNCTION — a trigger is +/// inert iff at least one holds. They are ordered cheapest-first, and the zone +/// gate MUST stay first: MEASURED on the largest board in the enrolled fixture +/// set it removes 103 of 145 candidate definitions before any other work runs. +/// +/// 1. **Zone of function** — CR 113.6 / CR 603.6: +/// [`crate::game::triggers::trigger_definition_functions_in_zone`] is the +/// single authority. Reading `def.trigger_zones.contains(&zone)` directly is +/// FAIL-OPEN and must never be done here: an EMPTY `trigger_zones` means +/// battlefield-only, so a direct `contains` answers "does not function" for +/// every ordinary battlefield trigger on the board. +/// 2. **Mode** — [`trigger_event_unreachable_by_confined_action`]. +/// 3. **The self-reference carve-out** — a trigger that watches only ITS OWN +/// object (CR 109.5: "you"/"your" refer to the object's controller) and whose +/// object the actor does not own cannot be reached by an action confined to +/// the actor's own resources. All three conjuncts are load-bearing: +/// * `zone_change_clauses.is_empty()`, because a non-empty clause list makes +/// the matcher IGNORE the scalar `valid_card` entirely +/// (`types::ability::TriggerDefinition`), so reading `valid_card` under a +/// disjunctive trigger reads a field the engine does not consult; +/// * `valid_card == Some(TargetFilter::SelfRef)` EXACTLY. This deliberately +/// does NOT reuse [`filter_is_actor_owned`], which answers `true` for +/// `Typed { controller: Some(You) }` — precisely Hedron Crab's `valid_card`, +/// so reusing it would carve out the very trigger this scan exists to catch. +/// `valid_card: None` means UNRESTRICTED rather than self +/// (`game::trigger_index`), and `== Some(SelfRef)` rejects it without a +/// dedicated arm; +/// * `obj.owner != actor`, because the actor's OWN self-referential observer +/// is reachable by the actor's own action. +/// +/// NOT a `TriggerDefinition` destructure, unlike [`ability_window_reach`]'s +/// `..`-free discipline, and the asymmetry is deliberate. The 30 fields not read +/// here are inert, effect-side, or NARROWING — a narrowing field can only make a +/// trigger fire less often, so ignoring it is conservative. The two that can +/// broaden a trigger within its class, `origin_zones` and `zone_change_clauses`, +/// belong exclusively to zone-change modes, and no zone-change mode is ever +/// relieved by arm 2 (`ChangesZone`/`ChangesZoneAll` fall to `_ => false`); +/// `zone_change_clauses` is additionally read directly by arm 3. +/// +/// CR 603.10a: this reads live `state.objects` rather than any look-back +/// snapshot, which is correct here because the question is prospective — what +/// could fire if the actor acts — not what did fire. +fn board_observer_may_react(state: &GameState, actor: PlayerId) -> bool { + state.objects.values().any(|obj| { + crate::game::functioning_abilities::active_trigger_definitions(state, obj).any(|active| { + let def = active.definition; + let inert = !crate::game::triggers::trigger_definition_functions_in_zone(def, obj.zone) + || trigger_event_unreachable_by_confined_action(def) + || (def.zone_change_clauses.is_empty() + && def.valid_card == Some(TargetFilter::SelfRef) + && obj.owner != actor); + !inert + }) + }) +} + +/// Stage 2's predicate: does the polled player hold any action that could reach +/// past their own resources? +/// +/// Reads the actions stage 1 counted — no clone, no `find_legal_targets`, no +/// simulation, no graph build. The caller MUST hand it +/// `ai_support::stage_two_action_set`, not the bare flat list: stage 1 counts +/// sacrifice-for-mana activations that only ever live in +/// `legal_actions_by_object`, and an action never handed to this fold reaches no +/// arm at all, so the fail-closed `_ => MayInterfere` default cannot protect it. +/// Missing an action here is an Accept by OMISSION — the direction that loses +/// games. +/// +/// # What this seam's inputs can and cannot describe +/// +/// A fetched permanent that itself enables interference is modelled only through +/// its ARRIVAL STATE, never by walking its abilities. `effect_window_reach` keeps +/// a battlefield entry confined only when the AST proves it arrives tapped +/// (CR 110.5b), so the mana axis — the fetched land that taps for mana inside +/// this same window — is closed: an untapped entry reads `MayInterfere`. +/// +/// What that leaves outside the seam's description, stated as a property of the +/// inputs rather than as a blanket: a permanent that arrives TAPPED and still +/// enables interference through an ability whose cost is not tapping (a +/// sacrifice-for-mana, say). +/// +/// That residual is scoped to ONE origin, and the scoping is enforced in code +/// rather than promised here. `effect_window_reach`'s `ChangeZone` arm admits a +/// battlefield entry only when `origin == Some(Zone::Library)`, and what the +/// arriving card can DO is then classified by [`library_arrivals_are_inert`], +/// which both entry points run. +/// +/// The residual is what THAT gate leaves, and it is narrower than the whole +/// fetch class: `carries_unreadable_rules_content` is a presence check, so a +/// selectable card with no trigger, replacement, static or keyword passes it +/// while still carrying an ACTIVATED ability whose cost is not tapping. Such a +/// card arrives tapped (the arm requires it) and can still be sacrificed for +/// value inside this window. +/// +/// This paragraph previously claimed the residual was total and unreachable, on +/// the argument that CR 400.2 makes the library hidden so "neither input +/// contains it and neither the per-action fold nor the board scan has an object +/// to read". That was measurably false — the enrolled 4p dump resolves all 91 of +/// the actor's library cards in `state.objects` — and CR 701.23a is the rule it +/// mistook: a search looks at all cards in the zone "even if it's a hidden +/// zone". `board_observer_may_react` really does miss them, but for the CR 113.6 +/// reason (`trigger_definition_functions_in_zone` answers "does not function" for +/// a library card), which is why the selection gate is separate from it. +/// +/// A `Graveyard`, `Hand` or `Exile` origin is a different situation again — the +/// arriving card is named by the effect's own target rather than chosen out of a +/// pool — and it is not in this residual because the arm no longer admits it. See +/// that arm's fourth battlefield conjunct for the measurement and the efficacy +/// trade. +/// +/// Its cost, on both axes, for the reader deciding whether that matters: +/// - across windows: a bounded miss — a seat's fetched answer goes unused for +/// THIS shortcut; +/// - within the window: NOT bounded by "one shortcut". On an `UntilLethal` +/// offer the accepted sequence runs to lethal, so the in-window cost of a +/// missed out is elimination. +/// +/// The miss requires the out to be reachable ONLY through the fetched permanent +/// AND that permanent to arrive tapped; a directly-castable answer is already +/// caught by the top-level fold, and CR 732.1b makes shortcut use permissive +/// ("can be used") rather than guaranteed. +/// +/// # Two board-level conjuncts, evaluated ONCE +/// +/// Both run BEFORE the action fold, because each is a fact about the BOARD and +/// not about any action: re-deriving them per action would multiply a whole-board +/// scan by the action count and produce the identical answer every time. +/// +/// * [`actor_owns_everything_they_control`] — the fold's filter proofs are +/// CONTROL proofs (CR 109.5), and CR 701.21a routes a sacrificed permanent to +/// its OWNER's graveyard. +/// * [`board_observer_may_react`] — a confined action is still OBSERVED +/// (CR 603.2); an opponent's Hedron Crab turns the actor's own fetch into a +/// mill targeting somebody else. +pub(crate) fn any_action_may_interfere( + state: &GameState, + actor: PlayerId, + actions: &[GameAction], +) -> bool { + if !actor_owns_everything_they_control(state, actor) { + return true; + } + if board_observer_may_react(state, actor) { + return true; + } + actions.iter().any(|action| match action { + GameAction::PassPriority => false, + GameAction::CastSpell { object_id, .. } => { + object_window_reach(state, *object_id).may_interfere() + } + GameAction::ActivateAbility { + source_id, + ability_index, + } => indexed_ability_window_reach(state, *source_id, *ability_index).may_interfere(), + // Every other priority action (play a land, declare attackers, special + // actions, ...) is unclassified and therefore interference. + _ => true, + }) +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::game::zones::create_object; + use crate::parser::oracle::parse_oracle_text; + use crate::types::card::{CardFace, CardMetadata}; + use crate::types::keywords::Keyword; + + /// A card as the pipeline sees it: its REAL printed name plus its verbatim + /// Oracle text. The name is load-bearing, not decoration — `~` + /// normalization resolves a card's self-reference by matching its own name, + /// so parsing "Lightning Bolt deals 3 damage to any target." under a + /// placeholder name yields `Effect::Unimplemented` and the row would then + /// be measuring the fail-closed arm instead of the effect's own semantics + /// (MEASURED: that is exactly what an earlier revision of this table did). + struct Card { + name: &'static str, + oracle: &'static str, + } + + /// Parse verbatim Oracle text the way the card pipeline does and return the + /// ability at `index`. + fn ability(card: &Card, index: usize) -> AbilityDefinition { + let parsed = parse_oracle_text(card.oracle, card.name, &[], &[], &[]); + parsed + .abilities + .get(index) + .unwrap_or_else(|| { + panic!( + "{}[{index}] must exist; parsed {} abilities", + card.name, + parsed.abilities.len() + ) + }) + .clone() + } + + fn reach(card: &Card, index: usize) -> WindowReach { + ability_window_reach(&ability(card, index)) + } + + /// True when this ability's head is the unparsed gap node, i.e. its verdict + /// rides the fail-closed `_` arm rather than the effect's own semantics. + fn head_is_unparsed(card: &Card, index: usize) -> bool { + matches!( + ability(card, index).effect.as_ref(), + Effect::Unimplemented { .. } + ) + } + + const TERRAMORPHIC: Card = Card { + name: "Terramorphic Expanse", + oracle: "{T}, Sacrifice this land: Search your library for a basic land \ + card, put it onto the battlefield tapped, then shuffle.", + }; + /// Helping Hand, verbatim (Oracle text verified on Scryfall, + /// `api.scryfall.com/cards/named?exact=Helping+Hand`). The witness for the + /// origin gate: a tapped, You-controlled, unconditional, non-attacking + /// battlefield entry — confined on every axis the arm reads EXCEPT that the + /// arriving card comes from a graveyard, where it is a real object whose + /// rules content the fold has never classified. + const HELPING_HAND: Card = Card { + name: "Helping Hand", + oracle: "Return target creature card with mana value 3 or less from your \ + graveyard to the battlefield tapped.", + }; + const EVOLVING_WILDS: Card = Card { + name: "Evolving Wilds", + oracle: "{T}, Sacrifice this land: Search your library for a basic land \ + card, put it onto the battlefield tapped, then shuffle.", + }; + const RAMPANT_GROWTH: Card = Card { + name: "Rampant Growth", + oracle: "Search your library for a basic land card, put that card onto the battlefield \ + tapped, then shuffle.", + }; + const DEATHRITE_SHAMAN: Card = Card { + name: "Deathrite Shaman", + oracle: "{T}: Exile target land card from a graveyard. Add one mana of \ + any color.\n{B}, {T}: Exile target instant or sorcery card \ + from a graveyard. Each opponent loses 2 life.\n{G}, {T}: \ + Exile target creature card from a graveyard. You gain 2 life.", + }; + const SOUL_GUIDE_LANTERN: Card = Card { + name: "Soul-Guide Lantern", + oracle: "When this artifact enters, exile target card from a \ + graveyard.\n{T}, Sacrifice this artifact: Exile each \ + opponent's graveyard.\n{1}, {T}, Sacrifice this artifact: \ + Draw a card.", + }; + const RELIC_OF_PROGENITUS: Card = Card { + name: "Relic of Progenitus", + oracle: "{T}: Target player exiles a card from their \ + graveyard.\n{1}, Exile this artifact: Exile all graveyards. \ + Draw a card.", + }; + const SCAVENGING_OOZE: Card = Card { + name: "Scavenging Ooze", + oracle: "{G}: Exile target card from a graveyard. If it was a creature \ + card, put a +1/+1 counter on this creature and you gain 1 life.", + }; + const BRIBERY: Card = Card { + name: "Bribery", + oracle: "Search target opponent's library for a creature card and put that card onto the \ + battlefield under your control. Then that player shuffles.", + }; + const PRAETORS_GRASP: Card = Card { + name: "Praetor's Grasp", + oracle: + "Search target opponent's library for a card and exile it face down. Then that player \ + shuffles. You may play that card for as long as it remains exiled.", + }; + const HAUNTING_ECHOES: Card = Card { + name: "Haunting Echoes", + oracle: "Exile all cards from target player's graveyard other than basic land cards. For \ + each card exiled this way, search that player's library for all cards with the same name \ + as that card and exile them. Then that player shuffles.", + }; + const THOUGHTSEIZE: Card = Card { + name: "Thoughtseize", + oracle: "Target player reveals their hand. You choose a nonland card from \ + it. That player discards that card. You lose 2 life.", + }; + const DURESS: Card = Card { + name: "Duress", + oracle: "Target opponent reveals their hand. You choose a noncreature, nonland \ + card from it. That player discards that card.", + }; + const SURVEYORS_SCOPE: Card = Card { + name: "Surveyor's Scope", + oracle: + "{T}, Exile this artifact: Search your library for up to X basic land cards, where X \ + is the number of players who control at least two more lands than you. Put those \ + cards onto the battlefield, then shuffle.", + }; + const ASSASSINS_TROPHY: Card = Card { + name: "Assassin's Trophy", + oracle: "Destroy target permanent an opponent controls. Its controller \ + may search their library for a basic land card, put it onto \ + the battlefield, then shuffle.", + }; + const LIGHTNING_BOLT: Card = Card { + name: "Lightning Bolt", + oracle: "Lightning Bolt deals 3 damage to any target.", + }; + const WRATH_OF_GOD: Card = Card { + name: "Wrath of God", + oracle: "Destroy all creatures. They can't be regenerated.", + }; + const NATURALIZE: Card = Card { + name: "Naturalize", + oracle: "Destroy target artifact or enchantment.", + }; + const DIVINATION: Card = Card { + name: "Divination", + oracle: "Draw two cards.", + }; + const PATH_TO_EXILE: Card = Card { + name: "Path to Exile", + oracle: "Exile target creature. Its controller may search their library for a basic land \ + card, put that card onto the battlefield tapped, then shuffle.", + }; + /// Nature's Lore, verbatim (MTGJSON `.data["Nature's Lore"][0].text`). The + /// MINIMAL PAIR against `RAMPANT_GROWTH` above: same sentence shape, same + /// absent cost, same anaphoric `Library -> Battlefield / Any` node — and it + /// differs by the ONE printed word (`tapped`) the gate reads. + const NATURES_LORE: Card = Card { + name: "Nature's Lore", + oracle: "Search your library for a Forest card, put that card onto the battlefield, \ + then shuffle.", + }; + /// Crop Rotation, verbatim (MTGJSON, both lines). The reviewer's named + /// residual. MEASURED on the live parser: the additional-cost line is NOT + /// carried (`cost: None`, one ability), so its verdict rides the zone-change + /// node alone — which is exactly why it was allowlisted before this gate. + const CROP_ROTATION: Card = Card { + name: "Crop Rotation", + oracle: "As an additional cost to cast this spell, sacrifice a land.\n\ + Search your library for a land card, put that card onto the battlefield, \ + then shuffle.", + }; + /// Cultivate, verbatim (MTGJSON). The SECOND door onto the battlefield: its + /// search carries a `SearchDestinationSplit` and moves the found cards + /// ITSELF, with no `ChangeZone` sub-ability for the tap gate to read. + /// MEASURED over the corpus: 12 abilities carry a split at all, and every + /// battlefield-primary one prints "tapped" — so this fixture is the class, + /// not an example of it. + const CULTIVATE: Card = Card { + name: "Cultivate", + oracle: "Search your library for up to two basic land cards, reveal those cards, put one \ + onto the battlefield tapped and the other into your hand, then shuffle.", + }; + const SPREADING_SEAS: Card = Card { + name: "Spreading Seas", + oracle: "Enchant land\nWhen this Aura enters, draw a card.\nEnchanted land is an Island.", + }; + const DARK_RITUAL: Card = Card { + name: "Dark Ritual", + oracle: "Add {B}{B}{B}.", + }; + const LOTUS_PETAL: Card = Card { + name: "Lotus Petal", + oracle: "{T}, Sacrifice this artifact: Add one mana of any color.", + }; + + /// Verbatim from the pinned MTGJSON `AtomicCards.json` (`{3}{B}`, Instant), + /// not from memory. The two lines matter in opposite directions: the SECOND + /// is all this module can read, and the FIRST is the entire card. + const STUNNING_REVERSAL: Card = Card { + name: "Stunning Reversal", + oracle: "The next time you would lose the game this turn, instead draw seven cards \ + and your life total becomes 1.\nExile Stunning Reversal.", + }; + + /// V8 — the classifier is correct across the whole class, in BOTH + /// directions. Acceptance (a) must be confined; every acceptance-(b) + /// interaction, the graveyard-hate class the origin-keyed predecessor rule + /// wrongly confined, the foreign-library and foreign-hand analogues, and + /// the hostile pair must all be interference. + /// + /// Revert-probe: deleting any allowlisted arm flips its acceptance-(a) rows + /// to `MayInterfere`. That clause is TIGHTER than it used to be — there are + /// now three allowlisted arms and all three are exercised by the three + /// `confined` rows, whereas the `Effect::Mana` arm this table shipped with + /// had no acceptance-(a) row witnessing it at all. + /// + /// This table no longer witnesses the TRIVIALIZE mutant, and the sentence + /// that said it did has been removed rather than weakened. It claimed that + /// trivializing `filter_is_actor_owned` to `true` flips the + /// `Deathrite Shaman[0]` row to `OwnResourcesOnly`; MEASURED, that stopped + /// being true when `Effect::Mana` left the allowlist. `Deathrite Shaman[0]` + /// carries its "Add one mana of any color" clause as a `sub_ability`, which + /// now folds `MayInterfere` on its own, so the absorbing fold holds the row + /// no matter what the owner axis says. The owner axis keeps its full + /// discriminating power; only this table's claim to be its witness went + /// stale. Its witnesses are the two tests that assert on + /// `filter_is_actor_owned` DIRECTLY — + /// `deathrite_and_terramorphic_are_separated_only_by_the_owner_axis` and + /// `composite_filters_prove_ownership_by_set_logic`, both in this module. Do + /// NOT weaken any assertion here to restore the old sentence. + #[test] + fn window_reach_matches_the_measured_class_table() { + let confined: &[(&Card, usize)] = &[ + (&TERRAMORPHIC, 0), + (&EVOLVING_WILDS, 0), + (&RAMPANT_GROWTH, 0), + // Surveyor's Scope is deliberately NOT here — it is the fetch + // class's fail-closed member and gets its own row below, because + // its verdict rides its `Unimplemented` head and its + // non-allowlisted `Exile` cost rather than the classifier's + // hostile-detection logic. + ]; + let interfering: &[(&Card, usize)] = &[ + // acceptance (b) — real interaction must keep Shortening + (&LIGHTNING_BOLT, 0), + (&WRATH_OF_GOD, 0), + (&NATURALIZE, 0), + (&DIVINATION, 0), + (&PATH_TO_EXILE, 0), + // the B1 defect class: a graveyard is a per-player zone (CR 400.1) + // and none of these filters proves whose + (&DEATHRITE_SHAMAN, 0), + (&DEATHRITE_SHAMAN, 1), + (&SOUL_GUIDE_LANTERN, 0), + (&RELIC_OF_PROGENITUS, 1), + (&SCAVENGING_OOZE, 0), + // Library analogue — caught by `SearchLibrary.target_player` + (&BRIBERY, 0), + (&PRAETORS_GRASP, 0), + // Library analogue caught by the ABSORBING FOLD instead: its + // search node carries `target_player: None` and is confined on its + // own, so neither row above covers this path. The premise that + // makes it a fold witness is pinned separately by + // `a_foreign_library_search_is_confined_alone_then_absorbed`. + (&HAUNTING_ECHOES, 0), + // Hand analogue — these do not ride `ChangeZone` at all; they fall + // to the fail-closed default + (&THOUGHTSEIZE, 0), + (&DURESS, 0), + // hostile — a parsed removal spell that names an opponent's + // permanent explicitly + (&ASSASSINS_TROPHY, 0), + ]; + + for (card, index) in confined { + let name = card.name; + assert!( + !head_is_unparsed(card, *index), + "VACUITY GUARD: {name}[{index}] must PARSE — a confined verdict on an \ + Effect::Unimplemented head would be impossible, so this guard only ever \ + fires on a broken fixture" + ); + assert_eq!( + reach(card, *index), + WindowReach::OwnResourcesOnly, + "{name}[{index}] is a self-contained fetch: it must NOT buy a priority window" + ); + } + for (card, index) in interfering { + let name = card.name; + // The load-bearing anti-vacuity guard. Every row here must reach + // MayInterfere through the classifier's own logic on a PARSED + // effect. Without this, a row whose Oracle text merely failed to + // parse would sit in the table looking like hostile-detection + // coverage while actually exercising only the fail-closed arm — + // and the whole parsed-hostile branch could then be deleted with + // the suite still green. (MEASURED: `Lightning Bolt` did exactly + // this in an earlier revision, because it was parsed under a + // placeholder card name and its self-reference never resolved.) + assert!( + !head_is_unparsed(card, *index), + "VACUITY GUARD: {name}[{index}] rides the Effect::Unimplemented fail-closed \ + arm, so it is NOT a witness for parsed-hostile detection" + ); + assert_eq!( + reach(card, *index), + WindowReach::MayInterfere, + "{name}[{index}] can reach past its controller's own resources" + ); + } + } + + /// The `SearchLibrary` arm's safety warrant is the ABSORBING fold, not the + /// arm itself — and the two library rows in the table above do NOT witness + /// it: `Bribery[0]` and `Praetor's Grasp[0]` each carry + /// `target_player: Typed{controller: Opponent}`, so the arm catches them + /// directly and the fold is never asked to do anything. This test pins the + /// path they miss, on one of the five abilities the arm's own comment names + /// as foreign-library-with-`target_player: None`. + /// + /// MEASURED at this base: `Haunting Echoes[0]` searches "that player's + /// library" — FOREIGN — yet its `sub_ability` heads + /// `SearchLibrary { target_player: None }`, so that node ALONE classifies + /// `OwnResourcesOnly`. What makes the ability interference is its sibling + /// head, `ChangeZoneAll` (graveyard exile, not an allowlisted effect). + /// + /// The two assertions name the fail-open node and its absorber; the + /// composed verdict is the `HAUNTING_ECHOES` row in the interfering table + /// above, so no assertion here duplicates one there. + /// + /// Read the split correctly: MEASURED, that table row's verdict is carried + /// ENTIRELY by the `ChangeZoneAll` head — the ability has no cost, no + /// `player_scope` and no conservative-when-present field, so dropping the + /// fold's `sub_ability` leg leaves it `MayInterfere` unchanged. The reason is + /// specific to THIS fixture and does NOT generalize: in + /// `ability_window_reach` the head is the only term that is not optional, so + /// when the absorber IS the head, there is no leg the fold could lose that + /// would carry it away. Do NOT read that as "an absorbed verdict can never + /// flip" — when the absorbers sit on OPTIONAL legs, the verdict flips as soon + /// as those legs go. MEASURED at this base by fresh `parse_oracle_text` on + /// `Jace, Architect of Thought[2]`, another of the five abilities the + /// `SearchLibrary` arm's own comment names: its head is + /// `SearchLibrary { target_player: None }` — `OwnResourcesOnly` — and all + /// THREE of its absorbers are optional legs: `cost: Loyalty(-8)` (the + /// `cost_window_reach` wildcard), a `sub_ability` heading + /// `ChangeZone { Library -> Exile, target: Any }`, and `player_scope: All`. + /// Dropping the `sub_ability` and `cost` legs together still measures + /// `MayInterfere`, because `player_scope` alone still absorbs; dropping all + /// three measures `OwnResourcesOnly`. That card is NOT a fixture in this + /// suite, so nothing here pins it — it is cited to bound the claim above, not + /// as coverage. What remains lockable on Haunting Echoes is therefore the + /// premise, and the first assertion is what locks it. MEASURED: closing the + /// `SearchLibrary` arm (`WindowReach::of(target_player.is_none())` to a bare + /// `MayInterfere`) flips that assertion. It cannot flip `Bribery[0]` or + /// `Praetor's Grasp[0]` — DERIVED, not measured: closing the arm can only + /// move a verdict toward `MayInterfere`, and both are already there. + #[test] + fn a_foreign_library_search_is_confined_alone_then_absorbed() { + let echoes = ability(&HAUNTING_ECHOES, 0); + let search = echoes + .sub_ability + .as_ref() + .expect("PREMISE: Haunting Echoes[0] carries the library search as its sub_ability"); + assert_eq!( + effect_window_reach(&search.effect), + WindowReach::OwnResourcesOnly, + "PREMISE: the foreign-library search must still look CONFINED on its own — that is \ + the fail-open shape the fold exists to absorb. If this flips, the parser now carries \ + the foreign `target_player` and this row has silently become a second Bribery" + ); + assert_eq!( + effect_window_reach(&echoes.effect), + WindowReach::MayInterfere, + "the absorber: the sibling graveyard-exile head is what the fold ORs in" + ); + } + + /// The fetch class's ONE fail-open candidate, pinned with its mechanism + /// visible instead of hidden among the parsed rows. + /// + /// Surveyor's Scope is shaped like acceptance (a) — it searches the actor's + /// own library for the actor's own basics and shuffles the actor's own + /// library — but at this base the parser does not carry its whole sentence + /// ("where X is the number of players who control at least two more lands + /// than you"), so `abilities[0]` heads an `Effect::Unimplemented`. + /// + /// The verdict is JOINTLY determined, and the two assertions below are not + /// equally load-bearing. MEASURED at this base: the head reaches + /// `effect_window_reach`'s fail-closed `_` arm, AND the cost is + /// `Composite[Tap, Exile{filter: SelfRef}]` — `AbilityCost::Exile` is not + /// allowlisted, so `cost_window_reach` returns `MayInterfere` on its own. + /// Therefore: + /// + /// * the head assertion is the one that carries weight. If it ever flips + /// (the parser learns the sentence), this row fails LOUDLY rather than + /// silently changing which arm it exercises — the failure is the signal + /// to re-verify the verdict on the parsed AST and, if it is then + /// confined, move it into the confined table above. Do NOT delete it as + /// "redundant with the verdict": that leaves a vacuous row; + /// * the verdict assertion is DOMINATED by the cost leg — it would still + /// hold if the head parsed to a fully confined fetch, so it is NOT + /// evidence that the `_` effect arm fired. It is kept because it is the + /// class-level statement "the fetch class has no fail-open member". + /// + /// Kept OUT of the two tables deliberately: an `Unimplemented` row placed + /// among the interfering rows would look like hostile-detection coverage + /// while exercising only the fail-closed arm, which is the exact vacuity + /// the tables' guards exist to forbid. + #[test] + fn surveyors_scope_is_the_fetch_classs_fail_closed_member() { + assert!( + head_is_unparsed(&SURVEYORS_SCOPE, 0), + "PREMISE: this row exists because the head is UNPARSED at this base. If the parser \ + has learned the sentence, re-measure the parsed AST and reclassify the row \ + deliberately — do not delete this assertion to make the suite green" + ); + assert_eq!( + reach(&SURVEYORS_SCOPE, 0), + WindowReach::MayInterfere, + "the fetch class has no fail-open member: an ability the parser cannot carry must \ + never be proven confined" + ); + } + + /// V1c's premise, at AST granularity: the ONLY thing separating + /// `Deathrite Shaman[0]` from `Terramorphic Expanse[0]` is + /// `filter_is_actor_owned`. Trivializing it merges them — which is exactly + /// the defect the integration row pins on a real board. + #[test] + fn deathrite_and_terramorphic_are_separated_only_by_the_owner_axis() { + let drs = ability(&DEATHRITE_SHAMAN, 0); + let Effect::ChangeZone { target, origin, .. } = drs.effect.as_ref() else { + panic!( + "Deathrite Shaman[0] must head a ChangeZone, got {:?}", + drs.effect + ); + }; + assert_eq!( + *origin, + Some(Zone::Graveyard), + "the graveyard origin is what the refuted origin-keyed rule keyed on" + ); + assert!( + !filter_is_actor_owned(target), + "a bare graveyard-card filter names no owner (CR 400.1), so ownership is UNPROVEN — \ + this is the whole of the B1 fix" + ); + + let terramorphic = ability(&TERRAMORPHIC, 0); + let Some(AbilityCost::Composite { costs }) = terramorphic.cost.as_ref() else { + panic!("Terramorphic Expanse[0] must carry a composite cost"); + }; + assert!( + costs.iter().any( + |c| matches!(c, AbilityCost::Sacrifice(s) if filter_is_actor_owned(&s.target)) + ), + "Terramorphic sacrifices ITSELF — proven actor-owned, which is why the fix is \ + surgical rather than a blanket flip to MayInterfere" + ); + } + + /// V8c — the row that discharges B2. An unrecognized nesting container is + /// interference regardless of what it nests: every branch below is + /// individually confined, and the container still folds to `MayInterfere`. + /// + /// Revert-probe: changing `effect_window_reach`'s `_` arm to + /// `OwnResourcesOnly` flips this assertion. + #[test] + fn an_unrecognized_container_with_confined_branches_is_still_interference() { + let confined_branch = ability(&RAMPANT_GROWTH, 0); + assert_eq!( + ability_window_reach(&confined_branch), + WindowReach::OwnResourcesOnly, + "reach-guard: the branch really is confined, so the container's verdict below is \ + attributable to the container and not to its contents" + ); + + let container = Effect::ChooseOneOf { + chooser: PlayerFilter::Controller, + branches: vec![confined_branch.clone(), confined_branch], + }; + assert_eq!( + effect_window_reach(&container), + WindowReach::MayInterfere, + "an unallowlisted container is interference regardless of what it nests" + ); + + assert_eq!( + effect_window_reach(&Effect::unimplemented("test", "unparsed fragment")), + WindowReach::MayInterfere, + "an unparsed effect is the Surveyor's Scope path — never confined" + ); + } + + /// An object is not the same thing as its ability list, and proving the + /// ability list confined proves nothing about the object. + /// + /// `game::printed_cards` splits one card face across four collections. This + /// module can classify exactly one of them. Before the gate in + /// `object_window_reach`, a card whose ability list was the confined fraction + /// and whose real content sat in another collection read `OwnResourcesOnly`. + /// + /// The witness is real, not constructed: `Stunning Reversal` parses to one + /// ability — `Exile ~`, i.e. `ChangeZone { destination: Exile, target: SelfRef + /// }`, actor-owned and off the battlefield, so confined on every conjunct this + /// module reads — plus one `GameLoss` replacement carrying the whole card. A + /// seat holding it would have Accepted the shortcut the card exists to + /// survive, which is the direction §2 calls the one that loses games. + /// + /// Discrimination is measured, not asserted, and by construction rather than + /// by a second fixture: the two objects below differ in exactly one field. + /// The CONTROL clears `replacement_definitions` and nothing else, and it must + /// return `OwnResourcesOnly` — so the guarded verdict cannot be a constant, + /// and it is attributable to that field alone. + /// + /// Revert-probe: delete the `carries_unreadable_rules_content` call from + /// `object_window_reach` and this row's first assertion reds while the control + /// stays green. Cutting a single disjunct out of that function instead reds only + /// the row for that disjunct, which is how each one is shown to carry its own + /// weight rather than riding the first. + #[test] + fn an_object_whose_rules_content_this_module_cannot_read_is_never_confined() { + let parsed = parse_oracle_text( + STUNNING_REVERSAL.oracle, + STUNNING_REVERSAL.name, + &[], + &[], + &[], + ); + assert_eq!( + parsed.abilities.len(), + 1, + "PREMISE: the card projects exactly one ability; got {:?}", + parsed.abilities + ); + assert_eq!( + parsed.replacements.len(), + 1, + "PREMISE: and exactly one replacement — the half this module cannot read; got {:?}", + parsed.replacements + ); + assert_eq!( + ability_window_reach(&parsed.abilities[0]), + WindowReach::OwnResourcesOnly, + "PREMISE: the ability half really is confined on its own, so the verdict below is \ + produced by the GATE and not by the ability list" + ); + + // `game::zones::create_object` is the shared primitive for this: it allocates the id, + // builds the object AND registers it in its zone. Hand-rolling the insert here would + // duplicate it and, worse, would leave the object absent from the hand's own id list. + let mut state = GameState::default(); + let id = create_object( + &mut state, + crate::types::identifiers::CardId(1), + crate::types::player::PlayerId(0), + STUNNING_REVERSAL.name.to_string(), + Zone::Hand, + ); + let object = state.objects.get_mut(&id).expect("just created"); + object.abilities = std::sync::Arc::new(parsed.abilities.clone()); + object.replacement_definitions = parsed.replacements.clone().into(); + + assert_eq!( + object_window_reach(&state, id), + WindowReach::MayInterfere, + "a GameLoss replacement this module cannot classify is not proof of confinement" + ); + assert_eq!( + indexed_ability_window_reach(&state, id, 0), + WindowReach::MayInterfere, + "the activation path takes the same gate: a trigger or replacement on the SAME object \ + can fire off the activation (CR 603.2)" + ); + + // CONTROL — one field cleared IN PLACE, nothing else touched. + state + .objects + .get_mut(&id) + .expect("still present") + .replacement_definitions = Vec::new().into(); + assert_eq!( + object_window_reach(&state, id), + WindowReach::OwnResourcesOnly, + "REACH-GUARD: with the unreadable collection gone the SAME object is confined, so the \ + two verdicts above are attributable to that one field and are not a constant" + ); + + // The TRIGGER disjunct, exercised through the real materialization path rather than + // asserted from reading it. The three collections are not wired alike: `printed_cards` + // assigns `replacement_definitions` and `static_definitions` directly, but routes triggers + // through `base_trigger_definitions` + `materialize_base_trigger_definitions()`. A gate that + // reads the materialized field while the pipeline only ever fills the printed one would be + // silently blind to every trigger, so the wiring is the thing under test here, not the + // `is_empty()` call. + let triggers = parse_oracle_text( + SOUL_GUIDE_LANTERN.oracle, + SOUL_GUIDE_LANTERN.name, + &[], + &[], + &[], + ) + .triggers; + assert_eq!( + triggers.len(), + 1, + "PREMISE: Soul-Guide Lantern's ETB is a real parsed trigger; got {triggers:?}" + ); + let object = state.objects.get_mut(&id).expect("still present"); + object.base_trigger_definitions = std::sync::Arc::new(triggers); + object.materialize_base_trigger_definitions(); + assert!( + !object.trigger_definitions.is_empty(), + "PREMISE: materializing the printed triggers must populate the field the gate reads — \ + if this ever fails the gate is blind to triggers no matter what it returns" + ); + assert_eq!( + object_window_reach(&state, id), + WindowReach::MayInterfere, + "a trigger this module cannot classify is not proof of confinement either" + ); + + // The STATIC disjunct — the third of three, and the one a review round + // correctly noted had neither a test nor a probe. 7 of the 19 printed cards + // this gate flips at today's pool are static-only carriers, so an untested + // disjunct here would leave better than a THIRD of the gate's own measured + // effect unexercised. + let object = state.objects.get_mut(&id).expect("still present"); + object.base_trigger_definitions = std::sync::Arc::new(Vec::new()); + object.materialize_base_trigger_definitions(); + assert!( + object.trigger_definitions.is_empty(), + "PREMISE: triggers cleared, so the next verdict cannot be the trigger clause again" + ); + assert_eq!( + object_window_reach(&state, id), + WindowReach::OwnResourcesOnly, + "CONTROL: with every unreadable collection empty the SAME object is confined again" + ); + let parsed_statics = + parse_oracle_text(SPREADING_SEAS.oracle, SPREADING_SEAS.name, &[], &[], &[]).statics; + assert!( + !parsed_statics.is_empty(), + "PREMISE: Spreading Seas carries a real parsed static ability; got {parsed_statics:?}" + ); + state + .objects + .get_mut(&id) + .expect("still present") + .static_definitions = parsed_statics.into(); + assert_eq!( + object_window_reach(&state, id), + WindowReach::MayInterfere, + "nor is a static ability this module cannot classify proof of confinement" + ); + + // The KEYWORD disjunct. This is the one a review round caught: the gate used to + // read three collections while `printed_cards` writes far more, and printed + // Cascade lives in `obj.keywords` and never reaches `trigger_definitions` — so a + // Cascade spell whose printed abilities all read confined was provably + // `OwnResourcesOnly` while resolving it casts a free spell of arbitrary reach. + let object = state.objects.get_mut(&id).expect("still present"); + object.static_definitions = Vec::new().into(); + assert_eq!( + object_window_reach(&state, id), + WindowReach::OwnResourcesOnly, + "CONTROL: statics cleared, so the keyword verdict below is the keyword's alone" + ); + state + .objects + .get_mut(&id) + .expect("still present") + .keywords + .push(Keyword::Cascade); + assert_eq!( + object_window_reach(&state, id), + WindowReach::MayInterfere, + "a keyword is rules text this fold never reads; Cascade resolves a free spell of \ + arbitrary reach inside the window the seat would have declined to keep" + ); + assert_eq!( + indexed_ability_window_reach(&state, id, 0), + WindowReach::MayInterfere, + "and the activation path takes the same widened gate, not the old three-field one" + ); + + // A CASTING-TIME MODIFIER, to show the widening is not keyword-specific. + let object = state.objects.get_mut(&id).expect("still present"); + object.keywords.clear(); + assert_eq!( + object_window_reach(&state, id), + WindowReach::OwnResourcesOnly, + "CONTROL: keyword cleared and the SAME object is confined again, so neither verdict \ + above is a constant" + ); + state + .objects + .get_mut(&id) + .expect("still present") + .spellbook + .push("Lightning Bolt".to_string()); + assert_eq!( + object_window_reach(&state, id), + WindowReach::MayInterfere, + "a spellbook names cards this object can reach for, and it is not an \ + AbilityDefinition either — the gate is over unreadable CONTENT, not over one field" + ); + + // The four fields the STALENESS GUARD surfaced. They are inert at today's pool + // (0 carriers among the cards that survive the gate), which is exactly why they + // need a witness here: an inert disjunct with no test is indistinguishable from a + // disjunct that does nothing, and the next person to tidy this function would have + // no way to tell. Each is set on the SAME object with every other unreadable field + // cleared first, so each verdict is attributable to that one field. + // Named rather than written inline: `clippy::type_complexity` rejects the tuple-of-fn-ptr + // array form, and the alias is the lint's own suggested remedy. + type FieldSetter = fn(&mut GameObject); + let setters: [(&str, FieldSetter); 4] = [ + ("case_state", |o| { + o.case_state = Some(crate::game::game_object::CaseState { + is_solved: false, + solve_condition: crate::types::ability::SolveCondition::Text { + description: "probe".to_string(), + }, + }) + }), + ("class_level", |o| o.class_level = Some(1)), + ("intensity", |o| o.intensity = 1), + ("attraction_lights", |o| o.attraction_lights = vec![1]), + ]; + for (field, set) in setters { + let object = state.objects.get_mut(&id).expect("still present"); + object.spellbook.clear(); + object.case_state = None; + object.class_level = None; + object.intensity = 0; + object.attraction_lights.clear(); + assert_eq!( + object_window_reach(&state, id), + WindowReach::OwnResourcesOnly, + "CONTROL before {field}: with every unreadable field cleared the SAME object \ + is confined again, so the verdict below is attributable to {field} alone" + ); + set(state.objects.get_mut(&id).expect("still present")); + assert_eq!( + object_window_reach(&state, id), + WindowReach::MayInterfere, + "{field} is rules content this fold cannot read, so it is not proof of confinement" + ); + } + } + + /// STALENESS GUARD. Every printed rules field is either folded or gated. + /// + /// The defect this exists to prevent has now happened twice on this one gate: it + /// shipped reading three collections while `printed_cards` wrote eleven fields, and a + /// review round found `keywords` (printed Cascade) that way. Writing THIS test then + /// found four more — `case_state`, `class_level`, `intensity`, `attraction_lights` — + /// which no amount of re-reading the gate by hand had surfaced. An enumerated list is + /// only ever correct on the day it is written; a `..`-free destructure is correct + /// until the compiler says otherwise. + /// + /// **Why `CardFace` and not `GameObject`.** `GameObject` has 149 fields, most of them + /// runtime state (zone, damage, counters, attachments) with no bearing on what a card + /// can do. Destructuring it here would be a churn magnet that every unrelated field + /// addition breaks, and it would be blanket-`..`'d back within a round. `CardFace` has + /// 33 and is the actual source `printed_cards` reads to populate object rules content, + /// so it guards the defect class that occurred rather than the largest surface + /// available. + /// + /// **Honest scope limit:** this guards fields that reach an object THROUGH + /// `printed_cards`. A `GameObject` field written by some other path is not covered — + /// `game::stickers` is the live example, and it writes only the three definition + /// collections, which are gated. + #[test] + fn every_printed_rules_field_is_either_folded_or_gated() { + // `..`-free ON PURPOSE. A new `CardFace` field is a COMPILE ERROR here until + // someone sorts it into one of the three buckets. The sort IS the assertion: + // there is nothing to run, and that is the point — this fires at build time, + // when it can still be cheap, rather than at review time. + let CardFace { + // ---- FOLDED: this module classifies these itself. + abilities: _, + + // ---- GATED: unreadable rules content. `carries_unreadable_rules_content` + // returns true on the corresponding `GameObject` field. + keywords: _, + triggers: _, + static_abilities: _, + replacements: _, + cleave_variant: _, + modal: _, + additional_cost: _, + casting_restrictions: _, + casting_options: _, + strive_cost: _, + solve_condition: _, // lands as `obj.case_state` + attraction_lights: _, + // GATED as `obj.parse_warnings`. It was in the NOT-RULES-BEARING bucket + // below, reasoned "parser diagnostics, never consulted at runtime". That + // reason was TRUE about the field and WRONG about the conclusion: a + // diagnostic is not rules text, it is the parser's report that some printed + // rules text is MISSING from `abilities`, which is the one thing that makes + // an otherwise-confined fold unsound (module doc §2's named residual). + parse_warnings: _, + // `metadata` is MIXED, so it is DESTRUCTURED rather than bound whole. Binding + // it was a hole in the guard that the guard's own comment declared and did not + // close: `spellbook` is exactly a rules-bearing field that arrived inside this + // struct, so "mixed" is the reason to open it, not the reason to wave it past. + metadata: + CardMetadata { + // GATED as `obj.spellbook`. + spellbook: _, + // Parser-provenance counters: how many abilities came from Forge + // scripts rather than the Oracle parser. The abilities themselves are + // in the collections above; these are counts of them. + forge_abilities: _, + forge_triggers: _, + forge_statics: _, + forge_replacements: _, + // Names tokens this card can make; MAKING one runs through + // `Effect::Token` in `abilities`, which this fold already reads. + related_token_ids: _, + // Image/catalog identifiers. + source_printing_ids: _, + // CR 202.3d + CR 709.4b: a split card's combined off-stack mana value, + // read by deck-construction checks. A cost, not what resolving does. + off_stack_mana_value_override: _, + }, + + // ---- NOT RULES-BEARING. One reason each, because an unjustified entry here + // is exactly where the next lazy re-bucket lands. + name: _, // identity, not behaviour + mana_cost: _, // cost to cast, not what resolving does + // NOT inert, and the earlier reason here ("types/subtypes gate other rules, + // carry none alone") was measurably WRONG. `printed_cards` derives four + // object-level rules fields from `subtypes` ALONE, with no CardFace field + // behind them: `Class` => `class_level` (:206), `Case` => `case_state` (:238), + // `Room` => `room_unlocks` (:246), `Attraction` => `attraction_lights` (:250). + // The face's own field is therefore safe to skip only BECAUSE all four + // derived fields are gated — and `room_unlocks` was not, until the review + // round that read this line. A wrong reason in this bucket is worse than no + // reason: it certifies that no gate is needed. + card_type: _, + power: _, // combat statistic + toughness: _, // combat statistic + loyalty: _, // resource counter, abilities that spend it are in `abilities` + defense: _, // battle counter, same argument as loyalty + oracle_text: _, // the SOURCE the parser reads; the parse is the rules content + non_ability_text: _, // by definition not an ability + flavor_name: _, // cosmetic + color_override: _, // colour is a characteristic, not an action + color_identity: _, // deck construction (CR 903.4), not in-game behaviour + scryfall_oracle_id: _, // external identifier + brawl_commander: _, // format eligibility + is_commander: _, // format eligibility + is_oathbreaker: _, // format eligibility + deck_copy_limit: _, // deck construction + rarities: _, // printing metadata + } = CardFace::default(); + } + + /// Every GATED bucket entry above must actually REACH the gate, through the pipeline + /// that really populates it. + /// + /// This exists because a review round measured that seven of the gate's disjuncts had + /// no test and no revert-probe — `modal`, `additional_cost`, `strive_cost`, + /// `cleave_variant`, `casting_restrictions`, `casting_options`, `back_face` — each + /// occurring exactly once in the whole file, in the gate itself. Deleting any of them + /// left the entire suite green. The sting: `modal` and `additional_cost` are 2 of the + /// 10 cards the widening actually flips, so the disjuncts with no coverage were the + /// LIVE ones while the four that had witnesses were the inert ones. The guard above is + /// a compile-time claim that each field is classified; this is the runtime claim that + /// the classification is TRUE. + /// + /// It also turns the guard's `CardFace` → `GameObject` mapping from a comment into an + /// assertion. Each case mutates a **`CardFace`** and runs the real + /// `apply_card_face_to_object`, so a rename or a dropped copy in `printed_cards` reds + /// here instead of silently un-gating the field — which is the failure the `spellbook` + /// and `keywords` holes both took to get in. + #[test] + fn every_gated_card_face_field_reaches_the_gate_through_printed_cards() { + use crate::game::printed_cards::apply_card_face_to_object; + + // `clippy::type_complexity` rejects the inline tuple-of-fn-ptr array; the alias is + // the lint's own suggested remedy. + type FaceSetter = fn(&mut CardFace); + let cases: [(&str, FaceSetter); 13] = [ + // --- carried on the face itself. + ("keywords", |f| f.keywords = vec![Keyword::Cascade]), + ("cleave_variant", |f| { + f.cleave_variant = Some(crate::types::card::CleaveVariant::default()) + }), + ("modal", |f| { + f.modal = Some(crate::types::ability::ModalChoice::default()) + }), + ("additional_cost", |f| { + f.additional_cost = Some(crate::types::ability::AdditionalCost::Kicker { + costs: vec![], + repeatability: crate::types::ability::AdditionalCostRepeatability::Once, + }) + }), + ("casting_restrictions", |f| { + f.casting_restrictions = vec![crate::types::ability::CastingRestriction::AsSorcery] + }), + ("casting_options", |f| { + f.casting_options = vec![crate::types::ability::SpellCastingOption::free_cast()] + }), + ("strive_cost", |f| { + f.strive_cost = Some(crate::types::mana::ManaCost::default()) + }), + ("metadata.spellbook", |f| { + f.metadata.spellbook = vec!["Lightning Bolt".to_string()] + }), + // The parser's own report that some printed clause is NOT in `abilities`. + // `IgnoredRemainder` is the cheapest variant to build and the gate is a + // presence check, so the variant is not load-bearing — that the field + // SURVIVES `apply_card_face_to_object` is. + ("parse_warnings", |f| { + f.parse_warnings = vec![ + crate::parser::oracle_ir::diagnostic::OracleDiagnostic::IgnoredRemainder { + text: "and you gain 2 life".to_string(), + parser: "probe".to_string(), + line_index: 0, + }, + ] + }), + // --- DERIVED FROM `card_type.subtypes` ALONE, with no face field behind them. + // These four are why the guard's `card_type` bucket reason had to be rewritten: + // the face's own `card_type` is safe to skip only because all four landing + // fields are gated, and `room_unlocks` was not until this round. + ("card_type: Class → class_level", |f| { + f.card_type.subtypes = vec!["Class".to_string()] + }), + ("card_type: Case → case_state", |f| { + f.card_type.subtypes = vec!["Case".to_string()]; + f.solve_condition = Some(crate::types::ability::SolveCondition::Text { + description: "probe".to_string(), + }); + }), + ("card_type: Room → room_unlocks", |f| { + f.card_type.subtypes = vec!["Room".to_string()] + }), + ("card_type: Attraction → attraction_lights", |f| { + f.card_type.subtypes = vec!["Attraction".to_string()] + }), + ]; + + for (field, set) in cases { + // CONTROL and WITNESS are SEPARATE freshly-created objects rather than one + // object applied twice. `printed_cards` seeds `class_level` only when + // `base_characteristics_initialized` is still false (CR 716.2b), so re-applying + // to the same object would silently skip the very field the Class case tests — + // and the case would pass for the wrong reason on the three cases beside it. + let mut face = CardFace { + name: "Probe".to_string(), + ..CardFace::default() + }; + let mut state = GameState::default(); + + let control = create_object( + &mut state, + crate::types::identifiers::CardId(1), + crate::types::player::PlayerId(0), + face.name.clone(), + Zone::Hand, + ); + apply_card_face_to_object( + state.objects.get_mut(&control).expect("just created"), + &face, + ); + assert!( + !carries_unreadable_rules_content( + state.objects.get(&control).expect("just created") + ), + "CONTROL for {field}: a default face lands no unreadable content, so the \ + verdict below is produced by {field} and not by the face it rides on" + ); + + set(&mut face); + let witness = create_object( + &mut state, + crate::types::identifiers::CardId(2), + crate::types::player::PlayerId(0), + face.name.clone(), + Zone::Hand, + ); + apply_card_face_to_object( + state.objects.get_mut(&witness).expect("just created"), + &face, + ); + assert!( + carries_unreadable_rules_content( + state.objects.get(&witness).expect("just created") + ), + "CardFace {field} is rules content this fold cannot read, so `printed_cards` \ + must land it somewhere the gate looks — either the gate lost a disjunct or \ + the copy into `GameObject` was renamed out from under it" + ); + } + + // `back_face` is the one gated field with no `apply_card_face_to_object` route: + // `printed_cards::apply_card_face_to_back_face` fills a `BackFaceData` on the + // transform path instead. Asserted directly, and reusing `game::specialize`'s + // existing empty constructor rather than hand-rolling a 22-field literal that would + // go stale the moment `BackFaceData` gains a field. + let mut state = GameState::default(); + let id = create_object( + &mut state, + crate::types::identifiers::CardId(3), + crate::types::player::PlayerId(0), + "Probe".to_string(), + Zone::Hand, + ); + assert!( + !carries_unreadable_rules_content(state.objects.get(&id).expect("just created")), + "CONTROL for back_face: a bare object carries nothing the gate reads" + ); + state.objects.get_mut(&id).expect("just created").back_face = + Some(crate::game::specialize::empty_back_face()); + assert!( + carries_unreadable_rules_content(state.objects.get(&id).expect("just created")), + "a back face is an entire second face of rules content this fold never descends \ + into, so its presence is not proof of confinement" + ); + } + + /// The destination axis, on a REAL parsed node, one field mutated. + /// + /// `Stunning Reversal`'s ability is `ChangeZone { destination: Exile, target: + /// SelfRef }`, so `object_is_confined` holds by ownership alone and does not + /// depend on `destination` — which makes `destination` the only thing the + /// verdicts below can be measuring. (The anaphoric fetch node cannot serve + /// here: its `object_is_confined` disjunct itself requires + /// `destination == Battlefield`, so mutating the field would move two things + /// at once and the row would prove nothing.) + /// + /// `Hand` is gated for the same reason a `Battlefield`-untapped arrival is: a + /// card put into hand is a CASTABLE card. The spell that put it there + /// resolves, the active player receives priority (CR 117.3b) and priority then + /// passes in turn order (CR 117.3d), so the responding seat gets it back still + /// inside this window and can cast it. Graveyard, library and exile are not gated + /// because the actor cannot cast or activate from them without some further + /// permission — which would itself be an ability this fold already reads. + /// + /// Both directions are present, so neither verdict can be a constant. + #[test] + fn a_destination_is_confined_only_when_the_seat_cannot_act_on_what_lands_there() { + let parsed = parse_oracle_text( + STUNNING_REVERSAL.oracle, + STUNNING_REVERSAL.name, + &[], + &[], + &[], + ); + let node = parsed.abilities[0].effect.as_ref().clone(); + let Effect::ChangeZone { target, .. } = &node else { + panic!("PREMISE: the node must head a ChangeZone; got {node:?}"); + }; + assert!( + filter_is_actor_owned(target), + "PREMISE: the target is actor-owned, so `object_is_confined` holds independently of \ + `destination` and every verdict below is attributable to the destination alone" + ); + + // Every one of `Zone`'s seven variants (CR 400.1) appears here. The previous + // table listed five and the production match closed the gap with `_ => true`, + // so `Zone::Stack` was classified confined by a wildcard and no row noticed. + let table = [ + (Zone::Exile, WindowReach::OwnResourcesOnly), + (Zone::Graveyard, WindowReach::OwnResourcesOnly), + (Zone::Library, WindowReach::OwnResourcesOnly), + (Zone::Hand, WindowReach::MayInterfere), + // Already past casting (CR 405.1) and resolves inside the window + // (CR 608.1) — strictly stronger reach than the hand row above. + (Zone::Stack, WindowReach::MayInterfere), + // CR 903.8: a commander may be cast from here. + (Zone::Command, WindowReach::MayInterfere), + // `enter_tapped` is `Unspecified` on this node, so the battlefield + // arm is reach for the TAP reason, not the destination reason. + (Zone::Battlefield, WindowReach::MayInterfere), + ]; + + // COMPLETENESS GUARD, compile-time half: this match is exhaustive over `Zone`, + // so adding a variant breaks THIS test's build and forces a row decision here + // as well as in the production match. The runtime half below then catches a + // variant that compiles but was left out of `table`. Deliberately NOT a mirror + // of the production match — it asserts coverage only, never a verdict, so it + // cannot pass by agreeing with a wrong implementation. + for zone in [ + Zone::Library, + Zone::Hand, + Zone::Battlefield, + Zone::Graveyard, + Zone::Stack, + Zone::Exile, + Zone::Command, + ] { + match zone { + Zone::Library + | Zone::Hand + | Zone::Battlefield + | Zone::Graveyard + | Zone::Stack + | Zone::Exile + | Zone::Command => {} + } + assert!( + table.iter().any(|(z, _)| *z == zone), + "Zone::{zone:?} has no row in the destination table — every zone must be \ + classified explicitly, because the failure this test exists for is a \ + destination nobody wrote a row for" + ); + } + + for (zone, want) in table { + let mut mutated = node.clone(); + let Effect::ChangeZone { destination, .. } = &mut mutated else { + unreachable!("just matched above") + }; + *destination = zone; + assert_eq!( + effect_window_reach(&mutated), + want, + "destination {zone:?} must classify {want:?}" + ); + } + } + + /// V8's hostile edges on the action fold: nothing resolvable, nothing to + /// resolve, and an index past the end are all interference. + #[test] + fn unresolvable_action_subjects_are_interference() { + let state = GameState::default(); + let missing = ObjectId(9_999_999); + assert_eq!( + object_window_reach(&state, missing), + WindowReach::MayInterfere, + "an object that is not on the board cannot be proven confined" + ); + assert_eq!( + indexed_ability_window_reach(&state, missing, 0), + WindowReach::MayInterfere, + "neither can an ability index into an object that is not on the board" + ); + assert!( + any_action_may_interfere( + &state, + PlayerId(0), + &[GameAction::ActivateAbility { + source_id: missing, + ability_index: 7, + }] + ), + "an out-of-range ability index is interference, not a confined no-op" + ); + assert!( + !any_action_may_interfere(&state, PlayerId(0), &[GameAction::PassPriority]), + "reach-guard: the fold CAN return false, so the trues above are attributable" + ); + } + + /// The `Or`/`And` legs are set logic, not a coin flip, and an empty leg set + /// is never proven. + #[test] + fn composite_filters_prove_ownership_by_set_logic() { + let owned = TargetFilter::Controller; + let unowned = TargetFilter::Any; + + assert!( + !filter_is_actor_owned(&TargetFilter::Or { + filters: vec![owned.clone(), unowned.clone()], + }), + "an Or is proven only when EVERY leg is proven" + ); + assert!( + filter_is_actor_owned(&TargetFilter::Or { + filters: vec![owned.clone(), owned.clone()], + }), + "reach-guard: an all-proven Or IS proven, so the negative above is not vacuous" + ); + assert!( + filter_is_actor_owned(&TargetFilter::And { + filters: vec![owned, unowned], + }), + "an And narrows, so one proven leg suffices" + ); + assert!( + !filter_is_actor_owned(&TargetFilter::Or { filters: vec![] }), + "a degenerate empty Or must not be proven by a vacuous all()" + ); + } + + /// Mana is FUNGIBLE REACH (CR 106.1 / CR 106.4 / CR 601.2g), so neither a + /// cast ritual nor an actor-owned sacrifice-for-mana is confined. + /// + /// The Lotus Petal half is the load-bearing one, and its ATTRIBUTION is the + /// second assertion: the parser emits "Sacrifice this artifact" as a + /// `TargetFilter::SelfRef`, which `filter_is_actor_owned` returns true for, + /// so `cost_window_reach` returns `OwnResourcesOnly` and the ONLY thing that + /// can carry the verdict is the mana effect. + /// + /// What that predicate does and does NOT establish — CR 701.21a, quoted from + /// its FIRST sentence: "To sacrifice a permanent, its controller moves it + /// from the battlefield directly to its owner's graveyard. A player can't + /// sacrifice something that isn't a permanent, or something that's a + /// permanent they don't control." Sentence two bounds the actor to + /// permanents they CONTROL — that much is grounded. Sentence one is the half + /// that bounds the conclusion: the card goes to its OWNER's graveyard, so a + /// controlled-but-not-owned Petal (Control Magic) puts a card into another + /// player's graveyard while this leg still answers `OwnResourcesOnly`. + /// `SelfRef` therefore proves control, never ownership, and "confined" is + /// narrower than the predicate's name reads. + /// + /// Not repairable at this seam: `filter_is_actor_owned` is a pure AST + /// predicate and the AST carries no ownership. Nor does it move this row, + /// whose verdict the mana head decides on its own. It is named so the limit + /// is not later widened on the strength of a half-quoted rule — which is the + /// exact species of error (CR 106.4, above) this whole change repairs. + /// + /// A confined cost leg plus a verdict carried by the mana head ALONE is what + /// separates this row from `v9b`'s Ironworks, which reaches `MayInterfere` + /// through an UNPROVEN sacrifice filter and therefore never exercises this + /// arm. + /// + /// Revert-probe, EXECUTED: restoring + /// `Effect::Mana {..} => WindowReach::OwnResourcesOnly` as this match's first + /// arm reds this row at the Dark Ritual verdict, which is where the run + /// aborts. The Lotus Petal verdict flips under the same mutation and that is + /// MEASURED rather than derived — the integration row `v10b` reads exactly + /// this ability through `indexed_ability_window_reach` and flips to `Accept` + /// under the same mutation, which it can only do if this fold returned + /// `OwnResourcesOnly`. + #[test] + fn mana_production_is_reach_not_a_confined_own_resource() { + for (card, index) in [(&DARK_RITUAL, 0usize), (&LOTUS_PETAL, 0usize)] { + assert!( + !head_is_unparsed(card, index), + "VACUITY GUARD: {} must PARSE, or the row measures the fail-closed arm instead \ + of the mana effect's own semantics", + card.name + ); + } + + // PREMISE (card-data is gitignored; re-measured here on the live parser). + let ritual = ability(&DARK_RITUAL, 0); + assert!( + matches!(ritual.effect.as_ref(), Effect::Mana { .. }), + "PREMISE: Dark Ritual heads Effect::Mana; got {:?}", + ritual.effect + ); + assert!( + ritual.cost.is_none(), + "PREMISE: Dark Ritual carries no cost, so NOTHING but the head can carry the verdict" + ); + assert_eq!( + reach(&DARK_RITUAL, 0), + WindowReach::MayInterfere, + "a cast ritual funds an otherwise-unaffordable response" + ); + + let petal = ability(&LOTUS_PETAL, 0); + let cost = petal + .cost + .as_ref() + .expect("PREMISE: Lotus Petal carries an activation cost"); + assert_eq!( + cost_window_reach(cost), + WindowReach::OwnResourcesOnly, + "ATTRIBUTION: the SelfRef sacrifice is proven CONTROLLED (CR 701.21a bounds the actor \ + to permanents they control; the card still leaves for its OWNER's graveyard — see \ + the doc comment), so the cost leg reads confined and cannot be what produces the \ + verdict below" + ); + assert_eq!( + ability_window_reach(&petal), + WindowReach::MayInterfere, + "…so the verdict is carried by the mana effect ALONE — this is the row v9b cannot be" + ); + + // Reach-guard: the classifier can still return OwnResourcesOnly, so the + // two MayInterfere verdicts above are attributable and not a constant. + assert_eq!(reach(&RAMPANT_GROWTH, 0), WindowReach::OwnResourcesOnly); + } + + /// The tap-state gate (CR 110.5b), on the MINIMAL PAIR. `Rampant Growth` and + /// `Nature's Lore` differ by one printed word, and every other axis this + /// classifier reads is identical: no cost, a `SearchLibrary` head with + /// `target_player: None`, and one anaphoric + /// `ChangeZone { Library -> Battlefield, target: Any }` sub-ability. So the + /// verdicts below are attributable to `enter_tapped` and to nothing else — + /// the first two assertions MEASURE that premise rather than assert it. + /// + /// Why the untapped one is reach: the fetched land arrives ready (CR 302.6's + /// summoning-sickness bar is a creature rule), taps for mana inside the + /// window the Shorten hands back, and CR 601.2g runs that mana ability during + /// the cast it funds. `v10c` in `tests/integration/shorten_efficacy.rs` + /// measures that whole chain on the real 4p board; this row pins the AST + /// premise it rests on. + /// + /// Revert-probe: in `effect_window_reach`'s `ChangeZone` arm, replace + /// `object_is_confined && entry_is_confined` with `object_is_confined` alone + /// (the pre-fix expression) — BOTH untapped rows flip to `OwnResourcesOnly`. + #[test] + fn an_untapped_fetch_is_reach_and_a_tapped_one_stays_confined() { + for card in [&NATURES_LORE, &CROP_ROTATION] { + let name = card.name; + assert!( + !head_is_unparsed(card, 0), + "VACUITY GUARD: {name}[0] must PARSE, or the row measures the fail-closed arm \ + instead of the zone-change node's own semantics" + ); + let def = ability(card, 0); + assert!( + def.cost.is_none(), + "PREMISE: {name}[0] carries no cost, so no cost leg can carry the verdict; got \ + {:?}", + def.cost + ); + assert_eq!( + effect_window_reach(&def.effect), + WindowReach::OwnResourcesOnly, + "PREMISE: {name}[0]'s SearchLibrary head is confined ON ITS OWN, so the verdict \ + below is produced by the zone-change sub-ability and by nothing else" + ); + assert_eq!( + reach(card, 0), + WindowReach::MayInterfere, + "{name}[0] puts a land onto the battlefield UNTAPPED (CR 110.5b), which taps for \ + mana inside the window the Shorten hands back — the Effect::Mana case with one \ + extra step" + ); + } + + // The tapped half of the pair, and the reach-guard that keeps the two + // MayInterfere verdicts above from being a constant. + assert_eq!( + reach(&RAMPANT_GROWTH, 0), + WindowReach::OwnResourcesOnly, + "the gate is on the TAP STATE, not on the fetch shape: the same sentence with \ + 'tapped' printed in it stays confined" + ); + + // Fail-closed direction, on all THREE `EtbTapState` variants, measured on + // the REAL parsed node rather than a hand-built one. Only a provably + // `Tapped` entry is allowlisted; `Unspecified` (the AST said nothing) and + // `Untapped` are both reach — which is what makes a conditionally-untapped + // entry (a shock land's pay-life choice, a land-count gate) safe by + // default instead of a shape this predicate would have to model. + let mut node = ability(&NATURES_LORE, 0) + .sub_ability + .as_ref() + .expect("PREMISE: Nature's Lore[0] carries the zone change as its sub_ability") + .effect + .as_ref() + .clone(); + for (state, expected) in [ + (EtbTapState::Tapped, WindowReach::OwnResourcesOnly), + (EtbTapState::Unspecified, WindowReach::MayInterfere), + (EtbTapState::Untapped, WindowReach::MayInterfere), + ] { + let Effect::ChangeZone { enter_tapped, .. } = &mut node else { + panic!("PREMISE: the sub-ability must head a ChangeZone; got {node:?}"); + }; + *enter_tapped = state; + assert_eq!( + effect_window_reach(&node), + expected, + "fail-closed on the tap axis: {state:?} must classify {expected:?}" + ); + } + } + + /// **The origin gate** — a battlefield entry is confined only when the card + /// that arrives comes from a LIBRARY. + /// + /// The three riders in the row below ask what ARRIVES. This one asks what the + /// arriving CARD is, and it is the axis on which `OwnResourcesOnly` was + /// previously asserted over rules text nobody had classified: a graveyard, + /// hand or exile card is a real object in `state.objects`, and neither + /// `object_window_reach`'s `carries_unreadable_rules_content` gate (which + /// runs on the SOURCE) nor `board_observer_may_react` (CR 113.6 — an ETB does + /// not function in a graveyard) ever reads it. + /// + /// **Attribution: exactly one field varies.** Helping Hand's REAL parsed node + /// is measured `MayInterfere`, then the SAME node with `origin` rewritten to + /// `Library` and nothing else touched is measured `OwnResourcesOnly`. Every + /// other axis the arm reads — target filter, tap state, the three riders — is + /// held byte-identical across the pair, so the flip is the origin field's and + /// cannot be the fixture's. + /// + /// The `None` row is the stronger case of the same argument: an absent origin + /// does not even name the zone the card comes from. + #[test] + fn a_battlefield_entry_is_confined_only_from_a_library() { + assert!( + !head_is_unparsed(&HELPING_HAND, 0), + "VACUITY GUARD: Helping Hand[0] must PARSE, or this row measures the fail-closed arm \ + instead of the origin axis" + ); + let node = ability(&HELPING_HAND, 0).effect.as_ref().clone(); + let Effect::ChangeZone { + origin, + destination, + enter_tapped, + target, + .. + } = &node + else { + panic!("PREMISE: Helping Hand[0] must head a ChangeZone; got {node:?}"); + }; + assert_eq!( + (*origin, *destination, *enter_tapped), + ( + Some(Zone::Graveyard), + Zone::Battlefield, + EtbTapState::Tapped + ), + "PREMISE: the real card prints a TAPPED graveyard-to-battlefield return, which is what \ + makes the origin the only axis left to decide the verdict" + ); + assert!( + filter_is_actor_owned(target), + "PREMISE: the target is proven actor-controlled, so `object_is_confined` holds and the \ + verdict below is decided by `entry_is_confined` alone" + ); + + assert_eq!( + effect_window_reach(&node), + WindowReach::MayInterfere, + "a graveyard card entering the battlefield IS a readable object this fold never \ + classified — Accepting here hands back a window in which a Fleshbag-Marauder-class \ + ETB makes every player sacrifice" + ); + + for (label, rewritten) in [ + ( + "Library: the card is an unchosen member of a hidden zone (CR 400.2), so there is \ + nothing to read and nothing is skipped", + Some(Zone::Library), + ), + ("Hand: readable, and never classified", Some(Zone::Hand)), + ("Exile: readable, and never classified", Some(Zone::Exile)), + ( + "None: the seam cannot even name the zone the card comes from", + None, + ), + ] { + let mut mutated = node.clone(); + let Effect::ChangeZone { origin, .. } = &mut mutated else { + unreachable!("just destructured above"); + }; + *origin = rewritten; + let expected = if rewritten == Some(Zone::Library) { + WindowReach::OwnResourcesOnly + } else { + WindowReach::MayInterfere + }; + assert_eq!( + effect_window_reach(&mutated), + expected, + "ONE FIELD VARIES from the node asserted above — {label}" + ); + } + } + + /// PROVABLY tapped, not NOMINALLY tapped — the three riders that decide what + /// actually arrives, plus the split that reaches the battlefield without a + /// `ChangeZone` node at all. + /// + /// Every row mutates ONE field of a REAL parsed node and re-measures, so the + /// unmutated verdict is each row's own positive control: the base node is + /// asserted `OwnResourcesOnly` first, which is what makes each flip + /// attributable to the field and not to the fixture. + /// + /// The corpus is why these are fixtures rather than hypotheticals: MEASURED + /// over every card in the pinned MTGJSON projection, 12 abilities carry a + /// `SearchDestinationSplit`, and NO ability that classifies + /// `OwnResourcesOnly` carries `enters_under`, `enters_attacking` or + /// `enters_modified_if` today. So these guards change no card's verdict at + /// this base — they close the door before a parser improvement or a new card + /// walks through it, in the one direction (toward `MayInterfere`) that can + /// never produce a false Accept. + #[test] + fn a_battlefield_entry_must_be_provably_tapped_actor_controlled_and_not_attacking() { + // ── the three ChangeZone riders, on Terramorphic's real fetch node ── + let base_node = ability(&TERRAMORPHIC, 0) + .sub_ability + .as_ref() + .expect("PREMISE: Terramorphic Expanse[0] carries the zone change as its sub_ability") + .effect + .as_ref() + .clone(); + assert_eq!( + effect_window_reach(&base_node), + WindowReach::OwnResourcesOnly, + "POSITIVE CONTROL: the unmutated tapped fetch node IS confined, so every flip below is \ + attributable to the single field it mutates" + ); + + let mut attacking = base_node.clone(); + let mut foreign = base_node.clone(); + let mut conditional = base_node.clone(); + let Effect::ChangeZone { + enters_attacking, .. + } = &mut attacking + else { + panic!("PREMISE: the fetch node must head a ChangeZone"); + }; + *enters_attacking = true; + let Effect::ChangeZone { enters_under, .. } = &mut foreign else { + panic!("PREMISE: the fetch node must head a ChangeZone"); + }; + *enters_under = Some(ControllerRef::Opponent); + let Effect::ChangeZone { + enters_modified_if, .. + } = &mut conditional + else { + panic!("PREMISE: the fetch node must head a ChangeZone"); + }; + *enters_modified_if = Some(TargetFilter::Any); + + for (label, node) in [ + ( + "enters_attacking (CR 508.4): a tapped attacker is still an attacker", + &attacking, + ), + ( + "enters_under (CR 110.2a): the permanent lands on ANOTHER player's board", + &foreign, + ), + ( + "enters_modified_if (CR 614.12 + CR 614.12a): the tapped rider is CONDITIONAL, so \ + enter_tapped == Tapped is not proof of a tapped entry", + &conditional, + ), + ] { + assert_eq!( + effect_window_reach(node), + WindowReach::MayInterfere, + "{label}" + ); + } + + // ── the split door, on Cultivate's real search node ── + assert!( + !head_is_unparsed(&CULTIVATE, 0), + "VACUITY GUARD: Cultivate[0] must PARSE, or this half measures the fail-closed arm" + ); + let mut search = ability(&CULTIVATE, 0).effect.as_ref().clone(); + let Effect::SearchLibrary { split, .. } = &search else { + panic!("PREMISE: Cultivate[0] must head a SearchLibrary; got {search:?}"); + }; + let split = split.as_ref().expect( + "PREMISE: Cultivate[0] carries a SearchDestinationSplit — this is the shape \ + that reaches the battlefield with no ChangeZone node for the tap gate to read", + ); + assert_eq!( + split.primary_destination, + Zone::Battlefield, + "PREMISE: the split's PRIMARY destination is the battlefield" + ); + assert_eq!( + split.primary_enter_tapped, + EtbTapState::Tapped, + "PREMISE: and the real card prints 'tapped', which is the only reason it stays confined" + ); + assert_eq!( + split.rest_destination, + Zone::Hand, + "PREMISE: and the REST of the search goes to hand — the door this arm used to leave open" + ); + assert_eq!( + effect_window_reach(&search), + WindowReach::MayInterfere, + "the split arm takes the SAME landing-zone authority as the ChangeZone arm: a rest \ + destination of hand is a castable card inside the window, so Cultivate is NOT confined \ + however tapped its primary arrival is" + ); + + // From here the rest destination is moved OFF hand, which is what makes a + // confined split expressible at all: MEASURED on this candidate's own + // projection, all TWELVE `SearchDestinationSplit` carriers route something to + // hand (nine via `rest_destination`, three via `primary_destination`), so no + // real card can serve as the positive control for the tap axis. Single-field + // mutation off a real parsed node is the honest way to get one, and saying so + // is the point — an inert branch presented as covered is the error this row + // exists to avoid. + let Effect::SearchLibrary { + split: Some(split), .. + } = &mut search + else { + panic!("PREMISE: the mutated node must keep its split"); + }; + split.rest_destination = Zone::Graveyard; + assert_eq!( + effect_window_reach(&search), + WindowReach::OwnResourcesOnly, + "CONTROL: one field moved and nothing else, so the verdict above is attributable to \ + `rest_destination` alone and is not a constant" + ); + + for (state, expected) in [ + (EtbTapState::Tapped, WindowReach::OwnResourcesOnly), + (EtbTapState::Unspecified, WindowReach::MayInterfere), + (EtbTapState::Untapped, WindowReach::MayInterfere), + ] { + let Effect::SearchLibrary { + split: Some(split), .. + } = &mut search + else { + panic!("PREMISE: the mutated node must keep its split"); + }; + split.primary_enter_tapped = state; + assert_eq!( + effect_window_reach(&search), + expected, + "the split reaches the battlefield WITHOUT a ChangeZone node, so it takes the same \ + fail-closed tap gate: {state:?} must classify {expected:?}" + ); + } + + let Effect::SearchLibrary { + split: Some(split), .. + } = &mut search + else { + panic!("PREMISE: the mutated node must keep its split"); + }; + split.primary_enter_tapped = EtbTapState::Tapped; + split.rest_destination = Zone::Battlefield; + assert_eq!( + effect_window_reach(&search), + WindowReach::MayInterfere, + "`rest_destination` carries NO tap state of its own, so a battlefield rest can never be \ + proven tapped and is reach by construction" + ); + } + + // ======================================================================= + // PR #7101 — the predicates the integration rows exercise through the real + // board, asserted here at the level the board cannot reach (all three are + // private, and widening them to `pub` for a test would be the wrong trade). + // ======================================================================= + + use crate::types::ability::TriggerDefinition; + use crate::types::triggers::TriggerMode; + + fn trigger(mode: TriggerMode) -> TriggerDefinition { + TriggerDefinition::new(mode) + } + + /// Put one object carrying one trigger on the board and ask the scan. + fn scan_with( + owner: crate::types::player::PlayerId, + zone: Zone, + def: TriggerDefinition, + actor: crate::types::player::PlayerId, + ) -> bool { + let mut state = GameState::default(); + let id = create_object( + &mut state, + crate::types::identifiers::CardId(1), + owner, + "Observer".to_string(), + zone, + ); + state + .objects + .get_mut(&id) + .expect("just created") + .install_trigger_base_definitions(std::sync::Arc::new(vec![def])) + .expect("staging one printed trigger"); + board_observer_may_react(&state, actor) + } + + const ACTOR: crate::types::player::PlayerId = crate::types::player::PlayerId(0); + const OPPONENT: crate::types::player::PlayerId = crate::types::player::PlayerId(1); + + /// **T2.3 — the B4a NEGATIVE CONTROL, and the most load-bearing row here.** + /// + /// The carve-out and [`filter_is_actor_owned`] answer two DIFFERENT questions + /// on the identical input, and the whole [HIGH] fix depends on that gap. + /// `Typed { controller: Some(You) }` is Hedron Crab's `valid_card`; if the + /// carve-out had reused `filter_is_actor_owned` — the obvious reuse, and the + /// one this repo's building-block discipline actively invites — the crab + /// would have been carved out and the finding would have survived the fix. + /// + /// Both directions are asserted, so neither can be a constant: the helper + /// says `true` and the shipped carve-out says "not relieved" on ONE input. + #[test] + fn t2_3_the_carve_out_rejects_the_typed_you_shape_that_filter_is_actor_owned_accepts() { + let hedron_crab_shape = TargetFilter::Typed(crate::types::ability::TypedFilter { + controller: Some(ControllerRef::You), + ..Default::default() + }); + + assert!( + filter_is_actor_owned(&hedron_crab_shape), + "PREMISE: the helper really does accept this shape. If this ever goes false the \ + asymmetry below stops being a hazard and this row stops being a control" + ); + + let mut def = trigger(TriggerMode::ChangesZone); + def.valid_card = Some(hedron_crab_shape); + assert!( + scan_with(OPPONENT, Zone::Battlefield, def, ACTOR), + "THE [HIGH] FIX: an opponent-owned `Typed{{controller: You}}` observer must KEEP the \ + veto. Reusing `filter_is_actor_owned` as the carve-out predicate makes this pass \ + through as relieved — that is the exact defect, and this assertion is what forbids \ + the refactor that reintroduces it" + ); + + let mut self_ref = trigger(TriggerMode::ChangesZone); + self_ref.valid_card = Some(TargetFilter::SelfRef); + assert!( + !scan_with(OPPONENT, Zone::Battlefield, self_ref, ACTOR), + "…while the EXACT `SelfRef` shape is relieved. Without this half the row above would \ + pass under a carve-out that never fires at all" + ); + } + + /// **T2.5 — the relieved-mode table**, one row per family. + /// + /// The integration-level witness for this table is the flagship board itself: + /// Dina, Soul Steeper (`LifeGained`) and Bloodthirsty Conqueror (`LifeLost`) + /// are two of its three zone-gate survivors, and they are relieved by the Life + /// family alone. + /// + /// REVERT-PROBE (executed): delete the Life arm ⇒ those two survive the scan, + /// `board_observer_may_react` returns true for P2, and + /// `v1_live_path_fetchland_seat_accepts_on_the_real_4p_board` flips to + /// `Shorten`. + #[test] + fn t2_5_each_relieved_family_is_relieved_and_its_siblings_are_not() { + let relieved = [ + // CR 119.3 — life. + TriggerMode::LifeGained, + TriggerMode::LifeLost, + TriggerMode::LifeLostAll, + TriggerMode::LifeChanged, + TriggerMode::PayLife, + TriggerMode::PayCumulativeUpkeep, + TriggerMode::PayEcho, + // CR 120.1 — damage. + TriggerMode::DamageDone, + TriggerMode::DamageReceived, + TriggerMode::ExcessDamage, + TriggerMode::Fight, + // CR 508.1 / CR 509.1 — combat turn-based actions. + TriggerMode::Attacks, + TriggerMode::Blocks, + TriggerMode::AttackersDeclared, + TriggerMode::BlockersDeclared, + // CR 500.1 — turn structure. + TriggerMode::Phase, + TriggerMode::TurnBegin, + TriggerMode::NewGame, + // Card flow the allowlist cannot cause. + TriggerMode::Drawn, + TriggerMode::Discarded, + TriggerMode::TokenCreated, + ]; + for mode in relieved { + let def = trigger(mode.clone()); + assert!( + trigger_event_unreachable_by_confined_action(&def), + "{mode:?} must be relieved: no confined action can produce its trigger event" + ); + assert!( + !scan_with(OPPONENT, Zone::Battlefield, trigger(mode.clone()), ACTOR), + "{mode:?} must also be relieved END TO END, through the scan the caller runs" + ); + } + + // The other direction, on modes a confined action really does produce. + for mode in [ + TriggerMode::SpellCast, + TriggerMode::AbilityActivated, + TriggerMode::Taps, + TriggerMode::TapsForMana, + TriggerMode::ManaAdded, + TriggerMode::Shuffled, + TriggerMode::SearchedLibrary, + TriggerMode::PlayerPerformedAction, + TriggerMode::Sacrificed, + TriggerMode::Destroyed, + TriggerMode::Exiled, + TriggerMode::ChangesZone, + TriggerMode::BecomesTarget, + TriggerMode::CounterAdded, + TriggerMode::Revealed, + ] { + assert!( + !trigger_event_unreachable_by_confined_action(&trigger(mode.clone())), + "{mode:?} IS producible by a confined cast or activation, so it must keep its veto" + ); + } + } + + /// **T2.6 — an unclassifiable mode KEEPS its veto.** + /// + /// The fail-closed direction, and the one an earlier draft of this work had + /// backwards. `StateCondition` watches a game STATE rather than an event + /// (CR 603.2), so no event-stream argument can ever relieve it, and + /// `Unknown(_)` is an unclassified Forge mode string by construction. + /// + /// REVERT-PROBE (executed): change the predicate's `_ => false` arm to + /// `_ => true` ⇒ this row fails. + #[test] + fn t2_6_a_mode_the_predicate_cannot_classify_keeps_its_veto() { + for mode in [ + TriggerMode::StateCondition, + TriggerMode::Unknown("SomeFutureForgeMode".to_string()), + // The three MEASURED exclusions from families that read a GENERIC + // `GameEvent::ZoneChanged` an allowlisted `Effect::ChangeZone` emits. + // `match_milled` keys on `ZoneChanged { from: Library, to: Graveyard }` + // (CR 701.17a), which a confined actor-owned self-mill produces. + TriggerMode::Milled, + TriggerMode::MilledAll, + TriggerMode::EntersOrAttacks, + TriggerMode::EntersOrHauntedCreatureDies, + ] { + assert!( + !trigger_event_unreachable_by_confined_action(&trigger(mode.clone())), + "{mode:?} must NOT be relieved — either it is unclassifiable, or its matcher reads \ + a generic zone-change event the confined allowlist really does emit" + ); + } + } + + /// **T2.7 — a disjunctive zone-change trigger is not carved out.** + /// + /// Scrap Trawler's shape: "Whenever this creature dies OR another artifact you + /// control is put into a graveyard from the battlefield, …". When + /// `zone_change_clauses` is non-empty the matcher IGNORES the scalar + /// `valid_card` entirely (`types::ability::TriggerDefinition`), so a `SelfRef` + /// sitting in that field describes only the FIRST clause and says nothing + /// about the second. Carving out on it would relieve a trigger that fires on + /// other objects. + /// + /// Matched pair on the clause list alone. + #[test] + fn t2_7_a_disjunctive_zone_change_trigger_is_not_relieved_by_its_scalar_valid_card() { + let mut scalar = trigger(TriggerMode::ChangesZone); + scalar.valid_card = Some(TargetFilter::SelfRef); + assert!( + !scan_with(OPPONENT, Zone::Battlefield, scalar, ACTOR), + "control: with NO clauses the scalar `valid_card` is what the matcher reads, so the \ + carve-out applies" + ); + + let mut disjunctive = trigger(TriggerMode::ChangesZone); + disjunctive.valid_card = Some(TargetFilter::SelfRef); + disjunctive.zone_change_clauses = vec![crate::types::ability::ZoneChangeClause { + origin: crate::types::ability::OriginConstraint::Equals(Zone::Battlefield), + destination: Some(Zone::Graveyard), + destination_constraint: crate::types::ability::OriginConstraint::any_default(), + valid_card: None, + }]; + assert!( + scan_with(OPPONENT, Zone::Battlefield, disjunctive, ACTOR), + "witness: one clause added and nothing else. The engine now ignores `valid_card`, so \ + reading it would be reading a field that no longer decides anything" + ); + } + + /// **T2.10 — SHAPE PIN.** The relieved set is asserted against `TriggerMode`'s + /// own variant list, so a family that silently widens reds here. + /// + /// The list below is the COMPLETE set of modes this module relieves. A new + /// `TriggerMode` variant defaults to `_ => false` (not relieved) and does not + /// break this row — that is the fail-closed direction and it is correct. What + /// this catches is the dangerous edit: somebody adding a variant to a relieved + /// arm without re-deriving the soundness argument in that arm's comment. + #[test] + fn t2_10_the_relieved_mode_set_is_exactly_this_list() { + let expected: Vec = vec![ + TriggerMode::LifeGained, + TriggerMode::LifeLost, + TriggerMode::LifeLostAll, + TriggerMode::LifeChanged, + TriggerMode::PayLife, + TriggerMode::PayCumulativeUpkeep, + TriggerMode::PayEcho, + TriggerMode::DamageDone, + TriggerMode::DamageDoneOnce, + TriggerMode::DamageAll, + TriggerMode::DamageDealtOnce, + TriggerMode::DamageDoneOnceByController, + TriggerMode::DamageReceived, + TriggerMode::DamagePreventedOnce, + TriggerMode::ExcessDamage, + TriggerMode::ExcessDamageAll, + TriggerMode::Fight, + TriggerMode::FightOnce, + TriggerMode::Attacks, + TriggerMode::AttackersDeclared, + TriggerMode::AttackersDeclaredOneTarget, + TriggerMode::YouAttack, + TriggerMode::YouAttackUnblocked, + TriggerMode::AttackerBlocked, + TriggerMode::AttackerBlockedOnce, + TriggerMode::AttackerBlockedByCreature, + TriggerMode::AttackerUnblocked, + TriggerMode::AttackerUnblockedOnce, + TriggerMode::Blocks, + TriggerMode::BlockersDeclared, + TriggerMode::BecomesBlocked, + TriggerMode::AttacksOrBlocks, + TriggerMode::BlocksOrBecomesBlocked, + TriggerMode::Phase, + TriggerMode::TurnBegin, + TriggerMode::NewGame, + TriggerMode::Drawn, + TriggerMode::Discarded, + TriggerMode::DiscardedAll, + TriggerMode::TokenCreated, + TriggerMode::TokenCreatedOnce, + ]; + + for mode in &expected { + assert!( + trigger_event_unreachable_by_confined_action(&trigger(mode.clone())), + "{mode:?} is in the pinned relieved list but the predicate does not relieve it" + ); + } + + // REVERSE CONTAINMENT, over the enum's own declaration read from source. + // `TriggerMode` derives no iteration trait and there is no name table, so + // the only total enumeration available is the declaration itself; a + // hand-copied list here would be the very drift this row exists to catch. + // Each scanned name goes back through `FromStr`, which is the decoder the + // card pipeline uses. + let source = std::fs::read_to_string(concat!( + env!("CARGO_MANIFEST_DIR"), + "/src/types/triggers.rs" + )) + .expect("the enum's own source file is readable"); + let body = source + .split_once("pub enum TriggerMode {") + .expect("the enum declaration must be findable") + .1; + let body = body.split_once("\n}").expect("…and terminated").0; + + // The names this enumeration cannot construct, PINNED so the gap cannot + // grow silently. Three carry payloads and have no bare-name spelling for + // `FromStr`; the other three are PRE-EXISTING gaps in + // `types::triggers`'s own decoder — they are declared on the enum but have + // no `FromStr` arm, so `from_str` degrades them to `Unknown`. That gap is + // not this module's to fix (and `types/triggers.rs` is outside this + // change), but it IS this row's to disclose: none of the six is in the + // relieved list above, so the reverse containment below covers 165 of the + // enum's 171 variants and this constant names the remaining six. + // Sorted, and compared as a SET: this row's subject is which variants are + // undecodable, not where they sit in the declaration. Pinning declaration + // order would red this `ai_support` row on a no-op reordering of + // `TriggerMode` — a failure that says nothing about either module. + const UNCONSTRUCTIBLE: [&str; 6] = [ + "Copied", // no `FromStr` arm + "Explored", // no `FromStr` arm + "HauntedCreatureDies", // no `FromStr` arm + "KeywordAbilityActivated", // payload + "Planeswalked", // payload + "Unknown", // payload + ]; + let mut undecodable = Vec::new(); + + let mut scanned = 0usize; + let mut unexpected = Vec::new(); + for line in body.lines() { + let line = line.trim(); + // Payload variants FIRST: `Foo(Bar),` would otherwise strip only the + // comma and then fail the identifier filter below, silently dropping + // the variant from the enumeration entirely. + let Some(name) = line + .split_once('(') + .map(|(head, _)| head) + .or_else(|| line.strip_suffix(" {")) + .or_else(|| line.strip_suffix(',')) + else { + continue; + }; + let name = name.trim(); + if name.is_empty() + || !name.chars().next().is_some_and(|c| c.is_ascii_uppercase()) + || !name.chars().all(|c| c.is_ascii_alphanumeric()) + { + continue; + } + let mode: TriggerMode = name.parse().expect("FromStr for TriggerMode is Infallible"); + if matches!(mode, TriggerMode::Unknown(_)) { + undecodable.push(name.to_string()); + continue; + } + scanned += 1; + if trigger_event_unreachable_by_confined_action(&trigger(mode.clone())) + && !expected.contains(&mode) + { + unexpected.push(mode); + } + } + + undecodable.sort_unstable(); + assert_eq!( + undecodable, UNCONSTRUCTIBLE, + "the set of `TriggerMode` variants this enumeration cannot construct changed. If a \ + variant was ADDED to it, the reverse containment below silently stopped covering \ + that variant — restore its `FromStr` arm rather than widening this constant" + ); + assert!( + scanned >= 165, + "the source scan must actually reach the variant list — a parsing change that made it \ + match nothing, or match only a prefix, would turn this whole row vacuous; scanned \ + {scanned}" + ); + assert!( + unexpected.is_empty(), + "these modes are relieved but are NOT in the pinned list — a family widened without \ + its soundness comment being re-derived: {unexpected:?}" + ); + } + + /// **T2.4b — an EMPTY `trigger_zones` means battlefield, not nowhere.** + /// + /// CR 113.6: the zone-of-function question has one authority, + /// `game::triggers::trigger_definition_functions_in_zone`, and the reason the + /// scan must call it rather than read the field is this exact shape. An empty + /// list is the engine's spelling of "battlefield only"; a direct + /// `def.trigger_zones.contains(&zone)` answers `false` for it and would + /// relieve every ordinary battlefield observer on the board — the FAIL-OPEN + /// direction, which produces a false `Accept`. + /// + /// Built here rather than on the real board because it cannot be built there: + /// MEASURED, every active trigger definition on the flagship carries an + /// explicit `trigger_zones: [Battlefield]`, so the direct read and the + /// authority agree across the whole fixture corpus and no integration row can + /// tell them apart. Latent, not live — and closed for the same reason this + /// module closed its `Zone::Stack` arm. + /// + /// REVERT-PROBE (executed): swap the authority call for + /// `def.trigger_zones.contains(&obj.zone)` ⇒ this row fails. + #[test] + fn t2_4b_an_empty_trigger_zones_list_means_battlefield_not_nowhere() { + let mut def = trigger(TriggerMode::ChangesZone); + def.valid_card = Some(TargetFilter::Typed(crate::types::ability::TypedFilter { + controller: Some(ControllerRef::You), + ..Default::default() + })); + assert!( + def.trigger_zones.is_empty(), + "PREMISE: a fresh `TriggerDefinition` carries no zone list, which is the shape under \ + test" + ); + + assert!( + scan_with(OPPONENT, Zone::Battlefield, def.clone(), ACTOR), + "CR 113.6: an empty `trigger_zones` FUNCTIONS on the battlefield, so this observer \ + keeps its veto. A direct `contains` read answers `false` here and relieves it" + ); + assert!( + !scan_with(OPPONENT, Zone::Hand, def, ACTOR), + "…and the same definition does NOT function from hand, so the gate is a distinction \ + and not a constant" + ); + } + + /// **T3.1 — an unread parse warning is not proof of confinement.** + /// + /// RAMPANT_GROWTH is the clean single-variable discriminator: it carries no + /// keywords, no modal, no additional cost, no triggers, no statics and no + /// replacements, so every other disjunct of the gate is already false and the + /// verdict below can only be produced by `parse_warnings`. (Crop Rotation + /// cannot serve — it is over-determined by `additional_cost`.) + /// + /// Both directions on ONE object, one field mutated. + #[test] + fn t3_1_a_parse_diagnostic_gates_an_otherwise_confined_object() { + let mut state = GameState::default(); + let id = create_object( + &mut state, + crate::types::identifiers::CardId(1), + crate::types::player::PlayerId(0), + RAMPANT_GROWTH.name.to_string(), + Zone::Hand, + ); + let parsed = parse_oracle_text(RAMPANT_GROWTH.oracle, RAMPANT_GROWTH.name, &[], &[], &[]); + let obj = state.objects.get_mut(&id).expect("just created"); + obj.abilities = std::sync::Arc::new(parsed.abilities); + + assert_eq!( + object_window_reach(&state, id), + WindowReach::OwnResourcesOnly, + "PREMISE: with a clean parse this card is the module's flagship confined shape. If \ + this direction ever fails the row below stops measuring the diagnostic" + ); + + state + .objects + .get_mut(&id) + .expect("just created") + .parse_warnings = vec![ + crate::parser::oracle_ir::diagnostic::OracleDiagnostic::IgnoredRemainder { + text: "and each opponent loses 2 life".to_string(), + parser: "probe".to_string(), + line_index: 0, + }, + ]; + assert_eq!( + object_window_reach(&state, id), + WindowReach::MayInterfere, + "the parser reported that some printed clause never became an `AbilityDefinition`. \ + Proving confinement from the abilities that DID parse is proving it from the fraction \ + of the card the classifier can see — the module doc's §2 residual, now in band" + ); + } + + /// Urza's Cave, verbatim, BOTH lines (Oracle text verified on Scryfall, + /// `api.scryfall.com/cards/named?exact=Urza's+Cave`). Terramorphic Expanse's + /// UNRESTRICTED sibling on the ACTIVATED path: same `{T}` + sacrifice-this + /// cost shape, same tapped library arrival, and the search filter is + /// `Typed[Land]` where Terramorphic's is `Typed[Land] + HasSupertype(Basic)`. + /// Ability `[0]` is its mana ability and `[1]` is the fetch, which is what + /// makes it the right card for the INDEXED entry point: folding the whole + /// object would be over-determined by `Effect::Mana`. + const URZAS_CAVE: Card = Card { + name: "Urza's Cave", + oracle: "{T}: Add {C}.\n{3}, {T}, Sacrifice this land: Search your library for a land \ + card, put it onto the battlefield tapped, then shuffle.", + }; + + /// Bojuka Bog, verbatim (Oracle text verified on Scryfall, + /// `api.scryfall.com/cards/named?exact=Bojuka+Bog`). A LAND whose ETB reaches + /// a graveyard belonging to somebody else — the card that makes "an + /// unrestricted land search is confined" false. + const BOJUKA_BOG: Card = Card { + name: "Bojuka Bog", + oracle: "This land enters tapped.\nWhen this land enters, exile target player's \ + graveyard.\n{T}: Add {B}.", + }; + + /// Snow-Covered Swamp, verbatim — its entire printed rules text is one mana + /// ability. The inert control, and a REAL basic rather than a hand-built + /// vanilla stand-in. + const SNOW_COVERED_SWAMP: Card = Card { + name: "Snow-Covered Swamp", + oracle: "({T}: Add {B}.)", + }; + + /// Put a real parsed card into `player`'s library through the production face + /// path, so its trigger/replacement/static/keyword content is whatever the + /// pipeline actually produces rather than whatever a fixture remembered to + /// set. + fn give_library_card( + state: &mut GameState, + player: PlayerId, + card: &Card, + supertypes: Vec, + ) -> ObjectId { + let parsed = parse_oracle_text(card.oracle, card.name, &[], &[], &[]); + let face = CardFace { + name: card.name.to_string(), + oracle_text: Some(card.oracle.to_string()), + card_type: crate::types::card_type::CardType { + supertypes, + core_types: vec![crate::types::card_type::CoreType::Land], + subtypes: vec![], + }, + abilities: parsed.abilities, + triggers: parsed.triggers, + static_abilities: parsed.statics, + replacements: parsed.replacements, + keywords: parsed.extracted_keywords, + parse_warnings: parsed.parse_warnings, + ..CardFace::default() + }; + let id = create_object( + state, + crate::types::identifiers::CardId(state.next_object_id), + player, + card.name.to_string(), + Zone::Library, + ); + crate::game::printed_cards::apply_card_face_to_object( + state.objects.get_mut(&id).expect("just created"), + &face, + ); + id + } + + /// **T3.3 — a tapped library fetch is confined only while every card it could + /// SELECT is inert, at BOTH entry points.** + /// + /// `effect_window_reach`'s `ChangeZone` arm admits a tapped battlefield + /// arrival whose origin is a library, and it used to discharge the arriving + /// card's rules content with a hidden-zone argument: CR 400.2 makes a library + /// hidden, so "the card is the subject of neither input". CR 701.23a says + /// otherwise — "To search for a card in a zone, look at all cards in that zone + /// (even if it's a hidden zone) and find a card that matches the given + /// description" — and the library cards really are in `state.objects`. + /// + /// TWO AXES, varied one at a time against the same board: + /// * **the deck** — Urza's Cave / Reshape the Earth search for ANY land, so a + /// Bojuka Bog in the library is selectable and a Snow-Covered Swamp is not + /// enough to save it; + /// * **the printed filter** — Terramorphic Expanse searches for a BASIC land + /// on the identical library, and the Bog is not basic, so it stays confined. + /// This is the row that separates the implemented gate from a + /// "Basic means safe" heuristic: the heuristic passes the filter axis and + /// fails the deck axis. + /// + /// Both entry points are exercised because they gate independently: + /// `object_window_reach` folds every ability (Reshape the Earth, a spell), and + /// `indexed_ability_window_reach` folds exactly one (Urza's Cave `[1]`, an + /// activation). Dropping the conjunct from either one alone leaves the other + /// row green. + /// + /// REVERT-PROBES (both executed): delete the `library_arrivals_are_inert` + /// conjunct from `object_window_reach` ⇒ the Reshape row's `MayInterfere` + /// flips; delete it from `indexed_ability_window_reach` ⇒ the Urza's Cave + /// row's flips. + #[test] + fn t3_3_a_library_fetch_is_confined_only_while_every_selectable_card_is_inert() { + const RESHAPE_THE_EARTH: Card = Card { + name: "Reshape the Earth", + oracle: "Search your library for up to ten land cards, put them onto the battlefield \ + tapped, then shuffle.", + }; + let actor = crate::types::player::PlayerId(0); + + // One board, built once, then two sources staged on it. + let mut state = GameState::default(); + state.players.push(crate::types::player::Player { + id: actor, + ..Default::default() + }); + let swamp = give_library_card( + &mut state, + actor, + &SNOW_COVERED_SWAMP, + vec![ + crate::types::card_type::Supertype::Basic, + crate::types::card_type::Supertype::Snow, + ], + ); + let bog = give_library_card(&mut state, actor, &BOJUKA_BOG, vec![]); + for id in [swamp, bog] { + state + .players + .iter_mut() + .find(|p| p.id == actor) + .expect("seated") + .library + .push_back(id); + } + assert!( + !carries_unreadable_rules_content(&state.objects[&swamp]), + "PREMISE: a basic Snow-Covered Swamp is inert, so it can never be what produces a \ + `MayInterfere` below" + ); + assert!( + carries_unreadable_rules_content(&state.objects[&bog]), + "PREMISE: Bojuka Bog carries rules content this fold cannot read — its ETB. Without \ + this the rows below have no hazard to detect" + ); + + // ── source A: a SPELL, folded through `object_window_reach` ── + let reshape = create_object( + &mut state, + crate::types::identifiers::CardId(90), + actor, + RESHAPE_THE_EARTH.name.to_string(), + Zone::Hand, + ); + state + .objects + .get_mut(&reshape) + .expect("just created") + .abilities = std::sync::Arc::new(vec![ability(&RESHAPE_THE_EARTH, 0)]); + assert_eq!( + object_window_reach(&state, reshape), + WindowReach::MayInterfere, + "an unrestricted land search LOOKS AT ALL CARDS (CR 701.23a) and this library holds \ + Bojuka Bog, whose ETB exiles a graveyard the actor does not own" + ); + + // ── source B: an ACTIVATION, folded through `indexed_ability_window_reach` ── + let cave = create_object( + &mut state, + crate::types::identifiers::CardId(91), + actor, + URZAS_CAVE.name.to_string(), + Zone::Battlefield, + ); + state + .objects + .get_mut(&cave) + .expect("just created") + .abilities = + std::sync::Arc::new(vec![ability(&URZAS_CAVE, 0), ability(&URZAS_CAVE, 1)]); + assert_eq!( + indexed_ability_window_reach(&state, cave, 1), + WindowReach::MayInterfere, + "the same hazard reached through the ACTIVATED entry point, which gates separately" + ); + + // ── AXIS 1: vary the DECK, hold the cards fixed ── + let inert_library = { + let mut inert = state.clone(); + inert.objects.remove(&bog); + inert + .players + .iter_mut() + .find(|p| p.id == actor) + .expect("seated") + .library + .retain(|id| *id != bog); + inert + }; + assert_eq!( + object_window_reach(&inert_library, reshape), + WindowReach::OwnResourcesOnly, + "AXIS 1 (deck varies): the identical unrestricted search is confined once every land \ + it could select is inert. Without this direction the gate could be a constant" + ); + assert_eq!( + indexed_ability_window_reach(&inert_library, cave, 1), + WindowReach::OwnResourcesOnly, + "AXIS 1, activated path" + ); + + // ── AXIS 2: vary the printed FILTER, hold the deck fixed ── + let terramorphic = create_object( + &mut state, + crate::types::identifiers::CardId(92), + actor, + TERRAMORPHIC.name.to_string(), + Zone::Battlefield, + ); + state + .objects + .get_mut(&terramorphic) + .expect("just created") + .abilities = std::sync::Arc::new(vec![ability(&TERRAMORPHIC, 0)]); + assert_eq!( + object_window_reach(&state, terramorphic), + WindowReach::OwnResourcesOnly, + "AXIS 2 (filter varies, deck held): a BASIC land search on the very library that \ + defeats the unrestricted one stays confined — the Bog is not basic. A gate that read \ + 'is there a fetch' rather than 'what can it select' fails here" + ); + } + + /// **T3.4 — a non-empty selection filter that matches nothing fails closed.** + /// + /// The one place [`library_arrivals_are_inert`] refuses to answer instead of + /// answering. A library with cards in it but none matching the search could be + /// a deck that genuinely cannot fetch, or it could be a filter this seam + /// cannot evaluate — `FilterContext::from_source_with_controller` carries the + /// acting object but no ability instance, and MEASURED over + /// `data/card-data.json` 24 cards carry a `SearchLibrary` filter that reads + /// the ability's own target (`SameNameAsParentTarget`, `CanEnchant { + /// ParentTarget }`). Those two cases are indistinguishable here, and one of + /// them is a false `Accept`, so neither gets one. + /// + /// The row is the pair: an EMPTY library is confined (nothing can be + /// selected — the filter never ran), a NON-EMPTY library with no match is not. + /// + /// REVERT-PROBE (executed): change the `selectable.is_empty()` arm to return + /// `true` ⇒ the second assertion flips to `OwnResourcesOnly`. + #[test] + fn t3_4_a_search_filter_that_matches_nothing_is_unanswerable_not_confined() { + const RAMPANT_GROWTH: Card = Card { + name: "Rampant Growth", + oracle: "Search your library for a basic land card, put that card onto the \ + battlefield tapped, then shuffle.", + }; + let actor = crate::types::player::PlayerId(0); + let mut state = GameState::default(); + state.players.push(crate::types::player::Player { + id: actor, + ..Default::default() + }); + let growth = create_object( + &mut state, + crate::types::identifiers::CardId(1), + actor, + RAMPANT_GROWTH.name.to_string(), + Zone::Hand, + ); + state + .objects + .get_mut(&growth) + .expect("just created") + .abilities = std::sync::Arc::new(vec![ability(&RAMPANT_GROWTH, 0)]); + + assert_eq!( + object_window_reach(&state, growth), + WindowReach::OwnResourcesOnly, + "an EMPTY library selects nothing, so nothing arrives. This empty set IS an answer" + ); + + // One NON-basic land in the library: the pool is non-empty and the + // basic-land filter matches none of it. + let bog = give_library_card(&mut state, actor, &BOJUKA_BOG, vec![]); + state + .players + .iter_mut() + .find(|p| p.id == actor) + .expect("seated") + .library + .push_back(bog); + assert_eq!( + object_window_reach(&state, growth), + WindowReach::MayInterfere, + "a non-empty pool that the filter matched NOTHING in is the case this seam cannot \ + tell apart from a filter it is unable to evaluate, so it does not claim confinement" + ); + } + + /// **T3.2 — a transform carries the DISPLAYED face's parse diagnostics, both + /// ways.** + /// + /// `obj.parse_warnings` documents itself as "diagnostics for the displayed + /// face", and before `BackFaceData` carried the field that sentence was false + /// the moment a permanent transformed. `printed_cards`' face application + /// copies field by field, so the FRONT face's diagnostics stayed on the object + /// while the BACK face's rules text was displayed. Both directions are wrong + /// and they are wrong in opposite ways, which is why both are asserted here: + /// a front-clean/back-dirty card looked clean while showing text the parser + /// could not read, and a front-dirty/back-clean one kept a diagnostic that + /// described nothing on the object any more. + /// + /// Driven through the REAL `game::transform::transform_permanent`, not through + /// the two face helpers it calls — a test that called `snapshot_object_face` + /// and `apply_back_face_to_object` itself would go green even if the transform + /// stopped using them. + /// + /// **What this row does NOT claim.** It is not a `carries_unreadable_rules_content` + /// row, and asserting that gate here would be vacuous: the gate has a + /// `back_face.is_some()` disjunct, so EVERY double-faced object trips it + /// whatever its diagnostics say. The claim is about the state the gate (and + /// `game::visibility`'s two redactions) read — that after a transform the + /// field describes the face now on top. + /// + /// REVERT-PROBES (both executed): + /// * drop `obj.parse_warnings = back_face.parse_warnings` from + /// `printed_cards::apply_back_face_to_object` ⇒ the post-transform assertion + /// fails in BOTH cases; + /// * drop `parse_warnings: obj.parse_warnings.clone()` from + /// `printed_cards::snapshot_object_face` ⇒ the transform-back assertion + /// fails in the front-dirty case (the outgoing face's diagnostics are lost + /// rather than stashed). + #[test] + fn t3_2_a_transform_carries_the_displayed_faces_parse_diagnostics() { + use crate::game::printed_cards::{apply_card_face_to_back_face, apply_card_face_to_object}; + + fn diagnostic(text: &str) -> crate::parser::oracle_ir::diagnostic::OracleDiagnostic { + crate::parser::oracle_ir::diagnostic::OracleDiagnostic::IgnoredRemainder { + text: text.to_string(), + parser: "probe".to_string(), + line_index: 0, + } + } + + // Both directions, as a table: neither verdict can be a constant. + for (label, front_warnings, back_warnings) in [ + ("front-clean / back-dirty", vec![], vec![diagnostic("back")]), + ( + "front-dirty / back-clean", + vec![diagnostic("front")], + vec![], + ), + ] { + let mut state = GameState::default(); + let id = create_object( + &mut state, + crate::types::identifiers::CardId(1), + crate::types::player::PlayerId(0), + "Probe Front".to_string(), + Zone::Battlefield, + ); + + let front = CardFace { + name: "Probe Front".to_string(), + parse_warnings: front_warnings.clone(), + ..CardFace::default() + }; + let back = CardFace { + name: "Probe Back".to_string(), + parse_warnings: back_warnings.clone(), + ..CardFace::default() + }; + apply_card_face_to_object(state.objects.get_mut(&id).expect("just created"), &front); + let mut stored_back = crate::game::specialize::empty_back_face(); + apply_card_face_to_back_face(&mut stored_back, &back); + assert_eq!( + stored_back.parse_warnings, back_warnings, + "PREMISE ({label}): `apply_card_face_to_back_face` must carry the face's own \ + diagnostics, or the transform below has nothing to install" + ); + state.objects.get_mut(&id).expect("just created").back_face = Some(stored_back); + + assert_eq!( + state.objects[&id].parse_warnings, front_warnings, + "PREMISE ({label}): the object starts on its FRONT face" + ); + + let mut events = Vec::new(); + crate::game::transform::transform_permanent(&mut state, id, &mut events) + .expect("CR 701.27a: a battlefield permanent with a back face transforms"); + assert!( + state.objects[&id].transformed, + "PREMISE ({label}): the transform must actually have happened, or the assertion \ + below is comparing the front face to itself" + ); + assert_eq!( + state.objects[&id].parse_warnings, back_warnings, + "({label}) the displayed face is now the BACK face, so its diagnostics are the \ + object's. Reporting the front face's here is reporting evidence about text the \ + permanent no longer has" + ); + + crate::game::transform::transform_permanent(&mut state, id, &mut events) + .expect("CR 701.27a: and it transforms back"); + assert!( + !state.objects[&id].transformed, + "PREMISE ({label}): the round trip must return to the front face" + ); + assert_eq!( + state.objects[&id].parse_warnings, front_warnings, + "({label}) the return trip restores the FRONT face's diagnostics exactly — a \ + stale back-face warning would outlive the text it described" + ); + + // THE THIRD SNAPSHOT HELPER. `game::effects::turn_face_down` stashes + // `snapshot_object_base_face` and the face-up path installs it with + // the same `apply_back_face_to_object` the transform above used, so + // that restore now READS a field the base snapshot has to write. + // MEASURED: `morph::apply_face_down_creature_characteristics` blanks + // name, types, abilities, keywords and every definition list but never + // touches `parse_warnings`, so a base snapshot that dropped the field + // would make turning face UP clear diagnostics that turning face DOWN + // had left alone — a regression this change would have introduced. + // + // Helper-level on purpose and stated as such: the production entry is + // an effect resolver needing a `ResolvedAbility` and a legal morph + // cost, and those would become the variables the row measures. + // REVERT-PROBE (executed): replace `snapshot_object_base_face`'s + // `parse_warnings: obj.parse_warnings.clone()` with `Vec::new()` ⇒ + // this assertion fails in the front-dirty case. + let stashed = + crate::game::printed_cards::snapshot_object_base_face(&state.objects[&id]); + crate::game::printed_cards::apply_back_face_to_object( + state.objects.get_mut(&id).expect("just created"), + stashed, + ); + assert_eq!( + state.objects[&id].parse_warnings, front_warnings, + "({label}) the face-down stash/restore pair must round-trip the displayed face's \ + diagnostics too" + ); + } + } +} diff --git a/crates/engine/src/game/casting_tests.rs b/crates/engine/src/game/casting_tests.rs index 2b3a34402a..b8ce7bc4bc 100644 --- a/crates/engine/src/game/casting_tests.rs +++ b/crates/engine/src/game/casting_tests.rs @@ -10574,6 +10574,7 @@ fn hearth_elemental_self_cost_reduction_counts_adventures() { casting_restrictions: vec![], casting_options: vec![], layout_kind: Some(crate::types::card::LayoutKind::Adventure), + parse_warnings: vec![], }); } } @@ -26689,6 +26690,7 @@ fn create_adventure_in_hand(state: &mut GameState, player: PlayerId) -> ObjectId casting_restrictions: Vec::new(), casting_options: Vec::new(), layout_kind: None, + parse_warnings: vec![], }); obj_id @@ -26781,6 +26783,7 @@ fn create_enchantment_adventure_in_hand(state: &mut GameState, player: PlayerId) casting_restrictions: Vec::new(), casting_options: Vec::new(), layout_kind: Some(LayoutKind::Adventure), + parse_warnings: vec![], }); obj_id @@ -26866,6 +26869,7 @@ fn create_omen_in_hand(state: &mut GameState, player: PlayerId) -> ObjectId { casting_restrictions: Vec::new(), casting_options: Vec::new(), layout_kind: Some(LayoutKind::Omen), + parse_warnings: vec![], }); obj_id @@ -30680,6 +30684,7 @@ fn add_disturb_creature_to_graveyard( casting_restrictions: Vec::new(), casting_options: Vec::new(), layout_kind: Some(LayoutKind::Transform), + parse_warnings: vec![], }); obj_id } @@ -36967,6 +36972,7 @@ mod mtmte_cast_flow { casting_restrictions: Vec::new(), casting_options: Vec::new(), layout_kind: Some(LayoutKind::Transform), + parse_warnings: vec![], } } @@ -50977,6 +50983,7 @@ fn exact_resolution_offer_does_not_inherit_sibling_cast_transformed() { casting_restrictions: Vec::new(), casting_options: Vec::new(), layout_kind: Some(LayoutKind::Transform), + parse_warnings: vec![], }); obj.casting_permissions .push(CastingPermission::ExileWithAltCost { diff --git a/crates/engine/src/game/day_night.rs b/crates/engine/src/game/day_night.rs index 985ab5d63b..e03a649772 100644 --- a/crates/engine/src/game/day_night.rs +++ b/crates/engine/src/game/day_night.rs @@ -178,6 +178,7 @@ mod tests { casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], }); id } diff --git a/crates/engine/src/game/effects/become_copy.rs b/crates/engine/src/game/effects/become_copy.rs index d6448b5634..8d2a44385b 100644 --- a/crates/engine/src/game/effects/become_copy.rs +++ b/crates/engine/src/game/effects/become_copy.rs @@ -1167,6 +1167,7 @@ mod tests { casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], }); } diff --git a/crates/engine/src/game/effects/change_zone.rs b/crates/engine/src/game/effects/change_zone.rs index 31143ec135..081ad1e1ef 100644 --- a/crates/engine/src/game/effects/change_zone.rs +++ b/crates/engine/src/game/effects/change_zone.rs @@ -9559,6 +9559,7 @@ mod tests { casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], }); } diff --git a/crates/engine/src/game/effects/flip_coin.rs b/crates/engine/src/game/effects/flip_coin.rs index 45a9badb58..e20ccac43d 100644 --- a/crates/engine/src/game/effects/flip_coin.rs +++ b/crates/engine/src/game/effects/flip_coin.rs @@ -934,6 +934,7 @@ mod tests { casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], }); id } diff --git a/crates/engine/src/game/effects/flip_permanent.rs b/crates/engine/src/game/effects/flip_permanent.rs index 11241f497a..1c3ecf3270 100644 --- a/crates/engine/src/game/effects/flip_permanent.rs +++ b/crates/engine/src/game/effects/flip_permanent.rs @@ -148,6 +148,7 @@ mod tests { casting_restrictions: vec![], casting_options: vec![], layout_kind: Some(crate::types::card::LayoutKind::Flip), + parse_warnings: vec![], }); id } diff --git a/crates/engine/src/game/effects/prepare.rs b/crates/engine/src/game/effects/prepare.rs index 2f720163d1..cb17a3aa3a 100644 --- a/crates/engine/src/game/effects/prepare.rs +++ b/crates/engine/src/game/effects/prepare.rs @@ -1260,6 +1260,7 @@ mod tests { casting_restrictions: Vec::new(), casting_options: Vec::new(), layout_kind: Some(LayoutKind::Prepare), + parse_warnings: vec![], } } } diff --git a/crates/engine/src/game/effects/set_room_door_lock.rs b/crates/engine/src/game/effects/set_room_door_lock.rs index debbc1d22a..fe6728e5ad 100644 --- a/crates/engine/src/game/effects/set_room_door_lock.rs +++ b/crates/engine/src/game/effects/set_room_door_lock.rs @@ -139,6 +139,7 @@ mod tests { casting_restrictions: Vec::new(), casting_options: Vec::new(), layout_kind: Some(crate::types::card::LayoutKind::Split), + parse_warnings: vec![], } } diff --git a/crates/engine/src/game/effects/token.rs b/crates/engine/src/game/effects/token.rs index 7fb6e53adb..bd691211e0 100644 --- a/crates/engine/src/game/effects/token.rs +++ b/crates/engine/src/game/effects/token.rs @@ -3295,6 +3295,9 @@ fn incubator_phyrexian_back_face() -> BackFaceData { strive_cost: None, casting_restrictions: vec![], casting_options: vec![], + // Built in code from CR 111.10i, not parsed from printed text, so there is + // no parse to have gone wrong. + parse_warnings: vec![], layout_kind: None, } } diff --git a/crates/engine/src/game/effects/transform_effect.rs b/crates/engine/src/game/effects/transform_effect.rs index 6a5572cacf..efb2804a0c 100644 --- a/crates/engine/src/game/effects/transform_effect.rs +++ b/crates/engine/src/game/effects/transform_effect.rs @@ -222,6 +222,7 @@ mod tests { // face so `is_double_faced_permanent` recognizes it (the mass-transform // resolver pre-filters on that authority). layout_kind: Some(crate::types::card::LayoutKind::Transform), + parse_warnings: vec![], }); id } diff --git a/crates/engine/src/game/engine.rs b/crates/engine/src/game/engine.rs index b30586e2bf..598b66d572 100644 --- a/crates/engine/src/game/engine.rs +++ b/crates/engine/src/game/engine.rs @@ -14230,6 +14230,7 @@ mod priority_principal_tests { casting_restrictions: Vec::new(), casting_options: Vec::new(), layout_kind: None, + parse_warnings: vec![], }); for _ in 0..mana_count { runner.state_mut().players[0].mana_pool.add(ManaUnit::new( diff --git a/crates/engine/src/game/engine_debug.rs b/crates/engine/src/game/engine_debug.rs index db293d883c..a44e187059 100644 --- a/crates/engine/src/game/engine_debug.rs +++ b/crates/engine/src/game/engine_debug.rs @@ -1551,6 +1551,7 @@ mod tests { casting_restrictions: Vec::new(), casting_options: Vec::new(), layout_kind: Some(LayoutKind::Prepare), + parse_warnings: vec![], } } diff --git a/crates/engine/src/game/engine_mdfc_land_tests.rs b/crates/engine/src/game/engine_mdfc_land_tests.rs index b2637d7df5..c82568085c 100644 --- a/crates/engine/src/game/engine_mdfc_land_tests.rs +++ b/crates/engine/src/game/engine_mdfc_land_tests.rs @@ -62,6 +62,7 @@ fn make_back_face( casting_restrictions: Vec::new(), casting_options: Vec::new(), layout_kind, + parse_warnings: vec![], } } diff --git a/crates/engine/src/game/engine_resolution_choices.rs b/crates/engine/src/game/engine_resolution_choices.rs index fa08fddddc..2b930cff13 100644 --- a/crates/engine/src/game/engine_resolution_choices.rs +++ b/crates/engine/src/game/engine_resolution_choices.rs @@ -10225,8 +10225,8 @@ mod tests { /// than a stricter sentence. /// /// POPULATION IS DISCOVERED, NOT LISTED. The guard walks the crate and enforces on every file - /// carrying the opt-in marker comment, so a seventh file joining the class is covered the - /// moment it opts in, and a hardcoded list cannot drift out of sync with the class it names. + /// carrying the opt-in marker comment, so a newly enrolling file is covered the moment it opts + /// in, and a hardcoded list cannot drift out of sync with the class it names. /// A whole-crate sweep was measured and rejected as out of scope, not as unnecessary: /// `crates/engine/src` carries 216 such anchors across 61 files (`game/engine.rs` alone 29), /// ~20x this change. Regenerate that census with: @@ -10253,7 +10253,7 @@ mod tests { const TEST_MOD: &str = "#[cfg(test)]\nmod tests {"; // Enrolment floor. Not a list — a non-vacuity guard, so a broken walk or a renamed marker // reds instead of passing on an empty population. Raise it when a file joins. - const ENROLLED_FLOOR: usize = 6; + const ENROLLED_FLOOR: usize = 8; // `CR 732.2a` has no colon; `std::vec` no digit; `field:1` and `{"Life":1}` have a name or // a quote before the colon. A bare back-reference is recognized only after whitespace, a diff --git a/crates/engine/src/game/engine_tests.rs b/crates/engine/src/game/engine_tests.rs index ab045257ab..c665caea18 100644 --- a/crates/engine/src/game/engine_tests.rs +++ b/crates/engine/src/game/engine_tests.rs @@ -1656,6 +1656,7 @@ fn room_back_face(name: &str) -> BackFaceData { casting_restrictions: Vec::new(), casting_options: Vec::new(), layout_kind: Some(crate::types::card::LayoutKind::Split), + parse_warnings: vec![], } } diff --git a/crates/engine/src/game/flip.rs b/crates/engine/src/game/flip.rs index ff53e9eea8..e5db14ecc4 100644 --- a/crates/engine/src/game/flip.rs +++ b/crates/engine/src/game/flip.rs @@ -456,6 +456,7 @@ mod tests { casting_restrictions: vec![], casting_options: vec![], layout_kind: Some(crate::types::card::LayoutKind::Flip), + parse_warnings: vec![], }); id diff --git a/crates/engine/src/game/game_object.rs b/crates/engine/src/game/game_object.rs index 2e87a31108..d95807ec68 100644 --- a/crates/engine/src/game/game_object.rs +++ b/crates/engine/src/game/game_object.rs @@ -239,6 +239,25 @@ pub struct BackFaceData { pub strive_cost: Option, pub casting_restrictions: Vec, pub casting_options: Vec, + /// Parser diagnostics for THIS face — the `BackFaceData` half of + /// [`GameObject::parse_warnings`], and per-face for the same reason `abilities` + /// is: the two faces are parsed independently, so a card whose front reads + /// cleanly and whose back does not is the normal case rather than a corner one. + /// + /// Without this field the diagnostic was not a per-face fact at all. Face + /// application copies field by field, so a transform kept the FRONT face's + /// diagnostics on the object while displaying the back face's rules text: a + /// front-clean card looked clean after transforming into a back face the parser + /// could not fully read, and a front-dirty one kept a diagnostic that no longer + /// described anything. `ai_support::shortcut_efficacy` reads the object field as + /// evidence that the printed rules text is fully modelled, so the stale answer + /// was load-bearing in both directions. + /// + /// `serde(default)` keeps every persisted dump loadable — an older + /// `BackFaceData` simply carries no diagnostics — and `skip_serializing_if` + /// keeps a clean parse byte-identical on the way out. + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub parse_warnings: Vec, /// Source layout kind — distinguishes Modal DFCs from Transform DFCs /// so the engine can offer face-choice for MDFCs (CR 712.12). #[serde(default, skip_serializing_if = "Option::is_none")] @@ -549,6 +568,38 @@ pub struct GameObject { #[serde(default, skip_serializing_if = "Vec::is_empty")] pub spellbook: Vec, + /// Parser diagnostics for the DISPLAYED face, copied verbatim from + /// `CardFace::parse_warnings` by `game::printed_cards`. A transform swaps this + /// along with the rest of the face, through [`BackFaceData::parse_warnings`] — + /// the two faces parse independently, so a card can be clean on one and not the + /// other, and reporting the wrong face's diagnostics is worse than reporting + /// none. + /// + /// NOT a rules field, and it does not change how anything resolves. It is + /// carried onto the object because a diagnostic is EVIDENCE ABOUT the rules + /// content: it records that the parser saw printed text it could not turn + /// into an `AbilityDefinition`. `game::coverage` already reads the same list + /// off the face to decide whether a card is supported. Any consumer that + /// wants to prove an object's printed rules text is fully modelled has to be + /// able to see that the parse was lossy, and before this field existed that + /// evidence stopped at the card database. + /// + /// `skip_serializing_if` keeps every existing dump byte-identical: the field + /// is empty for a clean parse, which is the overwhelming majority of objects. + /// + /// DELIBERATELY ABSENT FROM `CopiableValues`. CR 707.2 gives a copy the + /// copiable values of the original's CHARACTERISTICS, and CR 707.2a says why + /// the abilities come along: "those values are derived from its rules text". + /// A parse diagnostic is not derived from the rules text — it is a statement + /// about this engine's READING of it — so it is not a characteristic and a + /// copy does not acquire it. The consequence, stated rather than left to be + /// discovered: a token copy carries the source's `abilities` but its own + /// (empty) diagnostics. That is exactly the coverage a copy had before this + /// field existed; the field narrows the gap for printed objects and leaves + /// the copy case where it already was. + #[serde(default, skip_serializing_if = "Vec::is_empty")] + pub parse_warnings: Vec, + // Back face data for double-faced cards (DFCs) pub back_face: Option, @@ -1270,6 +1321,17 @@ fn _gameobject_partition_is_total(o: &GameObject) { token_image_ref: _, source_related_token_ids: _, spellbook: _, + // OMITTED, SAFE BY WRITE SITE. Every write is a FACE INSTALL: + // `printed_cards::apply_card_face_to_object` (front) and + // `apply_back_face_to_object` (the face a transform swaps in), each a verbatim + // clone of that face's own diagnostics, plus the two `game::visibility` + // redactions which act on a projected copy and never on stored state. So the + // field is a function of WHICH FACE IS DISPLAYED, and `transformed` — compared + // above — is that same function's discriminator: two states this comparator + // calls equal are showing the same face of the same card, and therefore agree + // here. Nothing accumulates in it, so it cannot become the per-iteration drift + // the §5.2c ADD set exists to catch. + parse_warnings: _, back_face: _, specialize_faces: _, specialized_color: _, @@ -2144,6 +2206,7 @@ impl GameObject { token_image_ref: None, source_related_token_ids: Vec::new(), spellbook: Vec::new(), + parse_warnings: Vec::new(), back_face: None, specialize_faces: None, specialized_color: None, diff --git a/crates/engine/src/game/printed_cards.rs b/crates/engine/src/game/printed_cards.rs index b156e6c9c0..de0021ad5f 100644 --- a/crates/engine/src/game/printed_cards.rs +++ b/crates/engine/src/game/printed_cards.rs @@ -184,6 +184,10 @@ pub fn apply_card_face_to_object(obj: &mut GameObject, card_face: &CardFace) { obj.base_printed_ref = obj.printed_ref.clone(); obj.source_related_token_ids = card_face.metadata.related_token_ids.clone(); obj.spellbook = card_face.metadata.spellbook.clone(); + // Evidence that this face's printed text did not parse cleanly. Carried onto + // the object so a consumer can tell "this card has no such ability" apart from + // "the parser could not read that clause". + obj.parse_warnings = card_face.parse_warnings.clone(); obj.modal = card_face.modal.clone(); obj.additional_cost = card_face.additional_cost.clone(); obj.strive_cost = card_face.strive_cost.clone(); @@ -292,6 +296,9 @@ pub fn apply_card_face_to_back_face(back_face: &mut BackFaceData, card_face: &Ca back_face.strive_cost = card_face.strive_cost.clone(); back_face.casting_restrictions = card_face.casting_restrictions.clone(); back_face.casting_options = card_face.casting_options.clone(); + // Same copy, same reason, as `apply_card_face_to_object`: evidence that THIS + // face's printed text did not parse cleanly travels with the face. + back_face.parse_warnings = card_face.parse_warnings.clone(); } pub fn apply_back_face_to_object(obj: &mut GameObject, back_face: BackFaceData) { @@ -341,6 +348,10 @@ pub fn apply_back_face_to_object(obj: &mut GameObject, back_face: BackFaceData) obj.strive_cost = back_face.strive_cost; obj.casting_restrictions = back_face.casting_restrictions; obj.casting_options = back_face.casting_options; + // The displayed face's diagnostics replace the outgoing face's. Both + // directions matter and both are this one line: a back face the parser could + // not fully read starts gating here, and transforming back off it stops. + obj.parse_warnings = back_face.parse_warnings; } /// CR 306.5b + CR 310.4b + CR 614.1c: Seed the intrinsic "enters with N @@ -743,6 +754,9 @@ pub fn snapshot_object_face(obj: &GameObject) -> BackFaceData { strive_cost: obj.strive_cost.clone(), casting_restrictions: obj.casting_restrictions.clone(), casting_options: obj.casting_options.clone(), + // The outgoing face's diagnostics ride out with it, so the return trip + // restores them rather than inheriting whatever the other face had. + parse_warnings: obj.parse_warnings.clone(), layout_kind: None, } } @@ -788,6 +802,10 @@ pub fn snapshot_object_base_face(obj: &GameObject) -> BackFaceData { strive_cost: obj.strive_cost.clone(), casting_restrictions: obj.casting_restrictions.clone(), casting_options: obj.casting_options.clone(), + // Face-derived, with no base/live split to choose between: nothing writes + // `parse_warnings` except a face install, so the live field IS the printed + // face's diagnostics and the layer system never touches it. + parse_warnings: obj.parse_warnings.clone(), layout_kind: None, } } @@ -1040,6 +1058,8 @@ fn back_face_for_card_face_with_printed_ref( strive_cost: None, casting_restrictions: Vec::new(), casting_options: Vec::new(), + // Empty seed; `apply_card_face_to_back_face` below fills it from the face. + parse_warnings: Vec::new(), layout_kind: None, }; apply_card_face_to_back_face(&mut back, face); @@ -1902,6 +1922,7 @@ mod tests { casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], }); rehydrate_game_from_card_db(&mut state, &db); diff --git a/crates/engine/src/game/specialize.rs b/crates/engine/src/game/specialize.rs index 95d1332ff0..67263dcac8 100644 --- a/crates/engine/src/game/specialize.rs +++ b/crates/engine/src/game/specialize.rs @@ -73,7 +73,10 @@ pub fn eligible_specialize_colors( .collect() } -fn empty_back_face() -> BackFaceData { +/// An all-empty `BackFaceData`. `pub(crate)` rather than private because it is the only +/// constructor of the type that does not hand-roll the full field list, and a second copy +/// of that literal would go stale the moment `BackFaceData` gains a field. +pub(crate) fn empty_back_face() -> BackFaceData { BackFaceData { name: String::new(), power: None, @@ -95,6 +98,7 @@ fn empty_back_face() -> BackFaceData { strive_cost: None, casting_restrictions: vec![], casting_options: vec![], + parse_warnings: vec![], layout_kind: None, } } diff --git a/crates/engine/src/game/stack.rs b/crates/engine/src/game/stack.rs index d18ce4d81e..2af1ebe66b 100644 --- a/crates/engine/src/game/stack.rs +++ b/crates/engine/src/game/stack.rs @@ -4806,6 +4806,7 @@ mod tests { casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], } } diff --git a/crates/engine/src/game/transform.rs b/crates/engine/src/game/transform.rs index 71c6a4b43c..4ef44b7893 100644 --- a/crates/engine/src/game/transform.rs +++ b/crates/engine/src/game/transform.rs @@ -255,6 +255,7 @@ mod tests { use super::*; use crate::game::game_object::BackFaceData; use crate::game::zones::create_object; + use crate::parser::oracle_ir::diagnostic::OracleDiagnostic; use crate::types::card_type::{CardType, CoreType}; use crate::types::identifiers::CardId; use crate::types::keywords::Keyword; @@ -294,6 +295,11 @@ mod tests { obj.base_abilities = Arc::clone(&obj.abilities); obj.color = vec![ManaColor::Green]; obj.base_color = vec![ManaColor::Green]; + obj.parse_warnings = vec![OracleDiagnostic::IgnoredRemainder { + text: "front diagnostic".to_string(), + parser: "transform_test".to_string(), + line_index: 0, + }]; obj.back_face = Some(BackFaceData { name: "Werewolf Back".to_string(), @@ -327,6 +333,11 @@ mod tests { casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![OracleDiagnostic::IgnoredRemainder { + text: "back diagnostic".to_string(), + parser: "transform_test".to_string(), + line_index: 0, + }], }); id @@ -351,6 +362,10 @@ mod tests { "BackAbility" ); assert_eq!(obj.color, vec![ManaColor::Green, ManaColor::Red]); + assert!(matches!( + obj.parse_warnings.as_slice(), + [OracleDiagnostic::IgnoredRemainder { text, .. }] if text == "back diagnostic" + )); assert!(state.layers_dirty.is_dirty()); assert_eq!(events.len(), 1); assert_eq!(events[0], GameEvent::Transformed { object_id: id }); @@ -368,6 +383,10 @@ mod tests { let obj = &state.objects[&id]; assert!(!obj.transformed); assert_eq!(obj.name, "Werewolf Front"); + assert!(matches!( + obj.parse_warnings.as_slice(), + [OracleDiagnostic::IgnoredRemainder { text, .. }] if text == "front diagnostic" + )); assert_eq!(events.len(), 2); } diff --git a/crates/engine/src/game/triggers.rs b/crates/engine/src/game/triggers.rs index 02df951016..d7495c5730 100644 --- a/crates/engine/src/game/triggers.rs +++ b/crates/engine/src/game/triggers.rs @@ -24719,6 +24719,7 @@ pub mod tests { casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], }); } diff --git a/crates/engine/src/game/visibility.rs b/crates/engine/src/game/visibility.rs index 3b371f680e..d4cbf49626 100644 --- a/crates/engine/src/game/visibility.rs +++ b/crates/engine/src/game/visibility.rs @@ -1807,6 +1807,14 @@ fn hide_card(state: &mut GameState, obj_id: ObjectId) { obj.back_face = None; obj.token_image_ref = None; obj.source_related_token_ids.clear(); + // CR 400.2: library and hand are hidden zones — a viewer without + // look-permission may not see the card's face. `parse_warnings` is + // parser evidence derived from that face's printed text (a + // `SwallowedClause` carries the rules text verbatim), and only 891 of + // 35,657 card faces carry a non-empty vector, so its presence and + // contents both fingerprint the card. Redact it with the rest of the + // printed identity. + obj.parse_warnings.clear(); obj.foretold = false; } } @@ -1836,6 +1844,13 @@ fn redact_face_down_identity_from_observer(obj: &mut crate::game::game_object::G obj.printed_ref = None; obj.base_printed_ref = None; obj.back_face = None; + // CR 708.5 + CR 708.2: a face-down permanent has no name and no abilities, + // and no player but its controller may look at the card underneath. + // `parse_warnings` survives the face-down transformation on the + // authoritative object (measured: a manifested card keeps the printed + // face's warnings), so it must be redacted here for the same reason + // `back_face` is — it is evidence about the hidden printed text. + obj.parse_warnings.clear(); } /// CR 603.3b + CR 400.2: A pending trigger awaiting its @@ -2751,6 +2766,116 @@ mod tests { assert!(hidden.back_face.is_none()); } + /// CR 400.2: a hand is a hidden zone. `parse_warnings` is derived from the + /// hidden face's printed text — an `IgnoredRemainder`/`SwallowedClause` + /// payload quotes that text verbatim, and `skip_serializing_if` makes the + /// field's mere presence a fingerprint (891 of 35,657 faces carry one). + /// Matched pair: the owner keeps the diagnostic, the opponent gets nothing. + /// The owner arm is the reach-guard — without it an empty-opponent + /// assertion would pass even if the field were never populated. + #[test] + fn hidden_hand_card_redacts_parse_warnings_from_opponent() { + let mut state = GameState::new_two_player(42); + let card_id = create_object( + &mut state, + CardId(2), + PlayerId(1), + "Warned Card".to_string(), + Zone::Hand, + ); + state.objects.get_mut(&card_id).unwrap().parse_warnings = vec![ + crate::parser::oracle_ir::diagnostic::OracleDiagnostic::IgnoredRemainder { + text: "and each opponent loses 2 life".to_string(), + parser: "effect_chain".to_string(), + line_index: 0, + }, + ]; + + let owner_view = filter_state_for_viewer(&state, PlayerId(1)); + let owned = owner_view.objects.get(&card_id).unwrap(); + assert_eq!(owned.name, "Warned Card"); + assert_eq!( + owned.parse_warnings.len(), + 1, + "reach guard: the owner must still see the diagnostic, otherwise \ + the opponent assertion below is vacuous" + ); + + let opponent_view = filter_state_for_viewer(&state, PlayerId(0)); + let hidden = opponent_view.objects.get(&card_id).unwrap(); + assert_eq!(hidden.name, "Hidden Card"); + assert!( + hidden.parse_warnings.is_empty(), + "opponent must not receive parse diagnostics for a hidden-zone card" + ); + // The wire payload is the actual leak vector: assert on the serialized + // bytes, not just the in-memory field. + assert!( + !serde_json::to_string(hidden) + .unwrap() + .contains("each opponent loses 2 life"), + "hidden card's serialized payload must not quote its printed text" + ); + } + + /// CR 708.5 + CR 708.2: a face-down permanent has no name and no abilities, + /// and only its controller may look at the card underneath. `manifest` does + /// not reset `parse_warnings`, so the printed face's diagnostics survive on + /// the authoritative object and must be redacted for every other viewer — + /// the same reason `back_face` is redacted on this path. + #[test] + fn face_down_permanent_redacts_parse_warnings_from_observer() { + let mut state = GameState::new(FormatConfig::standard(), 2, 42); + let controller = PlayerId(0); + let secret = create_object( + &mut state, + CardId(7), + controller, + "Secret Manifest".to_string(), + Zone::Library, + ); + { + let obj = state.objects.get_mut(&secret).unwrap(); + obj.card_types = CardType { + supertypes: vec![], + core_types: vec![CoreType::Creature], + subtypes: vec![], + }; + obj.parse_warnings = vec![ + crate::parser::oracle_ir::diagnostic::OracleDiagnostic::IgnoredRemainder { + text: "and each opponent loses 2 life".to_string(), + parser: "effect_chain".to_string(), + line_index: 0, + }, + ]; + } + + let mut events = Vec::new(); + manifest(&mut state, controller, &mut events).unwrap(); + // Reach guard: the field genuinely survives the face-down transform, so + // the observer assertion below is not vacuous. + assert_eq!( + state.objects[&secret].parse_warnings.len(), + 1, + "manifest must leave the printed face's diagnostics on the object" + ); + + let controller_view = filter_state_for_viewer(&state, controller); + assert_eq!( + controller_view.objects[&secret].parse_warnings.len(), + 1, + "the controller may look at their own face-down permanent" + ); + + let observer_view = filter_state_for_viewer(&state, PlayerId(1)); + let observed = observer_view.objects.get(&secret).unwrap(); + assert_eq!(observed.name, "Hidden Card"); + assert!( + observed.parse_warnings.is_empty(), + "observer must not receive parse diagnostics for a face-down permanent" + ); + } + #[test] fn search_choice_is_visible_to_turn_controller() { let mut state = GameState::new_two_player(42); diff --git a/crates/engine/src/game/zones.rs b/crates/engine/src/game/zones.rs index 4e094ea099..bf2112a9a5 100644 --- a/crates/engine/src/game/zones.rs +++ b/crates/engine/src/game/zones.rs @@ -4023,6 +4023,7 @@ mod tests { casting_restrictions: vec![], casting_options: vec![], layout_kind: Some(crate::types::card::LayoutKind::Modal), + parse_warnings: vec![], }); } @@ -4188,6 +4189,7 @@ mod tests { casting_restrictions: vec![], casting_options: vec![], layout_kind: Some(crate::types::card::LayoutKind::Modal), + parse_warnings: vec![], }); } // Apply back face (simulating ChooseModalFace on stack). diff --git a/crates/engine/tests/fixtures/dina_noff_turn5_4p.json.gz b/crates/engine/tests/fixtures/dina_noff_turn5_4p.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..169ab59d3d71fe8d50c84547a50c17315080a58a GIT binary patch literal 844846 zcmV(*K;FL}iwFP!000021KeEca@)9;eifGf^xV2)TGTH8nM!QOPA6U_a>vt)O9hgk zgf>O6LDCN6a@T!``-Jl(a~6=Iyu@}KJL&tw0tkXw4$k?`cL35Ct+`mrX)bcv+PG*5 zU&SgfXGUf^E^?)lY?dz+{1hg^3jK~Z>$En8ZOC;oH@a-MM3Ad9Ia5h44d!(+%VM2p zt&QI6KPr-T_}N; z-l_y2%~UdvW$W^!?lO%Ok^+z z&dQ}9m+rAPr(7$`g~?&ikj)pd%&F5{&oL>C4iY=VCIt%kh~IMD6_oH z**UfON*G@lB@)hulw`2N*(qhQomY}tfh4n+XZ);`ek>`o&~a$XOeXDkU#a=L>Q8ag zAZY4IbBo%{Df!6tjZlda0cBwwZDElu&c&Q6!n%nfFf^*oA95P?CMai2Xr&z< zwgG4oZXj2G7BVNvZ===RfmPHUBbTT!0N% zth;4M_O@F}Qjj+>JjwmNS*G}#1Ok>bw`Iw~w(ur7wG(@j{8^|>vHreEGD#NrlK|61 zG5-V;C?j6wp9+{4rGQ${YJoN1iexT~)|5RfFabDcczvr3$@VQQ;wk5_R~pOPM6ngT z)gl&@`kGefEe+)@nhaGmq?hkRSW>c7g43nQ3d$vH2JfT{7L+avzCKeTU(kHtEecdJ z6!tq6kf`6OPYf^bv~QPo4;s~^Z+qlF!5dLNTjiw*K-8w>yhXM>39f%(sHZ(eYPknE zt@%397Fzcd+0velIkEVS8Lcy0c4`v>kUg#Ewz5vD&U8UG0x3UJESFTb$k}-IN@}&l zQA1`Qhi{$CKCGEy<=U5lp#km#GJrQjYuU#o0acV$9^7fno@!quf1up=H9NF@J)hgm zl9YbGT&5_w1AxMmdN_zG^EjAOlLz_}B_^O>!mxv!MSoDF3%ZHeaZuU?IRxd>Y^jIf zxN^|5ly88i<=Gy}Ip{$~IRF^0iz{Q6wkDbN;X=k?DA3~QO3Q@6_i#}f`H{W*p^8au z4*`8>r4D1;M=XE~aVI({DKSBjD#GnUon-}z@6ZUzc64YIh>^7M5S*3FGFxni|3CPL z%KKjUzRD>R1e(_4y|8-mo`CJW^vQX@mr*POYsl{xpjDV6f1tXS(7f040>?BJyi8ND ztz~5(Qvrq{6y=hTlGJF615=nHRRX|3)i|d-&^pVzreFb<06>;Ze<}$grqZO6IcC$6kRJrCO6GO;?pPcJ5zEI(?8jxV+szFh6O{ga5^mvU>wiCFlXwFbYxmCeZ_QV zS|&8JBOqkrRA-cx^s7_u`e(D+vPXr0g(ryl{HhZMi(d<$ zxh|N}k2ESBwN5C4(&yO>W)(e2P%(%R9IwWi7&gK{^wI)AH4LnvaYd?v_*7BY ziVZH1GiE##AEZ1>^*KH}u$MWK*8~8KiU2FZRhYPG14k4Cgm;-tX3(ZlevwPtWT0c< zGFbUl45O!-I>}MpYy=vhdy`n_;*!P+;GP2Tp?vIk!8e|RdQ&r7(B%RK6)+7g(FCAT zn6j9ii5S2T$C&`-gwXd@taS(yGFe_a5O4s!WrC$SP=@YT)6ELMp4m#pEp0i$`>=pj z4YT`5c>DT7d%VmfL4;l?^*sFb%bAVY zFIq2ow}I9>gm4ziKzC*k?aPler=<=XSD7vV{h;wN4h$y%lEJ+TU<;QgmzS5g(m7Z` zq`+mOwt4M-2miWluRCeObM0=Y*X~UQZLfE-R(l4@0};YiHLO?trsZyKG$5Bl+1mA* zo(p2J4e5Ek^_Af&SC@k#^q_Tuf@VvM!J^O@t5JaBX0uRbn1NgMcxNEmYCi-O&{j0y zC9d0He~gA0Fq%{rbc5}#YFx8k-rnJ>8Tf{|q*XUAvK4+yZI&B}oM& zS?xUCElB9T5@iTvV=k|cz?K7*Oe^(gnMDWyP;S7b&q55oE9tG>NreHMP^qW^F}0$t z=GH*onLLx%>hTD;%*c5Gm2H{r7O|q%pczEyfUw!AN@t1un6K=I_vz|U+UCK2F56FY z^JINY0K&Ad7B)@5qdMqYW}j#>zx5^~K!q{|CtlxK1NUpCvn&y5wt!G&?RL`zG)aW5VBw~|zK8#}HLuVBTY488u+>(iz!o&P z0Tri9zdwFgFOQTc_#3e+#F(lwcTXt|*%XFLR}6ruEs`3zWq ztQL|>h=AsK#XJGcPGOEZW}oC6R5s8QjGi`Hb_1lLk`=8)2ai;{KKW2Gvu+;%Wlf)T zMzg@Qs=_66nb77iomDIZFYZb0{x-4NimmLyvbGSx?DdgI>C)nh*OXXOJUoh&qVRf@ zwvCsG#-j~77pa;pQ#y^n%UPsirln04Z4f9C7}^eOHn6Fesm?H@LU$xHsFJcgS{L2R zwsUa=KlPK2;2}5_z-&0b=)##p$mIO56RQYogic!IaQRQ~$A5ZGMV1|%I6US0VW)&= z?d03eIkYR`F_k&cg_Bi%hIRcPGKcj01xz?BjA*W#j3V3?+*kp{Me9$boENPu!1JAr zi{?rl3Kbp@Q)sN&AsNr=`n`-AS35AtcQ8XNinPIve?++=UPVu*e0=q?!d2vjBux?5 zb*ci(q{y4uTVSg*QBmbvb+a;<#!}g$TSXFlWr^4|omI8GL$7t4LbpIcT30ms%k=lK z$Tzv;yO)6WN**JA7NNy282mD|qQAVk6nQ2v@VJRO3}kfx%96R&ku-q1K3<{YmTQs2 zI|*16;tnr!dvJB&fN&d(Vl36DFuev~ULV{Q{9MXhR54=Z)Qn1qDJX7Y63K3F{2SYC`fGNIkj)1i|wpj-#5bk~=_{Amsz=Ki*3kO-vi{F#) z8euJ!s6pbj`bef~xe5%uWrV3*X=_;mPYGHSMgXG=WMh{GpsI}U+}?^7*-|SSdVv?h zvUQ`*#O?cojyoBQB3H`cU>FPslg_A%Oozh$S<`KwtnFRgHozWQs+B*p1(64fMjUzr zzT)|=P>hwf)dN_xLurnXhpr;F3h8O5ecf$7ox*TeU7l`o(#M}!PpBEH@r zjAQ8ldN2;w1Iia7$B~3iflG*uo4R$}IjAA?4nOAI*N@!*uj|17{Y<&xC2o$^X(te) zR4^R6eo`M|qYehNCqTpq5BaWbNN6+)BhF;WhitaRUqK$53p~K4U;@2w<=YQud#sv@JH#>{ov8@K(BZ#ps`vw>^4a z?n{_l`&Neb1yqb*tgT*OxOQOt83y(U=GA0bdolqJdvA`_yUww`Yy+V;kev{)Ycz~P zK(T)0`av*s!*NISIz!L*yAw3;VJC=2-oyAKziaNPC1V9@i!CI!Pc z@9+&)M@P;Fnb4aj_oHAe2PRCR#9cv2rIEyP(uZ1w$O0zMU&6n z_+(1&B0~qaqTJe0zJN>_!Af_}ErH&|8%rTZ?m+bVZa*9f*O!x?D<%Uu>h;1--}C<- z-o^Rr5es+Cvs@u>-#p;I$z!86XPq~f1-nwYks|YkM+TXsc~c&ms3VD4*It!?@s>gyZUqX^YQRHSvpZztF=0Z+j* zdkju5HLyB2(D|z#Pp{rjf8L|%XZIu5CNA)Vmu3HK=JME=sXoKf`O~=a3Q7M4?3_0I zvm8Irx-UcTex)7EZg=E)eVOO}2iCp20JEL&mg-`-3HtCM~!KmlEQOAR7 z{={?rQE%u@hJ(&zI1IXex6@?i2TPUcB6D_yIpbsc`_b~1B%J@E?Jpu`BFov=WT-%G z;AUy*sC;#_S?>+d)&R^9>Ds(HMse_5k3HfF&>GI`AHOFL1Qg4*c?OT*)uW*w3DeZ67-OU?6pyhpqX z^+jH8I1I;QuhVyf;UskXz5c`%eIWsHd*OI65WPVU_n#)6i5PVKz#a6Wq1zu0`tBt3 zN3I-4{c*3?3rE92)5}eBn6eUyGZpmj7}Nti-P+ro{Iyg2+FQ36XJxn{VZZxvKp#|0 zVH}?IARIb%L-blt{pcOL81_VtZnv+T6#Ag;OYnCoKm>lY_yT>giY0*f535q%2U&`e z5nnLQ!?09tq5p-mr7`-qFmmci{8|9JRY!4Gt--NAS?3i_Vgo1kM2f}Se^U^(Nc z7lxf-I2cVHwPDqL-q%aM2OatAx?Vh?D{lRavw%qTAR_2*y5-N+x?x4Dk3Vay#&3eD zF&Ta)x~Zzz7vJpo0ga$FKqvfcZ->!Ugu)CggPrvD59 zWyl}+(`A~IMN`@ZZ?spPMuy>ATj7$v41eM?*BwUeZC<0lS1jCU>7p`f`o{xLw+CI1 z@>bhfQ-$wp^Yj*TxpNb=Dygt&`^@fk-MA8uT+@5d>sN$khZf7e_2z}8G-z6KOQO)i zBUAmyqXIum&kcX1oylrw&oyK$qF2~ajDHqL2}L|rzWpCO_ur1G75W!lyd-z_&Gq?d z_AGDs*msS}-u62G`ZvE` zxhUIQ13xM9e)Jq4`892K{6Blww%o>%WPb(0mvO`>J$1i$pCpfO8@9)5$}@WKgrlw! z!yv&S$hEZ&Ip!nw3-;6IOE$B*aU(zoBrYU1bcAgQD0FvKS7l|MJbCIhJ>G!oE9OY! zjgj71=RZ!ENgc6uDFb@67IIx=B(=`aKG-oOdR>|R<@O(51QK+*IKBSOM7dyo`cCJHZpSGcFBYcGt?Q=0I_r5lJr{m;l|&!FwnK-f5`6$|IP?@Gar; zxA3;(!ryt5UesY&sN8uklzroLS&T{hu&ysG>NOE=NGokXV7$98I=5Tx!3~`s+dFuk zyL6G(&>mMCm&23gA8pG0FwFPa`0tQmI2}+DkDK^GlR#!+i`bN`+Z(V^r_Q&Gk@e!4 ze}8m7)p`u@v$IAdKW#AV9nxG|mq*?K^b?zSO7o!K1^UZPe2Cue1oG3_8!K#u$RzQ= ztAXIOf+&4dF{!9anA5FULJWP*!C4E5TLVg)1TJNV7vd!d=ZZ?i>`x|1ZbgNJb{dqD z0Rj^WT-Nx%#B!_)d9lySMHmjA;}pK^)F(Fs3!hImuI7|2mIIO(NK{zXT(>v48s`uO z(gt{7Zey3pX&iop>ZIB-sZlb@$n|4S+R6sycC)d3!zo?aQf!pSEa48S#J0D&VpWy_(^AhsMJIlwsx3+!z2c49hPo3?(`~5fr%6yW%AE5?d zl99t1^So=kl%O8f+VHxWy6IoKPabH{@ctU_iPO1qw`C$07QKh87%ojBi+hKQl#3FD zWt?-J4wZJJxo~<;lBL9OIQooq=!b8{chV8~Z83nD+n}yPLi54Y4z~Nrq-lC;pRS%` z7jM>#7@IZ!udC4Zm`~fVw6k~K-7P|YIL2{326?bjuqSNl37dMtrk=2=4+ERpWv#&v zZAW-`?!I_gux#N z_!q;~$2@&9n7&pbtB0-M?0*oWeg1XwYkCCBvTJiPsS_yma2jiK<8o~*Ht1@5+!@2y_>ARFE9D>k=BgE0JKvb0yNs_WIp$DI#7 zUu@J3!(UcZ+1w98@#ur8T~2^G%KNOYY8w>iYjlb`wrSoM*?r?x^n~_2p*@ch?YZWu zTw7E3R2s1_&i02OGI2Q6XJ`8I^Ev@9FT&~huxuj|@a*1j9?e|gIa??>W>C=@@GK^% zRXg-D=BqTJoG%?lyx^xSSCHOdAy3BL zalun7)1OiS}QOarw(T5TKSwMg~&7mR1+tF=o zqm`CxA3;ztj$#ZW&!8(X#ch(h@F|BU%YENa%2;mf$Ni`9g2<7+Yk*)m(-Z3 zu8wCXdeI5ibQLtyrTzR)R&k>O-r zeYKKLzgX0_UvW0AOA3x9$W&3QlBoEyScMu{D9J{QYV4z~64|aOWWExly|53V6lAya z^S*c&yQ}D!FIt^(C%V`DkjWF>6FyPV?+e9!J{-;+3rvU#y!sQoS|R#)w5gop_31Q4 zF{g9m2wolS^W3%-v-9SMm~a43&!6v08hIxG?9w?Ew?UexB71KqERI71st??Ay}?~n zA!=J3$@>aM(LWto6az>VqY}1Y;6WwiI@n~nEWiq#N2O9b9bH0>K?g2bHj%YvfeG{+ z@pFk@r56gK)dfmqqDm9WGare(n@r0(evh!JYMG@XoW6o4nf6SL**5lxoT?8-a>HRU^C7j zDvYB7y24(1Rh_1u2A)K489i_85oTZSwNLD0bj)o|4d=v3x3Stg zlRm*2RV_{*sWQ$t!y-j7Bx!9!F*%pW-2;oXJGqR**Hz(rO{IfV4_G+G7`N8riVV>+ zT))+>YCSLBP?TL?~Z z0q4Kg6`WVmOU{DKq;wO|MpY{ehFr>ku93>El!BxJnzf)EhSh80aT#zP<){Foe6*aV z3VfKr!Fr80$fA)A6pvE|N|NDqC2LR`O_amFfkyLWBL>&GGdo;+C(%Y2kI$@xOgK9O z+C_^7TX3|_A-1JmrM5f)6I!|uDB+d=FvdUz7YzkMQ~*Su6B6H_%sY6E&v#R0*Fw~^ z5F2&W_TzxgM?39sF+M``GW}|Wc8~be9|hGr4M+IP&^2hx+!fEf|Ij~3X%fywoSH-e z!>I@{hzz*n35z>h;X3R`j_Iyi4AZgQjsDVfT)zzCPjU2L^h3W4lJD}R?p~xxyjP@2 zEa@)YubBQ$*WA5e5c^Y=m`(BrjXg}C@(F)9oQn0L{!L3_P1!|!vwYT!7&PxCot}@z zCtZr`n$Y#jch3gX9}Ry0WN=)<1+LVVAnawF+x{8`F^tiRZy8tWTX#1232wM&eZAMh zAyRE-5?L45_V~?Jt;4RK`RqDOSz9V{KIQm~ob_kY@o^d>JjOT!n z7c>T&s0~dMxEJNW%iMgOzBwA@uX~y7dl04Gwn%EB9OqgxctKyhV{vRFFFqNi_lt{9 zHp#QMN1KX&FOW+k$n%2$u#zW&=F(FHl*#py>)N_RdZz_iI%#>7BDy&i% z&teWPhyo^74l26@(eel}CYK$TtX9JNxX(rtvdM!a;ZAH3xN=aGcV5ftjiLE2OVlY# z0kZf4irE4|Gmif;)=S2%Y%-uK8Bqz1HO>*yD;fwnS5Sn@Du@3xcuNamb4d!HnQKr+ zMDVJ3yfXeUw{kX!Hr3}XGNgB|m;{8Ib!P4+Xr#SxEflVB{ zkgEWvi~;Ldh(4&G8$_NZmzik}#6$;0Fr-VdLKW3XU9-})NxR}`1|TP9&>Wz7X4n>QZ^1>h6E?FVg47HR&-_|^ zF>E}|Z}8pceF@v+oWKr#{Nvg5K*K;41szXh3en78q^sS3M1u86)q?N5fU{0g&avP& zN|}KwlnAuX-o%f560Bc8YaWJJ{WtAl?kH5h?{h{Eu$ng4)7ihE#*=XGlW^~ol*^Np z%fE$i?_u8Dn#9E|JdkfkXT8$?Evba}t`+mwaC&~yWvlT2CzlVnT7<1CUfzOx#~elq zk`o)u3o6y{5KLvjNbtqfC{rcRRiqqi;u$dfltkykASW3Hw#Mpe$VGS>KB*jGGX{!h z7=AcOR5KAlE33S%Miob(htkAH!EmQUgICirVaSA`O4N8EqM@aBPM49+V#v$ENFuHU zA0U*d!K!2m-ZT5k8~2VSEjW=9sG`Hw2$6VfCPuB5kU{I#%xbBuW>5q5R76Dw%L|A_ zNn27ds!>kxme>c3pp*#~n-Ou%It59p=&KWgTj~M^XG##>m3+ds_^u%+7pbm>m7uLC zl1OzJ*kN2iM^`njOsj;pk85`DOpt2S}5QL&75phg)*k^$sFNSTS zQGSi9{Bm>EoCU3$6zGtLI2@&)Kkf@4r{Cda>0fddXJmzNHZAgN4LBnJq*Va+bUDII zDKKjKv~$jBLtp0o(d)9k7llZ4y%^8*h_i;~Oiwu*EaNr%=e-o1vYw_dhTerFbqsi+ zaQ@lELgGRjWse@Nb9eOn!fRe1N#XALf|{-H^Zri8_R#&gmKOSYoqAAsjZw_&miajP z=HzS^rcJA67uAGbjxNLSwjx6BEyTG#_IFxF+l0HbaP>>N?Pk&HT36|iG3-9g#M&J5 zJ|cz9liCM9H2X%n$88R_UUq!D-1nXQ-t=a4f_};6$!Tkki*Y;}UbT_Cqi@_l%vJ}| zuZd;0=PXXs%lA}|^j?Hz|C&*&q=I@3_e=Y>0Vu_u!5L#YRf<(2d^kgSdI7%TGq7r1 zlr;)pbSDxt$~0Zjw-^pbzu@#b$9?)Ia=6Ab&;QK`r{&H0kkjyM@73XNbQ2z${hfF2 z+fTheqx-+kt)0HmzLTH}^EG(n%FlmsKDYBNec6Qo?c?qcb^34`D0H7wA;B~p8)B!% z-3|MN_VEI1<%B8+pQp_cmrvU`4e;tyuE@Xs`M*D&{p+9qH(1@j0w$ScZH}doh;5|4k4kfB!gN7QKe!bN+Hg`fY#4N5ukd4lT*ccNj#g1f9Ek+ zFfKYYsMx}%$iXUJjq_4#wm@e4PaLU>XM-=^jIM?$kO`y`rEd!coWuWT@5+|rIIirk zbl_#=FfNt*!g+!ylcNWjj3I4F4l)$El87PEG!`>32r&E+{z89=@6GC+jb=A`rNjsY zMG#%pRase?=iKF-)3BCe(2SYRrkw>mu&eNhp>}%MUK`)mJ6@y(Y`|mLeaeHJ-l-x&Ps4Unz4}CE|jTx|;b` zg&k{7P&gAlu^Nk`?6v1S3t>4pPuk$z<7Sn40B#K;A9Ctw`Q{pm&OAjZA$v-|bJ9~O zfJDvYV%q3@zm{oc+kVAMtX0w1(DQ09hlF<2Ra5H z#9|SM&sBMgx$V?lG17GAX1N0JNkxXau15oGOK%>#Jv0aLMT#=JGcNjqOo10!!yGTL zh#8IMc}b`5Ps`ce$wT~G7q}RHaB1h1gEp&QW~wd1Sl{Ccu;+e^ElVA&=alg1Z3DT7 zn~LQd(wk+4WD0`?oMIW2780Cu8bYRQs0ltNN}5U|tFwlK=Tr%9ivwS{1{tl)+Q-BM zYnj?yy>x|S8Ic1@ULXeKfWnl>l(L>@+j{O(ib62Txh7D;YNU$POkZ3PPH|S6^Foo* zI{Y_~Qd7@;2;f;(l!UO-3&yx%li`48=cfay!pHsd*ZoTpJ$%y77x!+fKdfzfyYyXz z>}oXvGV_eu6*Q>_vIh`Q@Z2F zZ?Bui+d3x4YrN7SBq@a?SrU?{OjbZBDS`J4UvH6Qh@^~=vg4WM0*nULITk0vuGVe3TE51=`y*Db!9EB?yNDPHc4)HngSk4a3bzhS@ZYAJboL3mdD!;Tra))9po%MaMCiEXQOGKm!539 zX+ZvRyN!Pe=dI^%54qHVqRFnUJ|b5xmL_nIunVbIKo+D6{+I)=60un0RMEL=y=9OR zf;Ht^=dVF@7p=<;nBkB|Q zeX&#ll@}SD4zj2`iTeIpPR~A^;(FD4goC_1-0Q}429!0)3gSh}CC55$HIbRUJ5SdB z<;}F#*dkQ1jskpC)&;_GReNe<=J>Z#K^IR2oy?e4w0v)(BzK$V+~ITC-G=iuWx1=A z<^P1Uz2_?LErq*UGtM0Nd$7sSRT7<)njwvz88EYn*3k`s=D9E4?e@KL_lQTPofVhD zByz(sB(79YH7F3iRfuN}-f0OsiCV2JF3Tnp>$!@OMG%UlP+W@Oq^OX1b(*sxlBcrt z?4_|GFc3MA0ahkS4}?2Oi=tRyEHpcrh2#8W38!`cwvB+v`lAy3~RZdlo zFo)=*BJmoG@h&A@jbu{-AwM-I8r0pL!1 z5x33bE;u}DI~h^5iv?lf-cSf&u=QTOr%jc*Xto88){J@CKvJFA1DC2jX@&4I;Eyp1 zo~?3)sdd1Sy1z5-lSQ%_3mXqd>m$W3hvB1D^fFfQt=(be{6WvtgO8zYfPQZ|h}P}k zt2VQ4ueJIsR$LV;&aHu2G*#EHj9C=@`ptI%EG$F&)G%oG)n=c1tc?P_Gxf?3d(Ux$ z?(wxC}tD zW%e9$WgN6n99%AjEF`EDCR#4(V>-4Di44w~2)Y)Av`1RR%%1C9t&=V`+lyR<4i2;t z_(zBWf?=6#hmr7Pp<|%41yh>5B$$*lXp6io7Kc}Il zml%wzj;oZpsEd^PnMR%#xq>VWUV@J_7Lh?_NlTekNsMCGOh*x_)gX}DQQLBaC^G{* zRu_$2FUr)UGPR9bJN%`Nc($4$D(@lklC0L%nI<@HWi%||u*XmowJj%b!~>(Q$Vx** z##ovhWi`pPXu85LO~@d<;0%lstV$k?b-bB37h_49)8P0bRf)ReuAU)p6+G(PoVKgd zuEpDR%7I#{83d`Q!6hp0O^tzxDYn@!z2}#-CM@5OG*;;!;pCy>+o*Mweam|v-r)T2 zJ?V$bc^0al-3eZvb?eQ)|M{;QdD|5l9S?*OIvbDfIC?+kVe|*RZ+;nshsSQwcLI8H z9XY+c=#}=J&1agbJf^#?x?c`@si@wHl<)aSi2*4Do?~+{{hPT?rjPJu{(2e)i}4)! z!lkcr0`LAhrxzD@-hZ@W)uSJAcDWNzri_*r^LQKu|R%ov(Gu3af1a7-R@hdJM`%s1) zmwf+3*R>Vb0=n0AJGt35Jz?7geo+GJTPSO|wkv!_&7&xu4b+NSun%Ecn#H$~m`;_4F8QMlSe=*>m2h8$2-$$Ic8L z&*+k^hd_rnr}}i#dhKJs&5L2#&cSIv4RjH9UCP6Ja-1Op?pw{qP0j39n_eKxTSy;4!N1|UJ2wsE*Rbn23X=gNnj;VDG$@&srILMXJq6xc1aZJ zP14y~s9G}o((1r5vII!6W+aK3m)5#bgmcPKop)(i2AQ7A$oW(Zfvn_1P(Ui?J@T-U0wo5M54w0U%pb~V zAx5c?wkF|}K;qhLCUa2LRjENcgSVi#foNj{AA>epu^`-(!qhJT!Ohv}aqll@`MTL> z1zeXe!r7|Y4-;bBBOo-XM?TmDE(U%()c7B!Q9ptH!R360eGNXf!ot0xl>gNky%Mb! ze^n8w97Bs-@KniLv>5Q2dEkhIeMGKXQ~oj#@A?n(<6guSJ_~n$D@^U+?0ZHDurH*9 zc3oG|31_(dxQdQ0VC8VDCiPY!pa`--u7ZJ=p@O%yuo#rmoI;vPDia;W=s zcoJq&xD^pZ%oLBH0I;eh<913Ck`{la3lz;Hh)XM!MSOubgqt%J+c=ReNKH1)s(NQ> z*A+_R79I)+W~uO)(?D6=@2!@ahRQh_&lrlR#w!Sle3nzqq^DaE5rj~Mb%8S}LA1aR*1s3u7#6wE1ZGsw^*Zfpog<+#?`2 zVAMN_PfQzHo(vAyvZ3X$J)Hav=?!|dTZ^A%YiAZzU+<-DaeD>V-xad%J6sH_R>iP) zU^poS*D@g2jtD*#BL@N&6);}Ca>it7$o|k8#k8s%ilZ!ZDg~kuR9tO%DqJUNDYITe zNZKH1tI3d@yiNquJOu8U;Z>?E#f(eh#RYZkzwUk4e;vyzc8Mc?J)NQ+Nnwv#h&s`W z2fY_>Cj7T&+|B882r1sZf7?}!HoNnmzy0ISpN2w?dmr8u{Gy*pdy$|+Cr3rUZZ)eD zHLRoZ)$R9xNmgZ&u>h+$-pWXX#pHxol(LM6g4kYsLH%DJ5BE9l3a>4ta<+3X>visM zhxwijmqc$ZSu}U9t^*>+iJ|YWagjYu&)Tvxnl&5mGMK2o8-MAG(SowwFCJ&eUUUPw z<^&L=1|IkOd7^M- zKTMo1Vn3xNYys6d!G*VmX3f+t@YTMv(8p_NyYfv6*xVdF?`X&H+1+kV(Y2eB9lNKt zC!!LBZ^GI2K;Y_VB_YgT`(yvFt~iQHy|2os;`2&2qbOjtFrkQ`vZF_Bm8i)f0V;R^Xk{!okasd>{%%pgtpoiMk62@UQ4VDvX7M2;0gyS7pPW6avjX36<6pI zwAY-2Q1mfR=^v!&;IpDklFd9(j>Kh&i)}O@xk{jN7IsjcNacU2S7s3d_){G|#tf!EH1$y5!IL+OkT@#~cpGJv4!e&q{t z|6Hi}KH{(zXS1VQzz6DLQ=O~T;GIef!D|5(?>E(?tg&S>MDXPFZAJ?Agq-@8jtvY& z`<5wTpV+m@VC%n{1$-FnS6y-S%cC37?eEZ(A;u_02%kQ zAOhD~SlOh9y_b?Z+R=-vh+P6=7v1F3RKyjO1(|7sN5~L7HOA>o1&0++6g+Ouq1qS~ zPqO6LsvCHAxYt8z)r?+I>|7g!9F=86Qc=p%d^=07xUG_yZUQZGg%I#4FO200zc*!y z_U2@wVm^ZPxDjj4B=}+-h*&x9>N4Zjy$HJ?dSDj8Lp0=%r4S*-=DCR*d?iluF_O&X@wNZBdruSfQE}lah=< z2#}R(G&!ElF%}`^YC}c*hKPtjp3aIYJ3*AFsFV|*4#^2~#5pA)tcr%bJ*{_ExvU{Y zZt>a>UOFh=1{77{PY-*evH$l! z|J4g?5C4CYQS0RJi`fAm4bA9FMkgI)CO(Ag-L?5m49v`6EOD>xa&e2niA5!_3-9~= zq|Mp*mX}lx7-&+gY;(E=U(&%(e|i6+fAj_Gw(QJBgwP^sBOx5Xm8E-ZgXcKx%%_P= zxE7bglXnY8{YTO&dH?qM=r>WcytAg$Y-{F*OfH?EPWqG~3Mvc8LVKx;#l3G=idp+8 z`rFLj_3^igzIU;jRQS?9d~vl>j#J0>z&!PPCvPv=OCtwvEtW4JC)<=bq29be_E zuln(OH#0s9|2L^Mh4@MjDe2cdCru|l_n0Z+BFuWNJbI8an#{g3x~{|K^ka^Y<|ef399LK zNGL7EgELYuBsCz7i=3*&oFsaK>=qejF_4)?P8BUu*~|qs0t(M-rn-OPRLYuMw1DK1 z>?&@Mp=G3h)^Ud?%aJt?Cr<(4!Z{?NERm%IzLJ~?7YR@8kaE-6D*jC(n*s_DvpvAAXBOqW=ze!d|z7k@{d5xHzrq5+l}&0!Qz0iV6ch zn5Jf`@u?v7=Q?nlbcPARwo{oit|s{pdsn*K){&)Oh0ve*2=nta_!L0&D_ct_`9DEC%kx~la2JVDpo z?{o{DrE@0W`-P=8ypwx#mreqtiC6IBY`6Uz*-&K8jcbw5p~?L&3)Nna04_k$zXESb ztZee&D>5saMS(oucM$*{YLD1GMd~IyE#K}wYvZf8l!s>P>ZR?sy=A-?lmBG<-4@SImL zCf4Fz6&P-*RvWKGGL4RRbZ(=RhN!Fn6tyT>i*=nEAsFGaiA;##6|=flx?O>E*+ zoN@(EQ7}E4pKD}n)JH41dbW?{qt4K9w>hi3q92gS3*+f6 zitLz8R|de&;Gm+`xke#W*ouDOi4kS{?EqVJSyl@&RRy+1UV$+}OgYoq3^Axq%@M10 z^chNxZGciF%gM2f6ImhB`ls21%(tu{IP0JUM3h++-~9Z_e0%w^{8~qUq`}%i zcW^CTJGH25cU6KiUzy1w9DrJ*-kZE!g&MFMLl@NZ9j>%grDxJK+6X-jkg6K6&>k-} zs|sq_s;Cb^^s!S3!QBq^qbmr`FW)EWz+Dzj?}yF3>Pnmg>CVlo`^La#t0Jgb&t0E@ zLZ3~U5T29-4^2sMtK{XxA)H~bR#6f%CU88OW$*?lTgA(KJQ3KMNEvnP1CA1oPx9!L zy+yv!fz0sa!-!6BF#s)QgM7U#bmxp3Hl%|D_&rcE>lJz1 zxMkG3qU!KCNv&%)vIY1in`T-IP#bqD6bev-iITagi>qD>(J4DsGFepHKpV}y1z5Q= zls-D7|3q*#a1O$TV6#^ND1M4`SjZ5KE+9)rrBW=R>vz~{wTMoF%*j%mB{-vDA~gD= zPM8ISw!LfBC08k^mMSz(e6V^G=hB>rv1pq_*9VGP)s`j4-i<{=gal;1rq-Ny7PWPy zH#A^VHna?M1p_7p%@`dzn?T{KNEG66&J1gE+BgG6a6^Mrj{8XwWYtmECJb6WTM>f7 zYHK+ONKY#0Nt0I|SdW*YatarRt`z5tDNcbdiXzIAn9VeJ@Y=PECDO0ua9BZMIX#D- zxuiTGvwKG`tW2m(#?*ta7KPCYT#?K!N&}5Z7j52_qMWfV@nN;N?2C%vCHITaU_!F| zPHha0V*g^}0yEVg#$z0hPtN~kJbFte@%YomDYyglw04yfz$`^kGC+$=1utx1DtP2p zrHnF(%>o=H>2UzgW&u%7sxU&Q$79!(m32M>9 zrY}ZP^lZb|qraY$5g*aG^>?)Z6?#6J@)FQnJN-oe7bJK@)Cc&INw%HVh5)1E>(#QDIM&#W^!e+ zSDLIsPGrZt5n!|Q5Ccm&U_}v)aK7;_zGjK2wh)ud0!ncWENkt>7U-i^u_-btsBU9f zkcRIjI5H`0iZLLBO8*yQ&SdhOjj?O+>E?q&MTR8xZompr)xaP}l#jrXh96hHc@@3$=e08!+KiF<;8gP z!$}t{IlZ_z+nCW{Rp&zAJXUrttWm|;w21T5`R+El4O{unKGFT<4eV4DGLj=Fp(IAJ zI?auksDaE>306y4*2`V*r;BCXjP`zC`R&-U2k%|E8NIYCnuI6x(G&XU34Qd0K6+~B z+7mzHHv9iZiT-<|lOI0AzYP)LVUFXfmh-1^yf3`{X(;b8l*^fkr!m}o3|~|DR>!~L z={q{bfsN(lunIfvGgJkBqK$^n>U@B^hkeNmy5V6~jdtFhOmG%M*n; zsY(P@&^e{hbskZU6RA#hEklqNXO>>(M>+$$wY z2uWAf2`a6Rl|p8p7frKPXt0KqH1 z<=oDSKfj;bG@j3=x?bS;Bdq}1d^lP0175D3=X%ixtdn0}T#n9Yr8BqCPv`&lKmR+r z=|NY1d-bdFl?U`EUir=9L+`GrVzbMkRo2C0D7n%JP$>g43v5=p;3Ym1r1_>y z`L`FBmlu~uhrid#YkTcNTy%zZY)=Mke$$~@`tCO-c>V5#e5JLwobS6b z@{l*ZK~{#9Ihfpsc7);RA-8(>(VMFauFB#5aB+FIEG@Wq3JA$lfOSEu?R+zBG#KjyODQU(shxGIxH&$Smfv4 zm%Xc3Gu<=4kXN(bf_=nS^APOWk06%1!FKk0EH?3@9yHfkzriQ9$w$eGUxib>noG_~ z$92sBW4%n?(69VrfpSV{Hypx64ZpZO2}^~cXM3c}fs%W&>xj@bR>nD~IR_q0iO zj)|l1zL^<^7iW212<)btkr}xsJaF#O(XUF26d)THvS37-LgfuBrD~xy1*sHW#}GLVO%%R+)lx@LtCWim zHh`yC7>wZ%JJUxBex%l!B~mz(X|ila(2bj-nXcXy2(l`OzQq)k)k5;#=c3d}s|HnM zx>S&!0cs9}(#m?qxJlm=o~}`puOVl_I5tBkqG%axOF<_Ub53#URU&ePQQE4>I6rRq&mBz*XU@U>amLhvKz|DSIg(TOHXxAn1T(J zS$6_3-^h6%=GsPZ{Wo;wp~Y+&vHx}%uYbc-+6H@nfWFc0!1`}_;&B{{m!}uxj~p&q ze~t@azs}am;>4Pwh&8v`s}TYND+YP8h}v>FDv4BlmfqqmX7aa_;3l@}*#VD@pa@8Tyu?)=zXPXnoWow4IF8OfM(h-W$_a+H)U1Vz@WGb#{ zMUGEikP7^CaaNy={vF56zyIR6wzYkj$;-JVVb6Ak&N~mco=Kd{WaY-A${JRqNjui; zkaKR)dUq`cd5mR{L0RtJBJ)-T7L&`XMCD9}zKaX)$8z40jk5Oz<%=eh%@sijO-`5T zgx`*f>?Nn@gUa6A2b8Z5G(~z?6KIe5)>|E}g|T|HfjGL_GlpB3xjBD5KjDplCoxT# zFA*bm&9eR4#`4!FFT}46Gg6u5QoS_v3k`=+ns<0H- z1^kqfN+nhkY}}BIjIhd38_JNf%UW{_wTwmQ)G|09SQEf;zdJbyU=RQ|Xibr{f>JzC0OPh&IzYD~QgHL_c3UC>o^5WzX|R=OG((D|_fL)-&4lVLR5IZ-^uoFIph}Og z5xnmgazNSzcd4K4M~!YKo%S&Gm^JL_mD5}vSo(Kewxtbl6N?p@hp1!DXD1hu7h7c; z?~N7NHt)EkyFOX%(`EeiXdsvxoW?~8j`helMnlDZBet_0GI!mBl4~o1tp`uP?T%$@ z@YsgPZ*%0WYx zrDJZXh|xfZi6!Qg3}u13=?8uRJ+nny@?Yxd$$x$vR_A*D`ql9LbpCch+nHv{c;fzD z*JS1?GdejR492h1u4&HGJ({K2FFe>-;Y)K7T;ec~`)$yP2w7;AoDA9)dvv%g2}l3E z)%)BHK=kD&nyM#x2`4&-0Ek+X>)oSkWA3%TJBM9W~{U79fmg(&M@2B1WE>0r#dG{3PbCdeJi*bD*o}&jJwS!`E z`sV=-@0_8zxKL`fU|nlqY)XLISBO=WmW9t2x!fa~FqQ%licFaAu|x@xqD5#qXNhzq zwk`?gi>=Wl5Qz~9mB}Zi4IsVqC1XV$@_su0)l$d5TI~2YH+1~Jz3N2gs>K<(ierlY zXgGV=GM+frD=HTM3OYSInBD7eiroQ|5sWzg^522lhMAE9nKc z9_xiWUT?S;ezL)c?+$_Oa}Kg4&Doy}#^(YdTL;m}=u7Z5R`D1J>_u4Swc5eg9lFjW z75!Dvc;fk|QQuH$O5lg-JXl5f&9%c*dZk0N&+R3F#g3qLi3+Dq0K2O%hGxedwb|^S z#`zZGH^f;WBMJ8=T!fvs&%*kZPOs~M0 zO%skT&pRzBQ}JtUP}YTX9Sa~fTScsQ6@T}im`&B7*b-^PGxYl(h`#bAtuXQ z5hmy;oh-Ri0BKi^V7&wM2~1|1T%{`niIq;3toF7aR>-_&1=_ImK&@nStH@9a8l{S} zCW%fc#H}|iLDPzRSX=j&6xY)=PF)=%Vx)S`ZAJ zjm1ZPr;MXTx)40H7;>2x`*zaPA!@y~hwbfa|h;CMF(O8HqJ>|Wzn$nU|8y1V->MYgH zkkwmbD>jO+ja#O0KoTJ5m_F`&qv}L$i@~fdh!O!&+rWJ_IW2;5#~br9Y@L`Li@jKg zCK#1cCf=jiTI%rKX6^;-PF#oKot1ZE`_qb9Hm)XdwJw;4eOU>(^~8W=u3kT~DHhjy zOsHUe^t98tDivL#2IFXlykd+?9Mz}~nn(98gu`WpgTdk|`H zRrc}?Fk#tZr7LcngB2JAPJOef)g{39u5eB>Yul#aQ)R}!uvmAhS@WT{ZZY+Xws$EP zQgp`kg{20gG#$^8I+oO$)|uffXJM+r5?saxKb&?vtmS~f9(C-?Vc=4B{xYTw-(~D7 z4pYFEn0{Y|S#sPhK`{21UJS?_2BYR35RcPsk-${IWbA^4kJK)!?3s%Bz=!fmlBFD) zq3Ezt1Yb4Mz+RAMa?`Obc@t+ra_AREnS-^2CJg4cWlTWpY+XDTaFzz2wgAuQwo1bm zZH%LNPg5gUz1Y5P4UDi9UN+;%gX%n5VA_1Iu)=NZmMuCnEauz;GIJDI)nP2wG={fR zd|%b*&=wco#>YcxLBVDgF_BcuCmT$oFN6`8W5J4ew^Q`6++{jeac-$0wiOxOVZp$| z^lWWa);2B}@T&MZmKQEt9>d#m+ImVO7S;*yOINYk1&n=Mb=zJ%TciysGk^iw*!Bup zWjg0dGp@0ev+T)&U&zC@HcNsn^t(f~jrdr_gImvug?(F$aLSqj4hcI~uG5i!{hw37 z)}z0kF;;bRCUWlp^S;o!re=Ktl(2&qAh6Cg)3E_e&^@^-^BqI$x30Orc0}=?kDkZc z?+1u}^fm|T#WS4uY@nX)#ro~_1DhZFE^1@s`Kr~>MQG?EuJzIk)bEey`Lp!9i}d!_ zm-OmgN_uaSC3d;rPsZu-)!@wU7N%icKHy~}Q@s^tpS;M!i|?&>zq05AQ;A zq1&<2kG}q)9#fmiG55)Ynpqe#1iQUrJ7YdTrYcM!bK#YOL|9 z#v4Dq3a+)$0Ngux57-@0tqUMD0LsI5hqc}Sv-3N9xcc<-pWejT=spkSdHDx`=5B~7 zUK?+i7b%XiQ18TX$S^94rMZVKb7K6tE>rs3)BT(SEYc-Rna>|uE|i|u~>=)+K` z-ZY9N<9poUNSg=KD-Jc)@t`;C^SQvDa~fBhnquV{SZQfVr22uS$dl($nMgIbV62kX zkjS%~R%V~cW|Na$JYDXv-Yi{|qCA|nc)ER-Q%9_G@W9doMFpOLQNyTo7)S4_mMtee zOBqY6i83bM)B{hsjBoA>Lsg6P-63(tIg{VyKI4{vSgfN=d?OjTjXd*n@aW&p9v>fl zh9yDW<@4L0aL~&C{p3y?`QCKbVF4=7!O}j;@tIzd{fm{=WSXFm^K^1b(x?~Px3 z^&a@!OB&|A-QIQ&A>cdvqymRj7&8!0^U~QuWw61ls!P_pnCKo4gXWT1$hM-lB-DE?eOFBEy9om5Lj%M*+5k4Pov9X?ct|R>QZjRq%rM zZK>ng#MO~p)3*D?k8Cqz?k2>*;k9f?JjAH4_}aO8*Budnf5?pO;3^CV{5PG4(tS>F ztR^lUE*oA~V?$z(%Obrx2FPGJF(^4Ge5(L|#0+0*(}OepAOi>=z3jY;on9xt9ZT&X$Z(MXcbjp(u@LfW zXX4Y7AOCtXFZ&d{J9F{Y8`|EC#$w|BxF_ws)ENB#%zmp2KKN_~I3y_ztZ)UXYYUzf zzA$&+cNUqh6#Zbj2Ge!m#!3@wbhFx!#O_ogv55&h#V~;YL{#BB3rI46?dz(WfM!(l0(29cBYo|!shD$1EA+VFwJGyYHaf$)_^d<(wj%IaLXeY z&~>`gT1;h@1^usNK$mgQRra>IjIZ)G;1#?T=Fm7}U0Zp%EZT{w0CxH+(VIFcm>fF= z2LXy&3;<5iyOfADl4xBE*azPM@3jDLN^4Z6Ud69qeH42040x8hc&bom@_dW?GVRP( z@_LNd&LS%cuWvP&x*PD-W=&qe5zDt)Cf-?hN(|7BuM-23fw7nYf&sA@5Sf5vU2P3x zXB;I3no8C*!C!u;19|{~$7_P(JJGUpHrnWE3I??^De%xTFDPcA%cwT3Rd&wCNTK<_ zg6j=Pb^?9K);P&k+>n{~aR4St^Tf)*-8pVDfm?v7EM9?WXn2<0sj1+-65PCNJ0}fe zQIp4uTMv|)n4ZNqolJO2m>pm?px|5-6EKysQzcO~3ZQEzieL>y%yle;UWw?@@xJ&q zhBr*vnSsm7wD=Dru#?T=U@A#7+ER>y!Jnn=fKP8>#c24Dm<8bPJYqBArz|(;ay!9h z)iPK;V4@@r2%fSrFRtS$E6}LN!(2ybfBvqXoWdX;{Rh=1&wm9<`?=4&iV(fhcitCX zb6BoXG#PFW%4;=~GyYZCbIaz`LV1Vr+SQmnz=?-L;n%yx#8f*ti;*Kd)PTomJOd5z zV$wlE=RU?&aL`2upllHe`y&+n_XhmCrrB1Vc{?(=QDIvE39azpm3IRRcQCwgV{iz* zZhsd-gQ+)TGQn>NSYKV*F3?FV06t$!eBU^Yz3KxG0T&Q*sE^IjNV(N zi{RljStf|2Eyc`LWX4iM*iG4*t#iN|o30sO+Ue2&3aHl?`h@MCliPZX1s5|j)5tSZ zfO*i12gFY+9?WTz=ZxN8W?gH zxX*?Hhs>Enr@H%XRIoE~F2p4+%4D|H#(<8=yo-lyh1-;_UMhBQm4AWX?X9e{ZV3k+ax!G31gdFT)D=m8#m0Pskdp}!C8l{E$fxW_TDTsnw6qr`p7 z0Na^{1v3YIWheL=!QvLnWTd24!;-O24SIE8Yrqyv%im4ebF=_exGsW9&!M|o%vH^{ z^Uxo>(l?(?5oH$NXlV@_qQ-r=kW0(pu{kh&?Mcr@V2K(~QxLc6F5%EQL^2C^lw}fb zfO1EmCAFi@?uB(J#AJ~r4!IfdbKEU~;^*kp0GEOIB>dTJ3cyw+Rq|C~!}tX#Rm3?n zL-Y|4DTjS(5PO!S6&!mob`pRs!9Ig=nkEA~P5UkboA?2%x}lENZ%H^eMkrWP{7RSusjO%GUlXecXZgjutMr$ z7z=jW@5txv!OR=f=f1|QF1FE&qS`Mmz28V(`-WPm{p`ngLj?OEQg(hJd-gU}uz$Y! z-i~bbLkRedXC41s=I1Uc$2ZH7`s@!E>4ML^ApSf$y38Xyc*I+ApDWgL1=%kP0e=qS zFKgeP{p8wXZ#kb&k55m&z1HgX{DB0$2P8;HXlz(!b~cf9le!6@9D~uJvVe+J4=q#t z0*o>tdv{UutbpHkmI=_@W{EpVt5{`oH51}s=i08OpbX$4TQY-UIT;|h`MAM6*v-ylnqJ-X&RU-jEopsn0NtSzeovk_!}Xgf zF{}7o$}Y4Ht_M8mG}iG=s{=t}Omt0`wNzK6ZE-9nb}`wRY=L1mpoVB!PEz``iH%c; z8k)^t;S87+b=25&H^ zTdTn`?JtqxX6w517^jEY>WA9u57ddgJ2kU!q#7m0zL<*9s21axcd;0Di@l3x7|NaK z3e%aJ)ne)xN==J&s6@zZNy816D`j`j)Zm5>@I91k%C(rrKIhXVU8Rl&4@Qez^C~*K z>4UmBC1g{Y6F4B;Gxw&+Zw-~&OQs~sTzs}L;Z%4CXjk)2L!HSzSMl-h^9(EF=!*?~ z-bf|v(f22W%GX;dZB;&e@ED8ZsMYhweShx!SD$!1eML)^UsQ|!Q$7Fsa&2D0eXt%p z*R2Gjj~|~rKK}lAm+L+2Kgf5#Adlx;H2o`*>kB=CUp$++<-k20DhbV9x z<#uWm9@7SF?mWAd39#1R>!$U$=YsMgY`b;H>lf=}KWNAMVX?Ou`iy0m93%Laf_W7I z#c{1kPSM#`87l~sd7!qUU5*)s*hf{EW~kC@EYaiAtrm#;DYys7NuhdMF-5^?V${sy zd61f&x+78+(`cpmt)?|h4eAUf__A9WKW3y0jIj5yz+`&Nhfqwb#o}&x#gtm>Tbqm0 zRlNc$%;xN6i%M|J#NOEe5*k|AMKLS`l|Y3wyaF(UX~Dq?xE5=u%3{qeFBU@c9hc?a zS>S46CoCf<3i<{*xcV;ptiFRDHseZTQf{^^kIAN{9virzi*}1{HDzPYXz-m3I#udP zf{F?ymt$>IHG2*#Jm%s!?^LJy?DX546SG%r==;igjBUiBKvq(jnL8N0Or`I76^RrL zjPoI^{}9&yFvtgU$g9tw3zYaAFo%T|G)`z=0Jjz%0oZS8JRh?6|WZ zam8Muft92lYxJi1367!_&z#$oEf^XiEB0_VCy5+oM5YT=qp*Tr6r4p5H3M#1_MwGQ z5@tO{5U%VD?4k!jD(j$%8jwe2;=2*!SRGY0d^EALif zf(yt+N(t0JJd{K#?L5T*Jd*_Ad8a)@DTo`wZ}2G`JqdaS*|Nm#r>@~Z}x z|JO|cYiLnH$V~1P1Crn=Kn9nYiV>@zZE@#0v}!{qKP;I#w!#dhT%2(#v*t2=ayxy$ zK4ukw;p8e_&`^)&vwFJw0kz)CVQa_)*=D6ae z1nx2e@h;TuWv})?+um2&2JdFa=^jAa$ZKR~zj+!)PXq3eVHpDqFouwk7mF~(B8pVoez4IW(O=M?)?YGf#Xd!{ zWRWaVyok2^AWK!J_SrjkX2e=?Suw$X3IGQC{;Op8H%BSrx+k2xeXNb{DB?UiJs=SY z<+V%n6uyal+o^LI#HSLeBr3mnW$zjg!t~&Pqrn3QyBd4-*aWGyvc-|nRB;qfPN@e6 zifIBrZVU$^F^)Kehznj{aUrJuz&cCW(OZRNqHr>M{yKHK*?0kr6OP^N7c)!QmTDB- zL-%ZxgW;g!KHM%dXjs1GsiJ5j0csRwzx@#QF0#$8Mfh}OHcw^&FtWrYn^rhSbt*d+ zLr4dhqC2>nC5M)q=^A*@(KuE+b_Dvsf+UUvs7J)YHK3`HTegn@Q!P#oC@d*rCki;N zrv~GQUR}zjNRHc|KnH+-ob3Us33}OBHyS$L4 z0l&1~MQ~P8ii0P~tSoKos9_W4&51?pYg=n*0I2d43stz)5(Ss~a`_kmPm+g|XbRDR z?W6)+H}EC+Qb17L8om@eEaTBKu+}NJ0Z2H*l{SIeS zQMYdgRVBIUyiW^vVed3bB&P;;8l;^Zs-R%)$LwI})aH|A3EzU(!j)Ae8k~w_;PEiI zl(A#kIcl;|3a#Pt8E=Q8O_bE^nF)cE0O9=X$!bCIdIC6mJcgk`1(L(Y%XoLQE*zRT z&xR$S)`;zLXki&J9*pS)pjup|2A4CSx7E;YUsU7>$BH&Bb z!gk+g74+DVqheoauR${hG3m({WHk>6x_aOy$2*;4A3(Nk4QvOs!yXPI;y)+RVO zczEfiSzmPS#7I`@?52iIJKDnI!Y3>bI~tY~i?U&REL;QI!scFppTM>s5q~>##?h+b z?9Fy6oYj%wTfmGcMvsrNOxiiHp&fagE32y)d6wyv3>G{)++|BK!@5R1g%v-fGJM0S z9|;sIwFNJe@Y(K)gK-@&{-$@+`rxC2wTW#cXYUD*5ZGV~{%OP$#BA0IBMuWp4k*~< z1!mAobrHL4S1X^c+Ben*gnhB=IXbo?JMhy8P92NFv|8A4Ca_a#@hGPZc+TXYMH(RV zq-x8XJ{(@>l8wzVHfbyef%H8Jol&hT;INv(Z!t?s(|noZj08G4Y|xoW7O}S7x~W@( zKUg5IIE9Imy>X#QN|*~sr^1%IXg%#qWa(f>B(>{s$u^mzs9=o^#%a1!*=HxsIPhT8 ztOfzwZ4)F_D6?M#|Clxn0>-RzD$S_fq*Hfop@MKXM04|}=owJW7us<`778_21Ura-xQEEZ#@Zi0$fxcUle_xf8?`8~~ zvjVf*Gi@OrybJfaHw8h?zpE^CvVMCQA#4IH?+Q5MJ>Vh4nniJ}-~byAAcN+aIE11{ z8WX3RwAid%e-1~_%@G?^b%sUelj3CITEGE~qunj$5NhV|qMU5P2QJwI_LXJ{VZkk` zgCx7Na=3H*ga6AK?2qiHEgJy)L{lV8#mIflYf(s=zZXxC9n2 zF&bVt0liz!KDC**Gku4(5^xakVzFey#*(#yM}T$Pg`xFrK5N5liQxR^UfX5esLkLw z0%ZakwbITu2iSHTs@RA=07L6flxNJzn zSHT;ki|h!aQe9xfrmOhcAHrQ<8ZhFY*;M6kA3gimH%vk}9c4Ql#2jZ?EtMHguzWC>4Ftalms$72~G*K40s7Z7)3|l zr;+ypfbB=|x7LM%v62Oz{0+*#e1$biHDfB-4B2zF2q?zx$Pp~A%5;X8j z_EzIRIfRTe>ac?>Ii(JSu5ccdT0QXQtKR@NT7B<54$F6V1#RQI_SE)B95L4U+HjF6 z6?EAxBk7(UPZWN{V&Y{D(rN&k2#5qADkGR^V@SSs4$~^iiE$I$s_LT3qa!d(y%^vL z05BX`$Zug=l~UiR$r0oB5v1AoT1-`BF{c$d8;>*oETV#=L5*hsu>eZHEF2N2Rt*Qs z;)N8IRRRFV6F{aEuuyl-Vg#;Ry-+lY7317_m4UFD;NP)w6Z@PW11uU1h!a}|D2rlL z%E@<9K>uZI5OyA!FjE2Z13}hi+ET#bpn3<`S903slv6Exd$2|dS`k~P%0Gb3m zvCar)0T4UvoKn^ki*SUtfxQ$k&nCvjMjh`&)Hv{f- z_pVcjwX%ab4q)IJT}ZXs$H03Cu(4}MHa#JVD6?{-JDeG@6k!BG<#c~`|a!tG12A3@?tzR~+kF&Z4ObTuUv=opXW|hGW?A$Pz z%8NYpfOYschDxcJni;OL@qQUEdQ0N4Pm43OL@hI_%6Rh2vZ9SI&A6Cw#v2v}r=F@g zJ%GR9wS$m~hGoqHS@H5h;v7tlle={Oj$^Y0-GPnAXjdaLDpXgaE|rZ%tfsINfyNuh z&Us7w;y6}7c-#>SYj~!q*+s$k>cAMbn3kDj_1LqMD2t=uHeVa97YJpJAiU?1k>V5f zK1akc&`0reY}0&9oGWaL-iFyX;TXRFeump1i*#&?F3QPhFrv}#V8U54u;1_=4#wz? zWJfgc$iNs5^*9Q)kzj_^$>QcW?OIOj9GSTy#?;`KnjvR+O^5GgT$*CO-U@l9=f%Bu zr0QqjC1r+*;rHs`Xw}ZR&tUwbxjF-!u028lpTqtFF-eSCaAm9K6!fiYwncP`2;KX7_;B{l;m~T&K zlsMEA-0R?6O%IRlmOq0+8<$yhk0d7WdZ1u@3m$I;TYK*F5vH`Nc&AF)c90wVo5R5# z1?L$ysP%JZDn7kA6LeT8m`1#B{=sscbKmu`Px&Xd>hL|F50T;*e zGBUtwE-mnY@D|t=KuXKJ48X;RAbF<n42`@cq)KZOd95j!DKZ3ze`OEfPE_-oHkeYQH568`SCmht$FQI7Z1h47Fn!Jx&bR z9L}9Z25Qf1cDVVPEr1Xl4VR4`U700g#S|eb3v}lIn;Ui)q!+5hm*&-!Mq8lHY}H^{7BtBDthS*MN%pg zD1#r{X@XS`#-IC1tCgiZErnI0RIG$W@W3;2qPWQ0SH zjt~?J(k9hBv2H$Nvj~`eu!u^>naNZDFUtyegkcXJ$`obXR}U<#wXES1_Tdjj2JiZH=iHV(MufC#K?cQMfqGUWVYp;0!?DyZCH0uq&4Ymlv_aA;(`Q{|SDC=O=lQ5-}&zjLB zI1LmA2m~0G!`KW$TWiV6YZ<`6_5g$6@LdDulyt>SghOH;ls;iHfFF~H;~NNc8RH%N z0}dBYgV+iv`b+@f27;;S6~}s3@G0z&No={`c1i$*TBblkLkgPa7NOKI2!gMNHziOj(=et=%UgHEI4o~{H|g00r(2f zKdEyB``INYc-Zp!S%s?U=w!`#$>j4dbrjYfXO*9 z9H0+8i|V=x{OV_nV4`P?w}MK*sDeu{FPYfqx#z*r&R`4JA65wlSkf7##h0>w6v+AL ziHSwrm!}|)GnpOgy>7K3@GJskja|jVF&sUbvNy>ln$Nae!vV(jsbn8a!@*G>9Gxw& z3}71;<5f4eRI!RCWB3kCaH z8sJeT1xd?9dq8buY27#rRgD9}JOQl2XiU~?g9u>VT)@>9{cw~%EJ^?*8o(8minsOj z3jo_xeyzad4glVtvyBT_4**na#k>rNfX8l%lhdtn?#B-2$MOc@J~BO3VhLkq)xqpQ zQDEaB##Umbd*D9>MwOyHO#AC7^qt6wxvXUif-o z2A#gcOP>`~@GdJfE180=pFkhLLSS4leSQkevek-#e8&nju#{y~+b|&Gq42NDeAu*5 zuVO4cTsR5}d$(H5}W1}oNvXCWkLSu!di$tm}8ET(^Zn(J(@R!YIc@S!fGFtIbrV-=U4HBa!bJzL66i4qCe2i;X|u$-_1DOxepYKavc$6x~goTxLw#9*_* z_-J%(0$l(#b?{Qa-;m%qq=>@ zBEcIXr`|Hl=@@#0R{^%n6&@vxXeS_4=Fb6zgJT$);I}R;O=bwXTS>kJKo>A3%hf^Q z=)VCP@v`9yK{FAOb4Ge%9 zRT%298Z3gb2pvE~VR*xJ@)N;E0%h5F{}by6>XEEK4IUL+VeW(2m&}MMVg^fjjWuyv)MLCW=SeZ3xz3Q+>Sb;z3EJWyM(5Ev7 z5Y`YPQ@nHg(oF$(c3`f0ma5p*$Q^}a9&#Th z4g$!E9d>NX8A!z8!Rf?XV8oqd&Qu69VNoIRAjeGuzP=|Wc(4m&2kWc$7II;X5a1O^ zkwrPv^N0$EP^rW2+s;HDGn4D8v?0unxJ2+9sUaeQ-vK{ZY$)SslQl3u#PJK;c5f%j zbmRdWgp?m+#aRG?C7fdEC$6?Am;}}-2 zz!3ryC-*3WRdJ-k9rzZ11-!UHFwOy4c@G#Mjwo z$8?KDV8dDl@i1j~jVXZrSkWP@CddQ6 zMFWqp$mR^yMuY+PG3v^2Lu`70W``(qj%MgnV2VL|$FYU^v&rhNiIY`&4!E5u{#3nm z;2JCr(?sJC0RKDZjCFi7jAdEd>Lv@=whoS$@{A3o&47CmTzonfQh)=VAxqel2ACcK zGliSm(zD>cPR(Vr(oW6-HLzqn>9QdxAY3$I`2a!0QS;y)Hpc^-7bXSo6t;jng!Nw& zwqg$lTh&Ib-GZ|NTw`PRde#aiEH+PlJHW57&x@Bc6vE2Q#k4*3k){s&`!g}Mw}|k1Q*qS5=Bg#Od8-37M@{T)IvR- zCeGejLFJhp@jMz1Bm&$r1dEfx9Vh6AaW6Io&vCvymX@7$+f?x&( zJMuG~p*JnDR;DKzmuD+gg>5^Qr?^n`J)D8O9ENi0oJ8{r9C5lfzBFyTR2XPA{iY_` z)ZwjnhSQQ;!ay~a5k{*d5%>rDQjjFv99Anbe+C~x>1VoK2S1rX)ouPsqeOq>qZNKB zUN2KwKs5jgIO;Jh>$3vwSu^W7@Y3NI zB3^-OuAKeEOng~;aC0n~Z5vi5m30WrbArp=&1iFn;fWE)UxnqR^;E=%~ z*V%Xmn_J*z3Jq}D6sCpwId;uK*2rL&7NN_)nXH@YvU#%b*1>=iED!dS1BEU9{L=0E z&UmMem9;GAWY-_-*x-%vApLv8bmjb_#q2S(UEp%hbq8}BaT;@F8W78dH&sk_7lQs*}VQp~Ul47-FW9J!dY(L3E7 z-?#>29|p{@^P+B6Is#!8*34R&pvO(dq5waRu_2huTDgoHpr`=wEX%cEQ`T7kIY7q0 zI|D1M&JT$tS1cnKuoelOAw9;AN;Mqmc!;?0Z}cb_3MNw&)>F4^BQ~cuea6 z=`u+SH0Xhk1fFDG#D9UII1(o_GnEK=`+~8?VV^MGTQmg=mMu5ha-4%fn8yoErkvS+ z8nNk|#c&6#eP>o-I%4ukw+jo7{RZP-J3XgGnq2YQBDdLD-Q>XA;xrNATuHrkPyslXO6)EmX>ye4qS zfGM5};BD1j`Wf%jnV7(YX<@AlW1qTNpv=Y3qHFqR+3wYoS7%b`rXJnhm_dO z>j5>jyERr*ye^B-ZS3$2Cl#_~fANpb^3#<)@LA%Jsxu0vHZ7C^UgkuZxuH6>n;Cl? z`>0!DYzJ7B35$y@95~<ZP3zjkI z42K3hL${kU1)Z?{wBSi5sH`n7Gh3dswM?!lu`03=#0h>5RtYMT@5tC)q8nGgu@KeY zPNgGQ08kKXnW@UIi~}-+7?l|v1t|5sg?`z8x#|DD{=^S|{%Sp&*QlF* zk5*=>Q7s>GN%!T>g?JaWXmnnZg@9}+6iu--3sa^C}A6Mq?vwvHU zaCSetZ_Vf%?f!cN41u%(qJUv2JHd8>!ZM#sQz?w!l;Fx;z5YJFHsfUrcVFXpKIPRv znxw$(2xJ_#NB{8jN^z{lJl--k%Ty=L*Azxfy3;V*G}KMr;HpP!5OccBdbzUKkFPFC{u zdXc|cH?YYR_4w@zVi~ui-QQ-%oG$;Z##6(fKlq(pfBy?x7~JIrI6S+@^A}%y z`xNHL?(==Ec)0&i>zn?EPj8&{=O5B4dZ$OXKYEHsFj!+cHGc(AUo&=)ANb~R zzo8xs=K%lW`F8*3Z^rXgeEC-W^P8M_JpBJQ*Jjz_KmYc{@$7Jq*B^JB$g4r{zrum{ zM^8T$akcjbbwg$fW0#|JPGePOTE}84c$L)yb@LiOhS>#$sq! zPkk*oX}(3A;ndgH*H7+X#=GY5oBqcO=XqlNV4yvB{~K5P z>SA@{7>IP5H41p;-p3jXYl>=-_^ZUF3ovB4>CzPUG7_-9))3#0t^ zfBfhFd-UJ`@n2VO{fy85{KdySfBHk7^cA6+w}Aa?`Kcwb$%N_vb5Ki##pp>xiDR_0 zS?(i>3E!zxdIkji{RG9HW2E~D3IFELpI<%uqpQFC)76)&-;A&COlZ5>Cdl?&Oxs@g z=QgkH!Bgy>mohmHD_)PTo_zi7-VfKS!#DSUnBT8l{=F{iT??0=(~X}y&)XNk#rowX z^z&hYIPVf0e8`a5?JC_nU`D$8cEPeA?El~88sBqH+Id7i_K@Ry|MYLUu&?%EB}{2i zS4^nZB21{)nR9lnCd&>wUEP(|DK*M$bY%mD0O*t&HDsT?m~7jwIY+>odaA1I$|;@e zke+j0i82?~+3cxaQRXo+6Ll2H>V=J`tIVXFzHA9~-?W6zYZzk63HL@FEZ0UTeab3U zC>=Z#H>?#hi8nTVHvlgtbymy8jbPHYY;lfE5ly9{Ri}^zTLpKdMA`1Ei4_b1%K6>> z;X6BY7yPDnj<}t|#R9y^7YkqTCr9s;FRBfAZr4z&^*DC;T#e}{mA%Mr z&ZF<>57`=Om{j`eCT-hX(2fO(!7A=2JFzBb0IWT6uQgfiPApxWNtD}cfRx!zJ+M9{ zm*9sC6NV9Sv$8;GvF$zW%mN1)NA|!2ZLdrHzKG!Rd9t;bZT767DR?Ok%Q)Ui#=bzw0I9Y5mFL6)jt*5rS886lClDwIKlP|1_!nVw5 z29|zmH=%->XYzvmmWyYv9<`frOpd%_%{q&7CVNn|)ya;TvRPNeVa1ijK6&R79gm?} z=ik5{7ME&as{GQcr&u~qp(Se-W5fNN%G%A@3iipaXRn?sV-`*? zWziwum=(SxtOa*CZoq1Huu55YemiHc1sWZ^PfkdtR74&AZq8;|C!Iuky-%QZz_CJYtHuU zLz;No9^YBKeXRQ30^5Z%Usj~rk`Ej&u=g%DAJ3)`IhZqSxV)mq41cHqw@@PNhl_<%cv#k$GkLK@jD%l5HE?QSy;+Cvst z=3}$6+VsLXot(w!m4~e_t9ioiEFHU^O+PG+@NAZ)l*LLl75JNE^`-+>s<#jiQR~{l zf#__`uWTjrU{Bf9D@RRXCXSunJTh$cZ-ccB>>QK|du|E@Ys0dPOkFV(Okw92-+xhT zVsW{Sv#g;?_8d_#SYDS{R|2sAM5gVGlQ@@fs_H;gvF;6DRoW z0m9i0gR`L6Sc}!fK30YOXVtzl`4g9`oPkB>Wn${Um|yhyg5&CP!Ar0eyi4sTfBK;iSndPugp9yae0uQze$iAR&wOq=oLNQW|SS))D3%{2hb-;AwyK4^OVFpy!8X!cjQP{+$7j97^}gc_e)cRXdolkHX#VfkQ~d0I+{4npX5z#5gg3rBx8bLO z44>>khTQT7cgn{mcTH401$wU>qyh%HdIQUNZ(jTDs>l9M|K{<7+aKT4M*a4qDGUD9 zq~AA*Iz<6(C>;clq_>7ejV&s*mZmuk@m2`$3FbLOz){W(d;pj`1`25|#y7@lR@EDp z-?CgN{`2_=A+rQNnJT2>IYdrsOC1Jed#0`@3W3ld|itn-G#|AcqVp?heKe$Y%3V zMLF3alo(obl zbkO@3JmCL)czr#uDBJl4MTRda4J2iGbj@t!^Pf$e|Icp|e{em2!Y?0QKUq&MSn_p%DWHzqUDyX}D)C|ArmU>rxhu*`Ug!?lTHWQ}K^P9fmCd<%CoL@$;- zf4us^@4E3{+2g$6#eazh`#?oJf8WKEuPmuNGj>lbW%r7*%I`qOcUoWhJd^u9nD72s z6Ku*0Q%IR( zWj1?ADKM8D;IGYOagww4<&ViJScy5AO1wTgz;oTco#Q)wsh|VQ5_uEhsFMRX^$?-5 zX^1{s&tjm~9kpOJQpKrrGEQCP0IKF7j!MM?lT_W&`RQ

=$R^v2)IJXra#DKwZSL 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�^{LuI` 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⋙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

iHOl*u1vuvl z4Vshk`aRJ+lGep17KP9vbEh(j>bPd*lVgZ60cC-!4xck>eRHxIyOIk0^*XUKaXLIt zxmqpb7BN3g;9WFLfulru0CuF8lIx#H!NBDqXQWZQIN4QOvGvQNZ4j4Q+oZ*dliR2L zyO98iQHrBRUflKn$WLXiNltduOUG)x++3AWq2l5+aQ32JPkMWYpmuqqGgc?Jf8BpM zscjMef@Hak2}<5OsM>9~w9g+F24vjFDj}%LOPvPY4XDK+>Wj^qO!7?JKEzK7OWIa> z(tGbIwDfGaJjm+$#O^K~-A9MUr)yNYCkLH&v|#3%bVTrV zxqtZT&U%8VYvY-ymWtt^gTl@=zR>n5?ed6#(;rHgOoysArC7q}i%m|adfw-E7z3u@ zab-f?IG`L`I2Jrix&(GV+gzI#1HoCd5xNnBOg)D^;%%f|`;1Ll-^2HsgF=+uQ!r`= z-jEU$dp+*c;F=gPz>^vi<_A&k!m=@Uij(r9w~+YZ0NEeF7xo*pd*w>#agR|{O6!ry zO+(tjh4T<_uPUOAL{V=iW*jabNo1dD%rgX$&vaX;UA`p`z8l;$Gk<#dq=h(qx2M(p zFBy&A2m45!+RF89vx!*`Hs)V+?U*7=tboNJa0}bWOpJ&Bdhxn8MYnt1(vL-!=m7Hh?E-r0N~0FL z^=1T4-?*tj5-!V^XuW}Dj%xN2ELpvqqd{vTWd9Jc5a&>O<}`&TerI!rtb{QWRmXZy zMYFad{=ERMla}M2zxU-=-G_}V1KsTolB5DzkQBW~hwwkY0%-xu1O+w7g*uVCkxp~R zxQZGy7XI@4r@~L53FNIShB?pjk*af{Ky4}`8|LeTZrw(gxHLC- zPIwRS3|Zz(&DEdNNdy-o>(z+4*#$8LyUvPR#WJzS6OZ^!kTy((z! zgY-`|&hD>aF2CVBVgJHM3QfXAPs_Ln8!7s_WI(Ggc3+aa&I$2hljRcb33ZdcV3s{ycG44EIle$2K+o z>%S;tQANH6ARcH|9@cqy#pD31CUw@JCDoW6=vwM9k~%{+h3;Y!>AUZF7{Jo~ti_ojWOv5;tKLFK0gSc3(=<7gs8pa`1SAV)YiX`q$(< z7;e{mDLK<9?fb8y%8!2&rzC$FG~6dk=f0o2k;JO`Be`iHUIxp`sotigFL{j<-HG_HlRF z+3>mFg8oU9X8jJa&WE1a_vTi1_OoO~Srk?>mZ<)SlV0lSu{?esMD`f zQF0=3OhCgi(jlSJdwYR?gv_%Wq;!e~mm5#+5AmDnr5%qSnmy}vkHp=pQnxKfbcKG!w%A6+aOU2sYZtH<+=8qLfGWnpU|g* zx#;($*yNNQG}MP2Yxq0p+_R}ICb>VANGw|QgF2j=m3~Uj&cQqkjGa3}*vU}e%Abp& z;ei+aV)H-p6gWMbz1mUU%l43hZ!q%Y_3T}39AX+z5QDtLkeWNCV1L1&H7PNUqVvBV zAE`*4#a5RGPuq~Zr14u>IaGDasgUX63z*M(DJ2&z|8~$tY&FX7lnVrW1u%7Y@bdd{ zz__bAliJ$c6ulKYheL_VCH2vJVP!>v!ap9azTVcGKCK0Kpz7~C?kZlZF!ZY5VC~HE zQ1BbJ{1K^dkYlnmgk04Gewek(`ZrWKF)boeq1?iS-_&E4=*wzf7sQP zp(Zu)v^qi9rR6y9$)$4oKjC{8xrM&heoOkm08jF(XsDGi5y96>Q5&COmmP9a%N*;b zTFYwKr2Z`w2WPj1rWbUqiKotiL6LaTunCg$Lq4!bM2U7@rGalN51sjE9s2`^5*-nz z$KbhF9cBA2eoaywn}+w+|FqYE7L%xz6vA7mpwYC^UJ$?NI`1*m!* zKLS>ar~jp?y*XOSI;T9^Q^S%Zi6B1nRux%OwsG+BKtBi=Y@oZO2pc>(#6)yi#VPSR z2~LMhi*gd(ONkSwpuA9d#($xaw{h)V~@?eEhG4FM3*g48D3 zHUJQxY(U}stiQ;?tJ+f?z7Bm<(!73egCVmi&G%{vZNxY0oR&cLOs-e_=JjWWbH*mW z3Q~i7^>Y3w65pL*k2LO|rrx^uRcdcAd*jm+T9=fcx*3ZdZ z;Uw~u>91Qzjmy*aJ*WBg4?Q+t%vXM9yh;*{k+VJ{Rc(pZcWqw_d%B|^_2Z_q`tbUc zHCKib-PmK<*I+W&PN^%-R!M~K+ZABPSo+~^g~x9$_} z6fLQMs4ortb{4T!;u8^NbyBtEYxk`V2Q3w;O)eW~Y}h&8gm92#uvT6O(8J7W7MURU z?%?28OqqntO3cNYl#r1jtwRp}E->iy94`4eQ}#X%ZXm$0B2s(VIV#0_$$UcWZ;P)y z_&cC|Cl&QJvvtli~i^g#`M98KBT|7vD;r6 ze*4Y2w5=20rOGH1gK4}I8$EXkW9WoQM44o%6_?RXe`8+v`zU0Uqf=oLpw9ayzgbKf zZ9nm*I~VuV>MOH_st&+T|9d^ArPDpN4870GrMPEIdyXw!G?WopOP`GjZcc|$nI6}L zt25Ms3t+29k`5P@S3_JLs~|`E{o*e(ykF_0KLj)cV z&hv(JfK(*5Hd2Y!(_qB-EvS9E%oJBN{2#}Avsm?1=tMBzQA84V8AiIqoo1Bmck+ZQTMgC??1Bti7luga;lMP7vd!c%-|CDOVb-U9<*1728`E8WY7? zRt8jR6rL|I0a^j!J`Iu(C$85l4_>K;cTn&*NdK}k_M-#pD(K;$eS4I(V&C&ETY?&Tm~i6ZDdz|LI-*{&* zXov)ubh8Q)8Xtq^_Ew6-y3PJV!o1_S5CmV`9;oGOTuIG(*VU7T%+P5A41v%hAxk|S zpj!y%&w;o5Y+sUiFkm!#gpe6H+7&*68IQDtm;C7NKEA&3@n1*}j~QvZ0NIPh(~lt9 zEWPBG*Ggb&=hkY33}|VD}J%%g_$#e5hbptaC`-mEga?CO|%Tr~x9!_BMdRW1ZigDw62wPyi)=S=6wt zPVC>~n>c2!RjJ~G94ZNE06FPfyP;_VIvqN;Izjk(S}9QarV)YNt6mX_Wf2%@{{7*c zNx^#Z@l_54$2J0=R^G6`6*#)vX+5+7L~*^kQBmISrSs zH;EkQX3G%kCj{(PBQe}VvmW_%jm1)%$va~h@!VfV&`v{3Lh5N{1<`qNjb|fGrC6L| zXb-DEjz)s~5Bzl6Qj=X$c9qDcL5t6MyC-3gK->z3!MYt3=~J3S^tuVM)vz4Y&~VC~ zY!KUcvE#LnNB$9Ky<5&42{at#-_SABvX<_;@z0KBH5ID)oa!Bzmqg$lJ^s?_ zOkvMkiK`ew!PC3*{lI$Dzndd$`OgvL!96z;@c4oGT#AqLxF23<@qDCrp_`|{(T z^ibvJ*ETe#+>@m zrs@H<*#7#-OsLoE*TD=klk|v*<)f|1NydTBvLnZ=DHfFi<#Mk+k5KCp6HUH`LHNW1Hx@ zGPUc(OMRvaC)YpqBXu1#3I=vHccmX$On446&n3gps*}GPD2?fU`BL<=(k;zx^7y1H zuFajTP{7J0zMfNc*IzE_>*OHk?=EZq8#LzA>|4!_9sxPd`zFu%|4miK?#-m~2z1Q9 zQZ{ew-{@&pfe)AxL{u6Pi25X*$l*u`^?>l%RmGcB8+%ylz3j0$^MwDPYGG5)k5iAb zTY)e@QpzjCHSCd+p~$Ns4!H;0H>0FK9N)RiRZ;u}$1&xL3agSaT80FaXL`9s0i&Nx zi7X#2Zs#=!y?}e9i@Vd}m3VIv2metUn6H?BmkN4OXyG#N=HGc7L>?8R@;V&dzk>+8 zOFZ=XwCA!^DTq7tEiwN9G~V|B906;?r2V2DpIIu#ZsF-pMcGgPIEN}hl`hxJ(7c~a z+z5xw&za|n!I>4ld;|g*+H%YGMNZWBV~=2m2S!;f{7HzB5by=Z(f@kclr#AobYxs5 zLa-+1a)8f1TOFnEyTF>)@0N>^Z}M~u+xtr)-u7EN^1;~-CdQF?LAZ{K8m(c|ZyERS zW%hG8V~H>uj9g5-)OfrF-0uI+N*Y@`%FPE?ghRm&8%~^#VUvlq{ z$Z-jF>Ir@L5U1!2CfUiQwV@RcxxsT`ChPY;g0dqo?w&yOieAHUC?H4X0E|~v80H{y z2#&#cJ5O%ITnpNx5rkXUS=GQwt!v78G_Jplqi1Uc>z@b&Wezz zacj{(=aQFDYLjC1zWpcgmr5fHBLKvq)}?EQA$t3n*XJoVCxb7bGQ7f+^#%ib98e?R zJfj5WOias$G;5(HgAR9wCH{hT%$0(6?sD&*RUO<#bj*rgKyhw;5WdegI$%5!z)NNGobL-?+6;7q1QO>LJz-09p;PIjj> z3|D>98I)vl(|U7a%6k5tjKF$SKX<0#d;&h(U$fzhGGgRBAE@Sf3^XGzu1)8zgA>)i zmZ6)koQ4e$r*fPFDVLpPnkU2_?c49H{HCcIt|d*f4BNS+EuG%l5;ZC~{7-yI$f--- z7Q4UU<9xp)`bVz?FGj|hxjMSAJ5fFGh%Ooe?)ts%gjm!TU&fB@)ld8k3ZjnkEFRRz zL@xZDyh6SV3>eY5jrU2(?zh*HRV^m8u3kk2ueQVE-_Q+mcG0cv_?BEml)GrJ1t3AjN6f}RdQU4E=C^Sx38X{qc#^TCVT;JD-d)csG2D0SS*w%sJ+EZWrR&g+ zU)lz|0CKfV+^@!ElA#IG>n4fe3#z=(Ykt*qZXxRugi9l)>1JQddbg>ANy5&-{MNP_ zA)48(cI1(YgNK_n9oS@A?z-^ZwvF{q;X}?_)ejlS!3kbo;L#}tvSg&Avxrw?TVtgW z=7X{OTn1%5GN-P|6!tqWZsb^>1-NMHy%?PBsr5SoLqdRkfl0e z!&MuVX#jK=uDd#dmZrzP&DP-f7G%>P76G_zIwgfS?e=5_)oC>_z;|_G}idL?O&^g*YCZ}zoVgCr|X&r{0|hbgAwbSLnrRgfYP?^4;{2PhORTQi(tkvyZ_dN8{zq~avxIy>3-a$n z8O79Bp60yMv+p|IuO}w}JZE>4PC6>K%1T^M z_{3m&^=HbMUYMdCE|<|mB4yL*zG8&<*ppAv>Q7_K55*%A{rutML-gT9$I*slrtq)u z#E|}v;%!U5!fK>X*QdUJ8fp`*N>J`ID(Leqh06E^;I1~QN2v5o{pgys4Ocv)( z5b(?PhWQqza?@Lv+nM&4|IrbolTg~3d0;5qSNeGB?a)f@lh1>x2f+*XZmj({mb|C` zQY!myNSR6=opO7ACG?YSYhTSRsV~BprnJScSTM>8byyWmP4H|duqIiy>UGO@{bB`$ z#YO-7p6MjDrX^~Zy`(AFxL+jj?|VDkVod_bVf9ivMC%tHKi_7g{bcJ&x*wy^koo(- zSNCU*9;@&vx*-1tLqNR0QkBD&4Wb9agjA0`l(Q3#2wNv)9M^$D*_7fm1ko&Kwot-; z!}1BkH;@UvxN!inty;7iM>JaWC^dtn??x2esiJQc%?<2h^sO~50;6eK-Ye18CQPYX z8>(KJfqkrc?}_l3V~Aw04Tiue5rt~=&Zw+L0!(3=N1T>W`Kk$$`-XF)Js!q7BsHeD zwp1`hL3mRz1Q`@sQvn;v7OaM}IO-!$#zf427OwH-;2U09Wygh%{T75{h-}Mzl1U}3 zY10^-#xbToFr&NF9Ua$}&nbF{vw+4O)q>-K_td=Z;rWkaI(r3U_w?e7^I~={Tv|m# zM+)lfC-rtVDw&`$jd&>sNjFrdOLKIkRet(>ex(CDDPZsSf7}7oIgrNYrX;XoaC>9p zU=6et9tU0(8QQfu!S8_XEcv>ho==r?pG^=aTLT1-FKv`7P|)u>TJHn6=Rj-te(;^I z7&zz6XA7Nbr66z3Q+!vks&BASF}6#KcW1lyZrbye%Iby91*Pv|-o&~$eI z2f9>L-ITX<6wcoq-u;}tBG@KIKr}(}Rj8gYFDfgR z*$1dsit<_{O3y@rAKTG!(>B*fc%*;7X7W|hNAq-+BD{LtE~rQnfw@IWpO z$nZK|&E5I@h~0k|uU?#=F8=kq-+K71N7>J2TEnx`D>dCa!~?#)IDc}!(5}8+Hu>vA z7P)6H?>%{R?-yKTo2vWSB3W=V-1h10ySs<={XJ_AE^nTpduKK?C%zfn`;vxeQEvygghBCH|gv2Ysq06Mi zX%BwToWuhQp1S}%oqaaeePfc|9>fOO6l%AK>m9OdzsKkHDsBHyXq)s4GS%GmEarDB zJ5VN)XXpMXJ4oJ%>{1ZbG;d5ILw<@JMA!82GBOLfR_yTYR%jy23~46VK}BPWEG1YW zi9Ks<<0X%0skWekO34KFNQUC8FA1+=Mjo`rC3&uk;(UyzMeE}R0r{fzbN2M&>ZD81vfW$N{=-x%eTZ{z4}8vz@hx(I zA~M>LmBBElRTDV+y2~D@48A5D;1tQi@;45aKgT9Aj;5%+YgcqvdW0oiFF2yUieNd& zsi}yZNQt5($?nO-an8Lbj&oLA0#rG?CPk8=3tf!Sx#;Fbg>EaYr*5ODWH~HpNW{oN zPOD>~5Nz&g!!=HmmHqAO)0eM#^XyUBv~&%uqgyNq(a(mFzE;|LHl5CG=%X8rUV3L& ziP($wTb&;Lk>2cpoUHe&Hgc*b@`dR=^I$||TFjb6Qih6CmZ}f?R2%6Jft$SNLjAn^ z;yk>YTl-P}E9$&$OK|zo0`ok-G8t0t_;$O7}Q1R~J8$ zBa+FMhmb|?stBoi)83R~5?>y5fQmuZ7i%(9tqRMlCMlGRu5>6{%?-H~NyZS0aGJqT zwB{6^95E|BIVFAc$*ikd-@%SJ`H_x)7)h+VT3yTao_#VR*&`{QK|-*N-dwT8{`L9% z$=NkJS=nyBJ)i&2HF2CN`~ICk%bSUdX7#-hLceTugpRiva_=<_52wD}i2jNR`uV0w z`DhSfKW5kD17p4Bs2Y*(LON%e=GTi{agwVlIhY)~8@`o28OiVD{J$?A^1GeP_a&-e zCEolAtvxw^cKYg@zVc1Jo7?etPa^ljI%e;4dJlDhy(c|reYW3aaEAzgv3^CYGrIqI zetdLtG@-<;^S5&=*YLOBxN`gEU0qY`w&iBKej~Eq{Ahl0I#9%~j$sv|t`*kJ`p!99 za!cMCzvIx+w)+dW+~RCt9A8hHXhk*h#|!9zi@K41F<&B8eno#@z39!mn8r_DzJ$5F zzzM&B1L(s;DQuNH`z+t15s~>~Ucc!Bk931{;bt701JcIqzPh^}f~7Hf^6KL*nE9o} zkL-agD>X9igM{@G7jFLqD@fQHVSx;HE+^({XJzs>i&U626E+6JGm>afi=wRs<`5fT zI!6iPM+(dkY$IqdFmSV9h{bWG>mt6(@yZr#0oIvgS;Cwjq~2nd7AwzpmYe z6RGeuC{YuNHB_Vt*_uvHVT;0e72_t_9))9d=I<8RB=yo>ru<|&a@Sp$q-{{mg>be+HS8Kh!AJ?0vb&tG30)m!;Y4@yLTT4Dp4q3$r z(-7H`%McS~h*b<%aqG4y*QTnwVuL1VD3F?5@0Xf@427uV(pKU;dAC78^(D1@@%r`Y zkFzh1>n%jU<|u(ye!lBMJvxXJ;`6CKYiTiG^8MU{X}_2Jm|Uojw{-p4r9A)W zyT7Y{N4|aV6enhQ_~8SJu)PwV?#zy$ai#m(IV&w^SacEQDOcut>yqMn;gb7%7zhH4 zw%#PZ>A5Vqa6=VB&v_zev{%XUs>W(tZm=w4&+>PcP1AuZXFS1~~UHvIl3y zd%b{*Mb(>PzO z>HaJu?#MWIC=wqGH@~JIkI|!n1;bOf5M76?D!C^z_g%ktv$=M3_U;U zn&QVyk#gRi&mZc(xxqwp`LXl`tGp$D#V&h7eRLhmBc2=o=6ziRkj?g9y!*| zN0)UZkvT|il^wA9ytR@qs&^b`29@+2M9&-=w+v^9ZN`9*BwAK6*n)-!AY6*nC~Fcv zWlle^>}qaSI4f0^sxY=6UmG?R7qbzHlK`xiS!9`%P|Eg7QcB|o7GRD!C&tjj-NS6r zxP)ZE6{C8vUH0tz$k=uioMik;?iTu~1$EB=joli>Z%uYwLcTjg`LIFw^%b>aE=M_;{dKJQZGz5QW5D0z3Yl)BPoK{hd*m@^Ao7RVC!;)TJip1s z^?248O6_(KvIkp+2l{{FjdQBT{Zw(A-w&kAtoUBLAP z<@G5yPcP|cz6&{6czc*AIMtLx&qa8}#RiOJNZu8Z5@cDgs@eLX@`mp}#r4KbxR0T~ zxcCM$)1=a@q7MJP_}|XXeE0T2Qw-3>*%fVox9QPxv(x-v&S!aK1JBRdYl7o2TU^$w z^KiC%iosQ`>>bs$X_h{w1c5{PBDVlF-fH?EU0&1|^NigB3;E)biG7-|KhKX?1>{>| zn#f-q-o||>R@>uP_hwqHKYs{4>nFw=eMR$40Ijc2zZ&L#f5A zLl&l0#zU5znW2^N(YpvGsMau`iJeQ@geZC%6skM~tDVqFx?n9)93ovvXgrJm>PkI9wFO%_l7gV*E8P z#H_aR!-^SmaAB@UZ)Ruc%yf^Ojcvl;zoO}UGFUd(3hqYxi+YfAB{A8 zfRwGqwpfL)Y)}vOhvdBIIA#m;m={kul8LL4n<nK}F9FwX;I zSyUKqXtLEr#_GZ^wXsLtA>PPlCc)qe?9_`;Jz^5H=R8Ihbb)IUx)czLYNFJLH94+a z=sj7|z72mx?J*NXR&ZJ~c>u%6vvh6A2gc0miRaC;yMZW($SC$U5MCcVZ2tfWrm=IZ z<5UL7J?*5DkcV~G6psx?%>+M~5MuXS%dSN4g~=S4wjwAr9+gxc*RYLl)Y7Mv6<4Vj>ZMDmIWn2IWeWe#-nH%4bsX7WA@q`YaA*47U5`oN1Op6ULrU`G!02mCgr)?M zPGT6EZ=bb#A6^c1C{Yw?QH~#Sk<@4J-qqDrtGcUJ1@YF4N}4J>CMzOhQJ8|aUC$9S z#R~-BqK7i-)qb0_{<%)5Ng)SXm=Gt2v45k6H-WlFLKY}!j>+JWz9k2&kXFNlmL%!I zMgv0HB6dv>;0>jHbhdPx0F_q0Xw0PnU!;Hy;XNK%Jto+UZNv5qUCgWa!osYun@VEJ zE3;k2H7Ij$8V|5mFYWCH?_?42sQd)Y#8WX?(;74TWB@418ph5eL#w{ll&vVl;B!sL z278ZbxLnhLM?;Z@3euV96#2C26?UI3r2+V@Jg4EXhZ^)Pq|(UO7F6XIIV*w7!_FWa z7U#4L;4D|DwkOk5#xg=ptbuwIv2)Qq&f}w$53J)Km)y>7;M%g11{|>gE?)~V03vW#C zo`i+*{lKZjH}CVs-#ohplWuj_@2jN%c527l0rOqypPWqmC#o(28(`QJCbP}OoC(OM z2GROc9V1bek9LG~|AqRPv!!j8SFPB81$9pe)Ll;UPp`4DF?Ed6&B{bYiS~%ZydLIpeGQ+ zT^g$_<_O60O-kG7eMwp45A4=7QAay8zJ6BOo4Es4WOrjA86eW0C~xC zzf|e#*T>&u8~lF!_;NKyx*IOK;BPwFNEr89ZCtckKD|9jfu~N_8fl#V=KPDd9(c4R z6aM!4ffKCedx6y>ZvGD?(ETu)r;n81|J{(=lc9%tIDW);q@v*q`)DV}rw=^&n|)7S zU`w7X@)3gQ@wTJ71K;9{agM<+&UY*(pD>SfkL;Z(e5+yFFOHQfAQJMv3tN$PW^oi% zLNUtDIV&4|20fo-jrlTq&)?8Q@qqpQ_~Snb_J2s~u)Wz%_`W&9_A*=VFE?ouXqxL_ zzaCzsxc_!XB(|rc+bVkw)bs2rd9D=*U6uvCI!tnWe2!T5=zq?Cb9MxqPom`IOZQdg zUF<>c8uergZa1<1>{5N0!jl^nCvLyo<3OE<+jRRPMdPr#;-?q8^&0-YmSwY-0khHE zVdU93KRD+3_#W8ccPA$=EuUZ1p?ODe@vkH{`qoF_VH1wi|>1yEBxXoc~-PfMovxea*hPk)pCI9WI#=%aaZ>|L8 z8Z$mByIRO-YIIX237gQb#_ZE}A-`9vDJx&tlijfEyYa!2=&P+X;NT~)p^a+jT9r4! zvtI(!S7NR}g+V*JC9TAoXH$`#ynQNUWbQ^Kr}Z$dkGgJZ(oAH6wyJuB=U&IIYDrV| z7=n?WU0sc`i)oTgTX%Vy%`Ze1-!j=#VoMXRUR|bZ$Zp0sRn2K&Ms1Q2#VhsM%4=B=1YXMwbs21@~_ZK_M9^FibieB z*~Sl~1BW}zkp16TBCyAzRsPPjnCIo6$E%d+1NvXT=j7lDMB{JY3D&O8AwCkc?HBHU z1c19Y=hjc}CoFlQX9mCQu=^20+>GsNNJLSiW?J3!N}3U+M~*IbA6|s%hkGNcZzhz-E-29c5&}xT&H}sdnG;U#tQR`$Y=Vj&%t#cCOA5s%p6oB zM&)V9ra1)=zlEk8grnAR+YW! zy7dyZ?LKI_Vq;2k(Zc@^7Va2bl+++BMaoW0G`%fOQy1aUXI7&yU#2gWx1y^&026c@I#*NkhID*twuZ#oBabij5KZn0-d*c3#P<};%7K#FZ7YBp zmNYm%1+wTAHB!v1L#ZRLZeXP)e4nTm0VzE5nrgu7M*yCPzSn8_v}kjxc0jzgV_3zs zN^Pvr3^w!*;I-IWBd|qCO!-Ki#aKX4#hS(s_synZYVB)S)?=~JLFi0a6RyHkZFYdO z(qoM)2db12F(u{>8Q>UV6Z~1ttYIWQpouI@rzts`RVaz6!xadzSy86;T1Ehj30#H5 z>d=zCvMB=)%>d}vQ&dTtTB^}guf(g=s}<*0{Tgew3RVHrRdYtXXhL=?2P%zPV>3>T zg%BkGk7*a7NaAh8ThpN2a&Y_uG(r~yW{Wc4*WuYpl{VQYw_iubjK0 zN673lsS7rW=T#L1Nr5EoLmxh-l@9KV)ink+wS_<;^V+&FOU_v_kUPG3RrwOQJF7%Q zvqq4~O#|N{x=881>CC-=-HCA!?_hqOPXg?XRaUMf<4Tz@4{MkNJbFMNncC}ttVJ^i z5({deAIuEnu$CvY^OU0<@)k0d*o(4=G;(j=g|H11%9jmY45@Yjs-ad)nqq=H3`}lj z8-@iMOvqzinBYMIX ztwp%7G&M%ZCynT*E}!2`!)501I&l&plVaqJ^@PTP74r7rB2>a0hpkBa>b0Nd?9t8io*T+@TXTY zc>f!v3!%P?{^D?T{Qk%9%m4c5?_a$&W&XVJLR?YCmgCd2t$y|} zllP~*7Wx|7<@9`;@?+f%Q2^Wb|4ik>2Wffk)dunqdDVZ!3G|abdDe3PeFJDULQ3BT z4>NhJ*@0-P2bSuL?mRp?Vzq`yhgtnRn+6KY0Og@*pd`~bw4Hm%QU%@}aKJmB%npI? z&j_G;DAle58*zF>9ldg$&K^Hkz-_=xr5FT*K=3Q(>4*iP8Ng$>aIh7P^N7VN7BjrN|;mbv2bG~nwu+z`aj;=P(vJz*bAdq39_3;%W4y&!p zQ7vbPb1sQ+w%ekO4QI7eJl#>F)+<}EGa9Q@{q*SUyC3E}dCzJ1KArEH__G~r?zcB6 zJa>Qjx}2V2hTq@(mqR4G`xpL;QTN;3S03nZ{wQE+>qooz2tU)F=&>J-ukZhE7WH7KDA3e__q(qvhzq?2|q>ihXdrG z_hT{e2!mXzDn}BJ!=eD0zbqw?V|l z*;l7(1d%ybYn0K}^W1k}7^E_w6ea71Y z{d2P8hg4--$yhm;?W%V6lC(ppO$bSP0)xdeSS;Z^YqBMqbzaVPLxbHaedg_QAkRhP z<&QNjveRT-=~jLs#112>n0c3zI)W5hE%H6&!x5^1MGnIy1)ENYRUtaVOY zn7ypq9(;($9&~J%=Uo zfuu>vb~VdrWfY^ss_iE=rM5PyIM?MCNh$1@swbHeruRwo8djt5E?%O?+y-`GO|4>V z6pN>MSwLPwil#t)<|xc#$@o&&0ROAU&Wuf__G=i{7`u#0u6bkZRT-Y?XfAZu8oqbU ztw)V5qE*zSIN{w&6(5y`*2EercHz2&4ESmd^_h0^eg?y&;Ax#3S(|F@YFS!R86Aqw z3mGao2|lMW*sQiTD5lN6Ey@XFY;sX0Oc*aEWhq-(=_I+d>L49%z%sOxgf&ePnR;kB z`+>axSq7;QHl{9W(c)ouwCcPz@)=u3Vk}BavLhB!Uh%@JHp^HjE9f9rEU;y%w=j1# z3rQ=Cn-p(llTfTU3>t5Y9f=rV7f3^@ElD$6SlvVI#2=viBJAOsQ&zQQqjb|HQfPCr zqqfp(!zwE4sUZWR$>bC3SZO;`6So~s=^C0RSBm9@{NTO4Knb{rc$DdJ(TEH?V3cei zD+o7WjAWIVt0B*DqS@zdv7-hfRIs3VW3=d3a>X2aqqP(V%gABSd03R7np^BPu&gC| ztJ<7yW;1kH1Y+2BP??q?c3x?A9eF3!RI|e-Dok0Kozr;i1yYd+?<%P#IR;A-Gbj&y zjBWhV2}cBZLf@FTf%zu#gJ64EEa!x^YAfGi&H!&^NP`M@P`L$H~Ght9~Th)>Dib6eEE+x=?lblxJv5c|fMREb310W9KwJZE$kDpDE!!)@HUSe_-$RW-R=x~= z5uDRqg~m?IY-63f(+XRYY*!O-Y+)Wa^{zG0oo3=yfFmk4Vi=$h{xIy8zW{UwcM1DH z8#$_gfXH~1;gVniBDHbU1&v_+fPa+nOz6;w#uwg!wAZlo4Gwytl!<{@U}b6Z{D2oP zy5P-KI};OZ=*n;jT}qp5x@nmAVHZATLI;op@K}hlaBNJlf+X#kmDx9z3`8+|)jg1e zb^wcEC0@Zy`{;{`1siE4Hx*6x#*_{GtEm7n95zD-E|@P@9Ht7ymEmG_H>)?NXaNx6{YvS)ZXuuKglJ-dkIHkHndXKB8iY;K zE;4lMo`_@NgIt8j8q-LKc|^S=s1a^7!f`?}x$D*WyM)r2qXiveLWdCl zTex_jm);No6j|9`fLD<2WJbkGbC{8Bx`9TF$rW(b1L7^ZsKt2ISTVpnBevs)O9T?^ z-T{(Yx3ZS-Mw=;n_#g4w z`T^I#RS9zv;iX5_12Ay;N8nwuR>SndcNd06T^t+4OLnzMUt4BQtb-MXU5V@jY&>2Q zIlK~Jamy82y~k`0)6ria&+`wUG~W!`H>ZoG{800}FOE9fYM=jWW92;i?Kh{(^c}G- z;4g2E{%enH{EFUuc|`JWjx~BC;Jm!Z`2zpM-2KvC^9p&eTiak-|L(1KVH3AEs4g$P z;@b}L!~G&moSp&d3Y*As5`Y=O#=&j@&>09-%t{5jHxZ`&*?Q((yLh{?lAoqk-8+wL z?V*dMgNImb_Wm@g`L>h8vt2)*&!eL6o%;6E^;SiH#SSZ{=U@Lndsot<$8lu;3Zat? zD6QO=xp^qS2QL^51;dwt5xJQSagj;MvJU$1elMz5szr5E&2{?LOMUfKWkyE4h|G9T zPL65P--wqL|NQu7cKPss9~A3#vQlJ~ zTDc!S*2-!eFY`hkT|6ps*g9P91-X${?gugyWIRYNGMkYydzL))yZbIkQ&P~Jm=tJC z=2A`ZNW^<;npL_*He-x~=EPG<8yA@^w=2~%K~xiVDO?0rUBgS(M2xbX_^ z^02jOY!~LX9Jhw|#wY-0vk^QlTp`^x6D%d9Qd&r+v}WA);y#CGUwE|aGIEv!GPXTbtJvcxdqpeBBm?7-b<8c?a^c8cXwXYyjfU#@SCq#$~;amu(bILAGp5WxsiP# z1N{EkA(i02@Ry%#ABmw{q@hP4^@JtVXVggG8O3#aoA18S28C}=P6ZgQ>OK7SHdWM{ zr-sGOQ3K3v((oebxohPPX=%$v+rxf~&BO1iWJ<=(yQ-NkdGY#+=_}6p^t<0i$@KbL z-$ebzrnK2oHMqeY$!gv@T{YYTH->#wvIY%Ra68CPsSFvhZ^<^ARh6IK!!g2HnNTH`o%*y+8yn%xdu`jSaVX%C z;X895C8g1OO;x|NRk&F;w#`8H@s$>$O<^Y-+()G@_(3YQ8ce5-aL}KZXyUrm{5|EAeCECSP1|uC_ z(={b*x3iETV`Hu?q{P&>S7sZ(9`^fUW`FqsCo zy1DBt1vj^@WK0-5`W0Q$M~`2etgoNS_ct$_!KUdBFW1Y?Rb2X$=i_U*sP*r$zQJF9 zcp#^m7?-5k<=OlK9;?$NFaAu$nAer!$XxsUT-FrNdUof}`ODRtT~z8EWoO=Fr7ryV zv%dHCmAT@8sXEX83*B!kzz9CFyC6k2b>^gK=p(Dl-D+arOSJ=FABl@PRy_}X+hp>z zyNyqK%IAFER&vI{c8h!y@#HT@XTh1=%w>)3FOT88uMghW2k+~H_w~U~1xf#TJ(F7~ z%HI|C-9Uc6wr0}irg2BAj0il;?xT*Fqid3{!l{#|PuB~CtM$!|5!LZ-x4=}~#{zIs zEx;@I>8~gMI+>~@_!=YyB>DKFhyBU(mw;q{L*lxZ(v}hXXiMzzx6cWB@aex%G>{4H zv+tgEGLh}0IUaBhaONKu9_os^%I|&!Lb`>T4RR3O4KJB&E}bX67LU(PXBVb#hJBY3 z^6v&0z3XXu=RpDwbQ&f8d6cuSZ&-OV5uyJ%d(X?|`7hZZ{%jnW>*en`Am`UzX6(8e zhW>=1{}YDz?L?uYr1bY!dl1hU#XkG-Emr+MmKpd1?ELM`z^`oE_;{i2yWjv}sM4|| zJk>#{^0c3NnG4_a3sM}f=y1HeD#UU2u)N)+EA{1HzHcQSe}y3b;l<0}i}Boax9ukK z-~Ua^{lJ(bt}pRkPw#RQS)VEreI2JPbdjAMB`qV)g%$H&aoL{`H*`Rdd5a@)AJVeD zPc8J0@S^9hTGH)5#6}hmsS!FWfP66n=Z~=&@j( zJk~Rl7fHgm&%Xu=RfgiB5siE2_oq5O)>9p)oLVeSA+GiNMRxHdV5Y?AH6bZ+~*neVNsyz;=PUgRx;2o`;{kYSTt*VqGXE`M7Ym#!%y& zSrJ#16>HO-n=DpB_1lm&)FihTyJMZ{cJe$+8M_xHU|k_+*GwJ_fPf#Uwsh0`<|b*% zrD?3D4N(B5Gw*`UnKlr!FTUkncCuzB+Olt@Zbvj4)t^PL`|1kKpUknTpTv$tH-(gYk{cj?$`WB$w^A zuIg2_fjq>HTi2c)B6tQWU{ff;PZb=;0LD})pb(XKx|9B^n`IZ?V)t<{N-q~^ zE`@^QgG9iU?TO8lT^$C%rPH%F7)0y2HJ@M-agfk9^5lMP!|mvE_VJ3;^^24K;L-PT z^D5=Vf<3EL^5Dw}w;rX2|E`RDu_RBWQT6;A z7UlDo+;_nDzD_Om(x)}_T=VgdMnV~Wkq>=&g?x6ef&9K1I8$idNiwyNHo8z7N!&JM z8+WeR<@6A;&m-FI1ptY{37hSzB;F<;eohF>Q=wq1DTfKTwS@=ZNHN|8!I;GZA7>lU zDLfeB;shM=p4{ldxIa?E&C{CQr-G{)_hS=pmzX&wX$ey2(cGkZ2Xn1dw~9IpJ6)N0 z`mqUJngiG%>q8F_Xs}hu3J*rNJ_~S7@j^_Jd9ZjDwtm(%Mv7j~D&w*#6vJ}F8F6nC z%(Q6sls>n_Srso$7eWaWBS32ISVsYx9nDl<$J!%qcN|&k9r2HfPuf;m`X+lpH$_Ip zJLKxzmF~<(YdraGuKD00rt8}uZo|xdEsZGr1lHVTKcX(9KiI2OB8ZZMwoe z`ZJ^U!ElJ;`A)`9R47kN+;BTDPk7_QL!MV=_)4E1nPq8I8{X4wSCxImk+q5pCu=!s zdRWz9`#@>mAO3ik*vx;t*zENY_WbzXhY)42-K}^-o;7QIVHb!G%2b7jG!gFN_Bkxr za&HIET4%n@rXF4&W#Wk#p@PsoN-qBb+weWadg1lf~kVcLB(6k(G`FYK!e%z&a+xQB&V}9D71O zx+;`?DV>CU6TqzYmB|a$$F5Pz(CT26O>r%L3yDrTDd<`@A&_-01}9Zf;W;ZqJX~EKSi9KYX&e^$S{EWqUH}QTf!%gzxu_$OI13R}l z4~`p;NVOd9A%oghX_7G~ky~k}HcAPH94O#r343A5DCa#ZUowZ77J6&eHaU3xLQIWh zYA__W)@|5vC4pY2Ir#x#tR=KiX8`&vfYQ27i?F;00L~t{)|)sb#S6_9*lDCbYUb3F z%M1$;w%xr;dpl*!2{Vn>7Qd7nH!c$Q3MOlmnP#x;Fx1OtS^^t_)ld%1c@o56Qicq% zSTk8UZo+bw@?F&-t-J!YuO@B7C05-Ho-81d(u*jjS!zrHrTUR#ags zX572y3?E4vyGR+W=CaxBep!W_i=0y|fsvcVvk7NmT7j#V4 zQe7#k$_%&^Jjj@^F-(NjK1i(V0XvkyRbLw%B^D9p12dblFZ-Y-#6<5LDN9EqU)m{& zZx-vOtXx*mCc=c9WvUTjV6f`bpn`4+oQl2^{&y&1Pg^x0vH9Yn(Sn#7+ zp7K-voz&O11r{kn>Lm(zQD6@%tFF{2kmR@)vgJX|4ddS|PIFB+FC<$FRVklxqgm$E z9c*@zPKTmJo6|<`75hqI`*W&h;xWkD zW~-4^IyHRYM1$MDm7~->I1i-4VZO*E>bYd#3V zh)XRmZJ0tZL?&ujOecjXyfZnjaC1i%(p6L|xI|c<<+es0WC;|!q-UoPmS3I7A*a4V z$pfE5j$2^POnFIOh)8GK5@e>hQrQ&|o5=5p6}PznJ=d6H+wX!q3Io%teYZs_5@1Kk zElg(=%L%}H;5I6CVXf|^l#T~u$I^BTMv;U>BZ;8`9O)a8wr9O;<2LM|-7L#i>Sk2V zg2Sx9wC6rvVdhpl=CsGE~6ZDD+IbC3qynNUnJq20|)4dD#?)Zrn*=wZ5ledn_ppmHwz9&26z- zQa#$%92X!ULAJ>G*+Z6tUWP~T+}7Bcop;p1D(v|pw<)4jSsG;kE(SMOm?*S^kQ6?E z1XyGCJpsF-?sBBMY=`G4jq!8^Qek4;vdki-7MW_6wOA|@>RT6XIIvRD5J{B@Ddn$j4SyT2lszs*)Uxsc>8>lDASPQ|&z6sL6Qo z0M|`zY7)oxL2^$Rz}{^q#6I1q$xVPb0E+5hiDi;_avFNaSc==->$vTXaovd8h08er zk;p{c95i|fwM}I!19tQQHezOUixg>GS&dArZU-!Rk1)i`u+k=X0A|wpM?~tZ7nOyG z2e1@Z)dp_I$cjLaBDE=fffEm|k@O93Pzx+hnMUDEg=dvlppj#ssQ)tH6_)_%QZbIp znH;$}!<8<}n$rSk5a1#}X-}@OGKX?_wH;>zZpJe=@|ISzQVPIt^s9tiF%rsxiaaBQ zgOZJ7Z@E|4sL_U(_V6NE32*@#5YU4q1YHN6Zfh7fmtZV;Qz~8iAF*Z-=165528Wj{ zZ@tlRA+BLP1`S47lo@asSt|*5;kXD=sW6vY2iyQY&PhAk;TZ-k(obdcR2pJ-Q_ixZ z#Xzd&opd<50pIIq4afN>WWmT6I^uwX!Oo?-YGbUN=-(_iEfW@N9hH6l@NA0!Un^Kx z;&ox-kW7%ijWDlPtomXx4Z-$(Ftm1u_~QbQYIe+2kTkSO3b|B*TX2OzC#&Zw6@k}S z#2z{>EN4nFD(9+&9|=h>D{b_^Ic57SP!@*Q!QG8ak~~jbq|~d6ZM1=F0fUMWKvu)h zZ-vxpxaFZpJK&v~gY)zF2XRQC#v;-OzDUPEhNe8jQ6;fdlcTn5dy*yVjy7Fe07h5* zhKPmOqqjPV zEf>O0@qkbVnE@Rs(lomWrG`Qfd_AHm0gELzS1wuy7*saWia@i(Dr}Q`_xKnx*DYCB z*1)54BABE!N~UhgE&(#Zg9E1`?kXl9fUk)B6D~SXdp9A7yG7khFW$mTT2e|r2fHJ~ z_KcgnlZ7(4!m2HdSdcJA^}W*}v<44MPH9_!KIB<2WO)5u+zbJkD8F>3ic|tl6}iNs z6eA32?Mb2qU~r(-tdx9!B~p|wFjDCf$eBIc_)H6{c%~^NVrX6q{5)`|2w39{?W1R6nf;Y}$5TXFa365`ZU znngqf7U%Kp^hkw5$!ii%legYGuW$wN&r&2CUrKs<%l0OOQA2k6p5ZIIRq0RG0UX)C zRn@v+@l@hoxF0GZ|A)PE>#^fHuJB(O@FfAPqwH(%?nlQK5+N5Grt&Q8tIe1m3cLgm z4F30gt9nKpDwM+EMWzhBSO(9Tb53{fUA0!#+O@oi3*_ku6fz)q$P0B7hS2C`-)br_ z*AlIr!Y^n4@#{Mvp0^F2!V)v)p%6q5_<>!*S|ln0bD3Jb+6%|AAAm!4&JvGJuPGWH zK6!lghf_p#PqFK(g5^DA1Rr7oG01D@`GWhB=3N8jS&u5K1n5-fCZ)Z6vSr>kTctj_ zKHbZ7m+JMHPygZB?JGA*vX9ZU|Mm5^Uta&__A8%Ro%qXJ<=V?%y0L%jZfsJHaF@QP zc#i6?kQ~sbCv*V<&Kd`(ix9>;ikE|g@(?84roYEFd?iaOP!gsqQJ18+cV&(N`slKA zhIx@cH^Q=lk%N549W*eT4IwcMsCwv-Rx6Mtt<>woG2|M5mSoLmy@_nKoC!9X(PY(X z4^BAZE?u9Hs!N922hfclw*Y_HVwQ(cH~GlVqB&H;da%TKA$et}zL)!>l~X~oS?_R~ zyxRrXyVBKu5IKnh$tLgmd8FcwpusE3&cOUOG;zy$7@vZ!xikc*sUu5)zlR*YWj6^B z1K$vH4+yb01NA^!JQ8_t96_j^w^doCwSCq-E>N;tXDu?CGrBvvL{BQcWeqk?c_*W! z9&HDNefOZ+9rUR(w7~B^xiwiOXj0f}X6_y)7_*z6&S(svk%vt#gk}t&N|+`NB>vT+ z5&j-Rrn)?QF_3#}m6{I$ls0WYP%tJ_5ZLEv1ub7eCErPjP&t3N6=LlyA4YV;A-WJG_)yBB++eqRg z@$I7+QsLW2+{Gi^S>*@I%1^zPUYsMMjWurGwuaKNd5lbrzk#}3I&7%27;E-6&}{JE zjU3rz%$-_E7m@c1aB|oDvAy-vLR5z5z)F9p6r!R}RSh7_z6qJ~%*Qzkymn~`s)+*+ zK=C05nH)Vxf7f_&8_na6vZ>bY<>LUDcIT&wJ8phET&`vw5`nC&u*As5vM0k2YAXghmt(M{eJ&B<)TnW&P> zc1LT9A?l8}B=8GW7=RC613y@8D6_T28q^;$m8q@XDwOHO1C}#OjXa!*FfM{qgqp>t z5ic$SenL!gZZ`&-Crjqw$Mk4B3uYwq4ne}*{DOMl%}r$kvmFxF%I-r{xPou_EAZli zU{nhZd36F%gUCefUOaof0UHfkNJl41F*9H%;PVh!z8Kd@|R5YgJHPu>O(R|NuapQ^4ZH%L$d z%?@!JqaTJoH$rjI@b|T;e>RrjI6JG<9QZk7^EQ>KIJibV0J=%RL6gO+O9~DL5D*4_ z&UY`c?bZ|P(5p6-mJ04=|JW5SA|xM7ElTdj$K^I_0LaU5Ew!w9|#*l*{UlSatM$uU4GxaE-<4 z^)|RC%O4~I^Wj&l^WwL&6avkTa^SfT-#4)xo+%%|A}6v|Jv=MY`(nL4Rh+=>ol8(xX^WcKKNNs_m|R15woiFKNt3lM4F~*{7X+}EmMF?hSup>XxS$bmsa$pJYKc3ij??JLAci}HhK(d zHF736Z0grK^4qR7p>7O(XmI^j7Oef~asbL+9aaG)9y)m;@(A4Fxc64x@?>f!muESd z!KaBbsm#kpcuu6;br@}~1fCe#1}kW0zsMbk$z5jX0EY~Rw4P{{-BuyX6b0b4s`z58 zm$m1x&7NVGR-wz_%%B4ho1Cmv0EYo5A`ffIL19Zhzf=~~nP=)WU2`fek>fQ-lx)m} z)bkR!BQVxNfHB>BU&=CE0+&Qo+6GbAs)t0E$iGi*JK3OJc6Ip*pHme^H(Qof(WJ>Q zEy{K*a|au@iZwr*pPo%@sjb0LoqbhPS-`3JG=Q3m{W0@K7LU4wmZPkjRAHB$QB(_X z@$51m&PpU$SgE&Zs%V^$I=@tqQipYup+^`SfTrYZ^sX&}kler7@BQ>CVw)`aet@uG zzae)k$T{#!q}?{D{{jKTqNP2^wEhHTO{D0fwLFLR7IEP_r$o9rPBs#x_(S|iPkmu`kL~zy{ z!GEvHoK|Ua#V@Pe%I7>amdOqRAqeouh*~LH(FaZdc3aeHZAm2@4kV10fk=D`Sy zaMg(+A%i~Me#i@|5R!q7wq-^t!~&IiqxwKg{fyZO#bW~Ard&?WdS4q!4NO9dv@)uF zHqAHDfIzNFi(PN4X&g%@KZpZ2J<&myAr&>Y8F$#EAtY**6CHVWsop0os9=85xfLll zHfIMoxw$j4)S4Dua%`_d;)=e455T70y%nU0SKetW>8U5;2~S=4okv()8GW2}t44{;AVU>+%?)ppYDTAlGHaZ5RIM?#0uf~paaqFhOJO?$5F{fC z4YCkJH5WlZ^ybd>Z3b%=CU~$;!D2KrxefAN8imX!U%)d;yD49GDIQ!aT*-jS+U-?m z%V#zfAyV2EBKaW@xAE_=N~jFv?(Tt|v$}Ehm6fROUE_M6YR&ztVsBppV^hErK(JMe zDK*srRYHtS9i0Zw4EdK5*e@lpPgO1%-dir|VbNP9mPo^pBtqD25<&N5f~Llom9v1Z zM+y$oz03qs^RlCpoGh#bHyD<89B{p>3E?CsA*vRooUDpP>SJG{c+)|Gr>X;#xNba7 zqsx^pN;K(Zlz-=1cTlq*> zw%^N5;ZCNI0H&xO$Z0yt2U#62tWs9AV-z0L?Ta#c1uLs)MiK=Huftv#c{94_^Tuze zIzp>N46uNOg4fsJ_D#7-9p_ZyNP?SZo~*@=1^6q05Q_SKfqrfGc35KXTf7wwi`-i{wOt2E7T)ABPT#dQJH4 z(ZenBSqAKN0O|tREK5Q`x;Tz%4q-_sU!%44w&kc~RUra=WT^=SCgGXxYTipYn`*1uo`l^^RoTdZ2PxGxY33l7z*8@= z5VLJBZDrG1Ycv=mJ<=Va=~2lb;!VJtbYI5_!epKKcPvsL6EiIL@U zTH7X(lD3&Sbd;(k=fhM-uwlUXwn5x>^Mzv}IZ1&)32W3NSKC=|+L8r=REUypN755D zw_1fM=iblGw+!PZ?DmqUAjeeCb$~nkf*q+2-t6|K&d%tG+neP`tOjC}_;wRbffuuD z?6=K>N35!KkOI%E(Hnx?qYU8!4-BM-vwnq??JTtA-27*#K zBUj1SMo@olt_vu*E!J-grheve1|CGc^wK0ElnfHMo$~G`4(fLA~)%RrQh% zvPxaDs~|J@-7Q-=tJ#i}c31w5QBfwSLB6R_t}=T!4%`xaRC-vwO_daJ zc9^Dg8*HA+oxXIb9inL5slb!IB!jE-rZZN@67yoS9vd5ni{I)vRc-?$$?7fDnfW2_ z5LYHAOivsQ)9ieA&+?dj2FpTfRQS)X!hPg#Wj)Tax9W|mS(_x~N&MF@Vh9W9GSWVs zlZG#v42vsOxmzU)MI=eC9lsJTm5HvAt1x|4D%~IK`kvHXmiy$c;&_Ed5M1Rot2^{SA`@CP^!SbYFKln>CGH?mo#;;IQr_6(Px<|cR6@K z&SqeaY)GGHDf{PaHF}irT{uLlvj$go!5{H3jppc1nHvtBx{!m~L$w!L_9WW_kQni;svWt7FiDHeIOfbpYz;s&iz3p{d5pC!_QIhyl3&GydMvffLeMIc zZX@!x!;Yn@2F@*SM=;NTZnm}?xK7d&mGBM?^k8fBT$|+g_S?D&RB8$isTDSzpx7r* z49uwR42#y7{*d7~DFINU?94U8n^|;#sC10H+^Kh&2^<7oWYOtxP*s0c=XB-QTB9oV z#-^oumqaAj{kXYrX3Xv?+Zt$e6jP`~M{H+P#Y5;rwddv}*<5P%9x)mdBZLk-6A*zPz;&3~!TS0)$ueRtVc1gs%)42kPx5h4)U|)PK zcMAf)e%dSi^WmdEUeD)$M+Je_%aV3e0)IipdV1U@O}hhE%Tem5F9^KpaP4p2e4h47 z_MG}xjYpBcgbnh2HNgGO*xmC?aDDz36AwP+!?7P_a{Rp~(tcMX`SRHtMl!s7$APuK zYyUkpuJ*eX51%~k^Xa!g7Yn@jfh_P;n@!??QBw5;Qi0E8Rmj~0 zevWC$$SD^eL2W}Nqui&cyGa@r*a_fhY&QgnDr1yp#*WN@3$s+GKxrouUk;;+8=z#@ znT{dWW>S!--ioyLem1D6i4b)DQ*b;sopf@tR9XP#J-g-r;LRE3$vqt62A5ui1||Eg zIzdA!+vX1WSj))WDmuj|SYb9osy;~V<91j)34Wb@pG}8s1}u2BsUvfmWubv;Dt)&K zwaJE5H+h}!ogZF`6rVcB21C0*tBP7fGCDG51QSskX94V_%$D2&(m?tL@{f?tX^iJT0yR_{p1Hpt4CC57>k%G?YiEkDZC#0)3d2>&cdpaY){ zL{)VLp^m#rT=TFiN#Q@{<0s?Wd(7hc;Hl^T&*}F}{cK6$t(N%@9kUeKdJZiGWzR%g1hhj%QsJ+X$;Z-Z65fSfBnPD&#nxJ-P%%p^WwSY zhrF7D`=7wjUn6$5gx<>|u-K{HRxR^8W4SwVUyHKW3MF*W2I>K3|-- z_~!=J?-*mA>E#dn>EGD8`rQntKK4|<2X~p?{Oy!W$oT3^ zg5uZD<}*c483TR&Y~KF7Pnu=C4>h@^zmNW6zl`Mk?8)O7wje&1r@+HMRbbO6>nadF zh^v4LY3@!WKmx1ObuwQP#XQDd!vMRQ?zcszDX-vLsdz5z77W^Ht( z@w313|MV-bfp9-#@b#{K2=@l=@WVC^nB-x?FQ}vZaG^9l)VWEbX=i-jA>F?##%jfj51Pg@``qlb$~au9GpYBhVdrW+ zA8G5Cd6boR4S?AF-LU#afBfj1XLDSc2Mn42tt0A>xCTCc^5oCA!AiFG%i09GA&OWQ zA8)AG=if!vr}KX%`{QnK{p{+?XPV{tnPzAHhZdP|`Kv&Cy43L{e=(Ok#b$!!BL&^> zV({lzzkhN55Y6HxBA*fT$@AxY!1sQP8Q5GwGlyP#I_A^2h^7Ahy=9Vm-hQmh(BV00 z?lreAYU;nngoNbAds#K7zl9~?-_;uU)J$>H%kTfDn>xoE>nE@JBCm4c``h3Aa0>mf zpM5_6kMO~_tLc`6-!yTo9rNcozxnz$uiY9i{$TS)%j)abpU1!7l$!LS7WMb~ZNGga z8uQ|tub)3TU-`v?`{!<9d}mtxdlS3A-uQy6igp7F-V83j`_dmPJ->XX*4Gbx^jlz+ zwA^mzn`2t?EYWeg!e}(XuO#rsg??=961w+{ni456}fgnN9&s`x}NzlWa zz>t4?s?J=Aml8#Z5s@KugeAEqieTSlfNk5u)1ZrLW2v z3&EQ6?^puxG`_2kw----A|(?5d2_v2>i(mXr0u=r>p$(e!=ELG-@a>)*L!Q+$=@oD z!&pww7B?Jnj2!yH&HlYdb@hGzubrYD6DvEn$Xugv=#XseTHEY5pig>OOPZuGm8EVP z^oiZA)tPKq0~$n^(l(!bq`snKRqTu`zz<%fYGau$Rx6dKKI_m~0Y4KvnLVptw206R z;Cs)xHPMqWlrUiJZDSd9=vpnL#HaW5n#dgZ2njYK?mKEZA?DRo>@#6LWfYtqo=lSv~ z;&Nvz>>e@MUt{;TiudYx#M@3-;)y4%`LpEzUYwqcv(g^$)%zE2Isc{pJWqfNe|`RB z-aGk+Z(02#=>!%Fo$XSCs(?w=CnxiNJH7U3?p$A;Y!Gs?OK)u9F^7Qv!&>sU`UK>B zLXY5?q2L)*k>8yd_EU;#-=J>lu4puT8~KUPm?DR%g!o}Q+hw&7msE3of)!n*{ulG(Id0jjXFTG;w|uhw*|t!> ze!+zQ?pd<{V3$mJTMzK+zI^uaOG%jR*u=+o>h^Lk?-vj4lb|=(^qbzU^yOB#e2@U@ zh6~QuLiN6U{q^r{FYfdf1N;M`#@+1vnrG)xE$vrav%k_k?b9#OhH=3*_vsDVF@het zQmi!x3QD9*GnqOSMf+`A#%wYR$%H!WS}ILS+go}|ut=%8x)3ZCN=Aynoug(E1q`SQ zZz8ojO;@JQ8tN*uNPjU72YF;OK^RiuUsa8ztJx64j2NaD&mpSe+sOWlMiDtGdFNI{ z+{$P6N}BeU){kX#B?0?E9`{dc$N4u4 zP9Ai&AG=Gmu`Nuy>yu;zy5yb#xdgmxiRfNe|akZOv>r~e6_wtzIqoz z?^4xof%$@5^>0)<{9e8IJE%J+aQ?2rlB1sEU+T;IIPNSGy5{5h{Qi_JfpCNNl-*MO ziRP5c3(>F8EppRb%ll7d|A&{4|14+x=Hc#STbIIj^TqC_yc_WLi-)gYVa=U;7xHh< zULEkcT~-it)KBd9QG|bNVZ(kx^@9NSR;rCZS|9a(#`J(u!R?3?O7G_mx9iiBXV0HM zlPuuwrg2mFHGq1jMR*&6g%5XM$(3K!3h!KQNBwdI716Bkrk#_ zUiC?79d(VJ7GGOielE@}ryS+qy*KQ2$&@zk!%#e?M{(UqCXU+K3(gxtW#k+SW##L_ zK~@Lp8@I_>P4B@ZP5w+#(aS^`@3igH$JCwp;`SOTQ|ObQyRp$_cTV5NXb3$-#@c1t zqlT%n8FVXI6x;Tmn(V<@AEw)c-Wt!wKxK++7Dkz~p*vQfVXnrTD=rABk3>y%Lped; zD20#MR#DxEep)VwR$ahf4y&sg(r?d{Uo*JoNd-ab-)vgOp)Fe$?to5gq^FEqON%;O znu57=*3AaC>!y2&6iaW^s&bSjw={WmQ;XTRC=2B72F=5CFmDa4=+$7E_^Y@DS-el; zLLg>(S2iUI6Cp0I6f`fCV5~LOF79?IQMkY+)pHi*JB-crNgK&*8nwKWcv^N(Rl2U0 zp-#aF0XMp6g~8zV;Xmy~<9^Uiyjx5p>Ux(JF)fQ%X{8bC2r-KdNnV&O4v#ZA+78oN z2EPc(4wF5zoJ&f;i#C{+)~dBA8^`(GC}L$yNNa`RO_M}uH`&?BH;$IbbgaW6xD6Od}EQi8mT8Fto`+7Z)5 z+al(#N`aQBiJrYwSC6CM0pPXB;z!p^F(MJ#EVnr5Y?0}q?J%lTbah51d83J!3w`q# z!%WAcrxbo(_`ELBw7Iz{Ca39I9ksZ{Vm1{{@*Z>aOXCd|%Ze69Fm&n_Z%%J8-|*hj z+S%c6Of6eRy-`4pZ$P!&uc2l`b69Fz&DBs5tStG`wweoAKFp$@4ILV?%}p)dvROkZ zqQ%)K73Ib0k5Z?Uzbe&w70a9p6Q)g@PxeL>A2%X!&kduVI9qH;L`heVQ^uvUs^?>bcSaZdBbVygs9-ePv9&Lbn20NGQ}w zTM;^&_#k55A`v_3F|;T*-{>G`bEXmcQn(qI|MXB4&2h}5!HqAx3v_zK+e*(j+MK88 zJN3$zn7LKsd#ki3$zlex6qiq>yYVe9EZ<9nx9TXg*W)=Fx5F?jYG{m@3SJkSAlh?f zpwM!Tq9eTJ6U`DY^> z^!eMw{x?7U<+11*$hJKHK+udow{Ew+3al&Wl0SSp<-xw)rUD~<_jMOYb^X_!U*DJZ z>vMf(5I!TB5U>~;;5a(VI|DLdLlsH#VX%7pqU;h25yFyP)bcDD;Xw06On#$w$s13% zSi({sppPBv{{mQQP{-w~m>M}pA1^G2G`#f*lsPwGI$$O@LlM&Ab1&juM42~`TEGSic2Vh{N1KvwXWZdM%AI#WgVyOmf&bL82qE(5<{t8-W2 z*|j8k1<4xRZJ9V9g)=9U0huC{fL9EwgSyc+gjYIT0`m_RA7@lkK?zGhkb^NqV}@fx zCjmIMK?5|z3-pZYRO;fD#yoQB8Ih4xC4oKSC~;|{LM=mrT6$1U51m8o2#!Qua-|p$ zWYEi-hS!A_Nh_#`;3CyjmOo$8_T$t3q(1)Z949|;*1dZ6;`3#v{`uv$CJBPRO%?Qu zwW$8{={d02`|%dnyz3N?{qm_oDqQuipSs%fDTx2RpcV+v{pTrF-2aOA{r2(_N30Y1 z=^BJz_E!E;Wp2LtR4L1wj}ffEC@au)yo%e9V;wAB-D15TZC0OC{<^G1uK1FCH7wwl zZEpQ=e$wvm$KEl4FT(`rZQzsGi6B5NguqZlPa5x2rmk@l!OJ?tC&Cy@0qJHCbOP+H z^$7Kg?n~lWB@ z?`xsBsG#d|k(47@PhB5izUBw!}McJhx#^OVlW)UHY%K!qcwHDQ15-op6F%%c3 zM=X5~GvhVca-I><2!es`y4zf9n=^$r0WGf)y_V3ThKRM;;BFOKmr~QewCWWiC_ht0 z6ei|AEg(vvSBp+o@&nw6ogH9caF=HpMSP8W9gV&r3IUhjD&n%IfsT%2jh1JTOh_ML z1kLC#gn)r(gFwY1LJM(@giy*4k!JJ=1QEWmwP|i3(QHLLgYPrGRfJ%2SX&YCkx_Wa z{8C;5&3}`_x7p%?5g&?`fjN`COosNynL!k$lS(*yx4F}|_}sqZ3wAxs7bkyw{PVNd z;tBeBkn_WPanainr~NSKg0=Hj0+wIj8^h5AC%c;6GY*fH;fX{ZM7#MR3Vlv5=X`~O zzn9Pd?n0R9`-*ho(bQ1zC4+iRED<14waHQ{8M-6o3O{ka|8Y0pAG|q8II_hdH;+L6 ze(A#bdw9CLx5vvE*7CVkZniPGZ|K%zv6cg-YASY((u4|tJos2Z5h53Qpf~llmI8$3 z40r}0iTm9cUIVvOFT~}uedeLTdRbq(PxLDMKR7ztjnt0Jw&WlL$E;&&&|LX3*FWxel$3mCXt!pxwm;N18ACtfgwE)Tkl0V zZQAICWo=T17EDfpdy8LXJx~ULC$NRPY%vY*IW`2qT`Z4*syM6{gqa>;{~8IXXQv0^ z33P*h<5g$z84Xx_P?-TW!pusqLqHnGmNCd-Sb7ub-NsFeJRH4d1_(k(7^v7pt{8I4 z8OTq4>@h%6uv{qZ5oi~{DASv6LJPY8eA7$FsUR2@0YKG@Co9}fYuAGYq^;p`1@_Q?ibE9@r2PxE$5P3#xw*q*FU@rl} zG%Jm(pQ;wuDTkwH=WoQX)SBKL{#80T`Y~G^=IByw(;Bgr;RI-HZ2>@@5uX}*LNu2D z1Wo(W0Y*Su=_O_1i1{4%tJli(*k&Axs4v;xHOA$W@zSIX$XkA>ia;D=qs){?fQi4$ z+*x-zbEk`5>a8IhcP=ujrL4BW4Ji$yxA-TDnQ?RYb6`ZXghpuO*l4JX_!b<(B64Q= zPY2YSnT#@G);=u}lqJ@|+tkO>Mii|^4){>&DpaaQEl&gIo>d>7VJ!Vy<**)$p+#IT zhIZF^;6?|d22FhtI~yZz;95Ajogx5rZ&AH&`PNoI}{84+1yU| zdW=CM0#B?Q-Mpfg)|yt@YBcsDcorm=HbHk-sEmMLpYJn&`26(~=2X9{#MHy%`}y_m z4&U$a{Stg%Wu{3kYNnH_aL2|CjTNQU+(OGG+aphf|8xj^Kfe`whwleShVQBhj(l_5 z8ccO=rfNG0wTSr|hNLXJcK{DLNID$A8$$q|OoEjkE~(-I6-9=NRo99*m=W><2go|B zAdZ_X!)XnnuK`d6>z(a`kP%B7KtQ8HVPR?Rz{L)>5W{L|rrf6|sfd%-6%F{_=@eTF zXuzCH#bH?2(~6bwGMm_Ep-!dA>|tRC7O)cl4WO(hAjnUmu96JCKy$~8@itq8aOo=1 zAd14^Q8Xqq0Bo8#)MD1l(+s76<^aw*i-nn-mUugZ4^$ebj6zRboUMk@)XXJRP=pjG z7mgBhw2|9%gQdq2K|~ux+R1`v^xhY5NYzd^pAubK9jgtZqB5Yu5zQg6PepPEh(>aB zIVuwd0%=QQduGSiTp&fOEGyLp)r0NmWfa}rahRcvy!NWsHbG=s3{7(I9yew#46BkY zWXptwk03`rtmQDC9Jki0OqCi?7xJRO3S~?2&;jb9%^YKEUy2#Gx-7+>H}axNN3W`I zUk4`Ah}(VZrj#&fRv*CBd!60TM912Ijkx9phLvzT(ujPlpgyywMEiFZp5a5PW(ox?7sKf3|Jl2i-n@?N_*V#T zCJXnV-;bqYBoikCcrbF1jRE8IYb1=!peL!isYsH=v7MG~3Oi4X52i2b<+gh4srZnA}1Bi)`zZ z0foW{1rx7bX{=MqESd-O*b^wDE#6@Jwa89R!co^sFVV?L^ivJz1tLct&{wrO62+Lh)PUG8ur-IxYTI)S2?p z^?PKDp=d|d;_p0pW)gwXdShw;UZz&`0${@!Xv?v~&`SMiDcHcuDV|YbAhocT*?<(K zc9||8h3P<2mU0W-^Hd2q5w{tp_*lb80T@c_u)7__rViBE39<;B@mPRtXbC1%2GI=0 zo$&7-W{cKg7tJ{g805|li80Nn*$vzhGDAy^S*e-IgEnGZmE~f`+lU*Q!MN?D?+TzU z^#&)yUg$Ak%qpQ0fn5u@{O6C{sZSn0!VJCJ6Ped+68E6!9u&O|6s_D+C=`NdOuWYQ zlY(Vr0LrI=NgM3v3yPlobavEp(C<&HJ)ZQ-F~|ZC-G?vUQT_2k7Ey~oE>tq{5{;ZZ ze^`Fq^D8etb)A*JhQ+>m@z!rIwfg4#!7<7%(blEt+w-CK#W(v!Sr+=7KY#y^;#a?m zDy`pvA-KB}LvTY?4{(bufJ)N0=N>mxD=c>~&J+6#Mx1KHWlnMp z&c>zMHY;Ga_1sQpWO@jo9-~NRS1FaH)2Ur^u6_9A?C-0e3)<@Z_SIgWa{k{^oc7jL zW2+Ur{iGcX<2-``ItXJDHVWCU!B8 zcW25OjGWN>U~H|X5-^dH(|Bg-C1h3_%`nMy=qJq@8SLqf*-z7kL+N^Xw_P?u`2;OZ zYWQNaXImB+w_fU3Mf^pVZ6+;LqI3!cfjn(M`IQ4;wJKe=0YuLV>&Y-=j2SCN4Lo&D zA%i50HdN+nr)({lqZMjIRS-MbOf&|?$T9)rRk&ezTk|9>RU)Yh+7m0$8q#NWV>eB> z+F%kOF3#B1a2a?b)3?B57AUEBsVkJ17nZM2|91B5=jD@~K+QF@NvXCVUDL$v5@c=jj%Crw);K;NW=ghH~%W zc<{+KdvkLN&{b*x|1t3hvf5~}OD;%uR`ji`%;jg-ns^>Tc59j{Z8XojPzh2GseO|u z)S3l|Gts4i%OZ2hqIYh{D81@Iu-kp(ibgmVWdUq4U*Gi}iW_w~t2UCBX>@Lz5vZ>_ zmZRHbHLFBtt@QwnD)eOmASva$y-lo!%cd3)6GkdC)Lf%zHJpzvcc8>^RL$>50kO)& zhgscdrD_sS3G7+-uxgH*hN=czUD{8EwCol1>%7S=`3e$!FD zxJDCPlmR&I12EY&2~CXpAJ)mA&S|lJW6*m!ne=G+C3DA17fZlVJ#&71b=Iq3mQ&+P z-Em&bzZ04Bf-;-<@8e@Ne1jaz4Rkhdj$Fq^uQLlWHP$l{w6?N~@#vGWeFbkw?{$Fr zvCUaNZUev0i{xYM?RRq6i8p-Qf4ov(d;WG`d`M9GIiNUS-0^Y4zIYXoc(av zkzD=JjRV{tfISYUm+xN|%0pPlQoe-h07fG!-EMcU%}T(N(!Yp8}b1kS%t5=e<|m`eBE4Jz0}F&(>xNMu3yd z8V-LbKo_d1KX8As0B)r+YqG9jssn;>Ggm9v>a1pTPCDGNF2o7*LsI~P@Cwxc)1-|) zRK|2=R#E_`WHreSxL=K9vS<-7sk*w877V)O2XhzeW?DsN!Jy0RyE&G62FSIuwFe#e zf{+17G$rJ_qLxtp71rURd=Sf z`PqtR{uXr6uO9MG=NJ~3Vdf7t1HZe2;Ct`j`?K5+^WJ*hBKUC0`FM2AB2&rRk53t0 zW^lU8#pCh9D-%QUaA(B6M^Wj^-_hifOVV4MGfzY#*tkZ$Jg@sn+{e@}eP4}z+kc)>`5c|bfqjS+Fx7xt294(Ip?cynV>sXQ> zKS7gUIcB;qpa14<6a4C$*O@^6qowBIK=^Vl7`yz>m!5&YvW4acu0l6kVjdo&=o7Cp zw@>JKc!t@JK6#bwoew!(pMdVYk5StP5i{$jw=0{Z8N;!I9#ODpJ3KZR%#f@J*##eU z=Z$Y=fD(XU^xcY)>erkh*Qj~4u7>K03!qY@1T%pgj2X>l%JAGW<5sh?wg;8IF5Tb8 zrps5atj?}&X7G^RRPbfZ-jW#cthb^?LSIY`8en|Zidd%^!^!nZ|E#V@*A+aZf*qP1 zQ(osx zl?CQm@NL=C)M9{#g_Q8NY5_JPo?;m4-cs;|Y04mntBhJfA=g$4+6suNW0_lFFRTsT zJL)p@&?qcsksegtb(FBkMVN0D(ZOtJD&2tPb?3&e%6kiLAwx_m;#lU-%JGE1>iGJQ zQxCmqrnP{#W}0gy4kW6!xs7MAJxKIDW-Vs}(MEd&O5`!$9peQox;v9n!#hrpNIiG$ z+l@9oMowa9h0R_V!Pr2-o#pVk^4@^KLc=thm{Wp|Hhof24m_*Xf`O?8kJCxU(5ogm zzG=q&=pSdmnRlDCb=y;YIo2AWw9IK^7IPm!!Q=hGkRjZId}5GnKCHF>k3&k zo^5BTYpw*!KU7a=_7zo4m_^I8D1lC9r0T*PeI9ClyKRZ|&r)->=tiQ5&oa}pdBNM4 zrtIvQt?gFKD0K7_%&b0{J%jFz9`iK$YxVp8bw;@Rhl`WHE*UrH+Mh2rxpQXjQVUC5 z1v6&}sq|=Sz<|wT4BOYJ((JFF!h8=H?*ZdIVEoMi#@|0sv;|mjsAF%VVeF(3UZa|A znlsfoWN97XNZ1^4#ir9~jGBpTS)5mLw60~*t=9LlOKy$zY{^8xLF%n1p45lgn$Mx> zWy~yy_^_8oD_)!EFh+ORoJt2$lya!`hEgNlHaC?Dct7E@wK_`|fP|$oynX?PQr|xf zOEm!egjJu~Iz7`|G8d;sbj}C-gJ(+=^|hNutCP~RYXd6oU4{zxdq)fxXgW-n(g5rM zGz6HGbGLJps=~Q33Kbd>kh9hN1iZp>lsOvJ@}xX;-ZW-l7Jyt)E>tp)}iv#h_4t zoqNal=lEu$#*VLSbiZrcT2Kl)Ivimt`URsWM;z4RqKO5tutD=|A=l|?Y6gp6^wBX@ z-?UPdD>2z-^d%+DF#@;0vQ~C>v4WK8ALt_VX>Up zBCCIQ24=?~(|j0Az!2t)92QPg86&ny2ka5JLIeh~HfDv}9K;q2jl%UF@U8`Y%GyoZ zb$D<#uwh3NTu_cVb$tWV!~~?*h0+}2NAMmoc67TMZGsPBF*;Qg(9zU{DjH4UdIcMH z9J}<)-b!=!D45D7Z_lNM;@d$eE0PCCT#I#ScrUcvIruS(nZ=I9p<>~}Bux&?QN8=H ze_)VrYJ6H6p~RS|0kW|aJHh=NUsw4H9$`g1IA#duLMQLDTp=b%1n!QtPNRTWkERP5 z+=>}fleuB&KI5&V3V1xNuNo}0bM@xUR${U-EStq&Ei6vh7xHdZZ;D@T56-PVpoG&gv1VO2u6CRMmu;Ih@``84|>y$g>)r01Czeua!g3WBCrd# zoWRUC?*gMas?abi4{M`xw51z(7PT&{V9d<8J0!IOUq_VxY-$Cza)VKF=^NaMn8Dgg`4 zq^Re@?pL)le?$IzEG*N;WRsvh*ZChVu0FYhgMYlr%a&)CwP;%Par*4dR+f4#vD~_N z)mQT5r^nA8y>iPhPuSWg?(ID7Zw$O04RM(_^v$UjzFjNv{4Aqd564ZY(MOM9-kz{N z)INOKbMt@DeP3O5+)X&^i>kR_G@0l9Y_uPo{`~dn^ZQkAFd`p+~QtHvG7juGT=x4 zRIxP!=8EQXb&K1QlaW5)rqnwJV(WROJXeWHea3*yyW4VRWOZGA7Wdo>#hHRFuAtg4v0#n2SC@eUYvq}j9_)Y+2 zG774}?ECfJpX*YU z=HZQiXpL1ByaeEyEQ1&>EhUEXdFRp_gfE~Y_^i+r|7H64IAGr>=~ zNb2KA-}i3iI5KA(hoxm=AexuH*{;N#T-1nB$i31|5HF18EufW+P&1&>edyrsD&f<- z4d@cE8iL=*AuJZ85pa4qT7eW5D{5$JG$Sc5ctIqUuB@g_lt^44L_s~o8~!LIJUG66 za?0Qp$c3!rv@9u0Xj*hjUBEptTn8f`0xG3)ifObNFl?+o8>nWSu7YzG&eMPv6vojo z$X8~t4STV@=P)TCSwH7olP(EWV0W;dF z=*|o&Gu}0Ltbn&>oib}JJo=VyeChB5TpcVkf`_o{>G)7>R_j8?=f?u4)e*h~kkoL5 z?4qL<6j^OTTlQ=*@wKxiK9PZ$<@Jz)da}I@T2HvjIfGYK-GVsWpjp%83PDpS(Cz}t zF&s(EeQy3SehhZS&8k;8yi6-|YV1@Nf zH2alSF-c=Qm3E8SVmgCp85=Pni!7I$(>x>#mWS0cXn2nvkBz$2rGd|ZZDVM#>%p;8 zq9fw$WU5$SsPf7A-#5Q(HJw?z6*Lj}DR^8w0&+4i(hG)OVmVP#(@U(*(J>C{(Cv&r zQH+ZfLEGD`+EO*XOn&|%0Hnag4^9VbNq@dey`tX$=05qCKcAib{Y0KA$9i`5RH+#s z_+@hU$CInlZ!$K$*KyhD!P?HAJv)2yav}HaqhI%$O#d{ROxQufVx~mWqqoIVa4t33 zdn_e%veh%E&sHUy5-KlGZBBu~V~x|>XWG7#0d4;3dm*9XNdMm>3H8uryds@??|Z$< zUo&j=UOZ_o*E06F#6pQk_rXq31gK;Mpajfjs=Q+sOI5zsIX#$pR0nVtK!fxau-hxM z@u6Y|<(5vZl1TExv?PFKq0dFb*4r{{_cX_ak8GIc55jU-a@&EVO68t6W!^NF;Xz_a!$ zz>UsRox}hWy;*~2)RU*mi;7KWFW}Z}ecrK%x;jJ10KkP|hypBKtx5}~({}ZXm|R%r zLPbdDf-V47Jch)t`11+8%^l7l0l+5k{)^n@LT&(d0NG*!IM1G%9iZaLyeVp77h)U+FG<5nJ*N@VJK*JC|NXn? zf4~Z3rOF?EJk{c}zkT(Vm*q>^G@jM!13I}6VB!2e~DH6@Uqw^Sn!L3 z1z-NzIsLF@_-JMv4Sl}sjZ?cFGXBHG9vVD2&1vaA&Wc^HaCyee2B8+h3sc zSr0W;-pCIM4@N|*y=lJ?c?v9MPIqGNqgDR?*+Jj;MOaUu?_JRM*lEcd+%_-5rIIs) z6wh-4wKb-7@D@6`;+Y=>PvO;dU)1H?*9e1Y#i6#5g52j{F=w8|)N4l`&~(39rb>pC z6>_A)iSwX@#Df!(UPj83Qq6?)b4?TZ^};xQjsqB!+Y%s9p0bw0G>1ZQlG21+9buK5 zRYi8nVG=Bnas{pLf#i7x)S}w5-9+NRwtbIwC1JW1n!t>M2&~4mb;aJF+~Ij;ImTOk zrpT9`8o5RkfHWHOM%tYlUYp3OIxcfb?M>e7xIM9cwl4KFA<}FCkT`WiEXkwK5Iq?q zU%R(vSxXHMIrX;Jsmg41CMFEh%;1kF0gD0owVOzM^l3^Id{*I6JLytt!`o`oxjBtK zAPRJD8)j@orRoU2HwwU{H4DQiw{SdDV}_1NWTpn0<4qEeE$dZfY@SUAQ64WIE4)6= zmu%{%WrPJ?q+JbT8T8CKJg5E~mJv9`i}1F9mFdhPI-%xD+WOVf4`Rc=H~oMj<{ym> z|BL(aJvs6xZ1{u?KQcDFm*FRc4Iez&=Z6h<90l=oxZn&~F0|*>Pe2ge`wX<$srSc= z4S)0VW5b8S{3mGmzBcY-*1}D7q`BMViCyQp(zcD4uLha~_{)$jEaZ=sE+ZTLs% z!a}Wl={RN9nz21R%e%)KtAL*SJ_Cz?;pkKpc zmC5UNPfgf1Qw9=UMp{0;cNohIb)7YVBD1s5F&Vsdz&MM%Dkhdwip@-_(57mqr8^m1 zqf(_!i~v7Cz`yCV76ERRXM)|Nt(wTd;@AJcI2G>zGIJR@-T{w#%}Qo;J}7 z)OsC~l$0^hg~S`ax!Bs$j;D0gu6b6imra7SSquRufN9NLjKyhb-kH=bIxk+DJX{QH zR>2=x_m;}o^*GKHoBeD6^5mD4GcezC2aH=TAQd-YmJAm#thT4N1i_jAphaji;sA= zII(Hpfsem=f{#z|@ngeBUxl9(dc2+8=La6!I7@gOF}?n#AuQJguVG18Wh3dX(0Zic z@$dfUCk2OZ(vY!0Ua(uA2))vu7)Sp5`=S05T*ZGz-{Q-6C*=P={q?usyn23Hz4vA* zQf}`uAGhY&X^qX5z z;rFjuVsY0}y#3jKKL6TY-7*Y-elPFO9!$XPN$*cTqj|fV_gesfzs9osWYV~QO56SJ zntB|Q`^6iO_xj}|oASS*`@ds@-iFmS~G$eXCVUgXsB2Ec`3CqlI9cM2@UVH3$C~wNF ziMoY6sc2EJ%zN5alHG@=_G71TY91HDB~O^~@@%`tj%!WQ!+WhUB1i4 z?p{u~Iv|LUZ6-3MHKxU?>VtqeoY`AzhzdQ$STH3SL1mbfVwZ*4-59q#Lui_M_KI(7 z#db^qUC7QS%kpgJO|K1M=%OI0>zEe{Xag%r2irzHRLp;qjflI~eabsJ=Ku6949l;T z!O@3{lo7%pT>IR8uG#=vHC!GtQ8p9tCLzF^fU%6?YSu#!WywNrN5F8t-#q`b9B2}i<(Z} z`P{eU2?3!M)~$G!;#w@RAl0-a9ty6eUP4w2E%msvupA?HCNn1Z2a+DZ??m&+v94SP z%sM=0UJu7>Va^M-HY-9;y@fm4%GjL^kFCP`GPtwO@*h&8Gl+) zof$*O(S)E*9jRDt6M0%=!YnRG(%>wQa^p0yXd)OIN2 z91hD!HlRT{@iLWu1VAo$fSOtuO)0%gz*K-EE(OB7mIa%u=*~`LQ@XT(@cpV@M$*0&v8{!whKHJEgpBcLE<(V_;uXuQ#tMpcuKI0BjTy`_2*H zJ;m;t>$J}=qYW_oh0Mi5!U$Qy-H|aB-XwhJOV4mT3uF!H{^-@$DO$Vr6$1o>g-@A zrE^l-m$10GbPR}UFjl<4nzmebu^&W*|M<-}-+jzmXl%!KVBuF!uYa*lga` z<*PqZSa_gq{xoY+LK=BlxpEJYZe$Z_Y51v8 zh}Q7=1-!-7xS|wm# zZ%f)*(K&*TTaL3u(iqLg!%S)#0~lYnS5Bmr$?<*+AgQ3uEjOx0EFi2=I-dnFOi9xs zGz^8{E5wUeSywqEf=R|JwF>hRCK+A)u@PrEq`YB;%OO=zPV2Hb_6ld8w!I5Ntqgvp zB*HHq$_4ytVa7;mB>84Xmb3dHXJjJ^E!}?r6f5)OxUo!}cqsIsf!sjSsUgU#x(P&i zt&zx>)q@S6`d*?m!GxzodP}CTrZ}!MFzL&NMCbbq_@eP`hCTymR$hl;NkzdTqWB`h z373pU5KsV<*J5Q*Mgz6wL{){zCA*{fxM?g{GwIsoS}lB0-(<|}ROQIACBKRcWY8p; z%p{vv*`0Mpq4=#J#(L!9$&+|Yk5Cn%^P1FHp1%t@d8{;9TB}DaK|9tikENXewXp`O zQnW19s#Gl3f9q4+GQPV>gb~thKQ3hQ#H8cXlzzt|LI%DB61aNp!L(JuqWv%DR>V9?Y4$K0TST5Gg&sC!~ zr;83Ih|SP&Jf6s|#T;VvNLxG;K~N9(@Y+O&uv<1cph_bHF&WHSZ7KC^ma{L*Q){J~ zjMKsv26G4x5nL?#VE+HTaWrZ7sReG!AA?PAYRmd19izK=t+ZoJXzapY= z6-ySff0U($f|yOHH&YgVFnEO_ric__u8POBcnonmbx14A2FoNNEtch)2t&n2n{F** zRQLjtKDEtzlSncH*rrOmYg?^Y_s6i0xlc>x?#zf&VWP(s`kHZ_z0dcLS+u+^1nPwg z>D(23VJL7Esi9m!B}SMHMCdRzlY1dETb^vbSupHrqdWK2PlQ>(MnT9*&fv^@lZvge zDh57;wwxs@CK%Xu3a>WE{!A9@3F9ErS&WEJI744dW5AxBOB$;SV~n@#d^HSNhWFHd zKc?|u>%tjzRz6}^U=xsp4Xd)JaI(|7M?}FV(bQmFnd%p3y- za}4Y_KE}euNbbYViqW=7JQhgWz0WpLtjgn$*_^Qd7i<~pC?ncd)4mqm-wG@0!y@k? z!Y_9K>*|#A@bv@RSrRGvNC59de$;dt1FqCO)#4;(pm6vQz|S8302I>uBMRCyY%E&U6yd0U`Ul(1@4R zsBc9Xffg`sR;}O4TF&r}9T1rfL#|1@jXDP=Irg3~PENRqm9hn6kG~~#x~ni@^Q5Xh z;-e?rb2=;xxPvQiwoPad2iylxMvPg6MHMcfjEyv~$gu*+JI;Ly^KsRk!+~c2Zu2g{ z(B=b2ISTcH(;_g#N{2}&)%ajJv$K4{vl~341QKH_re6KTsvCV-9?d0;u(t!Y0@^HO zn#+|ZXS`+J6}A^`i(#u2+#toR*oe{=%Po+8+>HaaN%==jJ~o4kl|IDnJA*Lw~HZzJ1bvGtS~#IfW#X z21FOA3*zGjgq9mN71kj4De$`%9$vt77XX%4oc0ut!Rtu6@OBI@Mce=!69xoLvwVP{ ze6rB;y`;c66xYfiI{=LwAn9QMhP~>K?SUDw3x<&k365D8#XK6#09;M-La>AxDa7iD zB(Y^Arbm#0Ho@-Ue*t?8e+&S-Cit?-90^2sSnk+24QmZPX9A=-eSuI$uSxQdYr?PkEz6%Q;&XoCxBP-YA3Z7n#aj1~ScZnEJ%=`=QZhbvwQl$`;k;9HL= z<@Wrs^S|VsOAjr}a+LoL3>ww@G4+fA6A)rtPYD4Q5(7s3cjC)h`{JRmk);bZ==gY_ z-fOMyuF8zeii~InTft%S1qysH^~UGj)PvJ?)yzW#LlliSrYm;XpkO3ucSuG8pexSm z?YyMjafEFZsYt5A8z09hxEEqSQf{u#u5ecr4fKoRAfG}HRMifuOIa)Um=B?HhvL7@ zvH_*Dxisi4I2>12==v+R-n7fw)cTGIU9dGR%Wwp9VuF#fpNPcN1H)pmMl**4=4HU4 zKDY4PvKhjJxwdmC6DNyr#NMv-+Nz%_1B)KXGt$u~AaSf$jh|jc#LH>HtSz_`55dMR z!$(kg0XbUEnSfGMXI|)N`cu}iowd=04OOrHq8zp>8nxrgJ?m{(ZTj&pQ-$3o8xv`T zLJ;@7yH-|RSu6XUS_!c#r;BqsOR)rgfK5d$E_5R01NdTssmd7|rOnDLYr+4y-giExSxR3!j=*?S(ULjD{~` z&`YUb#hpD6z1-VXCGcC36-1wqa#fJr+*rB^hejc}06*c6kbf3l**>;M33aRJBED za;ONjTNp_jRq-w3qME?S&GUHm9V)Drp0RzYih|8XX$TahBcMDj(}ks!8W5sBHY}g? zxM@fZF4Ir=5Gl7#qrg_ih1f3JiW}#C-Z1&pzQM~$sZI5h?jRrQTgH_mBnthuV~z!| zQdKm}W=fY+IofuXnHlNURsapYQc*QhJdPoBeB$1C2X0cz9C`C;c(x7wkASOQYAJv= zd-a=%3S&8#&E3GRtDC))Fqhw}SbeI?cEkYLAw`~2Ft0QHtv0om6j-XYCbV5unkhzZ zb0@TG87RF`UP2IZonYpONp zu|KGR2CoUG7rf^Z{m{08?-+`i&}kB~S1BT(i&bz6fS-b4v!JXt5DC55WmmE9`EOI# z)2qSeu&JubwG&jIy@V4E+jKAhKhe4p${~4Qp`|tA78=}nZT%S6O%VbE zZ6yPz$BrkVYWi=w?~y{@JEH+u4Qb@euS-_xm)3MIZ1gw2HE7S<=$yNzi8TuM3*! zK5d%z&AL)U`?Tcn-PT=FNLA>xS5J3DC9761CC^2c?p{{Y5m>(pUUm+cvT}S^+|#Qm zOp*nf^V%9co}JE`&7^Qs@x2vQJHZh{6s%B38Gyq+aJ$%cM66(^$Ukjk#y4;_LRQkz zy6SC#S>C6mJG^0MeN__jCdoA|7!{@ocNPE4EveMCzMZ{#G>#j6#GPr>J0%ZGAA-S3 zxO9XvV#yJi-Z`0Jt4Afy+^=s5HA*X@eMqw*$>Nv@P*gms#W2*%Z-rD3X?~$5N2k#o z6&ogRdSY9_Qw52U;S|)DvOyf!l-7%sCNEY+N*GDW$ojoPx(b3D+rVL21`!n%f_G`d z2yiK^xo4HB2u6GBvg^0LC05@^E0xBIzC;0EpyG2`P)eCmpm@K_ zhNHi92hYuF8Nnkxkk0f(%{jfxv`Yo)kc$DB(X#fmo3o;kQgZQcXAMCK)r;Q_iS0~T z;q`wC&K0FutuCu&gnN1%bjPg=y6LVA<_ok|Ik(d$w0Ek_?ywS>C{3qhCH6`{Q03C2 zx;>i{>9jeMOtrH}Mt>k^SAn(DRvNI_OT*eLxA<=A(fajcxP}?`QOpt08t*b;Ja;B1 z?6krnTTvxwyu^J4oN1*Z5v?e2vQZk=J{`xBMMhHaSEk*Tvs7Pb`C-|ba9{N6F!tgY zI2>INMGL^*=}s!087}0wNZWDhw+S4q7?eIeVkb$MDbfNj58y})5%lWT|Zj;F*fUmq}@xi zllR&fzO?#;7Ms2=RH3zD-8?Nsl}-u{$5glVAN4>6FRMCC4VCpQk|U(P1v~_E<8!Ul zTT>mXI3f7%)3!ks*pot(`zxF~sr+YB5`A&yC8f8h7x6yr;wDAu&1@?ubE-y!W;(T( z8gYcnRGs_Q&@Li3!IZu^9(N8G%EXiGM=f5xjnEwCk$~d<{+4*>do%-YAH;u zw|&ZeuU^%!UU3oHnlX9Re8z3<3MSgbJ?H#vTsxsZ;PyC#0;ZK?*`2mwbf~yOA#&5m zrB`!QP6`U`Y#u6E8>~0Q(_(DY>v1AQC!J7F;(8@E+tKl3+WZT*b*b>|f;CyYG21=Y%nVOaTnZOKce}&U`JVW<2@9tm$Y5qWmDK*@VJ2s zQs}gsu-clT4V7LlTSHQp&CZ#DKHT6jU4n&;r&Hy+g3_F~%ht7ay8E3wtMFV{?Kp*n z7WDAbyM>FXrtllb1d{c1e#q9EhFktBgh~UqIFHxNrIs6h#!yZBi`g zttutLyZ|063@TV^mFlJit`*Gf_$KS?p%Q;uti}&fh`vG@UPyLpA-U%4WyP+-SE!BQ zHdZfAUHV%J_*Ce<=ANE^l{TF~!?Jf;j`Hc<#?nzxLegtYyR2ka7YU8LkWR!_t$rL7 zD>C`M?M$5GX6^2!L|_(NoTQY6sn`+_ac~5Ta;=S88^~c&*Q-ib*5Ahd5tzKY^kkQn zlJyt`K}i~kQN0d3g2Pg+#VO3Sp3|~2n|_S`0Vd}>OF>OFpi-&er*=9KiAKHQ;X18B z1pPvl0Ips^kxxLt?3%KE*L2!(5$;kdM5MB}!k}0Ad%{iDJw|#zW^PT1k?oAxm_q;A zS~^o(yjllC%Z1dYtlh{|UGR8%{exqJt}x{NldDx>s6X0@2G}j9+N@&&M`h43Q<2x6 zS#;}INll!6h1RHQ@VZil^!m99IrbI?C*|647;b?>=Cj~x0-SoI^b+jVk9AZlu}|qa zL<)g?Aikqjc5ZZLm8WEb(y+sciVVmaLWx@tu_&$iejY!5X8kBMfJ5dj=m!qmrPo2v zR_Hw1342!RY19A>eqTzGEyz*-ero4 z?st=RS*QEdRW9Tqpf)X%t6ralM5(C~N;f<~M@5bG93vK+M`xYQ* zWjYO)_rWsSuDjI9MqCaYqnR6nvww zwf(lsX4GEL--4T$na9Y=3*BF36>UQ6x@)z~k|_ijx}^-IqNMMkU8!2zDX7_HE0m!v zipduT2f}YEt3SQhc|%mGV(x4Co&rxmJ3!kYZAMDy_bO#6jH{fvW0_vGgEj`Q28^V7 zTuX|U*ASFaicx8P?XuP*lGl5248f?vw7Fx|s~NeA$7uwxDvNbtr^RIy>|OYVb+kOI zYucBp$Wycc?Ls5zn{#K~DKNJx4()2K{t|$l`iy4v_W}HvA$wS7(W0ZmmNuq;8*LOXm4@(?YI#LW)`~ z+wo1w3Zyg9_B4qDn%bBqDi*k^D5zg}>@wl6X>1yv+l96?Jyzt2D~ARx zq#;b(LQ7T%=rW;DPS}>6%P7`2$b4}rlyK<0jsI3kOr4=4&MpBM+JGC+XyH&=6M~n) zE~B{3a9TRSL9vNW4yDa0N`VTlcA1vvhP~AW#_0>jLlENPfhnF1mCW`)>JY?eKpsv6 zLIz-L8V@vbwS!fKaakV%EQ{8Q&}Sl8caL)(N8U}rFd1AaRFv20ozl(G>OBh8BQ)t7@6z~JPv4w@NVHPAq#y;B48n7aJ{%%Wl_*g*rfvKU*$$NaY4Cd~- zA|WP^cOVgoLp0y?$5lmnFul#fYdb7{hNqGvFH|kz8y6y}+Frxn!cy2_KNZ4x3Y96W z!EpUPs&Iv&*VCJcA$mO!C2|ZhH|aybRc~Mq6{N}~;a#R6S~zG9Ak|G0S6K30C9QTJ zI`vPzCK-E=gN|qS)V+#0L=5P0o&F}oRE3z7XfX&1mTdw_oW=%Mv=puVh#?4xbB zITPPBK(!V=k5%JTSi9pBWr>(ZLjdt%6qQcEwU&5- z%@Ed%eiURy$ET%C>opj;%EeL?S*;19zpzks`tE_iFgahaE)fm4lSj?g0M`!%z=xR)wcxJ&i@%-r6Qr`E{x?6P6)SMusXO6wnmpuq~$e z%*qPPN2P8LCU?RRjWZ6)*eWO-Tyl1qf*6QG5FH$Xs7MiL)Ej_Ys2bh6pvufw1$!VQ z7zyffCa#LoEBREa|EEqo!fNy_!XYBjX`Co>C=mF#ib_hGGF31vo3o_Q?s{jG%797} zTG3rq)9pVG1xnzx(X z>8wllr^kTUa6(T+*rR+}R$3EY8(`UXp4TMCesqY8%k@&0$(>hv3X`u~h7Vfj@G+ts zX2R4eoeY4r;=>q5hp4MLqhHXoWxeTrP~o+_LC04}z`e_ab&lDA^G=%)4H>UhGP{C= z+p68V?#>)2p_B$o2O0^jqEfu7x3!K{yLBt92Ss@0Wm^3mD5Z#`I;mndo*wQMu#PM1 zq3UOVd+}EuaqAW`TG2~2jP0y_6!19*7_eSBsA!Pmqtb1ym-@UsJ(>78o6Bqf5hTdU zz1>0D7AVd}(5grHr3n&1p(oT(?J5_Rs**^H0OuIH>^J0 zCKPt}t2N*=|~kEZvBTlP?ar}b!W;VQ6G2$VYvU=&(x8<%sT?dkOk+4W6eyTW=K zaP||NX2tF;RHM}$XVL~Yts6ImrV3qUScn`*bodk6-KubRi`9TxQ|M4lU0x$6QP4I7 zwrNO>yQU(Md1edW&Km{kje}v815r`XvR0=(SB*E={OSdAoFEuG3qCove0oPYI}~xA z4i5tZD_GxxoJHpcj6{ni>Y<)zb=(Bh;@Y$pIo3B`^eBhk0wh&fclJPnN+`tru6>$! zp1gpZn=p-@q8`B02-+$}^iIPf)Ue#AhcMM)0%$1>D-{(5_XQ<3&ygJZMQy9(g;gUo zTdMG`U3TZH311%b^F|(=G4JYKQ&ka!BA=6vcS`pF=xkLRrtT`@6xdz6N;Hb=@3N#i zy3*yya)OT5^3Mb?9!B}D1E&WC$2uq!?+0Ii#;=~>697cDv>uINV zJ-k`F;5gN(F%z`OoG_yj<)KKSe(Q=tpUQ671&!7{m*v<7Ot0vSS*oC8cpB?*=eCME zJ7#TJ3y)3%qfn3)l_)z0u3p78!cW}}ADbeSYaCz}HX!ZBcB&Z_HSHt{Jo~gFM1<15 zDp&vp$6j6e<|IA!aUzS%F4F^|K&VYyROpGa0_N@E7$}a`tyFAmA#@@@q{$S{~#Zm-RwN+sQgVO|_3u#6hN! z9=?9%!0NnWQLmID%wzAg@s$dXglrl_o~CyHPJpI87ZO)?S!1+fe-Y|>TB&dh;V9UL zaC?c_`XOAV+t4eD^ey4mPly-_;$8b7gIMgci%}~zC&P3Kk3>ra0p)omyQDG~NPx-e zWuG!$z+ONlQm-vA|EGki2WjuL3$z|RGVOjaQbLYFB~Q>}VxHqXwTlLevhhJilROwa z(G(fm!B{HM*_pU7UGI1!cnkRY491bPHIzNH4#&E0FDTGJMATP#!k_|h`W5yO@Z!OlZN8ZpbNw>b8@Ol24o2h~wq5Yy*{TvN4W_5N^ux61^MRGR|{ z2E$DXIvfT?r?RhgQ`+FNS|c&`MEdgipr2EQWWPVl$=5Y(L7uxDg(g%6dh@a;@{z(QWmrN{$gf;PDM) zQ&l6^qF*L3ZeJQAElRCwo07wLLyK3KTtF;)YFQf~>U0LT@`7Rxs0Q2{_08J@OemwD z@@tIqRNm>dnLFh6wjxq-%4-mdw^7l0EP@+eVX)C6ZPqq990rX$-B7V>P^v3?ge6dP zU^gU+@XqMc*(cr-u3l?4kB_LJuHcZT&5lvrO~o6nXhta$hZuI*QBYDbv28v}_(92N z(Br(Wa$-{~XE9{RRLg{8m^os{Mc6Lu{_;R7(mM(yR?-UwM?YAwciU-2 z*EZ5)&~i;S2t$vHsSZzLSIJZLeXz@xc0p%=h+JOIGUJRVz0O-s>)G zg=~C&IIr)tH-`;3UV6@{2_Zu{E_PYc2HiGdM1R858|oYeu`X2?WXsNdYo&n6wE*X@ z{ExJM9TQag%4^LlPGS|u6eBsgF&^L069*Eg&`JtcMy}{b8|l~rBdNLx`$u?ct?U8F zvs+iHU*}a6K?A;)J~*#ke5rP?Fu4*Kk9Q~xUUv+RwZ~2$)JQ=WDI04$8v}fh4dI8R zMvu$Gkc8q`1_Rspm|N90{JL5o9y+?GZ%LTYPrZRbdDWgPPrK}7+H6Y4U_d>0EhKvQ zE-)>&;$!KI;6q-D&U$z2jnGa?(1zZ2Q1z1R+*upSGiITMl3 zh7Fr3_6h=U0yV)%Nq}D~|8CU+qnJ++GZ>HxVYo6_YDbv_Yu{>AGD`*tMvORJs`}^< z0>L31Wqn$>8CGNswzE`SoU5$!LFeM6h=!#8LRCRSpKm<~I#h2J<$WQ1>v1t2a%1`w z+q|Hu@~ia*^`HgUIBhh+JTy#)3I>(2`Z|>q`Q&1kEhfwZ;n^%ZEg2sLWCn)_Zlmejg8%swuYuEOkG*M}%a}IRrarK}z zQ8Ii=E*qsUhUrr0G`2CRL6OpF9xhk>G~A22nt)9d8f0Xf^M%QQThI?Vbl2YK${1+T zRk{a_plbaB&gCwLD60Z%xoj%cL&l8F&Sg{sC?~5tatK50IBR~F4Z#I?M(B)Dc> z6ctr9m${ntR0XlJVi7b@;m|~*v(vnEf&{8*kT$bVTQw)z(AtOKH%0x4^=;!YYqeG1 z+^!(^tWJfzi=24!r6Xs-6=uI@vr^42Q!=WsLJoI2IK^Ztzx&L1%RJpun@VZ@D+gnn zBVY#Bv`Qm`8!Az03K?irHZN60)fWZUN#X)OoD?fV^{NtE>2f_wvaHp&zdhhNAd^3POr3Yl&W!*p{STuPlNEaryKQxDno_mOKIkRmz|OsdWEXNG5ZMgWE7lNSh`W0 z#U8h8X8gZGslYsok`aB69Rxzl$`5P{rDY>9#FoLmSS{P4%lgbZ5&f|3eAlg=(Unmw zJEP*UFlf$<)2*6pAQyB$?feY2hSU_DJKT<{0PpJ&tgvpLwro3>=2e4gd&sAHPg+g- z+gL3}YlTh6VqRb*+D!wrM7uE-K~e=oJ-cj|oe-R7{>a-3q4nA+ZJ_pPXLmdHntD7c z7ZgK;lgV$Y0n#E&TqRItgEthW&=lf+&<)VotteJ%^G%hnQ#oUYwt~DoIqMnHpSbkY zGP*l0WL5UPSU+UyzKQ+#6kCIzO=S~xvGYG=+ewNxpB7*?GNzGvBK_X`G2h%&?+X`P zyG*$YW)V=BcM6ZQzn-%`LU7m6;8e~^C|YQX8*5_o+n}N;2qwJ@kv z*v=aYu&|sxkQ$<=W9A&3pR@|+Sy@mj3D-pdwYT0XA|b%BV~R%1FECwvb}}W9aK;mq z%mP-r$>r_9Md3rg0*Z3-In^7NofISc6gVpvq9l?-{9s}@Bmt0_gI1-zdg$AphD1z! z8r-#h;K~j`vWno5-9p=S!}|`jmXi=91>Q^*Sg{J#i?=qn(OduPB^OvKAu^_P*RYfFlE)UkoJIjUt8%X}!7VVB;Z4~Ju~~aYk1rW;!yDuvUb_?!s!G=A5c4#pPMlsY z#E-&|j)MU%)Y!PwZPE&=CI{^sp&go~Z2^8fhcj0hSy1|ML8qSMMgP_ZW&~D8KZN5{ zRZI%I?s{uYOub{1nb_CThyJ0&gMwN*h%+F4WS5OtkOK;l;ihg1O03Wnd{moa4e zd0s_|ruYF_U9mY0kZ5(7jI0iURsCCH#yp(O>47>21`rm#b!vJVsAP~z%Z z*x%9p3oC?NtfE}GDz#`6Z(~?EglIU;DMuAX8Fif0-envXJ0Ny^RJ6`fpQE4F>IKfkix3w%O&g;MqS~FRBB+AY#?+;F2AF{ zoR~?|&q)mL ztC9uB;rk#(?Nq_G3aZ%x(CEt)3;3(K;~@XGmF0ixl{&j4tFc{Ua({H*M(nj9m~PZ-^G0 zWM?1vzg);;m8p+%{d&t%$;{J|ZJT;A(rH8_DI_gG)l9+!_G#L#)0sImjJ3;gA%r;y zYX{k&pKsVHiYf|}s%#lOW`2c2 z$gzzBKIc@7EoC=grK$p|2AVl_Dc3VtZEr!~;x?w1ma_pO_?BA{dlj!} zp_lKh9NVGCGngWoT(;>AqPJeMQ?k6yT=GBEa9kSzdayexKi-U||!prYMEoLga- zDH&@w>2q~Qi!-BHil5p8_S=L!tSX5W`Kg9bDqeYk^DD(c#t+PZyJumzAgpd_7w$3V zawA3UcqQLqYD+sSD(ISzgOTo9!emo-<9EM^Kr@7`kw@UJq`8D%)@q0>BOC+wHOnD=P^6 zaQ4C2$rMyn!A^fv2&I_dz((nR>e;(tdaAS#p)EPD$Ei&ps*Or9a?5eB3U=B*w^?g~ zkpUq)6^j@S*kwLUtj!xIx++rafp9?3ktt_WwNWAY1;s; zF5AMv@JT7|Ij^-Ns~%MZtMo>Y&Mv$A4&*Vn_dhKix=%_AIku#KHTv}KOr@z{4~c#V ztbT+(KIMC5ZH203sAdmgOMye7HWSI|90oncYKFU9mX)zvHNEopMo*O)_5fFgx}a3u z^_{nyP=f-Z(h*DBnQ;Gz=&2&QzXE+g)i1Ue##H=s?TdC=0ab@%FyWA{*Il%fy1i2s zIOTEzVY9LL229Fh*YXtr%C1Fwr;|A&ph7kA+edaWIuw)3u=wn^(Py!_z0Au(9cC1Y z2BXI6wxTg%7|a_N|H4RfzG(j|H#ORuf}b3sSr=57DKVmXg)(k}y^WTvLQ1&;K#a)0 z-$uEHzm;AB~B^@IFn&8KpuQ9P6VnM8}inP7%J)Vl_d$y<*xyr9wAq zH-S=X2Mr=&DF(ru9X@Ww8jsMDKs4_Zz9oVqim}=+-R*aZ&34oZ8J{8;sZCq7Q|70l zN;kT-vT=SkUKJ`Utbzj!7zY+33>aZ>uZ zN=3OD8VJz{NfF8(pTq zhgP$NXzkv2z^`(A&mf4r3`HMT^x#e}^AH96z9 zUcX~H!$?Q)8u^&-Ag`F>{wY%K%WRa2(rCgUC&7-b3%5@QGl37H)}y-wY3oe^9~I&Z zC?U+tmu4pT26L1ll4#bkQ$<91cR@yja{vVgG>^0u9X%Fp=DY0>?Jy8HIZ*bDG@_fR zw`X-|sjl8K-*00&i)r1AP)7pV_BlCvLw_VMMLc_Mc?m`^^cwAiT_wmw_MyPqji;t( zb8?v2P?kfTmGcEEv2&R5Z)UI3!|$>>kB5GfmYr58FF@5(vZe{Dy4KERblEzbc+E?+ z3>@0QVi~eGmnZr4AQ>x=5*Ig3@|x@>d+drd~|rp{8a^Jymu0TQ}QiTzYi zAMyp4zGY(~9(2~2kxGa>*fGSZ4dN`iQk?D5%~3?^h~WsTT-ToxyQ&051&$}zwp~xt zM__c2?Bj8dG{5iFI#p0b47yE`#c=m*|#h5NW-QW{g}t$0BI7 z^7~ROWiEOSuqJe8hzP(XW2~To_3VMPhAxB_c_eTJT{gXGah#&v=-n&-RcU*@9A&Bq zDe17Cs|p(5U_~E=UK2$>m>zloGbR)mf8%8dGF=AxRm5o(pLf{_Z1_5Re(cT0kvxH0rhK%SEa0Q0qaOnc5xwZBXKW(;U8P20Q100I!Vx0PH8b>PJub%Z z>E;UyHVz(D%i9K|r^5tp0WT8&45C%4+Wk9)6+%26bVeLD zyGgio8o)TGt~+Sonz~nE=FaQkDMxYg$?R`49=B|&05&$LfTPe3U|+nf0;MV_nv^iAkhBYrRD6yCF^~69Rwm>G zI$}>-#jV$l^KZ6-G0q~i^;L9bQn1tiYZ{V*>Q!*UAi=q@Vp#>7f@R4h1Jmre7?mg2 zZpVe^3YDR4u<)7Ik5sVMQdbc-ma^-Z&&E{2L<^g78>1I4r0IjVacdO;f{P6Ad6;=N`@7GROH0*Z|9K4xMFj)ln z3~R$UD7q&*RaBT4CSD2}J{U!r^{v88k4sz7)6Ok+*_@TxC{?VS8Nnbwwq8 zhW$1qBpLgyCY#T=#(;DyWFY{vO>mscB7F+IYv@?Skja#s|Adpqyf7cF5V&!zi->EX zC7(c<4cm-Z@M4fNx3t=@Jkn)}%QPiy;M5=X6Bu zxe&VQ`a5>n@Ey6Un@pcvg|2XK1KR8$=%DTMK20U##;w4JyH&8Vf#j#P+q`ON(>=C1 zWG!?hG$sx%f@lG9g|c!|{=MFYbZ*saLwGtHzt?3jIRnx+Hf2!Xo=)SfiiiyQ#m(q( zp}V5A{|T$rl@-jrRUaxLv)(D?7z>HIrvPO@n!ioPDwFcb(mG$wR!Ezzpb4SuL83h7 zX3ycQ%3KvaZdrW0DofD-MNlKMLeLMH%iGr_^Wlat1!TH6k(9R2L|#9wf3tl zmEQyDRcXn(IUp{?)|EjK3{wGdg7FEsY#?E;I#MZdLieH{%FOj>R|#v3hkNgc+F1IJ zr9;NXZlZzCj#sLj0&33AKJFAWSmyF!r}UHKG`(G|`HssyI<9sZoRDdw$DC)uUDG{i z2W2H0UE{4GsUW8JfK2-WU<6Mgpv_wLsT_hR@xROH7ma~VK06D7PKT!o-%AN1KDs`n zXohoPUO~E}mLWiKIIWNKdegtlRNFDZu?<@yeABgU1!eDwrIux9ly{@ct_t>Q-MqJ8 z-TV*&uTSCL1{1DIk3AHf9c`LqT~}($u8pIwDe-a4RIs2KS&&$Uy-5kG9HuWdr3~#& z!?LposWupu2ZBuP46s9Gx*$%}vJX7@7_`p4SX{j2|DKlh*h*T4DK{|J9M`@{2B zxXsU1N!3b>Y`v$af`T0$Guo(vHYO|ef8|;g{uW%T{tjExe<`L_|Mq|U*T4MfKi0JB z&jb2f^{lefOGiPKpHENo5JB2?g|pF6%^b*SHKUXph7re6p`ee6+vJ9nRNc?BswV2L zjOblb9Qx4Hp_euZDD@f`avphG4j3bZtp=-Q!qw~oeni<2iYSN!##_p zD0s@4%`s_@0zV10FBD<5XGxuQ3-Kz2Qe)GP)nDP9MsQMvdsks`ku@^=C?~`$AgaP; zK*w1~NeNhV*OjVq_%f3lX0Na%Fuu1vmB|o%N3Ao#5VxZymuy(C)2aY7K?HFWb$wTX zgrm&yzEocs9eO}?G)}fDbd|5D;VX8j2(eGgB?`Ylj7BYjd97ZR-Xjd?6U%-?Ucq?B z{PK4T!^0IaSrfjl@MNcVbK2oI%`Zp`S`zeFO&Q9D#QIUTtGzz%yDPOG23T(C=0oP0 z1M#Z6@UKx_tOR41^_jMwR)yD-IHGOnBDpBw8oY{&w?dTH&^S_|RZY*APB0^9sVdr1 zR+-L}Qzfi&ehUsVsy8^q-Gu`fe4IGhw-DpHGUyt{FE)0a)(Ta%;OOQQG(1|cp7zZg zeigdnltV(DSXZl-oA8sL87~f49^&xrH0vXSU#@ddnuBiwCj0HIAuQTVn1)ZQOliVp z%)Xp3v;)HL(^knGe%5IWj{yZCfxt2PIj+_BP6xsZ^mL!&8k7gL5?YC6!L~^LIbcCC zje$4GvOGrrqJAv!MYM@+pvXbA8MywGV@-8E5C-Gw9oqGR7tM-2-8j990^jQ=Zq){q zkfUm(j8H;*C?6~1CcOYl@wdD%W)T09(->(MIKrsbU$pm z)iGn-gD@gGDhT)Ia(u{( zRa}5(Gy5@LC?$!E>x0AGEukIN&(o`q%@59O-={Gm0Ba-I_h&ssyHn*Z3PkjPIK=Us z5KMa&xGXU8VlFI7HU$+p{B__xP;xyzZ=`VaxSn%Z$mgkYA+(+jmQb8ohO*|y0m50a z=kd~j&pw#ONHDY+Hbc@b=ZvVG9fNtqY_JMLGXKpT&8&zNDX6ByMf+J>2?#@?EtzB2 zY!ig4z&V@tD-73-a|Q*Je60s!ok!ZlNpV_Vp{EhgNOtT>H$KqELN<>rbD8-j@~AG4 zOt9E_DgsLz`w)-sRSK~DI|av9QK>4Zgy%?=rXGkiS?TM>DnX}TDMiK)PjT!(jz zP@BI|z2|PK-&=n=$N~u13|z!o6V{i{jB22DO#1;U1#-5;eqEk8f4VdO{1qv8ZWuQ;J-u4-Jdkl`n7#aQ3Y z8cOHLeri*)PvNI9I;BDqtGgvYXAgw%&Yb!(CAx*eI1@pwIYmRXbxmc%Po^#$XXoIM zz%&jzB_x7dg_6p1gPRC=4)iX~J99J7&`rc@3({5B-=`sFlX;#CG&oIZk=B7KuQPq9 z;Tepr>6v$BrXA7%s#U73^|us`^mOkpaA{{W4$8LWEKZZ!g&d&Ogtxr1j4krb!fqM4 zmi-3U1R8{1^w^T{Q@qCE_Pe;qa8+zJGr-ZNN?L7=fq7sSUVUGRpBMFi;AG|E@F{qR z9vtnh74oy76PAliUbcqEhFKV`id>+x_#R9)pTj$WOUPLhT`kQ6)!I_^$MQG-zEDx-Wn$4j?KS}rRlfLTaSP$u zrdDRF6fIG|vC9-ZY+kF7oq1WNz^#{)ks`nM1yzny(dWvIP7pMd)WEp;pV7oJsso z_;9X*LwiK#w!OApKtLDow8dnx@~Hw>usv3M+paHfYyj-nv}^U)-}zSdi~vnRf>0Ig zqJYu6Odp0hF9)mW(iXU({kz&0m`Wh|WtUY~(3LM{^M)F=sw1*jMp1c{WXe#wtZqR( z?4vl0q5^y^j!x;o2baCD(i04_!omQ zl@A|skj%d`kBW6f3D}83da}3RZ^;aVo99J>ztOf8BVlFj)7>mu1_scAVF1clM8O7% z_Cfez)iwH4)CxhEbS{KfmPy(nek^QFnjA+=0yr52?)a0%ZB=$RM5?WC)E?7~v zEhMV}RIUnB3DGcZ@!a5IQ4UV-+b;dsZo+KLq8vqO)AO-gh$o({jTtfPF&_&Xf_Ex4 zipua_*Rv~AA<_fFGzQ&GL>R)Bu2G4t^3}L{A!+wtBM5QSL_1JB1&if_U5LYh#4Z~y z+mJsmHbvmkVPJB^rq705w%%o`;FL;pvY~7Jqa!#yRAiZNShac~Bm`MGExXG`SwQU( z@UwGr^dO$AnNYw`X#ed~&M^e-^|UXRx{%A>Tga4Ed{})0NT4u zF^XP9U_dwF{MitC3&o_NkYMJrGMV$y2JB|6%ZZeN--oA-ssP`^c&=tyi+qL8S6J5kO(8BGFYR!TQ|R;LtNYZTcfB2FZ}3GL#{ZF zYyBhOjyzZhZR@%FQo8NaHk>gjmEoC{MiNDDPuo`clB63gedsTZ$mAv5Ggb(sD3zeh z-?b`O-ff;CbSA6K2b>zvlm!kQ3?<;ofPQ+n(C3}dg5%?GZ&cD0Lqg7qt9_sHT=cYH zs)B_e7Nf`k4WytD#++dfN42KOcqvxwX_CvAT<YJITX!VwM=&0Fc!rmC&*$%Tv6fKG5lYKZ9ot{B?z-FAQ8ngd#712nh{<_T?_+IM1_nJT2mUr zkE%Q?HQgsFU{Dy*#lXw1srnE!UbEeH|JaoYsMrv!4NOL)FLciZ+gkn79nZ5Xt5LYh zebwlO(3{7ZNCEDM4C{Jj1-v)~6`s9OZ!4NKZeWi%7KiiG&hPa~U4y3g*iNcMJ^^vB zbtOEXFRJ3tIZST_C(eGV&1N%K$y~UO78?7;+3P2`4p<#_h6`D%M@93(Vt|!c&!lZz^k1xt@l}qw2iaw1%LZ z(wac|EZM=q%}rr(zkND!{5x1pP|GBwC)rtE%ShjP6twNrmV$*z72A1gYmj>sZ-O#} z3QZgj>oXW5;FH9m^eNHlL35Ojt|uC-)5PWVeY>HVi_8Hn#7u`40u{`+QGBor7_SR3 z96pcjb@Iqjp|^1cx{S&O!C+pzDj*kwjn=Dy2&6{@l8bj8CmdGar=4!v6PcO=4F^z- z;u|*Gc{rwg&DyFW@H&Cm&~d<)qv;k@aH?cYD%##-lR-niunxo7y9dR?{ zlb7D$Fi3!DZ`{a83sk%Xr2s&<3)07Ru21p={gwMeifrb)2~sI z7r?l}Xyqv88Z|9p+`^mO3t$F2qoWa(m9ZQ2kzj{tDN_l6k*WbRy|!Kwps`dO?C&G; zqHiW(j5jbiWMzh{6#9cwn!tskjWs0kK+Y%`%*ufaf}_p)Dyyw!O>ptq+-hlb;E|{|N$p&;6ckUoe`NUzplL;hrU zW{GhFGugPzcoG%fhWxt)DxS5~iUX#R0+5|nSZe}7#>Ge@#pm;^x{4{B?PU|$1P!8> zw~7fg!F{#oc3Rh3PR!M?Pw_tI{3Rn-g&m{+U3LT)q27&b^j6Xb-ZUM5zsk{bdY6sB zNR^K`sng@0ocF01nEHe>&vS#jF53sqj*$$PHyb*Gm4+7b}U92iZT z9;XT{?dH}&cXnBE3nRG4{KJ-HM$S)fY4?~Z?fX*gnF8|=Y z)O}JB7qZ{lY)b9+7LsD8qRPjZ@O!6bDbZ$F7#?aNo#(x@H$s*fM=JCL6hk_~J^yHeb{3_l`m z=WGR3$3PVWP1lc>QACBo+-p=GcYznx5d?fA86)(mB6pcd#kBJU#U16kt$bn6&8ENf z*5Mq_vhqZi(k|0`h{AQ$pG2gMf}HvMjg+PRv@QtJ9uoy#?oF^kPtOVgNFNdHew7LwhvF!^ILd}8mHbwbZC~1hV7%Uw zKrS>*gnFw`&2m~;N0`}<=Q35{KThx)t^NQ!7S!-0+8EHRzR$DjXo;{mo}kb8%saVU zRkvL^_S!g{UR5!P3SGuA1fzNcM2Efz^?I;YSmt~aQVPa5q}>Y>Cfcb>*4{1I2+(<4 zR3`K-Mh#LD#h`+Ns)!29SWjd#WAv!t!<{n6TZnI!W!ZPo-O;Esi>49-HpEDzQV0xG zytRadInOmuM|<^%0bu&sOtp;O@YFt0kvd&axGK%s=~|77Zp+-x$o1?jWVJSKnJZ>A zBJHxviJXAPfn>Z5lSecrRG&L#x2MR!(f3$}->79O1crb@O4V!k4Cr}VA={$?AHIzL zru9^NK}mKh7ES%KpE28x&eP>Pm_sq-iS%GGHFD)Om4okP9mVJ))Gizf;&O)Hy5OFgadzMIeD!YaPMH|uxJb*w@B+Ghg#!XamDla-In|vm ze27dT@>hwmfLT>w1f@23NWHm8IMDFFhwBYw;PEOd|c$BsPv>f~k zd*G)iG^C82%Xx-RocJ(AQ4y6u6+mljVSwEPN>2`k@Uh~{IMM{n6B3PlQvvQO&y@dC zc#;9SES1V+X)J+qdMzKd5ud6Vhk+GW`s>69o>H{pi+j6F=u zaZNX~4PC1~3Q7xw5tsJ5$AjUV9KA~@4tb+Plj^ z$5Z*(JSshaiPd{vSplt_KFoqnTUk3$k6jsPKl8JRl_py2NL8NkoOJ{R-9p&C*-R9m z3hV8rc&ANwaE7+aHuJi$w`fh6r8A93p~tNv_WnBCMM!co5}%&lDUtz!sql@mU2$~T z?6MTgjxZ-p#3Zn@1P=1*(?gYe$^xo6Rr`7@!RWs+^W81#yQSKb_KzK+5qPy(%2x}= ztj+9IOukxyObDOUZ5B;M-I_eQ1NJSVaB8)IFc{Wp}eIo5nI;r#qFIz^z)9aftsh@A;?1fG}x45}ej&C|6 zfC5^zMcw8u&+rMIMYsgsoBikJz{T12Qkw1P#M))%COn@5QlddH0j^qkXDQtFCn`}) z<&&c`j2%FbXbfzXig4BR-cEfMO+v(5>FPoaORP-M}b|KeYNc zCtG+^DNOp^2ZfRO&1k!-j9IUfYP6-n*M~qGZX#%JhA7&7bLcHZ=HC;2WCeUI!IEEh zDWBKp^dY9?W^<%V?7;F|?9SB1+@#DI{u(v*W#pM$V zQAeX%l{C*y;dLz`ct-t>?Rs6d1$>KQFJibr5X-E}Cip4O>5N&*NWCh5A^h{aBIvqD zj|Hi|1}6@aW~)l4NxA=nJPx}7Ctlt2a*APk@?qQQm{5ZoOn)sT5fUs0J=wvrK2yy~ zA2t{xB&a~4y{7gqzWr&CuQ^pjk9fG5RF#_b*1K%@B31f z?=W%|nv7J8oPjcu7Kh55refFjLal*g2y<=ZU^JnBpuZqwTsV1G**5{PBSRuc)7wdDt+Ogux4HunOSVZ2Dnb?Y& zD08T`kf2LCwi2iAFbY?rz?r>M*y+r) zcO$k8kLLo;> zxJ**GonqY;VX}hw(C1B(*fF4sg_ZDrpeq}b$zme9SV`{7#1SaWW;Y_n#Vu@lB~0_I zN|=UFxJJ5~`^vvu7g3~<~)m6_{BV*lq^WhSiH9#a|7 zn(8*5s%k;;asF(`>pG0y3j7R|EH<1U+_`EmYhw8^lU;T=9!E}auooCM>E?Uqm7TD| ziO&H`FA8j>#ZRdiI0c#5m7QWvd-qAn@PBq_Qkh0xG6Uqhn(B8%vK46R+ouPo9q2{d z{CAOvMHW+dCWPchh;IW5F~Y`yj((qZn30NizK}PulCivS1+pmrv^GHwN~(yC(+?R~ z-Kju+pT_bv@{k$uz?z_UhMt{pcs$!bm#NxpDll{kfuKYQ9SpI8>aG@Od=@5pcPb0h zcT6N5(#F6h2tz;4n9F?5I$lK^a)K&D?sHsg4mG6El;(t|Q+O^@IFX{BXJ+vD|4al= z^wK-yj7p#L*+=>9Gw!P0w5>CuIh^5ETzV0DdM;Df`vu2jqpyh4W(TJoUkFC^Jj=s| z`Rdw;Awq0p(sv%CzT$T{p_JJzL|O)dM=_!2>yDk=p#Z|5gFks1cSSYE>Gg?7LdIr< z`zA);F_q5BE{3@9UQ(=Q9ECnoAX;iseEJuM7cLW>?=qD(3S2wK@DAcR$yc}w*oj`W zHOy2=KzZ7!8Mqe&JfpMbPDg<1B$L}~G-5eR?&dydKC)xD?_#__VyT84gbLlkb_EtU zzYR%RD5FseNyVUF@A1~Dx6$U1kxyzVD)qK7WHryd9St8+X$P){}qafH&UyV^5K{ew`!a6Zec_W

W1ntz@f zo0Zkv_3K{XQjHP=@f0!qKg{_C$LtO?RfGuMrzwf!uE(JiVjOhcyZ#o_UpPp$cc%*W zlVi4~jEN{%g;{z(2T@h2J6%IHD!6xN09m<(Ph$pV3R_0x(M~+7fs0)>bPGs9F$#!J zF(a#Fz@CmC$qbf0R8J8}g`I9#Zw9JEK2cItQNc%8Q020wKlys4(ZN}p`KAa(Hw4fW z_HCc8CisQzmPrOswRcKI;k~sGtzXX#PTM=e3cB8u$S5lY8v?}uJ>C-g`?SF{L;E?< ztCXWTZ)cHIWO1MLJ`J*RKqQxanx8f*(wsrbv1HwKc$f7FrDol1V^zrhD&B;h9cQI6 zns^_^NkdEYb7lNow~a_28I>tV>CDhz+bg2R@f<=D=66~Q!|YBtTdm2kr7p_{!lPdt zWo(NwurXXJ0zj=dn+L>cg}{!T5BrqqeY9U!->9xbPOv*Y!L;%|mHX^0^P(0cjO!Nq z3j&X}vreM$zn_*ck|-HoG=z7InyiwsBBh;HxcT?A66Yi)lc7zZq{2~?^#&V)iru5M zM*od!M}Q#;_2Hh&=*U|kH(-*8iZ`pbu*jD+)>PbF4#Z3gpxtvCPE`>?x5+zBn0F

5remfRObM7{dUP?(ZY=miNxdgx}V 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%0D{8 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 BackFaceData { casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], } } diff --git a/crates/engine/tests/integration/copied_ability_transform_generation.rs b/crates/engine/tests/integration/copied_ability_transform_generation.rs index 250d1ff995..bf3af9c4c4 100644 --- a/crates/engine/tests/integration/copied_ability_transform_generation.rs +++ b/crates/engine/tests/integration/copied_ability_transform_generation.rs @@ -83,6 +83,7 @@ fn stonewing_antagonizer_back_face() -> BackFaceData { casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], } } diff --git a/crates/engine/tests/integration/craft_tithing_blade_transform.rs b/crates/engine/tests/integration/craft_tithing_blade_transform.rs index 78190502e1..81f9dbe73f 100644 --- a/crates/engine/tests/integration/craft_tithing_blade_transform.rs +++ b/crates/engine/tests/integration/craft_tithing_blade_transform.rs @@ -391,6 +391,7 @@ fn consuming_sepulcher_back_face() -> BackFaceData { casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], } } diff --git a/crates/engine/tests/integration/deterministic_game_state_serde.rs b/crates/engine/tests/integration/deterministic_game_state_serde.rs index eed8182619..f97aba069d 100644 --- a/crates/engine/tests/integration/deterministic_game_state_serde.rs +++ b/crates/engine/tests/integration/deterministic_game_state_serde.rs @@ -1191,6 +1191,7 @@ fn back_face(name: &str) -> BackFaceData { casting_restrictions: Vec::new(), casting_options: Vec::new(), layout_kind: None, + parse_warnings: vec![], } } diff --git a/crates/engine/tests/integration/integration_adventure.rs b/crates/engine/tests/integration/integration_adventure.rs index 70458bf2bc..d25b69a7ab 100644 --- a/crates/engine/tests/integration/integration_adventure.rs +++ b/crates/engine/tests/integration/integration_adventure.rs @@ -93,6 +93,7 @@ fn stomp_back_face() -> BackFaceData { casting_restrictions: Vec::new(), casting_options: Vec::new(), layout_kind: None, + parse_warnings: vec![], } } diff --git a/crates/engine/tests/integration/issue_2425_fable_chapter_iii_transform.rs b/crates/engine/tests/integration/issue_2425_fable_chapter_iii_transform.rs index fc0dcb6324..e532f31595 100644 --- a/crates/engine/tests/integration/issue_2425_fable_chapter_iii_transform.rs +++ b/crates/engine/tests/integration/issue_2425_fable_chapter_iii_transform.rs @@ -50,6 +50,7 @@ fn reflection_back_face() -> BackFaceData { casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], } } @@ -80,6 +81,7 @@ fn etching_back_face() -> BackFaceData { casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], } } diff --git a/crates/engine/tests/integration/issue_4001_frolicking_familiar_adventure_instant.rs b/crates/engine/tests/integration/issue_4001_frolicking_familiar_adventure_instant.rs index 86ca2b2121..8b16553292 100644 --- a/crates/engine/tests/integration/issue_4001_frolicking_familiar_adventure_instant.rs +++ b/crates/engine/tests/integration/issue_4001_frolicking_familiar_adventure_instant.rs @@ -63,6 +63,7 @@ fn blow_off_steam_back_face() -> BackFaceData { casting_restrictions: Vec::new(), casting_options: Vec::new(), layout_kind: None, + parse_warnings: vec![], } } diff --git a/crates/engine/tests/integration/issue_5326_avatar_aang_transform.rs b/crates/engine/tests/integration/issue_5326_avatar_aang_transform.rs index 0c66d980fb..6aba669b6a 100644 --- a/crates/engine/tests/integration/issue_5326_avatar_aang_transform.rs +++ b/crates/engine/tests/integration/issue_5326_avatar_aang_transform.rs @@ -81,6 +81,7 @@ fn attach_aang_back_face(runner: &mut engine::game::scenario::GameRunner, aang: casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], }); } diff --git a/crates/engine/tests/integration/issue_6403_moonmist_mass_transform.rs b/crates/engine/tests/integration/issue_6403_moonmist_mass_transform.rs index 7c7083ccfb..6cdcd03dfe 100644 --- a/crates/engine/tests/integration/issue_6403_moonmist_mass_transform.rs +++ b/crates/engine/tests/integration/issue_6403_moonmist_mass_transform.rs @@ -48,6 +48,7 @@ fn attach_transform_back_face(runner: &mut GameRunner, object_id: ObjectId) { // CR 712.16: this is a transforming DFC, so the mass resolver may // transform it rather than applying CR 701.27c's no-op. layout_kind: Some(LayoutKind::Transform), + parse_warnings: vec![], }); } diff --git a/crates/engine/tests/integration/issue_691_sheoldred_saga_lore.rs b/crates/engine/tests/integration/issue_691_sheoldred_saga_lore.rs index 64894f8a23..544d68b4a6 100644 --- a/crates/engine/tests/integration/issue_691_sheoldred_saga_lore.rs +++ b/crates/engine/tests/integration/issue_691_sheoldred_saga_lore.rs @@ -49,6 +49,7 @@ fn true_scriptures_back_face() -> BackFaceData { casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], } } diff --git a/crates/engine/tests/integration/kamigawa_flip_cards.rs b/crates/engine/tests/integration/kamigawa_flip_cards.rs index 00c3340b18..ef16674be3 100644 --- a/crates/engine/tests/integration/kamigawa_flip_cards.rs +++ b/crates/engine/tests/integration/kamigawa_flip_cards.rs @@ -70,6 +70,7 @@ fn kenzo_alternative_face() -> BackFaceData { casting_restrictions: vec![], casting_options: vec![], layout_kind: Some(LayoutKind::Flip), + parse_warnings: vec![], } } @@ -129,6 +130,7 @@ fn tok_tok_alternative_face() -> BackFaceData { casting_restrictions: vec![], casting_options: vec![], layout_kind: Some(LayoutKind::Flip), + parse_warnings: vec![], } } diff --git a/crates/engine/tests/integration/main.rs b/crates/engine/tests/integration/main.rs index 78400aabf6..b089ac90aa 100644 --- a/crates/engine/tests/integration/main.rs +++ b/crates/engine/tests/integration/main.rs @@ -903,6 +903,7 @@ mod sensei_golden_tail_5950; mod sentinel_sliver_vigilance_grant; mod serpent_society_ward_poison_cost; mod serras_emissary_chosen_card_type_protection; +mod shorten_efficacy; mod sin_spiras_punishment_repeat; mod skullwinder_chosen_opponent; mod slaughter_the_strong_total_power_4380; diff --git a/crates/engine/tests/integration/room_door_lock_unlock.rs b/crates/engine/tests/integration/room_door_lock_unlock.rs index a818e1ea34..35d0328289 100644 --- a/crates/engine/tests/integration/room_door_lock_unlock.rs +++ b/crates/engine/tests/integration/room_door_lock_unlock.rs @@ -55,6 +55,7 @@ fn room_back_face() -> BackFaceData { casting_restrictions: Vec::new(), casting_options: Vec::new(), layout_kind: Some(LayoutKind::Split), + parse_warnings: vec![], } } diff --git a/crates/engine/tests/integration/rules/battle.rs b/crates/engine/tests/integration/rules/battle.rs index 1cb418f067..dbbf599964 100644 --- a/crates/engine/tests/integration/rules/battle.rs +++ b/crates/engine/tests/integration/rules/battle.rs @@ -104,6 +104,7 @@ fn siege_victory_cast_during_resolution_enters_transformed() { casting_restrictions: Vec::new(), casting_options: Vec::new(), layout_kind: None, + parse_warnings: vec![], }); } diff --git a/crates/engine/tests/integration/shorten_efficacy.rs b/crates/engine/tests/integration/shorten_efficacy.rs new file mode 100644 index 0000000000..005a18a9de --- /dev/null +++ b/crates/engine/tests/integration/shorten_efficacy.rs @@ -0,0 +1,3186 @@ +// engine-citation-gate: symbol anchors only +//! CR 732.2b/c stage 2 — EFFICACY of a polled seat's loop-shortcut response. +//! +//! CITATION FORM: rule NUMBER only. The number is itself the greppable heading — +//! `grep '^732.2c' docs/MagicCompRules.txt` resolves any citation below. Line +//! anchors are forbidden here (this file is enrolled in +//! `subsystem_citations_are_symbol_anchored`) because `docs/MagicCompRules.txt` +//! is gitignored and re-fetched per checkout, so a line anchor is pinned to +//! whichever rules revision the author happened to hold — the anchors this file +//! originally shipped already resolved to the wrong lines against the revision +//! fetched into the neighbouring checkout. +//! +//! `ai_support::smart_shortcut_response` shipped with a POSSIBILITY predicate +//! only: any meaningful priority action bought a `Shorten`, i.e. a real priority +//! window. That is right for a seat holding a Bolt and wrong for a seat holding +//! a fetchland — activating Terramorphic Expanse satisfies CR 732.2c's "must +//! make a different game choice" while changing nothing about the loop, so the +//! window is spent achieving nothing. +//! +//! Stage 2 is AI POLICY, not a rule: CR 732.2b grants an +//! unconditioned accept-or-shorten option and states no efficacy criterion. The +//! rows below pin the policy's two arms and, more importantly, pin the ONE +//! thing an over-broad version would destroy — that a seat holding real +//! interaction still gets its window. +//! +//! # Mutant discipline +//! +//! Two mutants are named per row, and every row states which one flips it: +//! * **DROP** — delete stage 2 from `smart_shortcut_response` (both arms), i.e. +//! restore the shipped one-stage predicate. +//! * **TRIVIALIZE** — make the stage-2 predicate constant. For arm (B) that is +//! `shortcut_efficacy::filter_is_actor_owned ≡ true` (everything looks +//! confined); for arm (A) it is deleting the `crowned_winner` guard. +//! +//! A row whose expected value equals the SHIPPED value cannot be flipped by +//! DROP — its discriminating power is entirely in TRIVIALIZE, and that is +//! stated on the row rather than papered over. + +use engine::analysis::decision_template::IterationCount; +use engine::analysis::loop_check::ShortcutResponse; +use engine::game::engine::apply; +use engine::game::scenario::{GameRunner, GameScenario}; +use engine::types::ability::{AbilityDefinition, AbilityKind, Effect, QuantityExpr, TargetFilter}; +use engine::types::actions::{GameAction, PrecastCopyShortcutResponse}; +use engine::types::card_type::{CoreType, Supertype}; +use engine::types::game_state::{GameState, LayersDirty, LoopDetectionMode, WaitingFor}; +use engine::types::identifiers::{CardId, ObjectId}; +use engine::types::mana::{ManaColor, ManaCost, ManaCostShard}; +use engine::types::phase::Phase; +use engine::types::player::PlayerId; +use engine::types::zones::Zone; + +const P0: PlayerId = PlayerId(0); +const P1: PlayerId = PlayerId(1); +const P2: PlayerId = PlayerId(2); +const P3: PlayerId = PlayerId(3); + +// --- Oracle-text constants, and what each one's provenance ACTUALLY is --- +// +// Two provenances ship here and they are deliberately not conflated, because +// "verbatim Oracle text" is a claim about a printing and only some of these +// make it. +// +// (1) SIBLING-FIXTURE PROVENANCE — the four loop-shape constants below are +// byte-identical copies of the shipped constants in +// `tests/integration/loop_shortcut.rs`, which does not present them as any +// card's Oracle text either. They exist to reproduce that file's mutual-drain +// loop, and copying them verbatim is what keeps the two files' loop shape +// identical. MEASURED against MTGJSON `AtomicCards.json` (`.data[*][0].text`): +// * `DRAIN_CLERIC` IS one printing's complete Oracle text (Epicure of Blood, +// Marauding Blight-Priest — 2 exact matches); +// * `BLOOD_SIPPER` matches NO card, not even as a substring; +// * `KICKOFF` / `TARGETED_KICKOFF` match no card's complete text; they are +// single-clause fragments (substrings of 53 and 3 cards respectively). +// So do NOT cite this block as card-derived: only `DRAIN_CLERIC` would +// survive that claim, and it is not why any of the four is here. +// +// (2) CARD PROVENANCE — `TERRAMORPHIC` and `DEATHRITE_SHAMAN` (below) ARE their +// named printing's complete Oracle text, verified byte-for-byte against +// MTGJSON. That matters for those two specifically: they are the rows' +// subject matter, and a paraphrase can take a different parser branch and go +// green while the real card stays broken. + +const DRAIN_CLERIC: &str = "Whenever you gain life, each opponent loses 1 life."; +const BLOOD_SIPPER: &str = "Whenever an opponent loses life, you gain 1 life."; +const KICKOFF: &str = "You gain 1 life."; +const TARGETED_KICKOFF: &str = "Target player gains 1 life."; + +/// Terramorphic Expanse, verbatim. Acceptance (a): a fetchland is the canonical +/// action that is legal, meaningful to stage 1, and totally confined. +const TERRAMORPHIC: &str = "{T}, Sacrifice this land: Search your library for a basic land card, \ + put it onto the battlefield tapped, then shuffle."; + +/// Deathrite Shaman, verbatim, all three abilities. Ability `[0]`'s cost is +/// `{T}` ALONE — no mana component — which is what lets the V1c fixture deny +/// `{B}`/`{G}` and still leave `[0]` legal. Its target is a land card in *a* +/// graveyard: the AST names no player, so ownership is UNPROVEN (CR 400.1 — +/// "Each player has their own library, hand, and graveyard"), which is exactly +/// why an `origin`-keyed confinement rule would wrongly call it self-contained. +const DEATHRITE_SHAMAN: &str = "{T}: Exile target land card from a graveyard. Add one mana of any \ + color.\n{B}, {T}: Exile target instant or sorcery card from a \ + graveyard. Each opponent loses 2 life.\n{G}, {T}: Exile target \ + creature card from a graveyard. You gain 2 life."; + +// --------------------------------------------------------------------------- +// Shared drive helpers. Deliberately local: `loop_shortcut.rs`'s equivalents +// are private to that module and it is not in this change's scope. +// --------------------------------------------------------------------------- + +/// Pass/answer beats until the state leaves `Priority`/`OrderTriggers`. +fn drive_collect(runner: &mut GameRunner, cap: usize) -> WaitingFor { + for _ in 0..cap { + match runner.state().waiting_for.clone() { + WaitingFor::Priority { .. } => { + if runner.act(GameAction::PassPriority).is_err() { + break; + } + } + WaitingFor::OrderTriggers { triggers, .. } => { + let order: Vec = (0..triggers.len()).collect(); + if runner + .act(GameAction::OrderTriggers { order }) + .or_else(|_| runner.act(GameAction::OrderTriggers { order: vec![] })) + .is_err() + { + break; + } + } + _ => break, + } + } + runner.state().waiting_for.clone() +} + +/// The exact action list `smart_shortcut_response` folds over — obtained by +/// CALLING production's recipe (`ai_support::shortcut_probe`), not by copying it. +/// A local copy would drift the moment production's recipe changed, and every +/// reach-guard in this file reads this list, so the guards would then be +/// measuring a different action set than the code under test. +fn probe_actions(state: &GameState, player: PlayerId) -> Vec { + engine::ai_support::shortcut_probe(state, player).1 +} + +/// Stage 1's verdict, evaluated on the PROBE state — which is the state +/// production evaluates it on. Evaluating it on the caller's +/// `RespondToShortcut` state instead silently drops +/// `has_meaningful_priority_action`'s sacrifice-for-mana rung, which is gated on +/// `waiting_for` being `Priority`. +fn stage_one_meaningful(state: &GameState, player: PlayerId) -> bool { + let (probe, actions) = engine::ai_support::shortcut_probe(state, player); + engine::ai_support::has_meaningful_priority_action(probe.state(), &actions) +} + +/// Which ability indices of `source` are actually enumerated at this window. +/// V1c's two reach-guards read this. +fn legal_ability_indices(state: &GameState, player: PlayerId, source: ObjectId) -> Vec { + let mut indices: Vec = probe_actions(state, player) + .iter() + .filter_map(|a| match a { + GameAction::ActivateAbility { + source_id, + ability_index, + } if *source_id == source => Some(*ability_index), + _ => None, + }) + .collect(); + indices.sort_unstable(); + indices +} + +/// The shipped `setup_3p_optional_cascade` shape (`loop_shortcut.rs`): P0 runs +/// a self-refilling mutual drain, P1's Mountain + Bolt make the loop OPTIONAL +/// so an offer is raised at all. `decorate` stages the seat under test. +fn optional_cascade(decorate: impl FnOnce(&mut GameScenario)) -> (GameRunner, ObjectId) { + let mut scenario = GameScenario::new_n_player(3, 7); + scenario.at_phase(Phase::PreCombatMain); + scenario.with_life(P0, 20); + scenario.with_life(P1, 20); + scenario.with_life(P2, 20); + scenario.add_creature_from_oracle(P0, "Test Drain Cleric", 2, 2, DRAIN_CLERIC); + scenario.add_creature_from_oracle(P0, "Test Blood Sipper", 2, 2, BLOOD_SIPPER); + scenario.add_basic_land(P1, ManaColor::Red); + scenario.add_bolt_to_hand(P1); + decorate(&mut scenario); + let kickoff = scenario + .add_spell_to_hand_from_oracle(P0, "Test Lifegain Kickoff", false, KICKOFF) + .id(); + let mut runner = scenario.build(); + runner.state_mut().loop_detection = LoopDetectionMode::Interactive; + (runner, kickoff) +} + +/// Cast the kick-off, drive to the offer, have P0 declare, then walk the APNAP +/// queue to `seat` by submitting manual Accepts for everyone ahead of it (never +/// the AI's answer — that would stop the queue). +fn respond_window_at(runner: &mut GameRunner, kickoff: ObjectId, seat: PlayerId) { + let _ = runner.cast(kickoff).resolve(); + let wf = drive_collect(runner, 500); + assert!( + matches!(wf, WaitingFor::LoopShortcut { .. }), + "reach-guard: the optional cascade must OFFER a shortcut, got {wf:?}" + ); + runner + .act(GameAction::DeclareShortcut { + count: IterationCount::UntilLethal, + template: None, + }) + .expect("the proposer declares"); + for _ in 0..8 { + match runner.state().waiting_for { + WaitingFor::RespondToShortcut { player, .. } if player == seat => return, + WaitingFor::RespondToShortcut { .. } => { + runner + .act(GameAction::RespondToShortcut { + response: ShortcutResponse::Accept, + }) + .expect("manual Accept advances the APNAP queue"); + } + _ => break, + } + } + panic!( + "reach-guard: {seat:?} must be polled; stopped at {:?}", + runner.state().waiting_for + ); +} + +// =========================================================================== +// V1b — ACCEPTANCE (a), Path A class: a fetchland no longer buys a window. +// =========================================================================== + +/// The shipped optional-cascade fixture plus exactly ONE card: a Terramorphic +/// Expanse on the polled seat's battlefield. Stage 1 still says "you have a +/// meaningful action" — a non-mana activated ability always does — and stage 2 +/// answers the question stage 1 cannot: the action reaches nothing but its own +/// controller's library, so the window would change nothing. +/// +/// MUTANTS — both flip the `Accept` assertion: +/// * DROP ⇒ `Shorten { at_iteration: 0 }` (this IS the shipped behaviour, which +/// is the defect). +/// * TRIVIALIZE arm (B) (`any_action_may_interfere ≡ true`) ⇒ `Shorten`. +/// +/// REACH-GUARDS (both are assertions): the fetchland really is enumerated, and +/// stage 1 really does return `true`. Without them an `Accept` here would be +/// indistinguishable from the empty-board stage-1 path — the vacuity that a +/// naive version of this row would ship. +#[test] +fn v1b_a_confined_fetchland_accepts_instead_of_buying_a_vacuous_window() { + let mut terramorphic = ObjectId(0); + let (mut runner, kickoff) = optional_cascade(|s| { + terramorphic = s + .add_land_from_oracle(P2, "Terramorphic Expanse", TERRAMORPHIC) + .id(); + }); + respond_window_at(&mut runner, kickoff, P2); + + let actions = probe_actions(runner.state(), P2); + assert!( + actions.contains(&GameAction::ActivateAbility { + source_id: terramorphic, + ability_index: 0, + }), + "REACH-GUARD 1: the fetchland's ability must be enumerated, otherwise this row \ + degenerates to the empty-board stage-1 path; got {actions:?}" + ); + assert!( + stage_one_meaningful(runner.state(), P2), + "REACH-GUARD 2: stage 1 (POSSIBILITY, untouched by this change) must still return \ + true — an Accept produced by stage 1 would prove nothing about stage 2" + ); + + assert_eq!( + engine::ai_support::smart_shortcut_response(runner.state(), P2), + ShortcutResponse::Accept, + "a seat whose ONLY action is a self-contained fetch has no efficacious response; \ + spending a real priority window on it changes nothing (CR 732.2c is satisfied by \ + any different choice, which is precisely why it grants no efficacy)" + ); +} + +// =========================================================================== +// V1c — B1 REGRESSION LOCK. The graveyard-hate seat still Shortens. +// =========================================================================== + +/// The one row whose sole job is pinning the owner axis. A graveyard is a +/// PER-PLAYER zone (CR 400.1) and `Zone` carries no +/// player field, so a rule keyed on `ChangeZone.origin` cannot tell "exile a +/// land card from MY graveyard" from "…from YOURS". Deathrite Shaman `[0]` +/// exiles a land card from P0's graveyard — a real interaction with another +/// player's resources — and must keep its window. +/// +/// This row's expected value (`Shorten`) IS the shipped value, so **DROP cannot +/// flip it**. Its whole discriminating power is the TRIVIALIZE arm: +/// `filter_is_actor_owned ≡ true` makes DRS `[0]` fold to `OwnResourcesOnly` +/// and the response becomes `Accept` — the row FLIPS. +/// +/// That flip only exists if the fixture leaves ability `[0]` and ONLY `[0]` +/// legal, so both constraints ship as assertions: +/// * REACH-GUARD 1 — without a land card in a graveyard, `[0]` is not +/// enumerated at all and the action list collapses to `["PassPriority"]`; +/// stage 1 returns false and the row would pass through the wrong path. +/// * REACH-GUARD 2 — with `{B}`/`{G}` available and a matching graveyard card, +/// `[1]`/`[2]` become legal. Their `LoseLife`/`GainLife` sub-effects classify +/// `MayInterfere` even under the mutant, so `any_action_may_interfere`'s +/// `.any()` absorbs the mutation and the row passes VACUOUSLY. +/// +/// The fixture denies `{B}`/`{G}` by construction (P2 controls no lands) and +/// stages no instant/sorcery/creature card in any graveyard, so `[1]` and `[2]` +/// are each blocked on two independent axes. +#[test] +fn v1c_graveyard_hate_across_a_per_player_zone_keeps_its_window() { + let mut shaman = ObjectId(0); + let (mut runner, kickoff) = optional_cascade(|s| { + // CR 302.6 (the summoning-sickness rule): `add_creature_from_oracle` + // stages a pre-existing battlefield creature, so the `{T}` cost is + // payable. + shaman = s + .add_creature_from_oracle(P2, "Deathrite Shaman", 1, 2, DEATHRITE_SHAMAN) + .id(); + // The land card sits in P0's graveyard — the ability reaches ACROSS a + // per-player zone that the AST does not player-qualify. That crossing + // is the whole of the defect this row locks. + s.add_land_to_graveyard(P0, "Test Graveyard Land"); + }); + respond_window_at(&mut runner, kickoff, P2); + + let indices = legal_ability_indices(runner.state(), P2, shaman); + assert!( + indices.contains(&0), + "REACH-GUARD 1: without a land card in a graveyard the Shaman's [0] is not enumerated \ + and this row degenerates to the stage-1 empty-action path; got {indices:?}" + ); + assert_eq!( + indices, + vec![0], + "REACH-GUARD 2: [1]/[2] must stay illegal. They classify MayInterfere even under the \ + TRIVIALIZE mutant, so leaving one legal lets .any() absorb the mutation and this row \ + passes vacuously; got {indices:?}" + ); + + assert_eq!( + engine::ai_support::smart_shortcut_response(runner.state(), P2), + ShortcutResponse::Shorten { at_iteration: 0 }, + "exiling a land card out of ANOTHER player's graveyard is real interaction — the \ + confinement predicate must require PROVEN actor ownership, not merely a zone name" + ); +} + +// =========================================================================== +// V2 / V3 — ACCEPTANCE (b) and the matched pair. +// =========================================================================== + +/// V3, both arms in one row, because neither arm alone is the discriminator. +/// The two boards are identical but for P2's holdings: +/// * `{}` ⇒ Accept, reached through stage 1 (nothing to do); +/// * `{Mountain, Lightning Bolt}` ⇒ Shorten, reached through stage 2. +/// +/// The pass ⇒ grant / respond ⇒ no-grant pair is what proves stage 2 did not +/// over-generalize into "always Accept". Sibling coverage for Wrath of God, +/// Naturalize, Divination and Path to Exile is at classifier granularity in +/// `ai_support::shortcut_efficacy`'s unit table (they are sorceries/instants +/// with no legal target on this board, so a runtime row would assert on +/// castability rather than on efficacy). +/// +/// MUTANTS: TRIVIALIZE arm (B) (`any_action_may_interfere ≡ false`, or +/// `filter_is_actor_owned ≡ true` — Bolt's `DealDamage` reaches neither, so it +/// is the whole-predicate constant that bites) flips the Bolt arm to `Accept`. +/// DROP leaves both arms at their shipped values and flips neither; that is +/// stated rather than claimed otherwise. +#[test] +fn v3_matched_pair_empty_seat_accepts_and_bolt_seat_still_shortens() { + // Arm 1 — nothing at all. + let (mut bare, bare_kickoff) = optional_cascade(|_| {}); + respond_window_at(&mut bare, bare_kickoff, P2); + let bare_actions = probe_actions(bare.state(), P2); + assert!( + !stage_one_meaningful(bare.state(), P2), + "reach-guard: this arm must resolve at STAGE 1, so it stays a control for the stage-2 \ + arm below; got {bare_actions:?}" + ); + assert_eq!( + engine::ai_support::smart_shortcut_response(bare.state(), P2), + ShortcutResponse::Accept, + "no meaningful action ⇒ Accept, unchanged from the shipped predicate" + ); + + // Arm 2 — the SAME board plus a Mountain and a Bolt. + let (mut armed, armed_kickoff) = optional_cascade(|s| { + s.add_basic_land(P2, ManaColor::Red); + s.add_bolt_to_hand(P2); + }); + respond_window_at(&mut armed, armed_kickoff, P2); + let armed_actions = probe_actions(armed.state(), P2); + assert!( + armed_actions + .iter() + .any(|a| matches!(a, GameAction::CastSpell { .. })), + "reach-guard: the Bolt must actually be castable, otherwise this arm tests the empty \ + board twice; got {armed_actions:?}" + ); + assert_eq!( + engine::ai_support::smart_shortcut_response(armed.state(), P2), + ShortcutResponse::Shorten { at_iteration: 0 }, + "ACCEPTANCE (b): a seat holding real interaction must still get its priority window — \ + this is the assertion any over-broad confinement rule destroys first" + ); +} + +// =========================================================================== +// V4 / V6 / V7 — arm (A): the crowned seat, keyed on `predicted_winner`. +// =========================================================================== + +/// CR 732.2a lets the player with priority propose a +/// shortcut whose predictable result crowns SOMEONE ELSE. This fixture is the +/// shipped `interactive_offer_separates_priority_proposer_from_predicted_winner` +/// shape: P1 proposes, P0 is the measured winner, and P1 (the proposer) is +/// excluded from the response queue, so P0 is polled. +/// +/// P0 also holds a Mountain and a Bolt — the reach-guard the measurement proved +/// load-bearing. WITHOUT them P0 has no meaningful action and Accepts via +/// stage 1, making the row vacuous; WITH them the shipped predicate returns +/// `Shorten`, i.e. the crowned player shortens its own guaranteed win. +/// +/// Three claims ride this one board: +/// * **V4** — arm (A) fires: the crowned seat Accepts. +/// * **V6** — it is keyed on `predicted_winner`, never `proposer`. The row +/// asserts `proposer != predicted_winner` and `polled == predicted_winner`, +/// so a `proposer`-keyed implementation (which passes every other row) fails +/// exactly here. +/// * **V7** — read order. Arm (A) reads the proposal off the ORIGINAL state; +/// `smart_shortcut_response` overwrites its probe clone's `waiting_for` with +/// `Priority` before enumerating. Moving that read after the clone makes +/// `crowned_winner` unconditionally `None` and this row FAILS — it is the +/// only row that can detect the mis-ordering. +/// +/// MUTANTS — both flip the `Accept` assertion: DROP ⇒ `Shorten`; TRIVIALIZE +/// arm (A) (delete the `crowned_winner` guard) ⇒ `Shorten` via arm (B), because +/// the Bolt is genuine interference. +#[test] +fn v4_the_crowned_seat_accepts_its_own_predicted_win() { + let mut scenario = GameScenario::new_n_player(2, 7); + scenario.at_phase(Phase::PreCombatMain); + scenario.with_life(P0, 20); + scenario.with_life(P1, 20); + scenario.add_creature_from_oracle(P0, "Test Drain Cleric", 2, 2, DRAIN_CLERIC); + scenario.add_creature_from_oracle(P0, "Test Blood Sipper", 2, 2, BLOOD_SIPPER); + scenario.add_basic_land(P1, ManaColor::Red); + scenario.add_bolt_to_hand(P1); + // The reach-guard: P0 must hold a meaningful action or stage 1 answers first. + scenario.add_basic_land(P0, ManaColor::Red); + scenario.add_bolt_to_hand(P0); + let kickoff = scenario + .add_spell_to_hand_from_oracle(P1, "P0 Lifegain Kickoff", false, TARGETED_KICKOFF) + .id(); + let mut runner = scenario.build(); + runner.state_mut().loop_detection = LoopDetectionMode::Interactive; + runner.state_mut().active_player = P1; + runner.state_mut().priority_player = P1; + runner.state_mut().waiting_for = WaitingFor::Priority { player: P1 }; + + let _ = runner.cast(kickoff).target_player(P0).resolve(); + let wf = drive_collect(&mut runner, 500); + let WaitingFor::LoopShortcut { + proposer, + predicted_winner, + .. + } = wf + else { + panic!("reach-guard: P1's priority window must receive an offer, got {wf:?}"); + }; + assert_eq!( + proposer, P1, + "CR 732.2a routes the offer to the priority holder" + ); + assert_eq!( + predicted_winner, + Some(P0), + "reach-guard: the two authorities must actually DIFFER, or the winner-keyed and \ + proposer-keyed implementations are indistinguishable here" + ); + + runner + .act(GameAction::DeclareShortcut { + count: IterationCount::UntilLethal, + template: None, + }) + .expect("P1 declares"); + let WaitingFor::RespondToShortcut { + player, + ref proposal, + .. + } = runner.state().waiting_for + else { + panic!( + "reach-guard: a response window must open, got {:?}", + runner.state().waiting_for + ); + }; + assert_eq!( + player, P0, + "the proposer is excluded from its own response queue, so the crowned seat is polled" + ); + assert_ne!( + proposal.proposer, + proposal + .predicted_winner + .expect("this offer names a winner"), + "V6: the multi-authority premise — a proposer-keyed rule would read P1 here" + ); + + let actions = probe_actions(runner.state(), P0); + assert!( + stage_one_meaningful(runner.state(), P0), + "REACH-GUARD: without a meaningful action P0 would Accept via stage 1 and this row \ + would be vacuous; got {actions:?}" + ); + + assert_eq!( + engine::ai_support::smart_shortcut_response(runner.state(), P0), + ShortcutResponse::Accept, + "arm (A): the offer's predicted result already crowns this seat. CR 732.2c grants a \ + shortening player nothing but the obligation to choose differently, so shortening \ + here moves the game away from a win it already holds" + ); +} + +// =========================================================================== +// V1 / V5 — REAL 4-player board, loaded through the production restore +// chokepoint and driven through the public `apply()` boundary. +// =========================================================================== + +/// Inflate a committed dump fixture. +fn gunzip_dump(gz: &[u8]) -> String { + use std::io::Read; + let mut json = String::new(); + flate2::read::GzDecoder::new(gz) + .read_to_string(&mut json) + .expect("fixture .json.gz must inflate to UTF-8 JSON"); + json +} + +/// Decode AS `PersistedGameState` — the production chokepoint the server's +/// `from_persisted` and WASM's `decode_restored_game_state` both funnel +/// through — rather than decoding a bare `GameState`. +fn restore_dump(json: &str) -> GameState { + let envelope: serde_json::Value = + serde_json::from_str(json).expect("dump envelope parses as JSON"); + serde_json::from_value::( + envelope["gameState"].clone(), + ) + .expect("gameState deserializes through the production decoder") + .into_game_state() +} + +/// The LIVE-PATH board: the real 4-player Dina / Bloodthirsty Conqueror drain +/// on which the defect actually occurs, because seat P2 controls a Terramorphic +/// Expanse. +/// +/// Derived from the read-only pristine archive, and the derivation is the +/// artifact's provenance rather than a claim about it: +/// `unzip -p combofb-dumps-pristine/dina-conqueror-offers-no-ff.zip | +/// jq -c '{gameState}' | gzip -9 -n` +/// → 844846 bytes, sha256 +/// `9843d5165cbbf7dd7bca4171c7888c190b7eba7e52a2ed095b44ff76fadd7886`. +/// `gzip -n` is a no-op from a pipe but load-bearing from a file (it strips the +/// stored name and mtime), so KEEP it: a re-derivation that stages the 21 MB +/// dump through an intermediate file — the natural thing to do at that size — +/// otherwise misses the digest and presents as a corrupt artifact rather than +/// as convention drift. +fn live_path_board() -> GameState { + restore_dump(&gunzip_dump(include_bytes!( + "../fixtures/dina_noff_turn5_4p.json.gz" + ))) +} + +/// The QUIET board: the same matchup captured at a beat where NO seat holds any +/// meaningful priority action. Retained only as a negative control — see +/// `v1_control_*` for why it has no discriminating power for acceptance (a). +fn quiet_board() -> GameState { + restore_dump(&gunzip_dump(include_bytes!( + "../fixtures/dina_conqueror_4p.json.gz" + ))) +} + +fn dump_driver_forbids(a: &GameAction) -> bool { + matches!(a, GameAction::Concede { .. } | GameAction::Debug(_)) +} + +fn dump_beat_actor(state: &GameState) -> Option<(PlayerId, Vec)> { + if let Some(p) = state.waiting_for.acting_player() { + let (actions, _costs, _grouped) = engine::ai_support::legal_actions_for_viewer(state, p); + if !actions.is_empty() { + return Some((p, actions)); + } + } + for p in state.players.iter().map(|p| p.id) { + let (actions, _costs, _grouped) = engine::ai_support::legal_actions_for_viewer(state, p); + if !actions.is_empty() { + return Some((p, actions)); + } + } + None +} + +/// One beat of the drain-drive policy: at `Priority` ALWAYS pass (the mandatory +/// triggers re-trigger — that IS the loop), answer every other prompt. +fn dump_drive_one_beat(state: &mut GameState) -> Result<(), String> { + let Some((who, actions)) = dump_beat_actor(state) else { + return Err(format!("no legal actor at {:?}", state.waiting_for)); + }; + let chosen = if matches!(state.waiting_for, WaitingFor::Priority { .. }) { + actions + .iter() + .find(|a| matches!(a, GameAction::PassPriority)) + .cloned() + } else { + actions + .iter() + .find(|a| !matches!(a, GameAction::PassPriority) && !dump_driver_forbids(a)) + .or_else(|| actions.iter().find(|a| !dump_driver_forbids(a))) + .cloned() + }; + let Some(action) = chosen else { + return Err(format!("empty action list at {:?}", state.waiting_for)); + }; + apply(state, who, action.clone()) + .map(|_| ()) + .map_err(|e| format!("apply err ({action:?}): {e:?}")) +} + +/// Drive real beats until the board mints a bounded offer. +fn drive_to_offer(state: &mut GameState, cap: usize) -> Option { + for beat in 0..cap { + if matches!(state.waiting_for, WaitingFor::LoopShortcut { .. }) { + return Some(beat); + } + if dump_drive_one_beat(state).is_err() { + return None; + } + } + None +} + +// NOTE: no `give_fetchland` staging helper. The live-path test drives the seat's +// OWN Terramorphic Expanse out of the restored dump (`ObjectId(203)`), so there is +// nothing to inject; a staging helper here would have made the live test synthetic +// again. `give_bolt` below survives because the positive control needs an +// interactive card the recorded board does not contain. + +/// Stage a castable Lightning Bolt in `player`'s hand, mirroring +/// `GameScenario::add_bolt_to_hand` (same `Effect::DealDamage` ability, same +/// absence of a printed mana cost) so the positive control below is the same +/// interaction the shipped fixtures use. +fn give_bolt(state: &mut GameState, player: PlayerId) -> ObjectId { + give_bolt_with_cost(state, player, ManaCost::zero()) +} + +/// `give_bolt` with a PRINTED cost, so a row can stage an interaction the seat +/// cannot yet afford. `GameObject::mana_cost` is the field the castability probe +/// reads, and `ManaCost`'s `Default` is `zero()` (`GameObject::new` seeds both +/// cost fields from it), so the free-Bolt caller above is byte-unchanged. +/// +/// BOTH fields are assigned, but the LIVE one is what carries this helper — +/// `base_mana_cost` is NOT load-bearing for the objects staged here, and saying +/// otherwise would be a justification the next reader trusts. +/// +/// READ FROM SOURCE (three call sites, not a runtime probe — the evidence grade +/// is stated because overclaiming it is the very habit this comment replaces). +/// `game::layers`' base→live reseed does run +/// `mana_cost = base_mana_cost.clone()` (`seed_live_characteristics_from_base`), +/// and every consumer here does reach the object through +/// `ai_support::shortcut_probe`, which flushes layers — but the full pass +/// applies that reseed (via `reset_recipient_to_base`) only over +/// `battlefield_phased_in_ids()`, and the hand branch of the same pass resets +/// `keywords` alone. `layers::layer_pass_materializes_keywords`' doc is the +/// in-repo authority for that split ("Battlefield — resets the full +/// characteristic set" vs "Hand — keywords-only reset"); the incremental arm +/// resets only battlefield entrants and their hosts, so it cannot reach a hand +/// object either. This object is staged to `Zone::Hand`, so no pass reseeds its +/// `mana_cost`. `GameObject`'s +/// `sync_missing_base_characteristics` — which the hand branch DOES call — +/// would in fact back-fill `base_mana_cost` from the live field, the opposite +/// direction. +/// +/// `base_mana_cost` is set for symmetry: it keeps the two fields from +/// disagreeing on a freshly minted object, and it keeps the helper correct if +/// the hardcoded `Zone::Hand` below ever becomes the battlefield, where the +/// reseed WOULD restore the default (free) cost over the printed one and +/// silently leave an "otherwise-unaffordable" premise measuring nothing. +fn give_bolt_with_cost(state: &mut GameState, player: PlayerId, cost: ManaCost) -> ObjectId { + let card_id = CardId(state.next_object_id); + let id = engine::game::zones::create_object( + state, + card_id, + player, + "Lightning Bolt".to_string(), + Zone::Hand, + ); + let ability = AbilityDefinition::new( + AbilityKind::Spell, + Effect::DealDamage { + amount: QuantityExpr::Fixed { value: 3 }, + target: TargetFilter::Any, + damage_source: None, + excess: None, + }, + ); + let obj = state.objects.get_mut(&id).expect("just created"); + obj.card_types + .core_types + .push(engine::types::card_type::CoreType::Instant); + obj.base_card_types = obj.card_types.clone(); + obj.base_mana_cost = cost.clone(); + obj.mana_cost = cost; + obj.abilities = std::sync::Arc::new(vec![ability.clone()]); + obj.base_abilities = std::sync::Arc::new(vec![ability]); + state.layers_dirty = LayersDirty::full(); + id +} + +/// Declare the offer this board minted, then poll `seat` by walking the APNAP +/// queue with MANUAL Accepts (never the AI's answer, which would stop the +/// queue). Returns the state parked at `seat`'s response window. +fn declare_and_poll(state: &GameState, seat: PlayerId) -> GameState { + let WaitingFor::LoopShortcut { + proposer, + ref schema, + .. + } = state.waiting_for + else { + panic!( + "declare_and_poll expects a LoopShortcut window, got {:?}", + state.waiting_for + ); + }; + let mut s = state.clone(); + apply( + &mut s, + proposer, + GameAction::DeclareShortcut { + count: schema.iteration_count.clone(), + template: None, + }, + ) + .expect("the proposer declares its own offer"); + for _ in 0..8 { + match s.waiting_for { + WaitingFor::RespondToShortcut { player, .. } if player == seat => return s, + WaitingFor::RespondToShortcut { player, .. } => { + apply( + &mut s, + player, + GameAction::RespondToShortcut { + response: ShortcutResponse::Accept, + }, + ) + .expect("manual Accept advances the APNAP queue"); + } + _ => break, + } + } + panic!( + "reach-guard: {seat:?} must be polled; stopped at {:?}", + s.waiting_for + ); +} + +/// The non-`PassPriority` actions available to `seat`, rendered with the source +/// object's name / zone / controller so a reach-guard failure names the board +/// rather than an opaque id. +fn non_pass_actions(state: &GameState, seat: PlayerId) -> Vec { + probe_actions(state, seat) + .iter() + .filter(|a| !matches!(a, GameAction::PassPriority)) + .map(|a| match a { + GameAction::ActivateAbility { + source_id, + ability_index, + } => { + let o = state.objects.get(source_id); + format!( + "ActivateAbility({source_id:?} {:?} #{ability_index} zone={:?} controller={:?})", + o.map(|o| o.name.clone()), + o.map(|o| o.zone), + o.map(|o| o.controller) + ) + } + other => format!("{other:?}"), + }) + .collect() +} + +// =========================================================================== +// V1 / V5 — ACCEPTANCE (a) on the REAL 4-player board, LIVE PATH. +// =========================================================================== + +/// **The acceptance row.** A real 4-player Dina / Bloodthirsty Conqueror drain, +/// restored through the production chokepoint +/// (`PersistedGameState::into_game_state()`, the same path the server's +/// `from_persisted` and WASM's `decode_restored_game_state` funnel through) and +/// driven beat by beat through the public `apply()` boundary. No `GameScenario` +/// anywhere on this row: a synthetic board going green while the live 4p case +/// failed is a documented failure mode in this lane. +/// +/// The defect, on this exact board: seat P2 controls **`ObjectId(203)`, +/// "Terramorphic Expanse"**, on the battlefield. A non-mana activated ability is +/// unconditionally "meaningful" to stage 1, so the shipped one-stage predicate +/// answered `Shorten { at_iteration: 0 }` — handing P2 a real priority window +/// whose only content is cracking its own fetchland, which cannot touch the +/// drain. Stage 2 answers `Accept`. +/// +/// **V5 — bounded offers are NOT exempt.** MEASURED on this board: the offer +/// mints at beat 21 carrying `predicted_winner: None` and +/// `IterationCount::Fixed(25)`. It is the BOUNDED class, not the `UntilLethal` +/// class the synthetic rows use, and `predicted_winner: None` additionally +/// proves arm (A) cannot be what produces the `Accept` below — only arm (B) +/// can. Re-introducing an `UntilLethal`-only gate makes this row return +/// `Shorten` and fail. +/// +/// **Why the flip set is exactly {P2}, asserted rather than asserted-about.** +/// P1 and P3 are polled on the same board and hold nothing, so they answer at +/// stage 1 and are unaffected. That is the sibling control: the change is +/// surgical, not a blanket flip to `Accept`. +/// +/// MUTANTS — the `Accept` assertion flips under both: +/// * **DROP** (delete stage 2) ⇒ `Shorten { at_iteration: 0 }`, which is the +/// shipped behaviour and therefore the defect itself; +/// * **TRIVIALIZE** (`any_action_may_interfere ≡ true`) ⇒ `Shorten`. +/// +/// The opposite direction is `v1_positive_control_*` below, on this same board. +#[test] +fn v1_live_path_fetchland_seat_accepts_on_the_real_4p_board() { + let mut board = live_path_board(); + assert!( + !matches!(board.waiting_for, WaitingFor::LoopShortcut { .. }), + "reach-guard: the dump must not ship AT an offer — the offer is this drive's product, \ + not its input; got {:?}", + board.waiting_for + ); + let beat = drive_to_offer(&mut board, 400).expect( + "CR 732.2a: the offer must FIRE on this real 4p drain. A failure here is the offer \ + never being raised, not a fixture accident", + ); + let WaitingFor::LoopShortcut { + predicted_winner, + ref schema, + .. + } = board.waiting_for + else { + unreachable!("drive_to_offer only returns at a LoopShortcut window"); + }; + + // ── V5's premise, read off the live offer rather than assumed ── + assert_eq!( + predicted_winner, None, + "V5: the BOUNDED class mints no crown — so arm (A) is structurally unable to produce \ + the Accept below, and only arm (B) can (offer beat {beat})" + ); + assert_eq!( + schema.iteration_count, + IterationCount::Fixed(25), + "V5: a FINITE count is the point — stage 2 takes the identical rule for it and for \ + the UntilLethal class" + ); + + // ── the row: P2, whose only action is its own fetchland ── + let polled = declare_and_poll(&board, P2); + let non_pass = non_pass_actions(&polled, P2); + + assert_eq!( + non_pass.len(), + 1, + "REACH-GUARD: P2 must hold EXACTLY ONE non-pass action. Two would let the fold's \ + .any() reach Shorten through the other one and this row would pass for the wrong \ + reason; zero would make it the stage-1 path; got {non_pass:?}" + ); + assert!( + non_pass[0].contains("Terramorphic Expanse") + && non_pass[0].contains("zone=Some(Battlefield)") + && non_pass[0].contains("controller=Some(PlayerId(2))"), + "REACH-GUARD: that one action must be P2's OWN battlefield fetchland — the object the \ + diagnosis pinned; got {non_pass:?}" + ); + + // NON-VACUITY PIN. The guards above read the FLAT list, which cannot contain + // a BATTLEFIELD mana activation: `candidates.rs` excludes it at generation + // (`!is_mana_ability(&ability_def)`), and a land's `TapLandForMana` is + // additionally dropped by `flat_priority_actions_with_probe`'s + // `GameAction::is_mana_ability` filter. (It CAN contain a hand- or + // graveyard-zone mana activation, which has its own candidate loop and is a + // `GameAction::ActivateAbility` — so the filter never sees it. That class is + // not on this board, and what would catch it is the `non_pass.len() == 1` + // REACH-GUARD above, NOT the assertion below: such an activation is already + // IN the flat list, so it shows up as a second non-pass action, while + // `stage_two_action_set` only APPENDS `meaningful_sacrifice_mana_actions` — + // a non-sacrifice one adds nothing and `stage_two == flat` still holds.) + // The set stage 2 actually folds over is WIDER still — `stage_two_action_set` + // re-admits sacrifice-for-mana activations — so without this the flagship is + // blind to exactly the class that would vacuate the feature: a seat that + // acquired a Lotus-Petal-shaped permanent during the drive would silently + // start Shortening and this row would flip. + let (probe, flat) = engine::ai_support::shortcut_probe(&polled, P2); + let stage_two = engine::ai_support::stage_two_action_set(probe.state(), &flat); + assert_eq!( + stage_two, flat, + "NON-VACUITY: P2 must own NO mana-producing action on this board, so its Accept is \ + produced by the fetchland's confinement and NOT by the absence of a widening. If this \ + fails, the flagship Accept is no longer measuring what it claims — re-derive the row, \ + do NOT relax the assertion" + ); + + assert!( + stage_one_meaningful(&polled, P2), + "REACH-GUARD: stage 1 (POSSIBILITY, untouched here) must still return true. An Accept \ + produced by stage 1 would prove nothing about stage 2 — this is the assertion that \ + makes the row non-vacuous" + ); + + assert_eq!( + engine::ai_support::smart_shortcut_response(&polled, P2), + ShortcutResponse::Accept, + "ACCEPTANCE (a), LIVE PATH: cracking its own fetchland cannot touch the drain, so P2 \ + must not buy a priority window with it. CR 732.2c is satisfied by ANY different \ + choice, which is exactly why satisfying it carries no efficacy" + ); + + // ── sibling control: the flip set is exactly {P2} ── + for seat in [P1, P3] { + let other = declare_and_poll(&board, seat); + assert!( + !stage_one_meaningful(&other, seat), + "sibling control: {seat:?} holds nothing on this board, so it answers at stage 1 \ + and stage 2 never runs for it; got {:?}", + non_pass_actions(&other, seat) + ); + assert_eq!( + engine::ai_support::smart_shortcut_response(&other, seat), + ShortcutResponse::Accept, + "sibling control: {seat:?} is unchanged by this fix — the flip set is exactly {{P2}}" + ); + } +} + +/// The positive control for the row above, on the SAME real board: give P2 a +/// castable Lightning Bolt and it must Shorten. +/// +/// This is what makes `v1_live_path_*`'s `Accept` attributable. The same +/// instrument, on the same restored 4p board, at the same offer, returns BOTH +/// values — so the `Accept` is caused by the fetchland's confinement and not by +/// anything about the board, the beat, or the offer class. Without this row a +/// classifier that answered `Accept` unconditionally would pass. +/// +/// MUTANT: `any_action_may_interfere ≡ false` ⇒ `Accept` — this row flips. +/// +/// This row's expected value (`Shorten`) IS the shipped value, so **DROP cannot +/// flip it**. Its whole discriminating power is the TRIVIALIZE arm named above. +#[test] +fn v1_positive_control_interactive_seat_still_shortens_on_the_real_4p_board() { + let mut board = live_path_board(); + drive_to_offer(&mut board, 400).expect("the offer must fire"); + let bolt = give_bolt(&mut board, P2); + + let polled = declare_and_poll(&board, P2); + let actions = probe_actions(&polled, P2); + assert!( + actions + .iter() + .any(|a| matches!(a, GameAction::CastSpell { object_id, .. } if *object_id == bolt)), + "REACH-GUARD: the Bolt must actually be castable here, or this control cannot fire; \ + got {:?}", + non_pass_actions(&polled, P2) + ); + + assert_eq!( + engine::ai_support::smart_shortcut_response(&polled, P2), + ShortcutResponse::Shorten { at_iteration: 0 }, + "ACCEPTANCE (b), LIVE PATH: a seat holding real interaction must still get its window. \ + This is the assertion any over-broad confinement rule destroys first" + ); +} + +/// NEGATIVE CONTROL — and its limits are the point. +/// +/// The previously-tracked `dina_conqueror_4p` board is the same matchup at a +/// beat where NO seat holds any meaningful priority action. MEASURED: the offer +/// mints at beat 19 with `predicted_winner: None`, `IterationCount::Fixed(30)`, +/// and all three polled seats (P1, P2, P3) enumerate exactly +/// `["PassPriority"]` — length one, NOT empty; it is +/// `has_meaningful_priority_action` returning false that produces the Accept, +/// not an empty action vector. +/// +/// **This board therefore has ZERO discriminating power for acceptance (a), and +/// it is retained only for what it CAN show.** The defect needs a seat holding +/// a meaningful-but-vacuous action; a board with no such seat cannot exhibit it, +/// so this row passes identically with and without stage 2. Do not promote it +/// to an acceptance row, and do not read its green as evidence about the fix: +/// what it pins is the one-way property that stage 2 must not make a quiet +/// board start Shortening. +#[test] +fn v1_control_quiet_board_is_unchanged_and_cannot_discriminate() { + let mut board = quiet_board(); + let beat = drive_to_offer(&mut board, 400).expect("the quiet board still mints an offer"); + let WaitingFor::LoopShortcut { + predicted_winner, + ref schema, + .. + } = board.waiting_for + else { + unreachable!() + }; + assert_eq!(predicted_winner, None, "bounded class (offer beat {beat})"); + assert_eq!(schema.iteration_count, IterationCount::Fixed(30)); + + for seat in [P1, P2, P3] { + let polled = declare_and_poll(&board, seat); + let actions = probe_actions(&polled, seat); + assert_eq!( + actions, + vec![GameAction::PassPriority], + "the premise of this control: {seat:?} enumerates exactly one action, and it is a \ + pass. If this ever fails the board is no longer quiet and the row's `cannot \ + discriminate` claim needs re-deriving" + ); + assert!( + !stage_one_meaningful(&polled, seat), + "and it is stage 1, not an empty action list, that answers" + ); + assert_eq!( + engine::ai_support::smart_shortcut_response(&polled, seat), + ShortcutResponse::Accept, + "no-regress: stage 2 must not make a quiet seat start Shortening" + ); + } +} + +// =========================================================================== +// V8 — the SECOND window this authority answers: the pre-cast copy route. +// =========================================================================== + +const PRECAST_EPOCH: u64 = 7; +const PRECAST_BREAKPOINT: u64 = 99; + +/// Re-park an already-polled state at the PRE-CAST responder window, board +/// untouched. +/// +/// Hand-built from the engine's own constructor shape +/// (`game::precast_copy_shortcut::responder_wait`), exactly as the shipped +/// `precast_copy_shortcut.rs` fixture `precast_shortcut_response_state` does. +/// Sound HERE specifically: `smart_shortcut_response` reads `waiting_for` for +/// one thing only (the crown — and this variant carries no crown to read) and +/// then re-parks its own probe clone at `Priority`, so the efficacy answer is a +/// function of the BOARD. Driving a genuine pre-cast copy route would supply a +/// different board, which is the one variable this row must hold fixed against +/// `v1b`/`v3` above. +fn as_precast_window(state: &GameState, seat: PlayerId) -> GameState { + let mut s = state.clone(); + s.waiting_for = WaitingFor::RespondToPrecastCopyShortcut { + player: seat, + epoch: PRECAST_EPOCH, + breakpoint_ids: vec![PRECAST_BREAKPOINT], + remaining_players: Vec::new(), + }; + s +} + +/// The pre-cast reply the PRODUCTION candidate builder emits for this state. +/// Goes through `ai_support::candidate_actions`, i.e. the real consumer at +/// `candidates::candidate_actions_broad_with_probe`, so the +/// `ShortcutResponse` → `PrecastCopyShortcutResponse` mapping is measured too. +fn precast_candidate_response(state: &GameState) -> PrecastCopyShortcutResponse { + let replies: Vec = engine::ai_support::candidate_actions(state) + .iter() + .filter_map(|candidate| match &candidate.action { + GameAction::PrecastCopyShortcut { epoch, response } if *epoch == PRECAST_EPOCH => { + Some(response.clone()) + } + _ => None, + }) + .collect(); + assert_eq!( + replies.len(), + 1, + "reach-guard: the pre-cast responder window must offer exactly one reply candidate, \ + otherwise this row is reading something else; got {replies:?}" + ); + replies[0].clone() +} + +/// `smart_shortcut_response` is the single authority for TWO accept-or-shorten +/// windows, not one: `candidates::candidate_actions_broad_with_probe` routes +/// `WaitingFor::RespondToPrecastCopyShortcut` through it as well and maps the +/// answer onto `PrecastCopyShortcutResponse`. Stage 2 therefore changed behaviour +/// at that window too, and this row measures it instead of assuming it. +/// +/// Uniform treatment is the deliberate choice: both windows ask the identical +/// question — is a real priority window worth taking here — so a seat whose only +/// action cannot touch the loop should decline both. Arm (A) is separately +/// INAPPLICABLE here rather than merely skipped: `RespondToPrecastCopyShortcut` +/// carries no proposal summary and hence no `predicted_winner` field, so there is +/// no crown to read. Stage 1 and arm (B) both apply and both run. +/// +/// NON-VACUITY, and it is arm 2 that supplies it: `candidates.rs` maps a +/// `Shorten` with an EMPTY `breakpoint_ids` back to `Accept`, so on a +/// breakpoint-less prompt both answers would collapse to `Accept` and arm 1 +/// would pass for free. Arm 2 returns `Shorten { breakpoint_id }` off the same +/// staged breakpoint list, which proves the mapping is live and arm 1's `Accept` +/// is the efficacy verdict rather than the collapse. +/// +/// MUTANTS — both RUN, not reasoned about: +/// * `any_action_may_interfere ≡ true` ⇒ arm 1's production-path assertion fails +/// with `left: Shorten { breakpoint_id: 99 }, right: Accept`. This is also the +/// direct measurement of the non-vacuity claim above: the mapping's `Shorten` +/// branch really is reachable on this prompt. +/// * `any_action_may_interfere ≡ false` ⇒ arm 2 fails with +/// `left: Accept, right: Shorten { breakpoint_id: 99 }`. +/// +/// DROP (delete stage 2 entirely) flips arm 1 the same way and leaves arm 2 at +/// its shipped value; the first mutant covers that direction. +#[test] +fn v8_precast_window_takes_the_same_efficacy_answer() { + // Arm 1 — the confined fetchland seat. + let (mut runner, kickoff) = optional_cascade(|s| { + s.add_land_from_oracle(P2, "Terramorphic Expanse", TERRAMORPHIC); + }); + respond_window_at(&mut runner, kickoff, P2); + let fetch_precast = as_precast_window(runner.state(), P2); + + assert!( + stage_one_meaningful(&fetch_precast, P2), + "REACH-GUARD: stage 1 must still say `meaningful` at the PRE-CAST window, or this arm \ + measures the stage-1 path and says nothing about stage 2; got {:?}", + non_pass_actions(&fetch_precast, P2) + ); + // The PRODUCTION-PATH assertion comes first deliberately: it is the one that + // has to discriminate, and an authority-level assertion ahead of it would + // absorb every mutant before the candidate builder was ever exercised. + assert_eq!( + precast_candidate_response(&fetch_precast), + PrecastCopyShortcutResponse::Accept, + "the pre-cast candidate builder must carry stage 2's answer through: a window whose only \ + content is cracking one's own fetchland is worth no more on the pre-cast route than on \ + the generic one" + ); + assert_eq!( + engine::ai_support::smart_shortcut_response(&fetch_precast, P2), + ShortcutResponse::Accept, + "and the authority itself answers identically at both windows" + ); + + // Arm 2 — the same board plus real interaction. The window is still granted. + let (mut armed, armed_kickoff) = optional_cascade(|s| { + s.add_land_from_oracle(P2, "Terramorphic Expanse", TERRAMORPHIC); + s.add_basic_land(P2, ManaColor::Red); + s.add_bolt_to_hand(P2); + }); + respond_window_at(&mut armed, armed_kickoff, P2); + let armed_precast = as_precast_window(armed.state(), P2); + + assert!( + probe_actions(&armed_precast, P2) + .iter() + .any(|a| matches!(a, GameAction::CastSpell { .. })), + "reach-guard: the Bolt must be castable at the pre-cast window too, or this arm repeats \ + arm 1; got {:?}", + non_pass_actions(&armed_precast, P2) + ); + assert_eq!( + precast_candidate_response(&armed_precast), + PrecastCopyShortcutResponse::Shorten { + breakpoint_id: PRECAST_BREAKPOINT + }, + "ACCEPTANCE (b) on the pre-cast route: a seat holding real interaction keeps its window, \ + named at the breakpoint the engine issued to it. This is also arm 1's non-vacuity proof \ + — the Shorten branch of the mapping is reachable on this exact prompt" + ); +} + +// =========================================================================== +// V9 — COVERAGE INVARIANT: stage 2 classifies everything stage 1 counted. +// =========================================================================== + +/// Krark-Clan Ironworks, verbatim, verified byte-for-byte against MTGJSON +/// `AtomicCards.json` (`.data["Krark-Clan Ironworks"][0].text`; `.types` is +/// `["Artifact"]`). CARD PROVENANCE, in the sense the header block above defines +/// — it is the shape under test, so a paraphrase could take a different parser +/// branch and go green while the real card stayed broken. +/// +/// Why THIS card: its activation is the issue #544 shape — a sacrifice-for-mana +/// ability that `legal_actions` structurally omits while +/// `has_meaningful_priority_action`'s second rung still counts it off `state`. +/// That gap between the two stages' inputs is the whole subject of this section. +const IRONWORKS: &str = "Sacrifice an artifact: Add {C}{C}."; + +/// Stage the Ironworks on `player`'s battlefield, ability taken from the REAL +/// parser (see `give_parsed_card`, which this is now one call into). +/// +/// It was an inlined copy of that helper until the two were diffed field by +/// field and found byte-equivalent — same parse call, same assertion text once +/// `name` is substituted, same `create_object` arguments, same core-type push, +/// same `base_card_types`/`abilities`/`base_abilities` assignment, same +/// `layers_dirty`. Delegating is behaviour-identical BY CONSTRUCTION, and the +/// divergence it prevents already fired once inside this same change: +/// `base_mana_cost` reached one construction path and not the other. +fn give_ironworks(state: &mut GameState, player: PlayerId) -> ObjectId { + give_parsed_card( + state, + player, + "Krark-Clan Ironworks", + IRONWORKS, + CoreType::Artifact, + Zone::Battlefield, + ) +} + +/// A vanilla artifact for the Ironworks to eat. No abilities and no card claim: +/// it exists so the sacrifice cost is payable, and it must contribute no action +/// of its own or it would give the fold a second way to reach `Shorten`. +fn give_artifact_fodder(state: &mut GameState, player: PlayerId) -> ObjectId { + let id = engine::game::zones::create_object( + state, + CardId(state.next_object_id), + player, + "Test Artifact Fodder".to_string(), + Zone::Battlefield, + ); + let obj = state.objects.get_mut(&id).expect("just created"); + obj.card_types + .core_types + .push(engine::types::card_type::CoreType::Artifact); + obj.base_card_types = obj.card_types.clone(); + obj.summoning_sick = false; + state.layers_dirty = LayersDirty::full(); + id +} + +/// The optional-cascade board with an Ironworks + one artifact staged on P2 +/// AFTER the response window opens, so the addition cannot perturb the drive to +/// the offer. +fn ironworks_seat_polled() -> (GameRunner, ObjectId) { + let (mut runner, kickoff) = optional_cascade(|_| {}); + respond_window_at(&mut runner, kickoff, P2); + let ironworks = give_ironworks(runner.state_mut(), P2); + let _fodder = give_artifact_fodder(runner.state_mut(), P2); + (runner, ironworks) +} + +/// The invariant, asserted directly on the set rather than inferred from a +/// verdict: **stage 2 folds over every action stage 1 counted as meaningful.** +/// +/// This is the row that survives a future reclassification. `v9b` below reads +/// the Ironworks' *verdict*, which a later, more precise `filter_is_actor_owned` +/// could legitimately flip (CR 701.21a: "A player can't sacrifice something that +/// isn't a permanent, or something that's a permanent they don't control" — so +/// "Sacrifice an artifact" IS actor-owned in fact, merely not PROVEN so by this +/// AST). This row does not depend on the verdict at all — it +/// pins that the action is *handed to the classifier*, which is what keeps a +/// newly added stage-1 rung from silently reintroducing Accept-by-omission. +/// +/// The three assertions are the defect's three premises, in order: +/// 1. the activation is ABSENT from the flat list (issue #544 grouping), so +/// 2. stage 1 nonetheless counts it — via the `state`-reading second rung — and +/// 3. `stage_two_action_set` therefore has to put it back, or the two stages +/// read different inputs. +/// +/// Revert-probe (EXECUTED, see the report): defining `stage_two_action_set` as +/// `flat_actions.to_vec()` fails assertion 3. +#[test] +fn v9a_stage_two_folds_over_every_action_stage_one_counted() { + let (runner, ironworks) = ironworks_seat_polled(); + let activation = GameAction::ActivateAbility { + source_id: ironworks, + ability_index: 0, + }; + + let (probe, flat) = engine::ai_support::shortcut_probe(runner.state(), P2); + assert!( + !flat.contains(&activation), + "PREMISE 1: sacrifice-for-mana stays out of the flat priority list (issue #544) — if it \ + were present, the two stages would already agree and this row would be vacuous; got \ + {flat:?}" + ); + assert!( + stage_one_meaningful(runner.state(), P2), + "PREMISE 2: stage 1 counts it anyway, off `state` rather than off that list — this is the \ + asymmetry the invariant exists to close; got {flat:?}" + ); + + let stage_two = engine::ai_support::stage_two_action_set(probe.state(), &flat); + assert!( + stage_two.contains(&activation), + "THE INVARIANT: every action stage 1 counted as meaningful must be handed to stage 2. An \ + action the classifier never sees reaches no arm, so the fail-closed default cannot save \ + it and the seat Accepts BY OMISSION; got {stage_two:?}" + ); +} + +/// The response-level discriminator: with the invariant restored, this seat +/// Shortens; without it, it Accepts. +/// +/// It discriminates because the Ironworks activation classifies `MayInterfere`, +/// and since V10 it does so through TWO independent legs. Its `Sacrifice` cost +/// filter (`Typed{Artifact}`) names no controller, so `filter_is_actor_owned` +/// cannot PROVE actor ownership and `cost_window_reach` takes the fail-closed +/// direction; and its `Effect::Mana` head is no longer allowlisted either, so +/// the head alone would carry the verdict. +/// +/// The counterfactual this doc used to carry — "a sacrifice ability whose filter +/// *were* proven actor-owned would classify `OwnResourcesOnly` … i.e. would not +/// discriminate" — is FALSE since `Effect::Mana` left the allowlist, and +/// `v10b` is the row that refutes it on exactly that shape (Lotus Petal's +/// `SelfRef` sacrifice IS proven actor-owned, and the seat still Shortens). What +/// survives is the sentence's purpose: the unproven filter is still what makes +/// THIS row's own MUTANT discriminate, because that mutant deletes the widening +/// rather than touching the classifier. +/// +/// REACH-GUARD: the flat list is asserted to be EXACTLY `[PassPriority]`. That +/// is what makes the verdict attributable: `PassPriority` is the classifier's +/// one `false` arm, so the flat half cannot reach `Shorten` on its own and the +/// only action that can is the one the widening added. +/// +/// MUTANT (EXECUTED, see the report): `stage_two_action_set ≡ flat_actions +/// .to_vec()` — i.e. delete the widening — flips this row to `Accept`. +/// +/// This row's verdict is now OVER-DETERMINED, which changes what a future +/// refinement does to it. The doc used to predict that a `filter_is_actor_owned` +/// which learns to prove "Sacrifice an artifact" actor-owned (CR 701.21a bounds +/// the actor to permanents they CONTROL, which is the fact such a refinement +/// would be reading) would red this row; it will not, because the unallowlisted +/// `Effect::Mana` head carries `MayInterfere` unconditionally. The guidance the +/// prediction carried still stands and is the part to keep: if this row ever +/// does red, re-derive the fixture on an ability whose reach is genuinely +/// unproven — NOT delete the row, and NOT weaken the classifier. Its +/// discriminating power comes from its MUTANT rather than from the cost filter's +/// imprecision, and `v9a` above holds the invariant meanwhile. +#[test] +fn v9b_a_sacrifice_for_mana_seat_still_gets_its_window() { + let (runner, ironworks) = ironworks_seat_polled(); + let activation = GameAction::ActivateAbility { + source_id: ironworks, + ability_index: 0, + }; + + let flat = probe_actions(runner.state(), P2); + assert_eq!( + flat, + vec![GameAction::PassPriority], + "REACH-GUARD: the flat half must be exactly the one action the classifier answers `false` \ + on, or a `Shorten` here is not attributable to the widening; got {flat:?}" + ); + assert!( + stage_one_meaningful(runner.state(), P2), + "reach-guard: stage 1 must return true, or the seat resolves at stage 1 and never reaches \ + the fold under test" + ); + + assert_eq!( + engine::ai_support::smart_shortcut_response(runner.state(), P2), + ShortcutResponse::Shorten { at_iteration: 0 }, + "a seat whose only meaningful action is {activation:?} must keep its window: the AST does \ + not prove the sacrificed artifact is this seat's own, and stage 2 must not Accept a \ + reach it cannot rule out" + ); +} + +// =========================================================================== +// V10 — MANA IS FUNGIBLE REACH, not a confined own resource. +// +// CR 106.4's first sentence ("that mana goes into a player's mana pool") is the +// half an earlier `Effect::Mana` arm quoted; the rest of the same rule says the +// mana "can be used to pay costs immediately", CR 106.1 says paying costs is +// mana's whole function, and CR 601.2g runs mana abilities during the very cast +// they fund. So producing mana widens what the polled seat can do inside the +// window `game::engine`'s `RespondToShortcut(Shorten)` arm hands back, and the +// classifier — which reads ONE ability's AST and no other object — cannot prove +// otherwise. Both rows below ride the REAL 4p board through the same production +// chokepoint the flagship uses. +// =========================================================================== + +/// Dark Ritual, verbatim. CARD PROVENANCE in the sense the header block defines. +/// The `Effect::Mana` head with `cost: None` is the point — nothing but the head +/// can carry this object's verdict. +const DARK_RITUAL: &str = "Add {B}{B}{B}."; + +/// Lotus Petal, verbatim. CARD PROVENANCE. This is the maintainer's named +/// "actor-owned sacrifice-for-mana" class: the parser emits "Sacrifice this +/// artifact" as a `TargetFilter::SelfRef`, which `filter_is_actor_owned` +/// returns true for, so the cost leg reads confined and the mana head carries +/// the verdict ALONE. CR 701.21a bounds the actor to permanents they CONTROL, +/// which is the most that predicate can be grounded in — its first sentence +/// sends the sacrificed card to its OWNER's graveyard, so control is not +/// ownership and "confined" is narrower than the predicate's name suggests. +/// `shortcut_efficacy`'s `mana_production_is_reach_not_a_confined_own_resource` +/// quotes the rule in full and names the limit; nothing here rests on it, +/// because the mana head decides this verdict either way. That is also what +/// makes this row not a second `v9b`, +/// whose Ironworks reaches the same verdict through an UNPROVEN cost filter. +const LOTUS_PETAL: &str = "{T}, Sacrifice this artifact: Add one mana of any color."; + +/// Sol Ring, verbatim. CARD PROVENANCE. The ORDINARY mana source: no sacrifice +/// leg, so `mana_ability_penalty` is `None` rather than `Sacrifices` and the +/// stage-2 widening must not re-admit it. +const SOL_RING: &str = "{T}: Add {C}{C}."; + +/// Crop Rotation, verbatim, BOTH lines. CARD PROVENANCE (MTGJSON +/// `.data["Crop Rotation"][0].text`). The UNTAPPED fetch — the residual the +/// `enter_tapped` gate closes, and the class `Terramorphic Expanse` is NOT. +/// +/// MEASURED on the live parser: this text yields exactly ONE ability with +/// `cost: None` — the additional-cost line is not carried — heading +/// `SearchLibrary { filter: Typed[Land], target_player: None }` over a +/// `ChangeZone { Library -> Battlefield, target: Any, enter_tapped: Unspecified }` +/// over `Shuffle { Controller }`. So every leg but the tap state reads confined, +/// which is precisely why this card was allowlisted before the gate. Its search +/// filter is ANY land card, which is what lets the funding lemma below find a +/// real basic Swamp in P2's own recorded library instead of staging one. +const CROP_ROTATION: &str = "As an additional cost to cast this spell, sacrifice a land.\n\ + Search your library for a land card, put that card onto the \ + battlefield, then shuffle."; + +/// Rampant Growth, verbatim. CARD PROVENANCE. The TAPPED sibling and the whole +/// point of the matched pair: one printed word apart from Crop Rotation on every +/// axis this classifier reads, and the fetched land arrives unable to pay for +/// anything. +const RAMPANT_GROWTH: &str = "Search your library for a basic land card, put that card onto \ + the battlefield tapped, then shuffle."; + +/// Reshape the Earth, verbatim. CARD PROVENANCE — Oracle text verified on +/// Scryfall (`/cards/named?exact=Reshape+the+Earth`), a Sorcery whose whole +/// printed text is this one sentence. +/// +/// Rampant Growth's UNRESTRICTED sibling, and the second one-word-apart pair in +/// this file: identical AST on every axis this classifier reads — no cost, one +/// ability, `SearchLibrary` over `ChangeZone { Library -> Battlefield, target: +/// Any, enter_tapped: Tapped }` over `Shuffle { Controller }`, no triggers, no +/// statics, no replacements, no keywords — and the search filter is +/// `Typed[Land]` where Rampant Growth's is `Typed[Land] + HasSupertype(Basic)`. +/// So the only thing that can separate their verdicts is WHICH CARDS THE ACTOR +/// COULD SELECT. +/// +/// Elvish Reclaimer is the card the review named for this row and it CANNOT +/// serve, which is worth stating rather than leaving as an unexplained +/// substitution. Its ability costs "Sacrifice a land" — parsed +/// `AbilityCost::Sacrifice(Typed[Land])` with `controller: null` — and +/// `filter_is_actor_owned` proves nothing about an unqualified `Typed`, so +/// `cost_window_reach` already answers `MayInterfere` for it. It reads +/// `Shorten` with the selection gate and `Shorten` without it: an +/// over-determined row that would go green while measuring nothing. +const RESHAPE_THE_EARTH: &str = "Search your library for up to ten land cards, put them onto \ + the battlefield tapped, then shuffle."; + +/// Stage a real card with its abilities taken from the REAL parser, not +/// hand-built: every verdict below is a function of the AST, so a hand-written +/// `AbilityDefinition` would let this section pass against a shape the pipeline +/// never produces. Parameterized over the three axes the V10 rows vary, and the +/// SINGLE staging path for parsed cards in this file — `give_ironworks` above +/// delegates here rather than keeping the byte-equivalent copy it used to be. +fn give_parsed_card( + state: &mut GameState, + player: PlayerId, + name: &str, + oracle: &str, + core_type: CoreType, + zone: Zone, +) -> ObjectId { + let parsed = engine::parser::oracle::parse_oracle_text(oracle, name, &[], &[], &[]); + assert_eq!( + parsed.abilities.len(), + 1, + "PREMISE: {name} parses to exactly one ability; got {:?}", + parsed.abilities + ); + let id = engine::game::zones::create_object( + state, + CardId(state.next_object_id), + player, + name.to_string(), + zone, + ); + let obj = state.objects.get_mut(&id).expect("just created"); + obj.card_types.core_types.push(core_type); + obj.base_card_types = obj.card_types.clone(); + // No `summoning_sick = false` here: it would be a no-op that reads as + // load-bearing. `zones::create_object` documents that it deliberately does + // NOT set the flag (only the real ETB pipeline's + // `reset_for_battlefield_entry` does), `add_to_zone` never touches it, and + // `GameObject::new` already defaults it to `false`. + obj.abilities = std::sync::Arc::new(parsed.abilities.clone()); + obj.base_abilities = std::sync::Arc::new(parsed.abilities); + state.layers_dirty = LayersDirty::full(); + id +} + +/// The Ritual is staged as an INSTANT and with no printed mana cost, and both +/// are deliberate. Without a core type the sorcery-timing gate refuses the cast +/// at this window and the funder never enters the action set — the row would go +/// vacuous silently. And Dark Ritual's real printed cost is `{B}` while P2 +/// controls no mana source, so a printed-cost Ritual would itself be uncastable +/// and the row would measure an empty board twice. What the row measures is the +/// CLASSIFIER, which reads the AST and never the mana cost. +fn give_dark_ritual(state: &mut GameState, player: PlayerId) -> ObjectId { + give_parsed_card( + state, + player, + "Dark Ritual", + DARK_RITUAL, + CoreType::Instant, + Zone::Hand, + ) +} + +/// THE SIZING SITE. This source contributes **exactly 1** to +/// `game::mana_sources`' `feasible_mana_capacity`: its `AnyOneColor` production +/// carries `count: Fixed { value: 1 }`, and that arm of +/// `game::effects::mana`'s `resolve_mana_types_for_ability` returns +/// `vec![mana_type; amount]` — length `amount`, NOT `color_options.len()`. +/// +/// MEASURED on this fixture, the only mana-gated action P2 owns at this window +/// is Angel of the Ruins' hand-zone plainscycling (object 210), whose cost is +/// `Composite[Mana{generic 2}, Discard{self_ref}]` — `{2}` generic. **The margin +/// is exactly 1 mana.** ANY staged P2 source contributing 2 or more unlocks that +/// cycling, puts an `ActivateAbility` in P2's flat list, and destroys `v10b`'s +/// attribution — its `non_pass` assertion is what fails, loudly, if that +/// happens. A future edit that raises this source's capacity silently destroys +/// the discrimination, so do NOT "strengthen" it. +fn give_lotus_petal(state: &mut GameState, player: PlayerId) -> ObjectId { + give_parsed_card( + state, + player, + "Lotus Petal", + LOTUS_PETAL, + CoreType::Artifact, + Zone::Battlefield, + ) +} + +/// Both fetches are staged as INSTANTS with no printed mana cost, for +/// `give_dark_ritual`'s reasons: without a core type the sorcery-timing gate +/// refuses the cast at this window and the funder never enters the action set, +/// and P2 controls no mana source so a printed cost would make the funder itself +/// uncastable and the row would measure an empty board twice. +/// +/// The type is card-faithful for Crop Rotation (a real instant) and is NOT for +/// Rampant Growth (a real sorcery). That deviation is deliberate and stated: the +/// control's subject is the TAP STATE of the fetched land, and putting the two +/// fetches on different timing rails would confound exactly that axis. +fn give_crop_rotation(state: &mut GameState, player: PlayerId) -> ObjectId { + give_parsed_card( + state, + player, + "Crop Rotation", + CROP_ROTATION, + CoreType::Instant, + Zone::Hand, + ) +} + +/// The tapped half of `v10c`'s pair. See `give_crop_rotation` for the staging. +fn give_rampant_growth(state: &mut GameState, player: PlayerId) -> ObjectId { + give_parsed_card( + state, + player, + "Rampant Growth", + RAMPANT_GROWTH, + CoreType::Instant, + Zone::Hand, + ) +} + +/// Cast `fetch` at P2's OWN probe priority and drive real `apply()` beats until +/// it resolves, selecting a basic **Swamp** at the search prompt. Returns the +/// resulting state and the fetched land. +/// +/// The Swamp is chosen by NAME rather than taken as the prompt's first offer: +/// several of the lands in P2's recorded library carry their own "enters tapped" +/// clause (Path of Ancestry, Goldmire Bridge, Temple of Silence, ...), and one of +/// those would make the funding lemma measure the FETCHED CARD's printed text +/// instead of the fetch effect's `enter_tapped` rider — the very axis under test. +fn resolve_fetch_choosing_a_swamp(arm: &GameState, fetch: ObjectId) -> (GameState, ObjectId) { + let (probe, list) = engine::ai_support::shortcut_probe(arm, P2); + let cast = list + .iter() + .find(|a| matches!(a, GameAction::CastSpell { object_id, .. } if *object_id == fetch)) + .cloned() + .expect("reach-guard: the fetch must be castable at P2's own probe priority"); + let mut state = probe.state().clone(); + // This drive is the first thing in this file to reach a library SHUFFLE, and + // a shuffle is the one operation that reads the live ChaCha20 stream. + // `restore_dump` above decodes through `into_game_state()`, which does NOT + // reseed the `#[serde(skip)]` `rng` — production's restore does that in a + // SECOND step (`engine-wasm`'s `restore_game_state` calls + // `GameState::rehydrate_rng` right after decoding, issue #5466). Without it + // the live stream sits at offset 0 while this dump's `rng_word_pos` is 313, + // and `game::library`'s `capture_rng_word_pos` fails the entropy-high-water + // invariant. Doing it here rather than in `restore_dump` keeps every other + // row in this file byte-identical: the reseed lands only on this quarantined + // funding clone, which no verdict is ever taken on. + state.rehydrate_rng(); + apply(&mut state, P2, cast).expect("the fetch casts at P2's own probe priority"); + + let mut chosen: Option = None; + for _ in 0..60 { + let prompt = match &state.waiting_for { + WaitingFor::SearchChoice { player, cards, .. } => Some((*player, cards.clone())), + _ => None, + }; + if let Some((player, cards)) = prompt { + let swamp = cards + .iter() + .copied() + .find(|id| state.objects.get(id).is_some_and(|o| o.name == "Swamp")) + .expect("P2's recorded library must offer a basic Swamp to this search"); + apply( + &mut state, + player, + GameAction::SelectCards { cards: vec![swamp] }, + ) + .expect("the searcher selects the Swamp"); + chosen = Some(swamp); + continue; + } + if chosen.is_some() && !state.stack.iter().any(|entry| entry.id == fetch) { + break; + } + dump_drive_one_beat(&mut state).expect("passing priority resolves the top of the stack"); + } + ( + state, + chosen.expect("reach-guard: the fetch must have PROMPTED a library search"), + ) +} + +/// Capacity **2** (`Colorless { count: Fixed 2 }`), which is why the control it +/// serves asserts re-admission ONLY and never a verdict — see `v10b`. +fn give_sol_ring(state: &mut GameState, player: PlayerId) -> ObjectId { + give_parsed_card( + state, + player, + "Sol Ring", + SOL_RING, + CoreType::Artifact, + Zone::Battlefield, + ) +} + +/// V10a — a CAST mana spell funds an otherwise-unaffordable answer, so the seat +/// must keep its window. +/// +/// The pair varies exactly one object: a Dark Ritual in P2's hand. Both arms +/// hold the same `{B}{B}{B}` Bolt, and assertion 1 is the operational definition +/// of "otherwise-unaffordable" — `feasible_mana_capacity` is battlefield-scoped, +/// so a Ritual sitting in HAND contributes 0 and the castability gate +/// structurally cannot see "cast a ritual first, then the Bolt". That two-step +/// is exactly what the priority window buys, and CR 601.2g / CR 117.1d are the +/// rules that make the mana available to pay a cost the moment it is produced. +/// +/// BOTH halves of "otherwise-unaffordable" are measured, as in `v10b`. The +/// negative half is assertion 1 above, in both arms. The positive half is the +/// QUARANTINED funding lemma at the end of the row: the Ritual is driven through +/// the stack on the `apply()` boundary and the SAME Bolt is re-probed, so the +/// arithmetic (`{B}{B}{B}` added against `{B}{B}{B}` printed) is read off the +/// engine's castability gate rather than off the verbatim texts. +/// +/// MUTANT: restoring `Effect::Mana {..} => WindowReach::OwnResourcesOnly` as +/// `effect_window_reach`'s first arm flips the SHORTEN arm to `Accept`. Under it +/// the Ritual's single ability folds `OwnResourcesOnly` (head `Effect::Mana`, +/// `cost: None`), and P2's remaining actions are `PassPriority` — the +/// classifier's one `false` arm — and the fetchland, whose verdict rides +/// untouched arms. The ACCEPT arm is unaffected by the mutation by construction: +/// its action set carries no `Effect::Mana` node at all. +/// +/// Every `GameAction::CastSpell` matcher below binds `{ object_id, .. }` and +/// must NOT name `payment_mode`: a Petal- or Ritual-funded cast can be offered +/// as `CastPaymentMode::AutoExceptSacrificialMana`, and a mode-specific matcher +/// would fail with a message claiming the funding does not work. +#[test] +fn v10a_a_cast_mana_spell_that_funds_an_unaffordable_answer_keeps_its_window() { + let mut board = live_path_board(); + drive_to_offer(&mut board, 400).expect("CR 732.2a: the offer must fire on this real 4p drain"); + // ONE drive, ONE poll, shared by both arms — so staging cannot perturb the + // drive, the offer schema, or the APNAP walk. + let polled = declare_and_poll(&board, P2); + + let mut base = polled.clone(); + let bolt = give_bolt_with_cost( + &mut base, + P2, + // `{B}{B}{B}` — sized to exactly what one Dark Ritual adds. + ManaCost::Cost { + shards: vec![ManaCostShard::Black; 3], + generic: 0, + }, + ); + + // ── arm ACCEPT: the interaction alone ── + let accept_arm = base.clone(); + // ── arm SHORTEN: same board, same Bolt, PLUS the funding piece ── + let mut shorten_arm = base.clone(); + let ritual = give_dark_ritual(&mut shorten_arm, P2); + + for (label, arm) in [("ACCEPT", &accept_arm), ("SHORTEN", &shorten_arm)] { + assert!( + !probe_actions(arm, P2).iter().any( + |a| matches!(a, GameAction::CastSpell { object_id, .. } if *object_id == bolt) + ), + "PREMISE ({label} arm): the Bolt must be OTHERWISE-UNAFFORDABLE at poll time — a \ + hand-zone Ritual is invisible to the battlefield-scoped capacity scan, so the \ + castability gate cannot see the two-step the window buys; got {:?}", + non_pass_actions(arm, P2) + ); + assert!( + stage_one_meaningful(arm, P2), + "reach-guard ({label} arm): stage 1 must return true, or the seat answers at stage 1 \ + and the fold under test never runs" + ); + } + + assert!( + probe_actions(&shorten_arm, P2) + .iter() + .any(|a| matches!(a, GameAction::CastSpell { object_id, .. } if *object_id == ritual)), + "reach-guard: the FUNDER must really be castable, or the SHORTEN arm is the ACCEPT arm \ + with extra steps; got {:?}", + non_pass_actions(&shorten_arm, P2) + ); + + let shorten_non_pass = non_pass_actions(&shorten_arm, P2); + assert_eq!( + shorten_non_pass.len(), + 2, + "ATTRIBUTION + THRESHOLD SENTINEL, mirroring `v10b`'s: the SHORTEN arm must be the \ + ACCEPT arm's single fetchland PLUS the Ritual cast, and nothing else. The Ritual sits \ + in `Zone::Hand`, which the battlefield-scoped `feasible_mana_capacity` cannot see, so \ + it unlocks no third action — but that is DERIVED, and a fixture or capacity change \ + that added one `MayInterfere` action here would over-determine this row silently \ + instead of reddening. MEASURED at 2 on the committed fixture; got {shorten_non_pass:?}" + ); + + let accept_non_pass = non_pass_actions(&accept_arm, P2); + assert_eq!( + accept_non_pass.len(), + 1, + "ATTRIBUTION: the ACCEPT arm's action set must be the flagship's exactly, so its Accept \ + is the already-shipped verdict and the pair's ONLY variable is the Ritual; got \ + {accept_non_pass:?}" + ); + assert!( + accept_non_pass[0].contains("Terramorphic Expanse") + && accept_non_pass[0].contains("zone=Some(Battlefield)") + && accept_non_pass[0].contains("controller=Some(PlayerId(2))"), + "ATTRIBUTION: that one action must be P2's OWN battlefield fetchland; got \ + {accept_non_pass:?}" + ); + + // IDENTITY, not just cardinality. The sentinel above bounds the SHORTEN + // arm's COUNT; this bounds its MEMBERSHIP, which is what that sentinel's + // prose actually claims ("the ACCEPT arm's single fetchland PLUS the Ritual + // cast, and nothing else"). Without this pair, a fixture or capacity change + // that DROPPED the fetchland and added some unrelated `MayInterfere` action + // still satisfies `len() == 2` AND the ritual reach-guard, and the row + // silently measures the wrong pair. + // + // The fetchland is the same fixture object in both arms — both are clones + // of one `base`, and only the Ritual is staged on top — so + // `accept_non_pass[0]` is reusable verbatim instead of re-typing the three + // `contains` substrings. MEASURED: the two formatted strings are byte-equal + // (`ObjectId(203)` in both arms). + // + // The Ritual leg is matched on `object_id` ONLY. It must NOT name + // `payment_mode`, for the reason this test's doc comment gives. + let (_ritual_leg, other_legs): (Vec<&String>, Vec<&String>) = shorten_non_pass + .iter() + .partition(|a| a.starts_with(&format!("CastSpell {{ object_id: {ritual:?},"))); + assert_eq!( + other_legs, + vec![&accept_non_pass[0]], + "ATTRIBUTION: the SHORTEN arm's set MINUS the Ritual must be the ACCEPT arm's set \ + EXACTLY — same fetchland object, same zone, same controller. Anything else means the \ + pair varies more than the single object it claims to vary, and the Shorten verdict below \ + is no longer attributable to the Ritual. This one equality also pins the Ritual leg: if \ + the partition matched nothing, `other_legs` carries both members and reddens; if it \ + matched both, `other_legs` is empty and reddens; got {shorten_non_pass:?}" + ); + + assert_eq!( + engine::ai_support::smart_shortcut_response(&accept_arm, P2), + ShortcutResponse::Accept, + "the pair's negative arm: an unaffordable answer and a confined fetchland buy nothing" + ); + assert_eq!( + engine::ai_support::smart_shortcut_response(&shorten_arm, P2), + ShortcutResponse::Shorten { at_iteration: 0 }, + "the pair's positive arm: producing mana is REACH (CR 106.1 / CR 106.4 / CR 601.2g). \ + The ritual is the one object that differs, and accepting here surrenders a live out" + ); + + // ── FUNDING LEMMA (CR 117.1d + CR 601.2g), deliberately QUARANTINED ── + // + // The negative half is already asserted above: the `{B}{B}{B}` Bolt is NOT + // castable in EITHER arm at poll time. This is the positive half — the half + // this row's title claims ("funds an unaffordable answer") — measured on the + // production instrument rather than left to the verbatim texts' arithmetic. + // + // QUARANTINE, mirroring `v10b`'s lemma: this clone NEVER reaches + // `smart_shortcut_response`. Both verdicts above are already taken; resolving + // the Ritual inside an arm would change the very action set they were taken + // on, and the funded board additionally unlocks the Angel's `{2}` cycling + // (`give_lotus_petal`'s capacity note), which carries `MayInterfere` on a + // route this pair does not model. + let (probe, probe_list) = engine::ai_support::shortcut_probe(&shorten_arm, P2); + let cast_ritual = probe_list + .iter() + .find(|a| matches!(a, GameAction::CastSpell { object_id, .. } if *object_id == ritual)) + .cloned() + .expect("the funder is castable — the reach-guard above asserts exactly this"); + let mut funded = probe.state().clone(); + apply(&mut funded, P2, cast_ritual).expect("the funder casts at P2's own probe priority"); + // Pass beats until the Ritual leaves the stack: it is on top, so the first + // full pass round resolves it (MEASURED: 4 beats on this 4p board). + for _ in 0..40 { + if !funded.stack.iter().any(|entry| entry.id == ritual) { + break; + } + dump_drive_one_beat(&mut funded).expect("passing priority resolves the top of the stack"); + } + assert_eq!( + funded.objects.get(&ritual).map(|o| o.zone), + Some(Zone::Graveyard), + "reach-guard: the Ritual must have RESOLVED, not merely been cast — CR 608.2n puts a \ + resolved instant into its owner's graveyard, so this is the observable that separates \ + 'it resolved' from 'the drive capped out' and would otherwise red the funding \ + assertion below for the wrong reason" + ); + assert!( + probe_actions(&funded, P2) + .iter() + .any(|a| matches!(a, GameAction::CastSpell { object_id, .. } if *object_id == bolt)), + "FUNDING: with the Ritual resolved, the engine's own castability gate says the SAME \ + `{{B}}{{B}}{{B}}` Bolt that is unaffordable in BOTH arms above IS payable. That is the \ + two-step the priority window buys (CR 117.1d / CR 601.2g), measured rather than \ + inferred from the printed texts; got {:?}", + non_pass_actions(&funded, P2) + ); +} + +/// V10b — an ACTOR-OWNED sacrifice-for-mana seat keeps its window. This is the +/// maintainer's named class, and it is the row `v9b` structurally cannot be. +/// +/// The pair varies exactly ONE object: a Lotus Petal on P2's battlefield. No +/// Bolt, no Swamp, no second permanent. +/// +/// **CAPACITY THRESHOLD — the sizing this row lives or dies on.** The staged +/// source contributes exactly **1** to `feasible_mana_capacity` (see +/// `give_lotus_petal`), and the only mana-gated action P2 owns at this window is +/// Angel of the Ruins' hand-zone plainscycling at `{2}` generic. **The margin is +/// exactly 1 mana.** ANY staged P2 source contributing 2 or more unlocks that +/// cycling, puts an `ActivateAbility` in P2's flat list, and destroys this row's +/// attribution — the `non_pass` assertion below is what fails, loudly, if that +/// happens. A row that reds that way is a fixture-threshold artifact, not a +/// defect in the classifier: check whether `non_pass_actions` names object 210 +/// first, shrink the staged source, and do NOT respond by relaxing an +/// `Effect::Mana` classification. +/// +/// **P2's full reachable surface at this window, enumerated so the threshold is +/// not a claim about the hand alone.** MEASURED from the committed fixture: +/// battlefield 1 (Terramorphic Expanse, capacity 0); hand 7, of which six are +/// sorcery-speed (`Victimize`, `Plains`, `Arcane Signet`, `Commander's Sphere`, +/// `Compleated Huntmaster`, `Night's Whisper`) and only the Angel offers a +/// mana-gated instant-speed action; command zone 1 — `Brimaz, Blight of +/// Oreskos`, `{2}{W}{B}`, a CREATURE, and `format_config.command_zone` is true, +/// so `casting::spell_objects_available_to_cast`'s `Zone::Command` clause does +/// put it inside the candidate loop. The fixture is `active_player` 0 in +/// `CombatDamage` with priority at P2, so it is neither P2's turn nor a main +/// phase and sorcery-speed timing blocks Brimaz — and no amount of mana lifts a +/// timing gate. Library-zone activations are gated `is_active && stack_empty` +/// and P2 is not active. So `{2}` really is the whole threshold, over the whole +/// surface rather than over the hand. +/// +/// MUTANT: restoring `Effect::Mana {..} => WindowReach::OwnResourcesOnly` flips +/// the SHORTEN arm to `Accept`. The Petal's cost leg is ALREADY +/// `OwnResourcesOnly` — `Composite[Tap, Sacrifice{SelfRef}]`, and +/// `filter_is_actor_owned` proves `SelfRef` at its first match arm — so with the +/// mana arm restored the whole ability folds `OwnResourcesOnly`. That is exactly +/// why this row is not a second `v9b`, whose verdict rides its UNPROVEN cost +/// filter and is untouched by the mutation. +#[test] +fn v10b_an_actor_owned_sacrifice_for_mana_seat_keeps_its_window() { + let mut board = live_path_board(); + drive_to_offer(&mut board, 400).expect("CR 732.2a: the offer must fire on this real 4p drain"); + let polled = declare_and_poll(&board, P2); + + // ── arm ACCEPT: the polled board, untouched ── + let accept_arm = polled.clone(); + // ── arm SHORTEN: the polled board plus ONE object ── + let mut shorten_arm = polled.clone(); + let petal = give_lotus_petal(&mut shorten_arm, P2); + let activation = GameAction::ActivateAbility { + source_id: petal, + ability_index: 0, + }; + + assert!( + !probe_actions(&shorten_arm, P2).contains(&activation), + "PREMISE: the Petal's ability IS a mana ability (CR 605.1a), so candidate generation \ + excludes it from the flat list outright. This is the issue-#544 asymmetry the whole \ + V9/V10 section exists for — if it were present, stage 2 would already see it and the \ + widening below would be vacuous" + ); + + let non_pass = non_pass_actions(&shorten_arm, P2); + assert_eq!( + non_pass.len(), + 1, + "ATTRIBUTION + THRESHOLD SENTINEL: if the Petal's mana made ANY P2 action affordable — a \ + hand card, or the Angel's {{2}} cycling — it would appear here and could carry \ + MayInterfere independently of the arm under test. See this row's capacity-threshold \ + note before touching the staged source; got {non_pass:?}" + ); + assert!( + non_pass[0].contains("Terramorphic Expanse") + && non_pass[0].contains("zone=Some(Battlefield)") + && non_pass[0].contains("controller=Some(PlayerId(2))"), + "ATTRIBUTION: that one action must still be P2's OWN battlefield fetchland; got \ + {non_pass:?}" + ); + + let (probe, flat) = engine::ai_support::shortcut_probe(&shorten_arm, P2); + let mut expected = flat.clone(); + expected.push(activation); + assert_eq!( + engine::ai_support::stage_two_action_set(probe.state(), &flat), + expected, + "the widening added EXACTLY the Petal. Order is determinate — `stage_two_action_set` is \ + the flat list chained with the meaningful sacrifice-mana actions — and the penalty is \ + `Sacrifices` because `mana_ability_penalty`'s FIRST clause is `cost_includes_sacrifice`, \ + which inspects `Composite` legs" + ); + + let (accept_probe, accept_flat) = engine::ai_support::shortcut_probe(&accept_arm, P2); + assert_eq!( + engine::ai_support::stage_two_action_set(accept_probe.state(), &accept_flat), + accept_flat, + "the negative half of the widening, on the same instrument: without the Petal there is \ + nothing to re-admit" + ); + + for (label, arm) in [("ACCEPT", &accept_arm), ("SHORTEN", &shorten_arm)] { + assert!( + stage_one_meaningful(arm, P2), + "reach-guard ({label} arm): stage 1 must return true, or the seat answers at stage 1 \ + and the fold under test never runs" + ); + } + + assert_eq!( + engine::ai_support::smart_shortcut_response(&accept_arm, P2), + ShortcutResponse::Accept, + "the pair's negative arm — and it is the flagship's own verdict on the flagship's own \ + action set" + ); + assert_eq!( + engine::ai_support::smart_shortcut_response(&shorten_arm, P2), + ShortcutResponse::Shorten { at_iteration: 0 }, + "the pair's positive arm: an actor-owned sacrifice-for-mana activation is two board \ + events, not a confined own resource. Stage 1 re-admits it PRECISELY because the \ + sacrifice is board-changing, so classifying it as confined here contradicted the stage \ + that handed it over" + ); + + // ── FUNDING LEMMA (CR 117.1d + CR 601.2g), deliberately QUARANTINED ── + // + // These two clones NEVER reach `smart_shortcut_response`. Staging the probe + // spell into an arm above would put a `CastSpell` in the flat list whose own + // `Effect::DealDamage` reaches the fail-closed arm — the pair would then + // Shorten with the fix reverted and would stop measuring anything. The + // separation IS the design; do not merge them. + // + // `{1}` generic on purpose: a generic residual is decided by comparing the + // summed capacity against it, so both halves are decided on one read path + // with zero slack. Without the Petal, P2's battlefield is one Terramorphic + // Expanse, whose ability heads `SearchLibrary` and contributes 0, so the sum + // is 0 < 1; with the Petal it is exactly 1 >= 1. + let mut funded = shorten_arm.clone(); + let probe_spell = give_bolt_with_cost(&mut funded, P2, ManaCost::generic(1)); + assert!( + probe_actions(&funded, P2).iter().any( + |a| matches!(a, GameAction::CastSpell { object_id, .. } if *object_id == probe_spell) + ), + "FUNDING: with the Petal on the battlefield the engine's own castability gate says a \ + {{1}} interaction IS payable — by activating a mana ability during cost payment, which \ + is exactly what happens inside the window this row buys (CR 117.1d / CR 601.2g); got \ + {:?}", + non_pass_actions(&funded, P2) + ); + + let mut unfunded = accept_arm.clone(); + let unfunded_spell = give_bolt_with_cost(&mut unfunded, P2, ManaCost::generic(1)); + assert!( + !probe_actions(&unfunded, P2).iter().any( + |a| matches!(a, GameAction::CastSpell { object_id, .. } if *object_id == unfunded_spell) + ), + "FUNDING, negative half: the SAME interaction on the SAME board minus the Petal is NOT \ + payable. Together with the assertion above, the Petal's mana is what makes it reachable \ + — which is the whole content of 'otherwise-unaffordable'; got {:?}", + non_pass_actions(&unfunded, P2) + ); + + // ── the ORDINARY-mana-source control: plain mana never leaks into stage 2 ── + let mut ordinary = polled.clone(); + let sol_ring = give_sol_ring(&mut ordinary, P2); + let (ordinary_probe, ordinary_flat) = engine::ai_support::shortcut_probe(&ordinary, P2); + // REACH-GUARD — the assertion the two negatives below rest on. `stage_two_action_set` + // filters `activatable_object_mana_actions`, and on a probe state parked at + // `Priority { player }` that IS + // `mana_sources::activatable_mana_actions_for_player(state, player)` — the same call, + // routed through `mana_action_player`'s `Priority` arm. Asserting the Sol Ring is IN + // that sweep is what makes "absent from the stage-2 set" attributable to the penalty + // filter; without it, the two negatives below cannot tell `ManaSourcePenalty::None` + // apart from "this object was never swept as a mana source at all". + assert!( + engine::game::mana_sources::activatable_mana_actions_for_player(ordinary_probe.state(), P2) + .contains(&GameAction::ActivateAbility { + source_id: sol_ring, + ability_index: 0, + }), + "REACH-GUARD: the Sol Ring must reach the sweep stage 2 filters, or the negatives \ + below pass because nothing was ever there to re-admit — which is not the \ + `None`-vs-`Sacrifices` penalty distinction this control claims to measure" + ); + assert!( + !ordinary_flat.iter().any( + |a| matches!(a, GameAction::ActivateAbility { source_id, .. } if *source_id == sol_ring) + ), + "candidate generation excludes a mana ability outright (CR 605.1a); got {ordinary_flat:?}" + ); + assert_eq!( + engine::ai_support::stage_two_action_set(ordinary_probe.state(), &ordinary_flat), + ordinary_flat, + "NON-VACUITY: an ordinary mana source has penalty `None`, not `Sacrifices`, so the \ + stage-2 widening does NOT re-admit it. The Lotus Petal DOES enter this same set in this \ + same test, so this emptiness is a measurement and not a stuck instrument" + ); + // NO verdict assertion here, deliberately. Sol Ring contributes 2 to + // `feasible_mana_capacity`, which is enough to pay Angel of the Ruins' + // hand-zone plainscycling already sitting in P2's hand on this fixture. That + // activation enters the FLAT list — MEASURED, because the withheld verdict + // rests on it and a stale fixture could silently make it false: + let ordinary_non_pass = non_pass_actions(&ordinary, P2); + assert!( + ordinary_non_pass.iter().any(|a| { + a.contains("Angel of the Ruins") + && a.contains("#0 zone=Some(Hand)") + && a.contains("controller=Some(PlayerId(2))") + }), + "the Sol Ring's 2 mana must unlock the Angel's {{2}} plainscycling — this is the fact \ + that makes withholding a verdict assertion correct rather than evasive. Ability index 0 \ + is MEASURED off this fixture, never assumed: the Angel (object 210) carries EXACTLY ONE \ + parsed ability and it is the plainscycling one — `ability_tag: Cycling`, \ + `activation_zone: Hand`, cost `Composite[Mana{{generic 2}}, Discard{{self_ref}}]`, \ + effect `SearchLibrary` filtered to `Subtype(Plains)`. A bare name match would also be \ + satisfied by some OTHER Angel activated ability, or by an Angel in a zone whose \ + activation this Sol Ring does not pay for, neither of which supports the withheld \ + verdict. If this reddens, first check whether the INDEX shifted (a newly parsed second \ + ability) before concluding the semantics changed; got {ordinary_non_pass:?}" + ); + // It is `MayInterfere` on two independent legs (`AbilityCost::Discard` is not + // allowlisted; its `sub_ability` moves a card to a HAND, which the anaphoric + // fetch disjunct does not cover), so this seat answers Shorten — through + // candidate affordability, a route this control does not model and claims + // nothing about. Asserting Accept here would assert a false fact about the + // board. +} + +/// V10c — an UNTAPPED fetch is the `Effect::Mana` case with one extra step, so +/// the seat must keep its window; the TAPPED sibling still Accepts. +/// +/// `v10a`/`v10b` closed mana production. This row closes the residual one arm +/// over: `effect_window_reach`'s `ChangeZone` arm allowlisted ANY +/// `Library -> Battlefield` move, and a land that arrives untapped (CR 110.5b — +/// permanents enter untapped "unless a spell or ability says otherwise") taps for +/// mana inside the window the Shorten hands back. CR 302.6's summoning-sickness +/// bar is a CREATURE rule and never reaches a land, and CR 601.2g runs the mana +/// ability during the cast it funds. +/// +/// **The pair varies exactly one object** on the flagship board: a Crop Rotation +/// in P2's hand. Its four-legged AST is confined on every axis but the tap state +/// (MEASURED — see `CROP_ROTATION`), so the Shorten below is attributable to the +/// gate and to nothing else. +/// +/// **Otherwise-unaffordable, both halves, on the production instrument.** The +/// negative half is asserted in BOTH arms at poll time: the `{1}` answer is not +/// castable, because `feasible_mana_capacity` is battlefield-scoped and P2's +/// battlefield is one Terramorphic Expanse (capacity 0). The positive half is the +/// QUARANTINED funding lemma: the Rotation is driven through the stack on the +/// `apply()` boundary, a real basic Swamp from P2's own recorded library enters +/// UNTAPPED, and the SAME answer is re-probed against the engine's own +/// castability gate. +/// +/// **The tapped control is the load-bearing half of the pair.** The same drive +/// with Rampant Growth puts a land on the battlefield TAPPED, the answer stays +/// uncastable, and the seat still Accepts. That is what makes this gate a +/// distinction rather than a blanket flip — and it is the measurement that keeps +/// `v1`/`v1b`'s Terramorphic Accept correct rather than merely surviving. +/// +/// MUTANT: in `effect_window_reach`'s `ChangeZone` arm, replace +/// `object_is_confined && entry_is_confined` with `object_is_confined` alone (the +/// pre-fix expression) — the SHORTEN arm flips to `Accept` (the shipped defect +/// this row exists to catch). The ACCEPT arm and +/// the tapped control are unaffected by that mutation by construction — neither +/// carries an untapped battlefield entry at all — so the row cannot pass by +/// trivializing in either direction. +/// +/// Every `GameAction::CastSpell` matcher binds `{ object_id, .. }` and must NOT +/// name `payment_mode`, for `v10a`'s reason. +#[test] +fn v10c_an_untapped_fetch_that_funds_an_unaffordable_answer_keeps_its_window() { + let mut board = live_path_board(); + drive_to_offer(&mut board, 400).expect("CR 732.2a: the offer must fire on this real 4p drain"); + let polled = declare_and_poll(&board, P2); + + let mut base = polled.clone(); + // `{1}` generic, sized as in `v10b`: a generic residual is decided by + // comparing summed battlefield capacity against it, so ONE untapped Swamp is + // exactly enough and one tapped Swamp is exactly not — zero slack on both + // halves, decided on one read path. + let answer = give_bolt_with_cost(&mut base, P2, ManaCost::generic(1)); + + // ── arm ACCEPT: the answer alone ── + let accept_arm = base.clone(); + // ── arm SHORTEN: same board, same answer, PLUS the untapped fetch ── + let mut shorten_arm = base.clone(); + let rotation = give_crop_rotation(&mut shorten_arm, P2); + + for (label, arm) in [("ACCEPT", &accept_arm), ("SHORTEN", &shorten_arm)] { + assert!( + !probe_actions(arm, P2).iter().any( + |a| matches!(a, GameAction::CastSpell { object_id, .. } if *object_id == answer) + ), + "PREMISE ({label} arm): the answer must be OTHERWISE-UNAFFORDABLE at poll time — P2's \ + battlefield is one Terramorphic Expanse, which contributes 0 to the \ + battlefield-scoped capacity scan, and the scan cannot see the fetch-then-tap two-step \ + the window buys; got {:?}", + non_pass_actions(arm, P2) + ); + assert!( + stage_one_meaningful(arm, P2), + "reach-guard ({label} arm): stage 1 must return true, or the seat answers at stage 1 \ + and the fold under test never runs" + ); + } + + assert!( + probe_actions(&shorten_arm, P2).iter().any( + |a| matches!(a, GameAction::CastSpell { object_id, .. } if *object_id == rotation) + ), + "reach-guard: the FUNDER must really be castable, or the SHORTEN arm is the ACCEPT arm \ + with extra steps; got {:?}", + non_pass_actions(&shorten_arm, P2) + ); + + let shorten_non_pass = non_pass_actions(&shorten_arm, P2); + assert_eq!( + shorten_non_pass.len(), + 2, + "ATTRIBUTION + THRESHOLD SENTINEL, mirroring `v10a`'s: the SHORTEN arm must be the ACCEPT \ + arm's single fetchland PLUS the Rotation cast, and nothing else. A fixture or capacity \ + change that added a third `MayInterfere` action would over-determine this row silently \ + instead of reddening; got {shorten_non_pass:?}" + ); + + let accept_non_pass = non_pass_actions(&accept_arm, P2); + assert_eq!( + accept_non_pass.len(), + 1, + "ATTRIBUTION: the ACCEPT arm's action set must be the flagship's exactly, so its Accept is \ + the already-shipped verdict and the pair's ONLY variable is the Rotation; got \ + {accept_non_pass:?}" + ); + assert!( + accept_non_pass[0].contains("Terramorphic Expanse") + && accept_non_pass[0].contains("zone=Some(Battlefield)") + && accept_non_pass[0].contains("controller=Some(PlayerId(2))"), + "ATTRIBUTION: that one action must be P2's OWN battlefield fetchland; got \ + {accept_non_pass:?}" + ); + + // MEMBERSHIP, not just cardinality — `v10a`'s partition, for its reasons. + let (_rotation_leg, other_legs): (Vec<&String>, Vec<&String>) = shorten_non_pass + .iter() + .partition(|a| a.starts_with(&format!("CastSpell {{ object_id: {rotation:?},"))); + assert_eq!( + other_legs, + vec![&accept_non_pass[0]], + "ATTRIBUTION: the SHORTEN arm's set MINUS the Rotation must be the ACCEPT arm's set \ + EXACTLY — same fetchland object, same zone, same controller; got {shorten_non_pass:?}" + ); + + assert_eq!( + engine::ai_support::smart_shortcut_response(&accept_arm, P2), + ShortcutResponse::Accept, + "the pair's negative arm: an unaffordable answer and a confined TAPPED fetchland buy \ + nothing" + ); + assert_eq!( + engine::ai_support::smart_shortcut_response(&shorten_arm, P2), + ShortcutResponse::Shorten { at_iteration: 0 }, + "the pair's positive arm: a fetch that puts a land onto the battlefield UNTAPPED \ + (CR 110.5b) hands the seat mana inside its own window, so accepting here surrenders a \ + live out. The Rotation is the one object that differs" + ); + + // ── FUNDING LEMMA (CR 110.5b + CR 117.1d + CR 601.2g), QUARANTINED ── + // + // Both verdicts above are already taken; resolving the fetch inside an arm + // would change the very action set they were taken on, and the funded board + // additionally unlocks the Angel's `{2}` cycling (`give_lotus_petal`'s + // capacity note), which carries `MayInterfere` on a route this pair does not + // model. Same quarantine as `v10a`/`v10b`. + let (funded, fetched) = resolve_fetch_choosing_a_swamp(&shorten_arm, rotation); + let land = funded + .objects + .get(&fetched) + .expect("the fetched Swamp is a real object on this board"); + assert_eq!( + land.zone, + Zone::Battlefield, + "reach-guard: the Rotation must have RESOLVED and MOVED the land, not merely been cast — \ + otherwise the funding assertion below would red for the wrong reason" + ); + assert!( + !land.tapped, + "CR 110.5b: the fetched land enters UNTAPPED because this fetch says nothing otherwise. \ + This is the game-level fact the AST's `enter_tapped` stands for, measured on the object \ + rather than inferred from the printed text" + ); + assert!( + probe_actions(&funded, P2) + .iter() + .any(|a| matches!(a, GameAction::CastSpell { object_id, .. } if *object_id == answer)), + "FUNDING: with the fetched Swamp untapped, the engine's own castability gate says the SAME \ + `{{1}}` answer that is unaffordable in BOTH arms above IS payable. That is the two-step \ + the priority window buys (CR 117.1d / CR 601.2g), measured rather than inferred; got {:?}", + non_pass_actions(&funded, P2) + ); + + // ── THE TAPPED CONTROL — the half that makes this a distinction ── + // + // Same board, same answer, same drive, same chosen Swamp: only the fetch's + // printed tap rider differs. The land arrives tapped, funds nothing, and the + // seat still Accepts — which is `v1`/`v1b`'s Terramorphic verdict, measured + // here on the funding mechanism itself instead of assumed to survive. + let mut tapped_arm = base.clone(); + let growth = give_rampant_growth(&mut tapped_arm, P2); + assert_eq!( + non_pass_actions(&tapped_arm, P2).len(), + 2, + "reach-guard: the tapped fetch must be castable too, or its Accept below is produced by an \ + absent action rather than by a confined one; got {:?}", + non_pass_actions(&tapped_arm, P2) + ); + + let (tapped_funded, tapped_fetched) = resolve_fetch_choosing_a_swamp(&tapped_arm, growth); + let tapped_land = tapped_funded + .objects + .get(&tapped_fetched) + .expect("the fetched Swamp is a real object on this board"); + assert_eq!( + tapped_land.zone, + Zone::Battlefield, + "reach-guard: the tapped fetch must have resolved and moved the land as well" + ); + assert!( + tapped_land.tapped, + "CR 110.5b: 'unless a spell or ability says otherwise' — this one says otherwise, and this \ + assertion is what separates the pair" + ); + assert!( + !probe_actions(&tapped_funded, P2) + .iter() + .any(|a| matches!(a, GameAction::CastSpell { object_id, .. } if *object_id == answer)), + "FUNDING, negative half: a TAPPED land pays for nothing, so the identical answer stays \ + uncastable after the identical drive. Together with the assertion above, the tap state — \ + not the fetch shape — is what funds the out; got {:?}", + non_pass_actions(&tapped_funded, P2) + ); + assert_eq!( + engine::ai_support::smart_shortcut_response(&tapped_arm, P2), + ShortcutResponse::Accept, + "…and the classifier agrees with the board: a tapped fetch buys the seat nothing, so the \ + gate is a DISTINCTION on the tap axis and not a blanket flip of the fetch class. This is \ + the assertion an over-broad version of this fix destroys first" + ); +} + +// =========================================================================== +// PR #7101 — the two maintainer findings, both on the REAL 4p board. +// +// SHARED PREMISE, MEASURED once here rather than re-asserted per row. At the +// offer beat the flagship board carries 171 active trigger definitions; the +// CR 113.6 zone-of-function gate removes 168, leaving exactly three: +// +// Dina, Soul Steeper LifeGained valid_card=None owner=P0 +// Bloodthirsty Conqueror LifeLost valid_card=None owner=P0 +// Abundant Growth ChangesZone valid_card=SelfRef owner=P1 +// +// Dina and the Conqueror are relieved by the MODE gate (CR 119.3: no confined +// action adjusts a life total). Abundant Growth is relieved for P2 by the +// SELF-REFERENCE carve-out and by nothing else — `obj.owner (P1) != actor (P2)` +// is the whole of it. That is why `v1_live_path_*` still Accepts, and it is why +// polling P1 on this same board would find a live observer: for P1 the carve-out +// conjunct is false. P1 is nevertheless safe, and NOT because "no board fires" — +// it is because `smart_shortcut_response` returns `Accept` from STAGE 1, before +// `any_action_may_interfere` ever runs, which `v1_live_path_*`'s own sibling +// control pins via `!stage_one_meaningful(&other, seat)`. +// =========================================================================== + +const HEDRON_CRAB: &str = "Landfall — Whenever a land you control enters, target player mills \ + three cards. (They put the top three cards of their library into their \ + graveyard.)"; +const BLOODGHAST_LANDFALL: &str = "Landfall — Whenever a land you control enters, you may return \ + this card from your graveyard to the battlefield."; + +/// Stage a real parsed OBSERVER — a card whose rules content is a printed +/// TRIGGER rather than an activated/spell ability — owned and controlled by +/// `player`. +/// +/// Distinct from `give_parsed_card` above on purpose: that helper stages the +/// ACTING object and asserts exactly one parsed *ability*, which is the premise +/// the V10 rows need and the exact opposite of what an observer carries. Verbatim +/// Oracle text under the card's REAL name — a paraphrase can take a different +/// parser branch and green a row while the printed card stays broken. +fn give_parsed_observer( + state: &mut GameState, + player: PlayerId, + zone: Zone, + name: &str, + oracle: &str, +) -> ObjectId { + let parsed = engine::parser::oracle::parse_oracle_text(oracle, name, &[], &[], &[]); + assert_eq!( + parsed.triggers.len(), + 1, + "PREMISE: {name} must parse to exactly one printed trigger, or the row below cannot \ + attribute its verdict to that trigger; got {:?}", + parsed.triggers + ); + let id = engine::game::zones::create_object( + state, + CardId(state.next_object_id), + player, + name.to_string(), + zone, + ); + let obj = state.objects.get_mut(&id).expect("just created"); + obj.card_types.core_types.push(CoreType::Creature); + obj.base_card_types = obj.card_types.clone(); + obj.install_trigger_base_definitions(std::sync::Arc::new(parsed.triggers)) + .expect("staging one printed trigger set on a fresh object"); + state.layers_dirty = LayersDirty::full(); + id +} + +/// Every active trigger definition on `object`, rendered for assertions. +fn trigger_shapes(state: &GameState, object: ObjectId) -> Vec { + let obj = state.objects.get(&object).expect("staged object exists"); + engine::game::functioning_abilities::active_trigger_definitions(state, obj) + .map(|a| { + format!( + "mode={:?} valid_card={:?} trigger_zones={:?} zcc={}", + a.definition.mode, + a.definition.valid_card, + a.definition.trigger_zones, + a.definition.zone_change_clauses.len() + ) + }) + .collect() +} + +/// **T1.2 — the [MED] finding.** `SelfRef` / `Controller` prove CONTROL, never +/// OWNERSHIP. +/// +/// CR 110.2 makes owner and controller independent. CR 701.21a: "To sacrifice a +/// permanent, its controller moves it from the battlefield directly to its +/// OWNER'S graveyard." So when P2 cracks a Terramorphic Expanse it controls but +/// does NOT own, the land lands in somebody else's graveyard — a per-player zone +/// (CR 400.1) — and the action was never confined at all. The fold's +/// `filter_is_actor_owned(sacrifice.target)` says `true` regardless, because +/// `TargetFilter::SelfRef` resolves through control (CR 109.5). +/// +/// ONE VARIABLE against `v1_live_path_fetchland_seat_accepts_on_the_real_4p_board`: +/// the same board, the same beat, the same offer, the same single action — only +/// `ObjectId(203).owner` differs. MEASURED: all four seats own everything they +/// control on this dump naturally, so the violating shape has to be constructed; +/// it is constructed on the flagship's OWN fetchland rather than on a spare +/// object so that the mis-owned permanent IS the one being sacrificed. +/// +/// REVERT-PROBE (executed): trivialize `actor_owns_everything_they_control` to +/// `true` ⇒ this row returns `Accept` and fails. +#[test] +fn t1_2_a_controlled_but_unowned_fetchland_is_not_confined() { + let mut board = live_path_board(); + drive_to_offer(&mut board, 400).expect("the offer must fire"); + let mut polled = declare_and_poll(&board, P2); + + // REACH-GUARD, before the mutation: an `Accept` produced by an empty seat + // would be indistinguishable from an `Accept` produced by the predicate. + let non_pass = non_pass_actions(&polled, P2); + assert!( + !non_pass.is_empty(), + "REACH-GUARD: P2 must hold a non-pass action, or stage 1 answers and stage 2 never runs" + ); + assert!( + non_pass + .iter() + .any(|a| a.contains("Terramorphic Expanse") && a.contains("zone=Some(Battlefield)")), + "REACH-GUARD: the action under test must be the fetchland activation the finding names; \ + got {non_pass:?}" + ); + assert!( + stage_one_meaningful(&polled, P2), + "REACH-GUARD: stage 1 must still pass P2 through to stage 2" + ); + + let fetch = *polled + .objects + .values() + .find(|o| o.name == "Terramorphic Expanse" && o.controller == P2) + .map(|o| &o.id) + .expect("P2's fetchland is on this board"); + + // CONTROL half — untouched board, unchanged answer. + assert_eq!( + engine::ai_support::smart_shortcut_response(&polled, P2), + ShortcutResponse::Accept, + "matched control (T1.3): with ownership intact the seat still Accepts, so the flip below \ + is attributable to the owner field and to nothing else about this board" + ); + + // WITNESS half — one field. + polled.objects.get_mut(&fetch).expect("just read").owner = P1; + assert_eq!( + engine::ai_support::smart_shortcut_response(&polled, P2), + ShortcutResponse::Shorten { at_iteration: 0 }, + "CR 701.21a: sacrificing a permanent P2 controls but P1 OWNS puts a card into P1's \ + graveyard. `filter_is_actor_owned` cannot see that — it proves control (CR 109.5) — so \ + the ownership fact has to be proven at board level or this Accept is unsound" + ); +} + +/// **T2.1 — the [HIGH] finding.** A confined action is still OBSERVED. +/// +/// CR 603.2: "Whenever a game event or game state matches a triggered ability's +/// trigger event, that ability automatically triggers." Reading the ACTING +/// object's AST proves what that object does; it proves nothing about what the +/// rest of the board is watching for. Hedron Crab watches for exactly the event +/// the flagship's confined fetch produces, and its effect targets a PLAYER. +/// +/// The crab is OPPONENT-owned on purpose. Actor-owned, both the shipped +/// carve-out and the `filter_is_actor_owned` shape rejected in T2.3 would relieve +/// it (the `obj.owner != actor` conjunct rescues it), so an actor-owned crab +/// cannot tell the two apart. Only the opponent-owned one discriminates. +/// +/// REVERT-PROBE (executed): delete the `board_observer_may_react` conjunct from +/// `any_action_may_interfere` ⇒ this row returns `Accept` and fails. +#[test] +fn t2_1_an_opponent_owned_landfall_observer_defeats_a_confined_fetch() { + let mut board = live_path_board(); + drive_to_offer(&mut board, 400).expect("the offer must fire"); + + // MATCHED CONTROL (T2.2) — same board, same beat, no crab. + let clean = declare_and_poll(&board, P2); + assert!( + stage_one_meaningful(&clean, P2), + "REACH-GUARD: stage 1 passes P2 through, so both halves below measure stage 2" + ); + assert_eq!( + engine::ai_support::smart_shortcut_response(&clean, P2), + ShortcutResponse::Accept, + "T2.2 matched control: without an observer the confined fetch still Accepts" + ); + + // WITNESS — one object added, owned and controlled by an opponent. + let mut with_crab = board.clone(); + let crab = give_parsed_observer( + &mut with_crab, + P1, + Zone::Battlefield, + "Hedron Crab", + HEDRON_CRAB, + ); + + // PARSE PIN: if the parser ever stops producing this shape the row must go + // RED rather than silently green on a different (or absent) trigger. + let shapes = trigger_shapes(&with_crab, crab); + assert_eq!( + shapes.len(), + 1, + "PREMISE: the crab must carry exactly one active trigger; got {shapes:?}" + ); + assert!( + shapes[0].contains("mode=ChangesZone"), + "PREMISE: landfall is a CR 603.6a zone-change trigger; got {shapes:?}" + ); + assert!( + shapes[0].contains("Land") && shapes[0].contains("You"), + "PREMISE: `valid_card` must be the TYPED land-you-control filter, NOT `SelfRef`. This is \ + the exact shape T2.3 proves `filter_is_actor_owned` accepts — reusing that helper as the \ + carve-out would relieve this trigger and the [HIGH] finding would survive; got {shapes:?}" + ); + assert!( + shapes[0].contains("trigger_zones=[Battlefield]"), + "PREMISE: the crab must FUNCTION where it is standing, or the zone gate — not the \ + carve-out — would be what produces the verdict below; got {shapes:?}" + ); + + let polled = declare_and_poll(&with_crab, P2); + assert!( + stage_one_meaningful(&polled, P2), + "REACH-GUARD: the crab must not have changed which stage answers" + ); + assert_eq!( + engine::ai_support::smart_shortcut_response(&polled, P2), + ShortcutResponse::Shorten { at_iteration: 0 }, + "CR 603.2: P2's 'confined' fetch makes a land enter, the opponent's Crab triggers on it, \ + and its effect mills a TARGET PLAYER. The action reached outside P2's own resources \ + without P2's own AST containing anything that says so" + ); +} + +/// **T2.4 — the zone-of-function gate, on one axis.** Same card, same trigger, +/// two zones. +/// +/// CR 113.6 / CR 603.6: a Bloodghast-shaped landfall trigger functions from the +/// GRAVEYARD (that is where the ability returns the card from), so a copy sitting +/// in HAND observes nothing. The pair moves the zone and nothing else, so the +/// `Accept` cannot be a property of the card and the `Shorten` cannot be a +/// property of the board. +/// +/// REVERT-PROBE (executed): delete the `trigger_definition_functions_in_zone` +/// conjunct from `board_observer_may_react` ⇒ the hand half returns `Shorten` +/// and this row fails. +/// +/// SCOPE, measured rather than assumed. The OTHER way this gate can go wrong — +/// reading `def.trigger_zones.contains(&obj.zone)` directly, which answers +/// "functions nowhere" for the empty list that means battlefield-only — is NOT +/// discriminated by this row, and it cannot be discriminated on this board: +/// MEASURED, every active trigger definition on the flagship carries an explicit +/// `trigger_zones: [Battlefield]`, so the direct read and the authority agree on +/// the whole corpus. That fail-open direction is a LATENT hole here, closed for +/// the same reason as this module's `Zone::Stack` arm, and it is pinned by +/// `t2_4b_an_empty_trigger_zones_list_means_battlefield_not_nowhere` at unit +/// level where the shape can actually be built. +#[test] +fn t2_4_a_landfall_observer_in_hand_does_not_veto_but_in_its_own_zone_it_does() { + let mut board = live_path_board(); + drive_to_offer(&mut board, 400).expect("the offer must fire"); + + for (zone, expected) in [ + (Zone::Hand, ShortcutResponse::Accept), + ( + Zone::Graveyard, + ShortcutResponse::Shorten { at_iteration: 0 }, + ), + ] { + let mut staged = board.clone(); + let ghast = give_parsed_observer(&mut staged, P1, zone, "Bloodghast", BLOODGHAST_LANDFALL); + let shapes = trigger_shapes(&staged, ghast); + assert!( + shapes.iter().any(|s| s.contains("mode=ChangesZone")), + "PREMISE at {zone:?}: the landfall trigger must survive parsing; got {shapes:?}" + ); + + let polled = declare_and_poll(&staged, P2); + assert!( + stage_one_meaningful(&polled, P2), + "REACH-GUARD at {zone:?}: stage 2 must be the stage that answers" + ); + assert_eq!( + engine::ai_support::smart_shortcut_response(&polled, P2), + expected, + "CR 113.6: the SAME trigger on the SAME card must veto from the zone it functions in \ + and not from the zone it does not; failed at {zone:?}" + ); + } +} + +/// **T2.8 — the scan is not battlefield-only.** A command-zone emblem is scanned. +/// +/// CR 114.1 puts emblems in the command zone and CR 114.4 is exact — "Abilities +/// of emblems function in the command zone" — so an observer that never touches +/// the battlefield +/// still observes. `active_trigger_definitions` applies the CR 114.4 emblem gate +/// itself, which is why the scan delegates to it rather than filtering zones. +/// +/// REVERT-PROBE (executed): restrict `board_observer_may_react` to +/// `obj.zone == Zone::Battlefield` ⇒ this row returns `Accept` and fails. +#[test] +fn t2_8_a_command_zone_emblem_observer_is_scanned() { + let mut board = live_path_board(); + drive_to_offer(&mut board, 400).expect("the offer must fire"); + + let emblem = give_parsed_observer(&mut board, P1, Zone::Command, "Hedron Crab", HEDRON_CRAB); + { + let obj = board.objects.get_mut(&emblem).expect("just staged"); + obj.is_emblem = true; + // CR 114.1: an emblem has no characteristics other than its abilities. + obj.card_types.core_types.clear(); + obj.base_card_types = obj.card_types.clone(); + // CR 114.4: "Abilities of emblems function in the command zone." The + // printed crab trigger parses as battlefield-only, so the zone list is + // retargeted — that retarget is the whole staging, and the assertion + // below proves it survived into the live set. + let mut defs = (*obj.base_trigger_definitions).clone(); + for d in &mut defs { + d.trigger_zones = vec![Zone::Command]; + } + obj.install_trigger_base_definitions(std::sync::Arc::new(defs)) + .expect("re-staging the emblem's trigger set"); + } + let shapes = trigger_shapes(&board, emblem); + assert_eq!( + shapes.len(), + 1, + "PREMISE: the emblem must expose exactly one active trigger from the command zone — \ + `active_trigger_definitions` drops non-emblem command-zone triggers, so an empty list \ + here would make the row vacuous; got {shapes:?}" + ); + + let polled = declare_and_poll(&board, P2); + assert!( + stage_one_meaningful(&polled, P2), + "REACH-GUARD: stage 2 must be the stage that answers" + ); + assert_eq!( + engine::ai_support::smart_shortcut_response(&polled, P2), + ShortcutResponse::Shorten { at_iteration: 0 }, + "CR 114.1 + CR 603.2: an observer in the command zone observes. A battlefield-only scan \ + would miss every emblem and every command-zone trigger" + ); +} + +/// **T2.9 — the actor's OWN self-referential observer is NOT relieved**, on the +/// real board's own survivor. +/// +/// Abundant Growth (`ChangesZone`, `valid_card: SelfRef`) is one of the three +/// definitions that survive the zone gate on the flagship board, and for P2 it is +/// relieved by the carve-out's `obj.owner != actor` conjunct alone. Retag it to +/// P2 — owner AND controller together, so the T1.2 ownership conjunct stays +/// satisfied and cannot be what moves the verdict — and the same trigger must +/// stop being relieved. +/// +/// One variable: the object's seat. This is the row that pins the carve-out to +/// "somebody ELSE'S self-reference", which is the only version of it that is +/// sound: an actor's own self-referential trigger is reachable by the actor's own +/// action. +/// +/// REVERT-PROBE (executed): drop the `obj.owner != actor` conjunct ⇒ this row +/// returns `Accept` and fails. +#[test] +fn t2_9_the_actors_own_self_referential_observer_keeps_the_veto() { + let mut board = live_path_board(); + drive_to_offer(&mut board, 400).expect("the offer must fire"); + let mut polled = declare_and_poll(&board, P2); + + let growth = *polled + .objects + .values() + .find(|o| o.name == "Abundant Growth") + .map(|o| &o.id) + .expect("MEASURED: Abundant Growth is on this board and survives the zone gate"); + let shapes = trigger_shapes(&polled, growth); + assert!( + shapes + .iter() + .any(|s| s.contains("valid_card=Some(SelfRef)")), + "PREMISE: this row needs the SelfRef shape the carve-out keys on; got {shapes:?}" + ); + assert_ne!( + polled.objects[&growth].owner, P2, + "PREMISE: it starts on another seat, which is why the flagship Accepts" + ); + + // CONTROL — somebody else's self-reference, relieved. + assert_eq!( + engine::ai_support::smart_shortcut_response(&polled, P2), + ShortcutResponse::Accept, + "control: an opponent's SelfRef observer cannot be reached by an action confined to P2's \ + own resources" + ); + + // WITNESS — the same trigger, now the actor's own. + { + let obj = polled.objects.get_mut(&growth).expect("just read"); + obj.owner = P2; + obj.base_controller = Some(P2); + obj.controller = P2; + } + assert_eq!( + engine::ai_support::smart_shortcut_response(&polled, P2), + ShortcutResponse::Shorten { at_iteration: 0 }, + "CR 109.5: 'you' on the observer means ITS controller. Once that is the actor, the actor's \ + own confined action can reach it, so the carve-out must not apply" + ); +} + +/// **T3.5 — the new `GameObject::parse_warnings` field changes no committed byte.** +/// +/// `skip_serializing_if = "Vec::is_empty"` is the whole mechanism, and this is +/// the assertion that it is actually wired: re-serialize every object of a +/// committed fixture through the production decoder and compare against the +/// bytes the fixture shipped with. +/// +/// REVERT-PROBE (executed): drop `skip_serializing_if` from the field ⇒ every +/// object gains `"parse_warnings":[]` and this row fails. +#[test] +fn t3_5_the_new_parse_warnings_field_keeps_dumps_byte_identical() { + let json = gunzip_dump(include_bytes!("../fixtures/dina_noff_turn5_4p.json.gz")); + let envelope: serde_json::Value = + serde_json::from_str(&json).expect("dump envelope parses as JSON"); + let before = envelope["gameState"]["objects"].clone(); + assert!( + before.as_object().is_some_and(|m| !m.is_empty()), + "PREMISE: the fixture must carry objects, or byte-equality below is vacuous" + ); + assert!( + !before.to_string().contains("parse_warnings"), + "PREMISE: the committed OBJECTS predate the field, so any occurrence below is new. \ + (Scoped to `objects` on purpose: the envelope's card-database subtree carries the \ + face-level `parse_warnings` this field is copied FROM, and has since before this change.)" + ); + + let state = restore_dump(&json); + let after = + serde_json::to_value(state.objects.values().collect::>()).expect("objects reencode"); + assert!( + !after.to_string().contains("parse_warnings"), + "an EMPTY diagnostics list must not serialize. Without `skip_serializing_if` every object \ + in every committed dump gains a `\"parse_warnings\":[]` key and every stored game grows" + ); +} + +/// Helping Hand, verbatim (Oracle text verified on Scryfall, +/// `api.scryfall.com/cards/named?exact=Helping+Hand`). Confined on every axis +/// `effect_window_reach`'s `ChangeZone` arm reads EXCEPT the origin: the card it +/// returns is a real object in the actor's graveyard whose rules content the fold +/// never classified. +const HELPING_HAND: &str = "Return target creature card with mana value 3 or less from your \ + graveyard to the battlefield tapped."; + +/// Stage a vanilla creature card in `player`'s graveyard. VANILLA on purpose: +/// with no abilities of its own it cannot itself move any verdict — not through +/// `board_observer_may_react` (nothing to observe with), not through the fold +/// (it is not the subject of any action). It exists only so the Helping Hand +/// below has a legal target, and it is staged in BOTH arms so it is held +/// constant rather than varied. +fn give_graveyard_creature(state: &mut GameState, player: PlayerId) -> ObjectId { + let id = engine::game::zones::create_object( + state, + CardId(state.next_object_id), + player, + "Grizzly Bears".to_string(), + Zone::Graveyard, + ); + let obj = state.objects.get_mut(&id).expect("just created"); + obj.card_types.core_types.push(CoreType::Creature); + obj.base_card_types = obj.card_types.clone(); + obj.power = Some(2); + obj.toughness = Some(2); + state.layers_dirty = LayersDirty::full(); + id +} + +/// V10d — a TAPPED battlefield entry from a GRAVEYARD keeps the seat's window; +/// the tapped LIBRARY sibling still Accepts. +/// +/// `v10c` closed the tap axis on a library fetch. This row closes the ORIGIN +/// axis: `effect_window_reach`'s `ChangeZone` arm allowlisted a tapped +/// battlefield entry from ANY origin, so a graveyard recursion read as confined +/// while the card it returns IS in `state.objects` with readable +/// trigger/replacement/static definitions that nothing reads. +/// `object_window_reach`'s `carries_unreadable_rules_content` gate runs on the +/// SOURCE (the Helping Hand), never on the card it returns, and +/// `board_observer_may_react` correctly answers "does not function" for a +/// graveyard ETB (CR 113.6). So a Fleshbag-Marauder-class creature in the actor's +/// own graveyard — "When this creature enters, each player sacrifices a creature +/// of their choice" — arrives inside the very window the seat declined to keep. +/// +/// The LIBRARY sibling below is not confined because its origin excuses it from +/// being read — v10e is the row that shows a library fetch reading `Shorten` on +/// this same board — but because `library_arrivals_are_inert` reads the cards +/// Rampant Growth could actually select and finds them vanilla. +/// +/// **The pair varies exactly one object** on the flagship board, and both halves +/// of that object are the SAME SHAPE on every axis but origin: two spells staged +/// identically (`give_parsed_card`, instant, no printed cost), each heading a +/// `ChangeZone` to the battlefield with `enter_tapped: Tapped`, no +/// `enters_attacking`, no `enters_modified_if`, and a You-controlled target. The +/// graveyard creature is present in BOTH arms. So the Shorten is attributable to +/// the origin field and to nothing else. +/// +/// **The control is the load-bearing half.** Rampant Growth's tapped LIBRARY +/// fetch must still Accept — that is what keeps this gate a distinction rather +/// than a blanket flip, and it is the same measurement that keeps `v1`/`v1b`'s +/// Terramorphic Accept correct. +/// +/// **Conservative by construction, and the cost is stated.** Grizzly Bears is +/// vanilla, so this seat surrenders its window over a recursion that could not +/// have interfered. That is the gate's shape: it reads the ORIGIN, not the +/// returned card, so it is uniform over what the graveyard happens to hold. Per +/// the module's §2 that is the direction that costs efficacy rather than games, +/// and it is the same trade the `Hand` destination gate already made. MEASURED on +/// `data/card-data.json`, of the 493 document-wide tapped/non-attacking/ +/// unconditional/You-controlled battlefield entries, 247 come from a library and +/// keep their classification; 74 graveyard, 25 hand, 6 exile and 140 +/// absent-origin nodes lose it. +/// +/// MUTANT: in `effect_window_reach`'s `ChangeZone` arm, delete the +/// `*origin == Some(Zone::Library)` conjunct from `entry_is_confined` (the +/// pre-fix expression) — the SHORTEN arm flips to `Accept`. The ACCEPT arm is +/// unaffected by that mutation by construction: its origin already IS +/// `Library`, so the conjunct it deletes was true there anyway. +/// +/// Every `GameAction::CastSpell` matcher binds `{ object_id, .. }` and must NOT +/// name `payment_mode`, for `v10a`'s reason. +#[test] +fn v10d_a_tapped_graveyard_return_keeps_its_window_and_the_library_sibling_accepts() { + let mut board = live_path_board(); + drive_to_offer(&mut board, 400).expect("CR 732.2a: the offer must fire on this real 4p drain"); + let polled = declare_and_poll(&board, P2); + + let mut base = polled.clone(); + give_graveyard_creature(&mut base, P2); + + // ── arm ACCEPT: the tapped LIBRARY fetch ── + let mut accept_arm = base.clone(); + let growth = give_rampant_growth(&mut accept_arm, P2); + // ── arm SHORTEN: same board, same graveyard, the tapped GRAVEYARD return ── + let mut shorten_arm = base.clone(); + let helping_hand = give_parsed_card( + &mut shorten_arm, + P2, + "Helping Hand", + HELPING_HAND, + CoreType::Instant, + Zone::Hand, + ); + + for (label, arm, staged) in [ + ("ACCEPT", &accept_arm, growth), + ("SHORTEN", &shorten_arm, helping_hand), + ] { + assert!( + stage_one_meaningful(arm, P2), + "reach-guard ({label} arm): stage 1 must return true, or the seat answers at stage 1 \ + and the fold under test never runs" + ); + assert!( + probe_actions(arm, P2).iter().any( + |a| matches!(a, GameAction::CastSpell { object_id, .. } if *object_id == staged) + ), + "reach-guard ({label} arm): the staged spell must really be castable at this window, \ + or the arm is the base board with extra steps and the pair measures nothing; got {:?}", + non_pass_actions(arm, P2) + ); + } + + // ATTRIBUTION: both arms must be the flagship's action set PLUS exactly the + // one staged cast. A third `MayInterfere` action in either arm would + // over-determine the row silently instead of reddening. + let accept_non_pass = non_pass_actions(&accept_arm, P2); + let shorten_non_pass = non_pass_actions(&shorten_arm, P2); + assert_eq!( + accept_non_pass.len(), + 2, + "ATTRIBUTION: the ACCEPT arm must be the flagship fetchland PLUS the Rampant Growth cast, \ + and nothing else; got {accept_non_pass:?}" + ); + assert_eq!( + shorten_non_pass.len(), + 2, + "ATTRIBUTION: the SHORTEN arm must be the flagship fetchland PLUS the Helping Hand cast, \ + and nothing else; got {shorten_non_pass:?}" + ); + + // MEMBERSHIP, not just cardinality: the two arms MINUS their staged cast must + // be the same single flagship action, so the pair really does vary one object. + let accept_rest: Vec<&String> = accept_non_pass + .iter() + .filter(|a| !a.starts_with(&format!("CastSpell {{ object_id: {growth:?},"))) + .collect(); + let shorten_rest: Vec<&String> = shorten_non_pass + .iter() + .filter(|a| !a.starts_with(&format!("CastSpell {{ object_id: {helping_hand:?},"))) + .collect(); + assert_eq!( + accept_rest, shorten_rest, + "ATTRIBUTION: each arm's set MINUS its staged cast must be the SAME flagship action — same \ + object, same zone, same controller; got {accept_non_pass:?} vs {shorten_non_pass:?}" + ); + assert!( + accept_rest.len() == 1 + && accept_rest[0].contains("Terramorphic Expanse") + && accept_rest[0].contains("zone=Some(Battlefield)") + && accept_rest[0].contains("controller=Some(PlayerId(2))"), + "ATTRIBUTION: that shared action must be P2's OWN battlefield fetchland; got \ + {accept_rest:?}" + ); + + assert_eq!( + engine::ai_support::smart_shortcut_response(&accept_arm, P2), + ShortcutResponse::Accept, + "the pair's negative arm: a tapped LIBRARY fetch stays confined — Rampant Growth searches \ + for a BASIC land and every basic in P2's recorded library is vanilla, so \ + `library_arrivals_are_inert` really did read the selectable set rather than skip it \ + (v10e is the row that varies that set)" + ); + assert_eq!( + engine::ai_support::smart_shortcut_response(&shorten_arm, P2), + ShortcutResponse::Shorten { at_iteration: 0 }, + "the pair's positive arm: the returned card is a REAL object in the actor's graveyard \ + whose rules content this fold never classified, so `OwnResourcesOnly` would be a proof it \ + cannot discharge. The Helping Hand is the one object that differs" + ); +} + +/// V10e — a tapped LIBRARY fetch whose search can SELECT an interfering +/// permanent is not confined, and the two things that could be producing that +/// verdict are separated by two orthogonal one-variable controls. +/// +/// The hole this closes was argued, not overlooked. Every earlier revision of +/// `effect_window_reach`'s `ChangeZone` arm discharged the arriving card with a +/// hidden-zone argument: CR 400.2 makes a library hidden, the card is an unchosen +/// member of it, so "the seam is handed a `GameState` and a list of +/// `GameAction`s, and the card is the subject of neither". CR 701.23a is the rule +/// that refutes it — "To search for a card in a zone, look at all cards in that +/// zone (even if it's a hidden zone) and find a card that matches the given +/// description" — and MEASURED on THIS fixture at THIS poll, all 91 cards of P2's +/// library resolve in `state.objects` with full parsed rules content. Hidden +/// means the opponents cannot see it. The searcher picks whichever member they +/// like. +/// +/// **`board_observer_may_react` cannot cover this**, and correctly so: CR 113.6, +/// through `trigger_definition_functions_in_zone`, answers "does not function" +/// for a card in a library. That scan asks which triggers function NOW; the +/// hazard is a trigger that functions once the search puts the card onto the +/// battlefield. +/// +/// **The witness is on the recorded board, not staged.** P2's own library holds +/// **Bojuka Bog** — "This land enters tapped. / When this land enters, exile +/// target player's graveyard. / {T}: Add {B}." (Oracle text verified on Scryfall) +/// — a LAND whose ETB exiles a graveyard belonging to somebody else. A seat that +/// Accepts while holding an unrestricted land fetch has declined a window in +/// which it could have made a live cross-player choice. +/// +/// **Three arms, two orthogonal controls, one variable each.** +/// * `SHORTEN` — Reshape the Earth (`Typed[Land]`) on the recorded library. +/// * `ACCEPT_BY_FILTER` — Rampant Growth (`Typed[Land] + Basic`) on the SAME +/// library. Holds the board fixed and varies the printed search filter, so the +/// gate is shown to read the filter and not merely "some land fetch exists". +/// * `ACCEPT_BY_LIBRARY` — Reshape the Earth again, with the non-inert LANDS +/// removed from P2's library. Holds the card fixed and varies the deck, which +/// is the axis the gate actually claims to read. This is the arm that +/// distinguishes the implemented gate from a filter-text heuristic: a +/// `Basic`-means-safe shortcut passes `ACCEPT_BY_FILTER` and fails here. +/// +/// MUTANT (executed): delete the `library_arrivals_are_inert` conjunct from +/// `object_window_reach` ⇒ the `SHORTEN` arm flips to `Accept`. The two ACCEPT +/// arms are unaffected by that mutation by construction — their selectable sets +/// are already inert, so the deleted conjunct was true in both. +#[test] +fn v10e_an_unrestricted_land_fetch_that_can_select_bojuka_bog_keeps_its_window() { + let mut board = live_path_board(); + drive_to_offer(&mut board, 400).expect("CR 732.2a: the offer must fire on this real 4p drain"); + let polled = declare_and_poll(&board, P2); + + // ── PREMISE, read off the recorded library rather than assumed ── + let library: Vec = polled + .players + .iter() + .find(|p| p.id == P2) + .expect("P2 is seated on this dump") + .library + .iter() + .copied() + .collect(); + assert!( + library.len() > 20, + "PREMISE: P2 must have a real recorded library for the selection set to mean anything; \ + got {}", + library.len() + ); + let resolved = library + .iter() + .filter(|id| polled.objects.contains_key(id)) + .count(); + assert_eq!( + resolved, + library.len(), + "PREMISE, and the refutation of the hidden-zone argument this row exists to retire: every \ + library card must resolve in `state.objects` at the decision point. If this ever fails, \ + the gate has nothing to read and the row measures nothing" + ); + + let named = |state: &GameState, id: &ObjectId| { + state + .objects + .get(id) + .map(|o| o.name.clone()) + .unwrap_or_default() + }; + // A land the gate must reject, and the basics it must accept — both real + // members of this deck. + let bog = library + .iter() + .copied() + .find(|id| named(&polled, id) == "Bojuka Bog") + .expect("PREMISE: the recorded library must contain Bojuka Bog — it IS the hazard"); + let bog_obj = polled.objects.get(&bog).expect("just found"); + assert!( + !bog_obj.trigger_definitions.is_empty(), + "PREMISE: Bojuka Bog must carry its ETB trigger, or it is not the card this row names" + ); + assert!( + bog_obj.card_types.core_types.contains(&CoreType::Land), + "PREMISE: it must be a LAND, or an unrestricted land search cannot select it" + ); + assert!( + !bog_obj.card_types.supertypes.contains(&Supertype::Basic), + "PREMISE: it must NOT be basic, or the ACCEPT_BY_FILTER control below cannot be a control" + ); + let basics: Vec = library + .iter() + .copied() + .filter(|id| { + polled.objects[id] + .card_types + .supertypes + .contains(&Supertype::Basic) + }) + .collect(); + assert!( + !basics.is_empty(), + "PREMISE: ACCEPT_BY_FILTER needs a NON-EMPTY basic-land match set — an empty match set is \ + the one case `library_arrivals_are_inert` deliberately fails closed on, so it would \ + produce the wrong verdict for the wrong reason" + ); + for id in &basics { + let o = &polled.objects[id]; + assert!( + o.trigger_definitions.is_empty() + && o.replacement_definitions.is_empty() + && o.static_definitions.is_empty() + && o.keywords.is_empty(), + "PREMISE: every basic in this deck must be vanilla, or ACCEPT_BY_FILTER would be \ + asserting the wrong direction; {} is not", + o.name + ); + } + + // ── the three arms ── + let mut shorten_arm = polled.clone(); + let reshape_shorten = give_parsed_card( + &mut shorten_arm, + P2, + "Reshape the Earth", + RESHAPE_THE_EARTH, + CoreType::Instant, + Zone::Hand, + ); + + let mut accept_by_filter = polled.clone(); + let growth = give_rampant_growth(&mut accept_by_filter, P2); + + // Vary the DECK, not the card: strip every library land the gate would + // reject, leaving a pool whose land members are all vanilla. + let mut accept_by_library = polled.clone(); + let stripped = strip_non_inert_library_lands(&mut accept_by_library, P2); + assert!( + stripped.contains(&bog), + "the ACCEPT_BY_LIBRARY arm must actually remove the hazard, or it is the SHORTEN arm with \ + extra steps; removed {stripped:?}" + ); + let reshape_accept = give_parsed_card( + &mut accept_by_library, + P2, + "Reshape the Earth", + RESHAPE_THE_EARTH, + CoreType::Instant, + Zone::Hand, + ); + + // ── reach-guards: each arm's staged spell must really be castable here, and + // each arm must be the flagship action set PLUS exactly that one cast ── + for (label, arm, staged) in [ + ("SHORTEN", &shorten_arm, reshape_shorten), + ("ACCEPT_BY_FILTER", &accept_by_filter, growth), + ("ACCEPT_BY_LIBRARY", &accept_by_library, reshape_accept), + ] { + assert!( + stage_one_meaningful(arm, P2), + "reach-guard ({label}): stage 1 must return true, or the seat answers at stage 1 and \ + the fold under test never runs" + ); + let non_pass = non_pass_actions(arm, P2); + assert_eq!( + non_pass.len(), + 2, + "ATTRIBUTION ({label}): the arm must be the flagship fetchland PLUS the one staged \ + cast, and nothing else; got {non_pass:?}" + ); + assert!( + non_pass + .iter() + .any(|a| a.starts_with(&format!("CastSpell {{ object_id: {staged:?},"))), + "reach-guard ({label}): the staged spell must be castable at this window; got \ + {non_pass:?}" + ); + assert!( + non_pass.iter().any(|a| a.contains("Terramorphic Expanse") + && a.contains("zone=Some(Battlefield)") + && a.contains("controller=Some(PlayerId(2))")), + "ATTRIBUTION ({label}): the other action must be P2's OWN battlefield fetchland, so \ + all three arms share it; got {non_pass:?}" + ); + } + + assert_eq!( + engine::ai_support::smart_shortcut_response(&shorten_arm, P2), + ShortcutResponse::Shorten { at_iteration: 0 }, + "CR 701.23a: an unrestricted land search LOOKS AT ALL CARDS in the library, and this one \ + contains Bojuka Bog, whose ETB exiles a graveyard P2 does not own. Accepting here \ + declines a window holding a live cross-player choice" + ); + assert_eq!( + engine::ai_support::smart_shortcut_response(&accept_by_filter, P2), + ShortcutResponse::Accept, + "CONTROL 1 (filter varies, deck held): a basic-land search on this same library can select \ + only vanilla Plains and Swamps, so the gate is a distinction and not a blanket flip" + ); + assert_eq!( + engine::ai_support::smart_shortcut_response(&accept_by_library, P2), + ShortcutResponse::Accept, + "CONTROL 2 (deck varies, card held): the SAME unrestricted search is confined once every \ + land it could select is vanilla. This is what proves the gate reads the library rather \ + than the printed word 'basic'" + ); +} + +/// Remove from `player`'s library every LAND that carries rules content +/// `shortcut_efficacy`'s gate cannot classify, and return what was removed. +/// +/// Lands only, deliberately: the search under test selects lands, so stripping +/// the rest would vary more than the arm claims to. The predicate mirrors the +/// public half of `carries_unreadable_rules_content` — if the two ever disagree +/// the ACCEPT arm reds rather than passing quietly, because a survivor the gate +/// still rejects keeps the verdict at `Shorten`. +fn strip_non_inert_library_lands(state: &mut GameState, player: PlayerId) -> Vec { + let doomed: Vec = state + .players + .iter() + .find(|p| p.id == player) + .expect("player is seated") + .library + .iter() + .copied() + .filter(|id| { + state.objects.get(id).is_some_and(|o| { + o.card_types.core_types.contains(&CoreType::Land) + && (!o.trigger_definitions.is_empty() + || !o.replacement_definitions.is_empty() + || !o.static_definitions.is_empty() + || !o.keywords.is_empty()) + }) + }) + .collect(); + for id in &doomed { + state.objects.remove(id); + } + let library = &mut state + .players + .iter_mut() + .find(|p| p.id == player) + .expect("player is seated") + .library; + library.retain(|id| !doomed.contains(id)); + doomed +} diff --git a/crates/engine/tests/integration/specialize_runtime.rs b/crates/engine/tests/integration/specialize_runtime.rs index a2151b0f8a..52e88f5efb 100644 --- a/crates/engine/tests/integration/specialize_runtime.rs +++ b/crates/engine/tests/integration/specialize_runtime.rs @@ -41,6 +41,7 @@ fn specialize_back(name: &str, color: ManaColor, shard: ManaCostShard) -> BackFa casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], } } diff --git a/crates/engine/tests/integration/std_s07_batch5b.rs b/crates/engine/tests/integration/std_s07_batch5b.rs index 8546922e4f..c49871ebf4 100644 --- a/crates/engine/tests/integration/std_s07_batch5b.rs +++ b/crates/engine/tests/integration/std_s07_batch5b.rs @@ -119,6 +119,7 @@ fn add_aang_dfc(state: &mut GameState) -> ObjectId { casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], }); id } diff --git a/crates/engine/tests/integration/stolen_goodies_zero_targets.rs b/crates/engine/tests/integration/stolen_goodies_zero_targets.rs index 38d4c24e0e..c00eff8605 100644 --- a/crates/engine/tests/integration/stolen_goodies_zero_targets.rs +++ b/crates/engine/tests/integration/stolen_goodies_zero_targets.rs @@ -80,6 +80,7 @@ fn stolen_goodies_can_be_cast_with_no_targets() { casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], }); let pool = &mut runner.state_mut().players[P0.0 as usize].mana_pool; diff --git a/crates/engine/tests/integration/tamiyo_inquisitive_student_flip.rs b/crates/engine/tests/integration/tamiyo_inquisitive_student_flip.rs index a0d4f4be7d..898a6cb4ab 100644 --- a/crates/engine/tests/integration/tamiyo_inquisitive_student_flip.rs +++ b/crates/engine/tests/integration/tamiyo_inquisitive_student_flip.rs @@ -113,6 +113,7 @@ fn tamiyo_third_draw_returns_transformed_not_stranded_in_exile() { casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], }); // Precondition: Tamiyo is on the battlefield, front-face (not transformed). diff --git a/crates/engine/tests/integration/wedding_announcement_transform.rs b/crates/engine/tests/integration/wedding_announcement_transform.rs index ecc56c4735..70fc1b1efe 100644 --- a/crates/engine/tests/integration/wedding_announcement_transform.rs +++ b/crates/engine/tests/integration/wedding_announcement_transform.rs @@ -97,6 +97,7 @@ fn wedding_announcement_human_branch_transforms_and_applies_festivity_anthem() { casting_restrictions: vec![], casting_options: vec![], layout_kind: None, + parse_warnings: vec![], }); wedding }; From 6b432b5ad1aa6d6dba4a312acbbbdef4a7476b73 Mon Sep 17 00:00:00 2001 From: Matt Evans <1388610+matthewevans@users.noreply.github.com> Date: Mon, 10 Aug 2026 01:03:00 -0700 Subject: [PATCH 07/15] chore: refresh metagame feeds (#7203) --- .../public/feeds/mtggoldfish-commander.json | 1591 ++++++++--------- client/public/feeds/mtggoldfish-modern.json | 2 +- client/public/feeds/mtggoldfish-pioneer.json | 184 +- client/public/feeds/mtggoldfish-standard.json | 384 ++-- 4 files changed, 1043 insertions(+), 1118 deletions(-) diff --git a/client/public/feeds/mtggoldfish-commander.json b/client/public/feeds/mtggoldfish-commander.json index 7f35a03475..8f0b217c8c 100644 --- a/client/public/feeds/mtggoldfish-commander.json +++ b/client/public/feeds/mtggoldfish-commander.json @@ -5,7 +5,7 @@ "icon": "G", "format": "commander", "version": 1, - "updated": "2026-08-09T00:00:00Z", + "updated": "2026-08-10T00:00:00Z", "source": "https://www.mtggoldfish.com/metagame/commander", "decks": [ { @@ -19,10 +19,6 @@ "metagame" ], "main": [ - { - "count": 1, - "name": "Trostani, Selesnya's Voice" - }, { "count": 1, "name": "Archangel of Thune" @@ -370,6 +366,10 @@ { "count": 7, "name": "Forest" + }, + { + "count": 1, + "name": "Trostani, Selesnya's Voice" } ], "sideboard": [] @@ -746,12 +746,12 @@ "sideboard": [] }, { - "name": "Y'shtola, Night's Blessed", + "name": "Ashling, the Limitless", "author": "MTGGoldfish", "colors": [ - "U", - "W", - "B" + "B", + "R", + "G" ], "tags": [ "metagame" @@ -759,384 +759,366 @@ "main": [ { "count": 1, - "name": "Y'shtola, Night's Blessed" - }, - { - "count": 1, - "name": "Contaminated Aquifer" + "name": "Ashling, the Limitless" }, { "count": 1, - "name": "Relic of Legends" - }, - { - "count": 3, - "name": "Island" + "name": "Arcane Denial" }, { "count": 1, - "name": "Shineshadow Snarl" + "name": "Arcane Signet" }, { "count": 1, - "name": "Exotic Orchard" + "name": "Ashnod's Altar" }, { "count": 1, - "name": "Toxic Deluge" + "name": "Birds of Paradise" }, { "count": 1, - "name": "Alisaie Leveilleur" + "name": "Blasphemous Act" }, { "count": 1, - "name": "Prairie Stream" + "name": "Blood Crypt" }, { "count": 1, - "name": "Thought Vessel" + "name": "Brushland" }, { "count": 1, - "name": "Vindicate" + "name": "Burnt Offering" }, { "count": 1, - "name": "Talisman of Dominance" + "name": "Catalyst Elemental" }, { "count": 1, - "name": "Final Judgment" + "name": "Cavalier of Flame" }, { "count": 1, - "name": "Relm's Sketching" + "name": "Cavalier of Gales" }, { "count": 1, - "name": "Summon: Primal Odin" + "name": "Cavalier of Night" }, { "count": 1, - "name": "Fetid Heath" + "name": "Cavalier of Thorns" }, { "count": 1, - "name": "Evolving Wilds" + "name": "Chain Reaction" }, { "count": 1, - "name": "Talisman of Progress" + "name": "Chromatic Lantern" }, { "count": 1, - "name": "Combat Tutorial" + "name": "Cinder Glade" }, { "count": 1, - "name": "Crux of Fate" + "name": "Command Tower" }, { "count": 1, - "name": "Archmage Emeritus" + "name": "Consign to Memory" }, { "count": 1, - "name": "Murderous Rider" + "name": "Culling the Weak" }, { "count": 1, - "name": "Eden, Seat of the Sanctum" + "name": "Cultivate" }, { "count": 1, - "name": "Coveted Jewel" + "name": "Dark Ritual" }, { "count": 1, - "name": "Reaper's Scythe" + "name": "Eirdu, Carrier of Dawn" }, { "count": 1, - "name": "Sunlit Marsh" + "name": "Elvish Spirit Guide" }, { "count": 1, - "name": "Exsanguinate" + "name": "Endurance" }, { "count": 1, - "name": "Hildibrand Manderville" - }, - { - "count": 4, - "name": "Plains" + "name": "Ephemerate" }, { "count": 1, - "name": "Eject" + "name": "Evolving Wilds" }, { "count": 1, - "name": "Void Rend" + "name": "Exotic Orchard" }, { "count": 1, - "name": "Sol Ring" + "name": "Explore" }, { "count": 1, - "name": "Talisman of Hierarchy" + "name": "Farseek" }, { "count": 1, - "name": "Ice Magic" + "name": "Feign Death" }, { "count": 1, - "name": "Syphon Mind" + "name": "Fellwar Stone" }, { "count": 1, - "name": "Krile Baldesion" + "name": "Flamebraider" }, { "count": 1, - "name": "Sublime Epiphany" + "name": "Flamekin Harbinger" }, { - "count": 1, - "name": "Esper Sentinel" + "count": 5, + "name": "Forest" }, { "count": 1, - "name": "Observed Stasis" + "name": "Frontier Bivouac" }, { "count": 1, - "name": "Stroke of Midnight" + "name": "Fury" }, { "count": 1, - "name": "Magic Damper" + "name": "Garruk's Uprising" }, { "count": 1, - "name": "Lyse Hext" + "name": "Generous Ent" }, { "count": 1, - "name": "Plea for Power" + "name": "Greenwarden of Murasa" }, { "count": 1, - "name": "Mana Drain" + "name": "Grief" }, { "count": 1, - "name": "Dancer's Chakrams" + "name": "Heartless Summoning" }, { "count": 1, - "name": "Desolate Mire" + "name": "Ignoble Hierarch" }, { "count": 1, - "name": "The One Ring" + "name": "Jeska's Will" }, { "count": 1, - "name": "Hermes, Overseer of Elpis" + "name": "Jungle Shrine" }, { "count": 1, - "name": "Lethal Scheme" + "name": "Karmic Guide" }, { "count": 1, - "name": "Arcane Signet" + "name": "Karplusan Forest" }, { "count": 1, - "name": "Port Town" + "name": "Llanowar Wastes" }, { "count": 1, - "name": "Hraesvelgr of the First Brood" + "name": "Lorien Revealed" }, { "count": 1, - "name": "Isolated Chapel" + "name": "Maelstrom Wanderer" }, { "count": 1, - "name": "Tome of Legends" + "name": "Mass of Mysteries" }, { - "count": 1, - "name": "Cut a Deal" + "count": 7, + "name": "Mountain" }, { "count": 1, - "name": "Emet-Selch of the Third Seat" + "name": "Mulldrifter" }, { "count": 1, - "name": "Underground River" + "name": "Nature's Lore" }, { "count": 1, - "name": "Sharlayan, Nation of Scholars" - }, - { - "count": 4, - "name": "Swamp" + "name": "Negate" }, { "count": 1, - "name": "Estinien Varlineau" + "name": "Noble Hierarch" }, { "count": 1, - "name": "Rhystic Study" + "name": "Noxious Revival" }, { "count": 1, - "name": "Idyllic Beachfront" + "name": "Overgrown Tomb" }, { "count": 1, - "name": "Drowned Catacomb" + "name": "Path of Ancestry" }, { "count": 1, - "name": "Demolition Field" + "name": "Path to Exile" }, { "count": 1, - "name": "Dig Through Time" + "name": "Pyre of Heroes" }, { "count": 1, - "name": "Fandaniel, Telophoroi Ascian" + "name": "Rampant Growth" }, { "count": 1, - "name": "White Auracite" + "name": "Reveillark" }, { "count": 1, - "name": "Summon: Good King Mog XII" + "name": "Risen Reef" }, { "count": 1, - "name": "Temple of the False God" + "name": "Sacrifice" }, { "count": 1, - "name": "Command Tower" + "name": "Savage Lands" }, { "count": 1, - "name": "Scavenger Grounds" + "name": "Secluded Courtyard" }, { "count": 1, - "name": "Sunken Ruins" + "name": "Semblance Anvil" }, { "count": 1, - "name": "Darkwater Catacombs" + "name": "Shivan Reef" }, { "count": 1, - "name": "Sunken Hollow" + "name": "Simian Spirit Guide" }, { "count": 1, - "name": "Propaganda" + "name": "Smokebraider" }, { "count": 1, - "name": "Cyclonic Rift" + "name": "Sol Ring" }, { "count": 1, - "name": "Ash Barrens" + "name": "Stomping Ground" }, { "count": 1, - "name": "Circle of Power" + "name": "Sulfurous Springs" }, { "count": 1, - "name": "Venat, Heart of Hydaelyn" + "name": "Sunderflock" }, { - "count": 1, - "name": "Instant Ramen" + "count": 3, + "name": "Swamp" }, { "count": 1, - "name": "Rite of Replication" + "name": "Swords to Plowshares" }, { "count": 1, - "name": "Alphinaud Leveilleur" + "name": "Talisman of Creativity" }, { "count": 1, - "name": "Thancred Waters" + "name": "Talisman of Impulse" }, { "count": 1, - "name": "Mystic Remora" + "name": "Talisman of Resilience" }, { "count": 1, - "name": "Baleful Strix" + "name": "Terramorphic Expanse" }, { "count": 1, - "name": "Dreams of Laguna" + "name": "Three Visits" }, { "count": 1, - "name": "Skycloud Expanse" + "name": "Unclaimed Territory" }, { "count": 1, - "name": "Archaeomancer's Map" + "name": "Undying Malice" }, { "count": 1, - "name": "Cleansing Nova" + "name": "Up the Beanstalk" }, { "count": 1, - "name": "Arcane Sanctum" + "name": "Utopia Sprawl" }, { "count": 1, - "name": "Tataru Taru" + "name": "Village Rites" }, { "count": 1, - "name": "Choked Estuary" + "name": "Yavimaya Coast" } ], "sideboard": [] }, { - "name": "Ashling, the Limitless", + "name": "Y'shtola, Night's Blessed", "author": "MTGGoldfish", "colors": [ - "W", "U", - "B", - "R", - "G" + "W", + "B" ], "tags": [ "metagame" @@ -1144,666 +1126,675 @@ "main": [ { "count": 1, - "name": "Mass of Mysteries" - }, - { - "count": 1, - "name": "Elemental Spectacle" - }, - { - "count": 1, - "name": "Springleaf Parade" + "name": "Adarkar Wastes" }, { "count": 1, - "name": "Jubilation" + "name": "Alisaie Leveilleur" }, { "count": 1, - "name": "Impulsivity" + "name": "Alphinaud Leveilleur" }, { "count": 1, - "name": "Lamentation" + "name": "Arcane Sanctum" }, { "count": 1, - "name": "Belonging" + "name": "Arcane Signet" }, { "count": 1, - "name": "Subterfuge" + "name": "Archaeomancer's Map" }, { "count": 1, - "name": "Rain-Slicked Copse" + "name": "Azorius Chancery" }, { "count": 1, - "name": "Sodden Verdure" + "name": "Azorius Signet" }, { "count": 1, - "name": "Abundant Countryside" + "name": "Bender's Waterskin" }, { "count": 1, - "name": "Endurance" + "name": "Breena, the Demagogue" }, { "count": 1, - "name": "Fury" + "name": "Caves of Koilos" }, { "count": 1, - "name": "Haunting Voyage" + "name": "Cloud Key" }, { "count": 1, - "name": "Avenger of Zendikar" + "name": "Coercive Impetus" }, { "count": 1, - "name": "Cavalier of Thorns" + "name": "Command Tower" }, { "count": 1, - "name": "Greenwarden of Murasa" + "name": "Contaminated Landscape" }, { "count": 1, - "name": "Selvala, Heart of the Wilds" + "name": "Copy Enchantment" }, { "count": 1, - "name": "Titan of Industry" + "name": "Curiosity" }, { "count": 1, - "name": "Muldrotha, the Gravetide" + "name": "Dimir Aqueduct" }, { "count": 1, - "name": "Omnath, Locus of Rage" + "name": "Dimir Signet" }, { "count": 1, - "name": "Yarok, the Desecrated" + "name": "Duelist's Heritage" }, { "count": 1, - "name": "Omnath, Locus of the Roil" + "name": "Endless Foot Assault" }, { "count": 1, - "name": "Timeless Lotus" + "name": "Eriette of the Charmed Apple" }, { "count": 1, - "name": "Shatter the Sky" + "name": "Estrid's Invocation" }, { "count": 1, - "name": "Hoofprints of the Stag" + "name": "Exotic Orchard" }, { "count": 1, - "name": "Slithermuse" + "name": "Eye of Nidhogg" }, { "count": 1, - "name": "Descendants' Fury" + "name": "Fealty to the Realm" }, { "count": 1, - "name": "Blasphemous Act" + "name": "Fear of Sleep Paralysis" }, { "count": 1, - "name": "Cream of the Crop" + "name": "Flare of Fortitude" }, { "count": 1, - "name": "Kindred Summons" + "name": "Frantic Search" }, { "count": 1, - "name": "Bane of Progress" + "name": "Ghostly Prison" }, { "count": 1, - "name": "Realmwalker" + "name": "Ghoulish Impetus" }, { "count": 1, - "name": "Return of the Wildspeaker" + "name": "Glacial Fortress" }, { "count": 1, - "name": "Faeburrow Elder" + "name": "Herald of Amity" }, { "count": 1, - "name": "Vernal Sovereign" + "name": "Horizon of Progress" }, { "count": 1, - "name": "Horde of Notions" + "name": "Inkshield" }, { "count": 1, - "name": "Maelstrom Wanderer" + "name": "Inquisitive Glimmer" }, { "count": 1, - "name": "Jegantha, the Wellspring" + "name": "Ishgard, the Holy See" }, { - "count": 1, - "name": "Chromatic Lantern" + "count": 8, + "name": "Island" }, { "count": 1, - "name": "Primal Beyond" + "name": "Killian, Decisive Mentor" }, { "count": 1, - "name": "Raging Ravine" + "name": "Killian, Ink Duelist" }, { "count": 1, - "name": "Exotic Orchard" + "name": "Kor Spiritdancer" }, { "count": 1, - "name": "Flamekin Village" + "name": "Martial Impetus" }, { "count": 1, - "name": "Path to Exile" + "name": "Mesa Enchantress" }, { "count": 1, - "name": "Mulldrifter" + "name": "Mirrormade" }, { "count": 1, - "name": "Reality Shift" + "name": "Orzhov Basilica" }, { "count": 1, - "name": "Shriekmaw" + "name": "Orzhov Signet" }, { "count": 1, - "name": "Shimmercreep" + "name": "Parasitic Impetus" }, { "count": 1, - "name": "Flamebraider" + "name": "Path of Ancestry" }, { - "count": 1, - "name": "Crib Swap" + "count": 9, + "name": "Plains" }, { "count": 1, - "name": "Secluded Courtyard" + "name": "Prairie Stream" }, { "count": 1, - "name": "Sol Ring" + "name": "Promise of Loyalty" }, { "count": 1, - "name": "Command Tower" + "name": "Propaganda" }, { "count": 1, - "name": "Arcane Signet" + "name": "Psychic Impetus" }, { "count": 1, - "name": "Distant Melody" + "name": "Public Enemy" }, { "count": 1, - "name": "Incandescent Soulstoke" + "name": "Reaper's Scythe" }, { "count": 1, - "name": "Eclipsed Flamekin" + "name": "Redemption Arc" }, { "count": 1, - "name": "Foundation Breaker" + "name": "Restoration Magic" }, { "count": 1, - "name": "Garruk's Uprising" + "name": "Rewind" }, { "count": 1, - "name": "Risen Reef" + "name": "Saw It Coming" }, { "count": 1, - "name": "Fellwar Stone" + "name": "Scriv, the Obligator" }, { "count": 1, - "name": "Unclaimed Territory" + "name": "Shardmage's Rescue" }, { "count": 1, - "name": "Ancient Ziggurat" + "name": "Shark Typhoon" }, { "count": 1, - "name": "Frontier Bivouac" + "name": "Sheltered by Ghosts" }, { "count": 1, - "name": "Sandsteppe Citadel" + "name": "Skrelv, Defector Mite" }, { "count": 1, - "name": "Savage Lands" + "name": "Spell Swindle" }, { "count": 1, - "name": "Opulent Palace" + "name": "Split Up" }, { "count": 1, - "name": "Seaside Citadel" + "name": "Starfield Mystic" }, { "count": 1, - "name": "Jungle Shrine" + "name": "Stock Up" }, { "count": 1, - "name": "Smokebraider" + "name": "Sublime Epiphany" }, { "count": 1, - "name": "Ingot Chewer" + "name": "Sunken Hollow" }, { - "count": 1, - "name": "Fertile Ground" + "count": 4, + "name": "Swamp" }, { "count": 1, - "name": "Abundant Growth" + "name": "Swords to Plowshares" }, { "count": 1, - "name": "Kodama's Reach" + "name": "Sygg, River Cutthroat" }, { "count": 1, - "name": "Cultivate" + "name": "Tenuous Truce" }, { "count": 1, - "name": "Path of Ancestry" + "name": "Terrain Generator" }, { "count": 1, - "name": "Thriving Grove" + "name": "The Death of Gwen Stacy" }, { "count": 1, - "name": "Thriving Heath" + "name": "Underground River" }, { "count": 1, - "name": "Thriving Isle" + "name": "Unwind" }, { "count": 1, - "name": "Opal Palace" + "name": "Void Rend" }, { "count": 1, - "name": "Thriving Bluff" + "name": "Vow of Malice" }, { "count": 1, - "name": "Thriving Moor" - }, - { - "count": 2, - "name": "Plains" - }, - { - "count": 2, - "name": "Island" - }, - { - "count": 2, - "name": "Swamp" - }, - { - "count": 2, - "name": "Mountain" - }, - { - "count": 8, - "name": "Forest" + "name": "Y'shtola, Night's Blessed" }, { "count": 1, - "name": "Ashling, the Limitless" + "name": "Yahenni's Expertise" } ], "sideboard": [] }, { - "name": "Giada, Font of Hope", + "name": "Lathril, Blade of the Elves", "author": "MTGGoldfish", - "colors": [ - "W" - ], + "colors": [], "tags": [ "metagame" ], "main": [ { "count": 1, - "name": "Giada, Font of Hope" + "name": "Birchlore Rangers [ONS]" }, { "count": 1, - "name": "Lyra Dawnbringer" + "name": "Essence Warden [PLC]" }, { "count": 1, - "name": "Righteous Valkyrie" + "name": "Llanowar Elves [M11]" }, { "count": 1, - "name": "Youthful Valkyrie" + "name": "Virulent Emissary [ECL]" }, { "count": 1, - "name": "Sephara, Sky's Blade" + "name": "Dwynen's Elite [ORI]" }, { "count": 1, - "name": "Herald of War" + "name": "Elvish Visionary [ALA]" }, { "count": 1, - "name": "Angel of Vitality" + "name": "Elvish Warmaster [KHM]" }, { "count": 1, - "name": "Valkyrie Harbinger" + "name": "Llanowar Loamspeaker [DMU] (F)" }, { "count": 1, - "name": "Inspiring Overseer" + "name": "Miara, Thorn of the Glade [CMR]" }, { "count": 1, - "name": "Exemplar of Light" + "name": "Quirion Explorer [PS]" }, { "count": 1, - "name": "Emeria Shepherd" + "name": "Thornweald Archer [FUT]" }, { "count": 1, - "name": "Bishop of Wings" + "name": "Wellwisher [ONS]" }, { "count": 1, - "name": "Angel of Finality" + "name": "Wren's Run Vanquisher [EVG]" }, { "count": 1, - "name": "Angelic Field Marshal" + "name": "Glissa Sunslayer [ECC]" }, { "count": 1, - "name": "Firemane Commando" + "name": "Harald, King of Skemfar [KHM]" }, { "count": 1, - "name": "Thraben Watcher" + "name": "Honest Rutstein [OTJ]" }, { "count": 1, - "name": "Segovian Angel" + "name": "Imperious Perfect [CMR]" }, { "count": 1, - "name": "Sunblast Angel" + "name": "Jagged-Scar Archers [LRW]" }, { "count": 1, - "name": "Dazzling Angel" + "name": "Lys Alana Scarblade [LRW]" }, { "count": 1, - "name": "Angel of the Ruins" + "name": "Morcant's Loyalist [ECL]" }, { "count": 1, - "name": "Metropolis Reformer" + "name": "Ochran Assassin [GRN]" }, { "count": 1, - "name": "Baneslayer Angel" + "name": "Reclamation Sage [PRM-GDP]" }, { "count": 1, - "name": "Angelic Skirmisher" + "name": "Steel Leaf Champion [DOM]" }, { "count": 1, - "name": "Starfield Shepherd" + "name": "Wood Elves [EX]" }, { "count": 1, - "name": "Herald of Eternal Dawn" + "name": "Creakwood Liege <019d4a1a-7260-75df-8d47-de58ca5eff30> [SOC]" }, { "count": 1, - "name": "Shattered Angel" + "name": "Dwynen, Gilt-Leaf Daen [ORI]" }, { "count": 1, - "name": "Serra Avenger" + "name": "Elvish Regrower [FDN]" }, { "count": 1, - "name": "Herald of the Host" + "name": "High Perfect Morcant [ECL]" }, { "count": 1, - "name": "Angel of the Dire Hour" + "name": "Lys Alana Huntmaster [LRW]" }, { "count": 1, - "name": "Serra Angel" + "name": "Moon-Vigil Adherents [ECL]" }, { "count": 1, - "name": "Angelic Curator" + "name": "Nullmage Shepherd [RAV]" }, { "count": 1, - "name": "Sol Ring" + "name": "Oviya, Automech Artisan [DFT]" }, { "count": 1, - "name": "Arcane Signet" + "name": "Poison-Tip Archer [BLC]" }, { "count": 1, - "name": "Patchwork Banner" + "name": "Storrev, Devkarin Lich [WAR]" }, { "count": 1, - "name": "Heraldic Banner" + "name": "Surrak, the Hunt Caller [FDN]" }, { "count": 1, - "name": "Pristine Talisman" + "name": "Wirewood Channeler [LGN]" }, { "count": 1, - "name": "Pearl Medallion" + "name": "Wren's Run Packmaster [LRW]" }, { "count": 1, - "name": "Marble Diamond" + "name": "Elvish Dreadlord [CMR]" }, { "count": 1, - "name": "Swiftfoot Boots" + "name": "Mirkwood Elk [LTC]" }, { "count": 1, - "name": "Moonsilver Spear" + "name": "Garruk, Cursed Huntsman [ELD] (F)" }, { "count": 1, - "name": "Cosmos Elixir" + "name": "Nissa Revane [ZEN]" }, { "count": 1, - "name": "Gathering Stone" + "name": "Bounty of Skemfar [J25]" }, { "count": 1, - "name": "Oketra's Monument" + "name": "Culling Ritual [ONC]" }, { "count": 1, - "name": "Generous Gift" + "name": "Vicious Rivalry <019d72c4-d8f7-75bf-afd7-e94991f3c1ac> [SOS]" }, { "count": 1, - "name": "Stroke of Midnight" + "name": "Ezuri's Predation [C21]" }, { "count": 1, - "name": "Swords to Plowshares" + "name": "Assassin's Trophy [ACR]" }, { "count": 1, - "name": "Path to Exile" + "name": "Tear Asunder [EOC]" }, { "count": 1, - "name": "Brave the Elements" + "name": "Beast Within [MIC]" }, { "count": 1, - "name": "Unbreakable Formation" + "name": "Dina's Guidance <019d72d5-17ae-7f45-b5c9-f28a6ca4d73c> [SOS]" }, { "count": 1, - "name": "Disenchant" + "name": "Eyeblight's Ending [EMA]" }, { "count": 1, - "name": "Make a Stand" + "name": "Hunter's Insight [M12]" }, { "count": 1, - "name": "Dawn Charm" + "name": "Avengers Monitoring Station <019edceb-7f53-7114-9bfe-83d2016c480b> [MSC]" }, { "count": 1, - "name": "Mana Tithe" + "name": "Sol Ring [C20]" }, { "count": 1, - "name": "Austere Command" + "name": "Arcane Signet [C21]" }, { "count": 1, - "name": "Fumigate" + "name": "Cauldron of Essence <019d71d5-8971-7548-a600-77e645309fd1> [SOS]" }, { "count": 1, - "name": "Vanquish the Horde" + "name": "Lifecrafter's Bestiary [AER]" }, { "count": 1, - "name": "Mass Calcify" + "name": "Summoning Materia [FIC]" }, { "count": 1, - "name": "Armored Ascension" + "name": "Colossal Majesty [AFC]" }, { "count": 1, - "name": "Folk Hero" + "name": "Elvish Guidance [ONS]" }, { "count": 1, - "name": "Authority of the Consuls" + "name": "Garruk's Uprising [FDN] (F)" }, { "count": 1, - "name": "True Conviction" + "name": "Deathreap Ritual [NCC]" }, { "count": 1, - "name": "Cathars' Crusade" + "name": "Greater Good [BBD]" }, { "count": 1, - "name": "Monologue Tax" + "name": "Glorious Sunrise [VOW]" }, { "count": 1, - "name": "Leyline of Hope" + "name": "Moldervine Reclamation [M20]" + }, + { + "count": 12, + "name": "Forest <295> [SOI]" + }, + { + "count": 9, + "name": "Swamp <263> [BFZ]" }, { "count": 1, - "name": "Adventurer's Inn" + "name": "High Market [FIC]" }, { "count": 1, - "name": "Path of Ancestry" + "name": "Path of Ancestry [CLB]" }, { "count": 1, - "name": "Radiant Fountain" + "name": "Command Tower [C16]" }, { "count": 1, - "name": "Rogue's Passage" + "name": "Llanowar Wastes [EOC]" }, { "count": 1, - "name": "Secluded Steppe" + "name": "Woodland Cemetery [DOM]" }, { "count": 1, - "name": "Seraph Sanctuary" + "name": "Vernal Fen [EOC]" }, { - "count": 30, - "name": "Plains" + "count": 1, + "name": "Necroblossom Snarl <019d4a1a-c1e7-73a2-a4bb-9ec4dbf7a339> [SOC]" + }, + { + "count": 1, + "name": "Lathril, Blade of the Elves [FDN]" + }, + { + "count": 1, + "name": "Ash Barrens [LTC]" + }, + { + "count": 1, + "name": "Blooming Marsh [KLD]" + }, + { + "count": 1, + "name": "Castle Garenbrig [ELD]" + }, + { + "count": 1, + "name": "Pendelhaven [A25]" + }, + { + "count": 1, + "name": "Spymaster's Vault [MH3]" + }, + { + "count": 1, + "name": "Titan's Grave <019d4a3e-d6ab-7d86-be06-bb27ada89890> [SOS]" + }, + { + "count": 1, + "name": "Viridescent Bog [BLC]" } ], "sideboard": [] }, { - "name": "Meren of Clan Nel Toth", + "name": "Giada, Font of Hope", "author": "MTGGoldfish", "colors": [ - "G", - "B" + "W" ], "tags": [ "metagame" @@ -1811,961 +1802,989 @@ "main": [ { "count": 1, - "name": "Meren of Clan Nel Toth" + "name": "Giada, Font of Hope" }, { "count": 1, - "name": "Protean Hulk" + "name": "Lyra Dawnbringer" }, { "count": 1, - "name": "Gray Merchant of Asphodel" + "name": "Righteous Valkyrie" }, { "count": 1, - "name": "Defiling Daemogoth" + "name": "Youthful Valkyrie" }, { "count": 1, - "name": "Eccentric Pestfinder" + "name": "Sephara, Sky's Blade" }, { "count": 1, - "name": "Blight Mound" + "name": "Herald of War" }, { "count": 1, - "name": "Pest Rescuer" + "name": "Angel of Vitality" }, { "count": 1, - "name": "Ribtruss Roaster" + "name": "Valkyrie Harbinger" }, { "count": 1, - "name": "Feral Appetite" + "name": "Inspiring Overseer" }, { "count": 1, - "name": "Trudge Garden" + "name": "Exemplar of Light" }, { "count": 1, - "name": "Beledros Witherbloom" + "name": "Emeria Shepherd" }, { "count": 1, - "name": "Grave Researcher" + "name": "Bishop of Wings" }, { "count": 1, - "name": "Witch of the Moors" + "name": "Angel of Finality" }, { "count": 1, - "name": "Veinwitch Coven" + "name": "Angelic Field Marshal" }, { "count": 1, - "name": "Deadly Brew" + "name": "Firemane Commando" }, { "count": 1, - "name": "Old Stickfingers" + "name": "Thraben Watcher" }, { "count": 1, - "name": "Satyr Wayfinder" + "name": "Segovian Angel" }, { "count": 1, - "name": "Zulaport Cutthroat" + "name": "Sunblast Angel" }, { "count": 1, - "name": "Blood Artist" + "name": "Dazzling Angel" }, { "count": 1, - "name": "Blossoming Bogbeast" + "name": "Angel of the Ruins" }, { "count": 1, - "name": "Spore Frog" + "name": "Metropolis Reformer" }, { "count": 1, - "name": "Assassin's Trophy" + "name": "Baneslayer Angel" }, { "count": 1, - "name": "Foundation Breaker" + "name": "Angelic Skirmisher" }, { "count": 1, - "name": "Haywire Mite" + "name": "Starfield Shepherd" }, { "count": 1, - "name": "Infernal Grasp" + "name": "Herald of Eternal Dawn" }, { "count": 1, - "name": "Shriekmaw" + "name": "Shattered Angel" }, { "count": 1, - "name": "Reclamation Sage" + "name": "Serra Avenger" }, { "count": 1, - "name": "Plagued Rusalka" + "name": "Herald of the Host" }, { "count": 1, - "name": "Brood Butcher" + "name": "Angel of the Dire Hour" }, { "count": 1, - "name": "Mortality Spear" + "name": "Serra Angel" }, { "count": 1, - "name": "Ravenous Chupacabra" + "name": "Angelic Curator" }, { "count": 1, - "name": "Immoral Bargain" + "name": "Sol Ring" }, { "count": 1, - "name": "Final Act" + "name": "Arcane Signet" }, { "count": 1, - "name": "Toxic Deluge" + "name": "Patchwork Banner" }, { "count": 1, - "name": "Pest Infestation" + "name": "Heraldic Banner" }, { "count": 1, - "name": "Massacre Girl" + "name": "Pristine Talisman" }, { "count": 1, - "name": "Vampiric Rites" + "name": "Pearl Medallion" }, { "count": 1, - "name": "Morbid Opportunist" + "name": "Marble Diamond" }, { "count": 1, - "name": "Smothering Abomination" + "name": "Swiftfoot Boots" }, { "count": 1, - "name": "Umbral Collar Zealot" + "name": "Moonsilver Spear" }, { "count": 1, - "name": "Viscera Seer" + "name": "Cosmos Elixir" }, { "count": 1, - "name": "Woe Strider" + "name": "Gathering Stone" }, { "count": 1, - "name": "Grim Haruspex" + "name": "Oketra's Monument" }, { "count": 1, - "name": "Midnight Reaper" + "name": "Generous Gift" }, { "count": 1, - "name": "Deathreap Ritual" + "name": "Stroke of Midnight" }, { "count": 1, - "name": "Moldervine Reclamation" + "name": "Swords to Plowshares" }, { "count": 1, - "name": "Unmarked Grave" + "name": "Path to Exile" }, { "count": 1, - "name": "Buried Alive" + "name": "Brave the Elements" }, { "count": 1, - "name": "Jarad's Orders" + "name": "Unbreakable Formation" }, { "count": 1, - "name": "Fauna Shaman" + "name": "Disenchant" }, { "count": 1, - "name": "Vile Entomber" + "name": "Make a Stand" }, { "count": 1, - "name": "Birthing Pod" + "name": "Dawn Charm" }, { "count": 1, - "name": "Grisly Salvage" + "name": "Mana Tithe" }, { "count": 1, - "name": "Arcane Signet" + "name": "Austere Command" }, { "count": 1, - "name": "Sol Ring" + "name": "Fumigate" }, { "count": 1, - "name": "Pawn of Ulamog" + "name": "Vanquish the Horde" }, { "count": 1, - "name": "Sakura-Tribe Elder" + "name": "Mass Calcify" }, { "count": 1, - "name": "Springbloom Druid" + "name": "Armored Ascension" }, { "count": 1, - "name": "Wight of the Reliquary" + "name": "Folk Hero" }, { "count": 1, - "name": "Pitiless Plunderer" + "name": "Authority of the Consuls" }, { "count": 1, - "name": "Skull Prophet" + "name": "True Conviction" }, { "count": 1, - "name": "Insidious Roots" + "name": "Cathars' Crusade" }, { "count": 1, - "name": "Ashnod's Altar" + "name": "Monologue Tax" }, { "count": 1, - "name": "Bojuka Bog" + "name": "Leyline of Hope" }, { "count": 1, - "name": "Command Tower" + "name": "Adventurer's Inn" }, { "count": 1, - "name": "Exotic Orchard" + "name": "Path of Ancestry" }, { "count": 1, - "name": "Fabled Passage" + "name": "Radiant Fountain" }, { "count": 1, - "name": "Festering Thicket" + "name": "Rogue's Passage" }, { - "count": 8, - "name": "Forest" + "count": 1, + "name": "Secluded Steppe" }, { "count": 1, - "name": "Grim Backwoods" + "name": "Seraph Sanctuary" }, + { + "count": 30, + "name": "Plains" + } + ], + "sideboard": [] + }, + { + "name": "The Ur-Dragon", + "author": "MTGGoldfish", + "colors": [ + "G", + "U", + "R", + "W", + "B" + ], + "tags": [ + "metagame" + ], + "main": [ { "count": 1, - "name": "Haunted Mire" + "name": "All-Out Assault" }, { "count": 1, - "name": "High Market" + "name": "Crucible of Fire" }, { "count": 1, - "name": "Llanowar Wastes" + "name": "Karrthus, Tyrant of Jund" }, { "count": 1, - "name": "Necroblossom Snarl" + "name": "Stormscale Scion" }, { "count": 1, - "name": "Path of Ancestry" + "name": "Thunderclap Wyvern" }, { "count": 1, - "name": "Study Hall" + "name": "Obelisk of Alara" }, { - "count": 8, - "name": "Swamp" + "count": 1, + "name": "Darigaaz, the Igniter" }, { "count": 1, - "name": "Temple of Malady" + "name": "Twinflame Tyrant" }, { "count": 1, - "name": "Terramorphic Expanse" + "name": "Vorosh, the Hunter" }, { "count": 1, - "name": "Titan's Grave" + "name": "Font of Mythos" }, { "count": 1, - "name": "Turbulent Fen" + "name": "Intet, the Dreamer" }, { "count": 1, - "name": "Twilight Mire" + "name": "Kaalia, Zenith Seeker" }, { "count": 1, - "name": "Vernal Fen" + "name": "Korlessa, Scale Singer" }, { "count": 1, - "name": "Viridescent Bog" + "name": "Sarkhan Unbroken" }, { "count": 1, - "name": "Witherbloom Campus" + "name": "Coalition Victory" }, { "count": 1, - "name": "Woodland Cemetery" - } - ], - "sideboard": [] - }, - { - "name": "Lathril, Blade of the Elves", - "author": "MTGGoldfish", - "colors": [ - "G", - "B" - ], - "tags": [ - "metagame" - ], - "main": [ + "name": "Ancient Ziggurat" + }, { "count": 1, - "name": "Advancing the Spirit" + "name": "Arcane Sanctum" }, { "count": 1, - "name": "Awakening of Vitu-Ghazi" + "name": "Bloodfell Caves" }, { "count": 1, - "name": "Blackblade Reforged" + "name": "Command Tower" }, { "count": 1, - "name": "Bladed Battle-Fan" + "name": "Crystal Grotto" }, { "count": 1, - "name": "Bonesplitter" + "name": "Dismal Backwater" }, { - "count": 1, - "name": "Colossal Collision" + "count": 6, + "name": "Forest" }, { "count": 1, - "name": "Command Tower" + "name": "Haven of the Spirit Dragon" }, { "count": 1, - "name": "Cost of Brilliance" + "name": "Hidden Grotto" }, { - "count": 1, - "name": "Deathbloom Ritualist" + "count": 7, + "name": "Island" }, { "count": 1, - "name": "Deepwood Denizen" + "name": "Jungle Shrine" }, { - "count": 1, - "name": "Defiant Bloodlord" + "count": 6, + "name": "Mountain" }, { - "count": 1, - "name": "Dwynen, Gilt-Leaf Daen" + "count": 7, + "name": "Plains" }, { "count": 1, - "name": "Dwynen's Elite" + "name": "Reliquary Tower" }, { "count": 1, - "name": "Elvish Aberration" + "name": "Rugged Highlands" }, { "count": 1, - "name": "Elvish Archdruid" + "name": "Savage Lands" }, { "count": 1, - "name": "Elvish Doomsayer" + "name": "Seaside Citadel" + }, + { + "count": 6, + "name": "Swamp" }, { "count": 1, - "name": "Elvish Mystic" + "name": "Treva, the Renewer" }, { "count": 1, - "name": "Elvish Visionary" + "name": "Belltoll Dragon" }, { "count": 1, - "name": "Elvish Warmaster" + "name": "Call the Spirit Dragons" }, { "count": 1, - "name": "Explore" + "name": "Dragonlord Dromoka" }, { "count": 1, - "name": "Eyeblight Massacre" + "name": "Palladia-Mors, the Ruiner" }, { "count": 1, - "name": "Ezuri's Archers" + "name": "Scion of Draco" }, { "count": 1, - "name": "Fertile Thicket" + "name": "Sivitri, Dragon Master" }, { "count": 1, - "name": "Find // Finality" + "name": "Chromanticore" }, { "count": 1, - "name": "Forebear's Blade" + "name": "Arcane Signet" }, { - "count": 16, - "name": "Forest" + "count": 1, + "name": "Bloom Tender" }, { "count": 1, - "name": "Gilt-Leaf Winnower" + "name": "Dracogenesis" }, { "count": 1, - "name": "Gladehart Cavalry" + "name": "Dragon Arch" }, { "count": 1, - "name": "Heirloom Blade" + "name": "Dragonstorm Globe" }, { "count": 1, - "name": "Hero's Blade" + "name": "Kaalia of the Vast" }, { "count": 1, - "name": "Immaculate Magistrate" + "name": "Patriar's Seal" }, { "count": 1, - "name": "Imperious Perfect" + "name": "Rivaz of the Claw" }, { "count": 1, - "name": "Ivy Lane Denizen" + "name": "Sol Ring" }, { "count": 1, - "name": "Jiang Yanggu, Wildcrafter" + "name": "Timeless Lotus" }, { "count": 1, - "name": "Jungle Hollow" + "name": "Urza's Incubator" }, { "count": 1, - "name": "Leyline of Abundance" + "name": "Teneb, the Harvester" }, { "count": 1, - "name": "Leyline Prowler" + "name": "Bedevil" }, { "count": 1, - "name": "Llanowar Elves" + "name": "Child of Alara" }, { "count": 1, - "name": "Llanowar Scout" + "name": "Clip Wings" }, { "count": 1, - "name": "Morcant's Loyalist" + "name": "Crux of Fate" }, { "count": 1, - "name": "Nadier's Nightblade" + "name": "Dragon Tempest" }, { "count": 1, - "name": "Naturalize" + "name": "Farewell" }, { "count": 1, - "name": "Oran-Rief, the Vastwood" + "name": "Numot, the Devastator" }, { "count": 1, - "name": "Paradise Druid" + "name": "O-Kagachi, Vengeful Kami" }, { "count": 1, - "name": "Pennon Blade" + "name": "Ojutai, Soul of Winter" }, { "count": 1, - "name": "Pride of the Perfect" + "name": "Oros, the Avenger" }, { "count": 1, - "name": "Prowler's Helm" + "name": "Sultai Charm" }, { "count": 1, - "name": "Punishing Punch" + "name": "Terminate" }, { "count": 1, - "name": "Putrefy" + "name": "Where Ancients Tread" }, { "count": 1, - "name": "Reclamation Sage" + "name": "Wrathful Red Dragon" }, { "count": 1, - "name": "Restorative Technique" + "name": "Broodmate Dragon" }, { "count": 1, - "name": "Rhys the Exiled" + "name": "Miirym, Sentinel Wyrm" }, { "count": 1, - "name": "Rope" + "name": "Rith, the Awakener" }, { "count": 1, - "name": "Sage of the Maze" + "name": "Tiamat" }, { "count": 1, - "name": "Sanctuary Blade" + "name": "Rally of Wings" }, { "count": 1, - "name": "Savage Land Dinosaur" + "name": "The Ur-Dragon" + } + ], + "sideboard": [] + }, + { + "name": "Hashaton, Scarab's Fist", + "author": "MTGGoldfish", + "colors": [ + "W", + "B", + "U" + ], + "tags": [ + "metagame" + ], + "main": [ + { + "count": 1, + "name": "Animate Dead" }, { "count": 1, - "name": "Sentinel of Lost Lore" + "name": "Anointed Procession" }, { "count": 1, - "name": "Serpent Specialist" + "name": "Arcane Sanctum" }, { "count": 1, - "name": "Shaman of the Pack" + "name": "Arcane Signet" }, { "count": 1, - "name": "Shang-Chi, Martial Mentor" + "name": "Archfiend of Ifnir" }, { "count": 1, - "name": "Sigil of Valor" + "name": "Archon of Cruelty" }, { "count": 1, - "name": "Skarrg Goliath" + "name": "Ashen Rider" }, { "count": 1, - "name": "Storrev, Devkarin Lich" + "name": "Bitter Triumph" }, { - "count": 8, - "name": "Swamp" + "count": 1, + "name": "Bone Shards" }, { "count": 1, - "name": "Talara's Battalion" + "name": "Careful Study" }, { "count": 1, - "name": "Thorn Lieutenant" + "name": "Chart a Course" }, { "count": 1, - "name": "Training Regimen" + "name": "Command Tower" }, { "count": 1, - "name": "Treasured Find" + "name": "Consecrated Sphinx" }, { "count": 1, - "name": "Trystan's Command" + "name": "Cryptbreaker" }, { "count": 1, - "name": "Undercover Skrull" + "name": "Dark Ritual" }, { "count": 1, - "name": "Unknown Shores" + "name": "Deadly Rollick" }, { "count": 1, - "name": "Vastwood Fortification" + "name": "Deserted Beach" }, { "count": 1, - "name": "Viridian Emissary" + "name": "Drowned Catacomb" }, { "count": 1, - "name": "Warped Landscape" + "name": "Elesh Norn, Grand Cenobite" }, { "count": 1, - "name": "Wildborn Preserver" + "name": "Exalted Sunborn" }, { "count": 1, - "name": "Wren's Run Vanquisher" + "name": "Exotic Orchard" }, { "count": 1, - "name": "Yeva, Nature's Herald" + "name": "Faithful Mending" }, { "count": 1, - "name": "Lathril, Blade of the Elves" - } - ], - "sideboard": [] - }, - { - "name": "The Unbeatable Squirrel Girl", - "author": "MTGGoldfish", - "colors": [ - "G" - ], - "tags": [ - "metagame" - ], - "main": [ + "name": "Fierce Guardianship" + }, { "count": 1, - "name": "Valley Mightcaller" + "name": "Flooded Strand" }, { "count": 1, - "name": "Bakersbane Duo" + "name": "Frantic Search" }, { "count": 1, - "name": "Bushy Bodyguard" + "name": "Glacial Fortress" }, { "count": 1, - "name": "Scurrid Colony" + "name": "Godless Shrine" }, { "count": 1, - "name": "Frog-Squirrels" + "name": "Grave Titan" }, { "count": 1, - "name": "Squirrel Sovereign" + "name": "Gray Merchant of Asphodel" }, { "count": 1, - "name": "Thornvault Forager" + "name": "Grimoire of the Dead" }, { "count": 1, - "name": "Three Tree Mascot" + "name": "Hallowed Fountain" + }, + { + "count": 4, + "name": "Island" }, { "count": 1, - "name": "Barkform Harvester" + "name": "Isolated Chapel" }, { "count": 1, - "name": "Changeling Wayfinder" + "name": "Jin-Gitaxias, Core Augur" }, { "count": 1, - "name": "Chomping Changeling" + "name": "Kitsa, Otterball Elite" }, { "count": 1, - "name": "Curious Forager" + "name": "Likeness Looter" }, { "count": 1, - "name": "Honored Dreyleader" + "name": "Living Death" }, { "count": 1, - "name": "Peregrin Took" + "name": "Macabre Waltz" }, { "count": 1, - "name": "Supportive Parents" + "name": "Mana Drain" }, { "count": 1, - "name": "Squirrel Mob" + "name": "Marsh Flats" }, { "count": 1, - "name": "Karametra's Acolyte" + "name": "Matzalantli, the Great Door" }, { "count": 1, - "name": "Keeper of Progenitus" + "name": "Merfolk Looter" }, { "count": 1, - "name": "Citanul Hierophants" + "name": "Metamorphosis Fanatic" }, { "count": 1, - "name": "Nullmage Shepherd" + "name": "Mondrak, Glory Dominus" }, { "count": 1, - "name": "Treetop Sentries" + "name": "Monument to Endurance" }, { "count": 1, - "name": "Deep Forest Hermit" + "name": "Morphic Pool" }, { "count": 1, - "name": "Groundchuck & Dirtbag" + "name": "Obsessive Stitcher" }, { "count": 1, - "name": "Might of the Masses" + "name": "Ojer Taq, Deepest Foundation" }, { "count": 1, - "name": "Chatter of the Squirrel" + "name": "Oversold Cemetery" }, { "count": 1, - "name": "Snakeskin Veil" + "name": "Path of Ancestry" }, { "count": 1, - "name": "Rampant Growth" + "name": "Peregrine Drake" + }, + { + "count": 3, + "name": "Plains" }, { "count": 1, - "name": "Origin of Metalbending" + "name": "Polluted Delta" }, { "count": 1, - "name": "Shared Roots" + "name": "Prairie Stream" }, { "count": 1, - "name": "Chatterstorm" + "name": "Psychic Frog" }, { "count": 1, - "name": "Grow from the Ashes" + "name": "Raffine's Tower" }, { "count": 1, - "name": "Cycle of Renewal" + "name": "Reanimate" }, { "count": 1, - "name": "Gaea's Bounty" + "name": "Reliquary Tower" }, { "count": 1, - "name": "Harmonize" + "name": "Renewed Solidarity" }, { "count": 1, - "name": "Vastwood Surge" + "name": "Rhet-Tomb Mystic" }, { "count": 1, - "name": "Migration Path" + "name": "Rhystic Study" }, { "count": 1, - "name": "Zimone's Experiment" + "name": "Rise of the Dark Realms" }, { "count": 1, - "name": "Overwhelming Encounter" + "name": "Rona, Herald of Invasion" }, { "count": 1, - "name": "Rude Awakening" + "name": "Rootborn Defenses" }, { "count": 1, - "name": "Overrun" + "name": "Sea of Clouds" }, { "count": 1, - "name": "Zuko's Exile" + "name": "Shattered Sanctum" }, { "count": 1, - "name": "Vivien's Stampede" + "name": "Sheoldred, Whispering One" }, { "count": 1, - "name": "Collective Unconscious" + "name": "Shipwreck Marsh" }, { "count": 1, - "name": "Klothys's Design" + "name": "Shorikai, Genesis Engine" }, { "count": 1, - "name": "Mask of Avacyn" + "name": "Skirge Familiar" }, { "count": 1, - "name": "Chariot of Victory" + "name": "Sol Ring" }, { "count": 1, - "name": "Chitterspitter" + "name": "Sunken Hollow" + }, + { + "count": 4, + "name": "Swamp" }, { "count": 1, - "name": "Firdoch Core" + "name": "Swords to Plowshares" }, { "count": 1, - "name": "Heaped Harvest" + "name": "Takenuma, Abandoned Mire" }, { "count": 1, - "name": "Unstable Obelisk" + "name": "Temmet, Naktamun's Will" }, { "count": 1, - "name": "Symmetry Matrix" + "name": "The Scarab God" }, { "count": 1, - "name": "Slate of Ancestry" + "name": "The Soul Stone" }, { "count": 1, - "name": "Wolfwillow Haven" + "name": "The Underworld Cookbook" }, { "count": 1, - "name": "Shimmerwilds Growth" + "name": "Thirst for Identity" }, { "count": 1, - "name": "Fertile Ground" + "name": "Three Steps Ahead" }, { "count": 1, - "name": "Overwhelming Instinct" + "name": "Tortured Existence" }, { "count": 1, - "name": "Squirrel Nest" + "name": "Toxrill, the Corrosive" }, { "count": 1, - "name": "Frontier Siege" + "name": "Unholy Grotto" }, { "count": 1, - "name": "Wilderness Reclamation" + "name": "Valgavoth, Terror Eater" }, { "count": 1, - "name": "Dictate of Karametra" + "name": "Vault of Champions" }, { "count": 1, - "name": "A Realm Reborn" + "name": "Victimize" }, { - "count": 35, - "name": "Forest" + "count": 1, + "name": "Vohar, Vodalian Desecrator" }, { "count": 1, - "name": "Oakhollow Village" + "name": "Watery Grave" }, { "count": 1, - "name": "Oran-Rief, the Vastwood" + "name": "Winternight Stories" }, { "count": 1, - "name": "The Unbeatable Squirrel Girl" + "name": "Hashaton, Scarab's Fist" }, { "count": 1, - "name": "Heirloom Epic" + "name": "Cyclonic Rift" } ], "sideboard": [] }, { - "name": "Hashaton, Scarab's Fist", + "name": "Meren of Clan Nel Toth", "author": "MTGGoldfish", "colors": [ - "W", - "B", - "U" + "G", + "B" ], "tags": [ "metagame" @@ -2773,382 +2792,356 @@ "main": [ { "count": 1, - "name": "Animate Dead" - }, - { - "count": 1, - "name": "Anointed Procession" - }, - { - "count": 1, - "name": "Arcane Sanctum" - }, - { - "count": 1, - "name": "Arcane Signet" - }, - { - "count": 1, - "name": "Archfiend of Ifnir" - }, - { - "count": 1, - "name": "Archon of Cruelty" + "name": "Meren of Clan Nel Toth" }, { "count": 1, - "name": "Ashen Rider" + "name": "Protean Hulk" }, { "count": 1, - "name": "Bitter Triumph" + "name": "Gray Merchant of Asphodel" }, { "count": 1, - "name": "Bone Shards" + "name": "Defiling Daemogoth" }, { "count": 1, - "name": "Careful Study" + "name": "Eccentric Pestfinder" }, { "count": 1, - "name": "Chart a Course" + "name": "Blight Mound" }, { "count": 1, - "name": "Command Tower" + "name": "Pest Rescuer" }, { "count": 1, - "name": "Consecrated Sphinx" + "name": "Ribtruss Roaster" }, { "count": 1, - "name": "Cryptbreaker" + "name": "Feral Appetite" }, { "count": 1, - "name": "Dark Ritual" + "name": "Trudge Garden" }, { "count": 1, - "name": "Deadly Rollick" + "name": "Beledros Witherbloom" }, { "count": 1, - "name": "Deserted Beach" + "name": "Grave Researcher" }, { "count": 1, - "name": "Drowned Catacomb" + "name": "Witch of the Moors" }, { "count": 1, - "name": "Elesh Norn, Grand Cenobite" + "name": "Veinwitch Coven" }, { "count": 1, - "name": "Exalted Sunborn" + "name": "Deadly Brew" }, { "count": 1, - "name": "Exotic Orchard" + "name": "Old Stickfingers" }, { "count": 1, - "name": "Faithful Mending" + "name": "Satyr Wayfinder" }, { "count": 1, - "name": "Fierce Guardianship" + "name": "Zulaport Cutthroat" }, { "count": 1, - "name": "Flooded Strand" + "name": "Blood Artist" }, { "count": 1, - "name": "Frantic Search" + "name": "Blossoming Bogbeast" }, { "count": 1, - "name": "Glacial Fortress" + "name": "Spore Frog" }, { "count": 1, - "name": "Godless Shrine" + "name": "Assassin's Trophy" }, { "count": 1, - "name": "Grave Titan" + "name": "Foundation Breaker" }, { "count": 1, - "name": "Gray Merchant of Asphodel" + "name": "Haywire Mite" }, { "count": 1, - "name": "Grimoire of the Dead" + "name": "Infernal Grasp" }, { "count": 1, - "name": "Hallowed Fountain" - }, - { - "count": 4, - "name": "Island" + "name": "Shriekmaw" }, { "count": 1, - "name": "Isolated Chapel" + "name": "Reclamation Sage" }, { "count": 1, - "name": "Jin-Gitaxias, Core Augur" + "name": "Plagued Rusalka" }, { "count": 1, - "name": "Kitsa, Otterball Elite" + "name": "Brood Butcher" }, { "count": 1, - "name": "Likeness Looter" + "name": "Mortality Spear" }, { "count": 1, - "name": "Living Death" + "name": "Ravenous Chupacabra" }, { "count": 1, - "name": "Macabre Waltz" + "name": "Immoral Bargain" }, { "count": 1, - "name": "Mana Drain" + "name": "Final Act" }, { "count": 1, - "name": "Marsh Flats" + "name": "Toxic Deluge" }, { "count": 1, - "name": "Matzalantli, the Great Door" + "name": "Pest Infestation" }, { "count": 1, - "name": "Merfolk Looter" + "name": "Massacre Girl" }, { "count": 1, - "name": "Metamorphosis Fanatic" + "name": "Vampiric Rites" }, { "count": 1, - "name": "Mondrak, Glory Dominus" + "name": "Morbid Opportunist" }, { "count": 1, - "name": "Monument to Endurance" + "name": "Smothering Abomination" }, { "count": 1, - "name": "Morphic Pool" + "name": "Umbral Collar Zealot" }, { "count": 1, - "name": "Obsessive Stitcher" + "name": "Viscera Seer" }, { "count": 1, - "name": "Ojer Taq, Deepest Foundation" + "name": "Woe Strider" }, { "count": 1, - "name": "Oversold Cemetery" + "name": "Grim Haruspex" }, { "count": 1, - "name": "Path of Ancestry" + "name": "Midnight Reaper" }, { "count": 1, - "name": "Peregrine Drake" + "name": "Deathreap Ritual" }, { - "count": 3, - "name": "Plains" + "count": 1, + "name": "Moldervine Reclamation" }, { "count": 1, - "name": "Polluted Delta" + "name": "Unmarked Grave" }, { "count": 1, - "name": "Prairie Stream" + "name": "Buried Alive" }, { "count": 1, - "name": "Psychic Frog" + "name": "Jarad's Orders" }, { "count": 1, - "name": "Raffine's Tower" + "name": "Fauna Shaman" }, { "count": 1, - "name": "Reanimate" + "name": "Vile Entomber" }, { "count": 1, - "name": "Reliquary Tower" + "name": "Birthing Pod" }, { "count": 1, - "name": "Renewed Solidarity" + "name": "Grisly Salvage" }, { "count": 1, - "name": "Rhet-Tomb Mystic" + "name": "Arcane Signet" }, { "count": 1, - "name": "Rhystic Study" + "name": "Sol Ring" }, { "count": 1, - "name": "Rise of the Dark Realms" + "name": "Pawn of Ulamog" }, { "count": 1, - "name": "Rona, Herald of Invasion" + "name": "Sakura-Tribe Elder" }, { "count": 1, - "name": "Rootborn Defenses" + "name": "Springbloom Druid" }, { "count": 1, - "name": "Sea of Clouds" + "name": "Wight of the Reliquary" }, { "count": 1, - "name": "Shattered Sanctum" + "name": "Pitiless Plunderer" }, { "count": 1, - "name": "Sheoldred, Whispering One" + "name": "Skull Prophet" }, { "count": 1, - "name": "Shipwreck Marsh" + "name": "Insidious Roots" }, { "count": 1, - "name": "Shorikai, Genesis Engine" + "name": "Ashnod's Altar" }, { "count": 1, - "name": "Skirge Familiar" + "name": "Bojuka Bog" }, { "count": 1, - "name": "Sol Ring" + "name": "Command Tower" }, { "count": 1, - "name": "Sunken Hollow" + "name": "Exotic Orchard" }, { - "count": 4, - "name": "Swamp" + "count": 1, + "name": "Fabled Passage" }, { "count": 1, - "name": "Swords to Plowshares" + "name": "Festering Thicket" }, { - "count": 1, - "name": "Takenuma, Abandoned Mire" + "count": 8, + "name": "Forest" }, { "count": 1, - "name": "Temmet, Naktamun's Will" + "name": "Grim Backwoods" }, { "count": 1, - "name": "The Scarab God" + "name": "Haunted Mire" }, { "count": 1, - "name": "The Soul Stone" + "name": "High Market" }, { "count": 1, - "name": "The Underworld Cookbook" + "name": "Llanowar Wastes" }, { "count": 1, - "name": "Thirst for Identity" + "name": "Necroblossom Snarl" }, { "count": 1, - "name": "Three Steps Ahead" + "name": "Path of Ancestry" }, { "count": 1, - "name": "Tortured Existence" + "name": "Study Hall" }, { - "count": 1, - "name": "Toxrill, the Corrosive" + "count": 8, + "name": "Swamp" }, { "count": 1, - "name": "Unholy Grotto" + "name": "Temple of Malady" }, { "count": 1, - "name": "Valgavoth, Terror Eater" + "name": "Terramorphic Expanse" }, { "count": 1, - "name": "Vault of Champions" + "name": "Titan's Grave" }, { "count": 1, - "name": "Victimize" + "name": "Turbulent Fen" }, { "count": 1, - "name": "Vohar, Vodalian Desecrator" + "name": "Twilight Mire" }, { "count": 1, - "name": "Watery Grave" + "name": "Vernal Fen" }, { "count": 1, - "name": "Winternight Stories" + "name": "Viridescent Bog" }, { "count": 1, - "name": "Hashaton, Scarab's Fist" + "name": "Witherbloom Campus" }, { "count": 1, - "name": "Cyclonic Rift" + "name": "Woodland Cemetery" } ], "sideboard": [] }, { - "name": "Kaalia of the Vast", + "name": "Magda, Brazen Outlaw", "author": "MTGGoldfish", "colors": [ - "W", - "R", - "B" + "R" ], "tags": [ "metagame" @@ -3156,351 +3149,315 @@ "main": [ { "count": 1, - "name": "Foreboding Ruins" - }, - { - "count": 1, - "name": "Victimize" - }, - { - "count": 1, - "name": "Gurmag Rakshasa" - }, - { - "count": 1, - "name": "Vampiric Dragon" - }, - { - "count": 1, - "name": "Blast-Furnace Hellkite" - }, - { - "count": 1, - "name": "Bladewing, Deathless Tyrant" + "name": "Magda, Brazen Outlaw" }, { "count": 1, - "name": "Angel of Invention" + "name": "Axgard Cavalry" }, { "count": 1, - "name": "Emeria Angel" - }, - { - "count": 1, - "name": "Angel of Finality" + "name": "Universal Automaton" }, { "count": 1, - "name": "Dragonstorm Globe" + "name": "Bloodline Pretender" }, { "count": 1, - "name": "Inevitable Defeat" + "name": "Taurean Mauler" }, { "count": 1, - "name": "Rakdos Charm" + "name": "Torbran, Thane of Red Fell" }, { "count": 1, - "name": "Marshal's Anthem" + "name": "Krark, the Thumbless" }, { "count": 1, - "name": "Rugged Prairie" + "name": "Fearless Liberator" }, { "count": 1, - "name": "Maelstrom of the Spirit Dragon" + "name": "Vault Robber" }, { "count": 1, - "name": "Evolving Wilds" + "name": "Amber Gristle O'Maul" }, { "count": 1, - "name": "Bontu's Monument" + "name": "Dwarven Miner" }, { "count": 1, - "name": "Rakdos Signet" + "name": "Dwarven Blastminer" }, { "count": 1, - "name": "Mind Stone" + "name": "Dwarven Berserker" }, { "count": 1, - "name": "Bedevil" + "name": "Dwarven Trader" }, { "count": 1, - "name": "Heirloom Blade" + "name": "Dwarven Grunt" }, { "count": 1, - "name": "Scoured Barrens" + "name": "Dwarven Nomad" }, { "count": 1, - "name": "Terramorphic Expanse" + "name": "Dwarven Warriors" }, { "count": 1, - "name": "Sunlit Marsh" + "name": "Dwarven Scorcher" }, { "count": 1, - "name": "Concealed Courtyard" + "name": "Bloodfire Dwarf" }, { "count": 1, - "name": "Akoum Refuge" + "name": "Spark Mage" }, { "count": 1, - "name": "Demonic Counsel" + "name": "Plundering Barbarian" }, { "count": 1, - "name": "Desecration Demon" + "name": "Rimrock Knight" }, { "count": 1, - "name": "Arbiter of Woe" + "name": "Insufferable Balladeer" }, { "count": 1, - "name": "Steel Hellkite" + "name": "Storm-Kiln Artist" }, { "count": 1, - "name": "Sephara, Sky's Blade" + "name": "Professional Face-Breaker" }, { "count": 1, - "name": "Restoration Angel" + "name": "Captain Lannery Storm" }, { "count": 1, - "name": "Utvara Hellkite" + "name": "Xorn" }, { "count": 1, - "name": "Capricious Hellraiser" + "name": "Reckless Fireweaver" }, { "count": 1, - "name": "Nesting Dragon" + "name": "Ingenious Artillerist" }, { "count": 1, - "name": "Decadent Dragon" + "name": "Goldspan Dragon" }, { "count": 1, - "name": "Angel of Sanctions" + "name": "Gadrak, the Crown-Scourge" }, { "count": 1, - "name": "Angel of the Ruins" + "name": "Rapacious Dragon" }, { "count": 1, - "name": "Steel Seraph" + "name": "Hellkite Igniter" }, { "count": 1, - "name": "Angel of Serenity" + "name": "Hellkite Tyrant" }, { "count": 1, - "name": "Aegis Angel" + "name": "Steel Hellkite" }, { "count": 1, - "name": "Lightning Greaves" + "name": "Terror of Mount Velus" }, { "count": 1, - "name": "Moment of Reckoning" + "name": "Combustible Gearhulk" }, { "count": 1, - "name": "Kothophed, Soul Hoarder" + "name": "Myr Battlesphere" }, { "count": 1, - "name": "Valgavoth, Terror Eater" + "name": "Meteor Golem" }, { "count": 1, - "name": "Warmonger Hellkite" + "name": "Solemn Simulacrum" }, { "count": 1, - "name": "Fields of Strife" + "name": "Burnished Hart" }, { "count": 1, - "name": "Youthful Valkyrie" + "name": "Sol Ring" }, { "count": 1, - "name": "Orzhov Guildgate" + "name": "Arcane Signet" }, { "count": 1, - "name": "Dragonskull Summit" + "name": "Mind Stone" }, { "count": 1, - "name": "Exotic Orchard" + "name": "Fellwar Stone" }, { "count": 1, - "name": "Thriving Bluff" + "name": "Wayfarer's Bauble" }, { "count": 1, - "name": "Read the Bones" + "name": "Springleaf Drum" }, { "count": 1, - "name": "The Balrog, Durin's Bane" + "name": "Clock of Omens" }, { "count": 1, - "name": "Hezrou" + "name": "Skullclamp" }, { "count": 1, - "name": "Murder" + "name": "Swiftfoot Boots" }, { "count": 1, - "name": "Breaching Dragonstorm" + "name": "Idol of Oblivion" }, { "count": 1, - "name": "There and Back Again" + "name": "Coveted Jewel" }, { "count": 1, - "name": "Sonic Screwdriver" + "name": "Goldvein Pick" }, { "count": 1, - "name": "Orim's Thunder" + "name": "Big Score" }, { "count": 1, - "name": "Take Up the Shield" + "name": "Pirate's Pillage" }, { "count": 1, - "name": "Barrensteppe Siege" + "name": "Brass's Bounty" }, { "count": 1, - "name": "Temple of Malice" + "name": "Seize the Spoils" }, { "count": 1, - "name": "Strionic Resonator" + "name": "Abrade" }, { "count": 1, - "name": "Hazoret's Monument" + "name": "Chaos Warp" }, { "count": 1, - "name": "Fellwar Stone" + "name": "Vandalblast" }, { "count": 1, - "name": "Pyretic Rebirth" + "name": "Blasphemous Act" }, { "count": 1, - "name": "Sundown Pass" + "name": "Fiery Confluence" }, { "count": 1, - "name": "Thriving Moor" + "name": "Jaya's Immolating Inferno" }, { "count": 1, - "name": "Aerial Assault" + "name": "Goblin Bombardment" }, { "count": 1, - "name": "Pestilence Demon" + "name": "Curse of Opulence" }, { "count": 1, - "name": "Valkyrie Harbinger" + "name": "Dwarven Mine" }, { "count": 1, - "name": "Immersturm Predator" + "name": "Holdout Settlement" }, { "count": 1, - "name": "Ghostly Prison" + "name": "Survivors' Encampment" }, { "count": 1, - "name": "Anguished Unmaking" + "name": "Darksteel Citadel" }, { "count": 1, - "name": "Gods Willing" + "name": "Treasure Vault" }, { "count": 1, - "name": "Sol Ring" + "name": "Buried Ruin" }, { "count": 1, - "name": "Thriving Heath" + "name": "Rogue's Passage" }, { "count": 1, - "name": "Command Tower" + "name": "Path of Ancestry" }, { "count": 1, - "name": "Shattered Sanctum" + "name": "Castle Embereth" }, { "count": 1, - "name": "Wind-Scarred Crag" + "name": "Ramunap Ruins" }, { "count": 1, - "name": "Neriv, Heart of the Storm" + "name": "Ghitu Encampment" }, { "count": 1, - "name": "Terror of Mount Velus" - }, - { - "count": 6, - "name": "Plains" + "name": "Forgotten Cave" }, { - "count": 4, + "count": 23, "name": "Mountain" - }, - { - "count": 6, - "name": "Swamp" - }, - { - "count": 1, - "name": "Kaalia of the Vast" } ], "sideboard": [] diff --git a/client/public/feeds/mtggoldfish-modern.json b/client/public/feeds/mtggoldfish-modern.json index 729c5a9aa7..72fa497765 100644 --- a/client/public/feeds/mtggoldfish-modern.json +++ b/client/public/feeds/mtggoldfish-modern.json @@ -5,7 +5,7 @@ "icon": "G", "format": "modern", "version": 1, - "updated": "2026-08-09T00:00:00Z", + "updated": "2026-08-10T00:00:00Z", "source": "https://www.mtggoldfish.com/metagame/modern", "decks": [ { diff --git a/client/public/feeds/mtggoldfish-pioneer.json b/client/public/feeds/mtggoldfish-pioneer.json index 15b8cd2591..a517a88db4 100644 --- a/client/public/feeds/mtggoldfish-pioneer.json +++ b/client/public/feeds/mtggoldfish-pioneer.json @@ -5,7 +5,7 @@ "icon": "G", "format": "pioneer", "version": 1, - "updated": "2026-08-09T00:00:00Z", + "updated": "2026-08-10T00:00:00Z", "source": "https://www.mtggoldfish.com/metagame/pioneer", "decks": [ { @@ -441,113 +441,97 @@ "main": [ { "count": 4, - "name": "Mountain" + "name": "Burst Lightning" }, { "count": 1, - "name": "Mountain" + "name": "Den of the Bugbear" }, { - "count": 1, - "name": "Mountain" + "count": 4, + "name": "Emberheart Challenger" }, { - "count": 1, - "name": "Mountain" + "count": 4, + "name": "Kumano Faces Kakkazan" }, { - "count": 4, - "name": "Soul-Scar Mage" + "count": 2, + "name": "Eidolon of the Great Revel" }, { - "count": 3, - "name": "Ramunap Ruins" + "count": 4, + "name": "Monastery Swiftspear" }, { "count": 3, - "name": "Reckless Rage" + "name": "Monstrous Rage" }, { - "count": 4, - "name": "Bonecrusher Giant" + "count": 15, + "name": "Mountain" }, { "count": 2, - "name": "Den of the Bugbear" - }, - { - "count": 4, - "name": "Kumano Faces Kakkazan" + "name": "Ramunap Ruins" }, { - "count": 1, - "name": "Sokenzan, Crucible of Defiance" + "count": 3, + "name": "Reckless Rage" }, { "count": 2, - "name": "Monstrous Rage" - }, - { - "count": 4, - "name": "Emberheart Challenger" + "name": "Screaming Nemesis" }, { "count": 1, - "name": "Rockface Village" + "name": "Sokenzan, Crucible of Defiance" }, { - "count": 1, - "name": "Mountain" + "count": 3, + "name": "Soul-Scar Mage" }, { - "count": 4, - "name": "Screaming Nemesis" + "count": 3, + "name": "Sunspine Lynx" }, { - "count": 4, - "name": "Mountain" + "count": 2, + "name": "Screaming Nemesis" }, { "count": 4, "name": "Mutavault" }, { - "count": 4, - "name": "Burst Lightning" - }, - { - "count": 4, - "name": "Monastery Swiftspear" + "count": 1, + "name": "Sunspine Lynx" }, { - "count": 4, - "name": "Sunspine Lynx" + "count": 2, + "name": "Flowstone Infusion" } ], "sideboard": [ { - "count": 2, - "name": "Pyroclasm" - }, - { - "count": 2, - "name": "Redcap Melee" + "count": 3, + "name": "Scorching Shot" }, { - "count": 2, - "name": "Weathered Runestone" + "count": 4, + "name": "Magebane Lizard" }, { "count": 3, - "name": "Flowstone Infusion" + "name": "Pyroclasm" }, { - "count": 4, - "name": "Magebane Lizard" + "count": 2, + "name": "Rending Volley" }, { - "count": 2, - "name": "Scorching Shot" + "count": 3, + "name": "Weathered Runestone" } ] }, @@ -702,28 +686,32 @@ ], "main": [ { - "count": 4, + "count": 5, "name": "Island" }, { - "count": 2, - "name": "Abandon Attachments" + "count": 4, + "name": "Gran-Gran" }, { - "count": 3, - "name": "Firebending Lesson" + "count": 1, + "name": "Otawara, Soaring City" }, { - "count": 3, - "name": "Combustion Technique" + "count": 4, + "name": "Stormchaser's Talent" }, { "count": 2, - "name": "It'll Quench Ya!" + "name": "Ral, Crackling Wit" }, { - "count": 4, - "name": "Gran-Gran" + "count": 1, + "name": "Torch the Tower" + }, + { + "count": 2, + "name": "Accumulate Wisdom" }, { "count": 3, @@ -731,43 +719,47 @@ }, { "count": 2, - "name": "Accumulate Wisdom" + "name": "Vivi Ornitier" }, { - "count": 2, - "name": "Vivi Ornitier" + "count": 4, + "name": "Riverglide Pathway" }, { - "count": 2, - "name": "Riverpyre Verge" + "count": 4, + "name": "Consider" }, { - "count": 1, - "name": "Spell Pierce" + "count": 3, + "name": "Combustion Technique" }, { - "count": 1, - "name": "Torch the Tower" + "count": 3, + "name": "Firebending Lesson" }, { "count": 1, - "name": "Otawara, Soaring City" + "name": "Spell Pierce" }, { - "count": 4, - "name": "Consider" + "count": 2, + "name": "Shivan Reef" }, { "count": 2, - "name": "Igneous Inspiration" + "name": "Abandon Attachments" }, { - "count": 4, - "name": "Divide by Zero" + "count": 1, + "name": "Riverpyre Verge" }, { - "count": 4, - "name": "Riverglide Pathway" + "count": 2, + "name": "It'll Quench Ya!" + }, + { + "count": 2, + "name": "Igneous Inspiration" }, { "count": 4, @@ -777,17 +769,9 @@ "count": 4, "name": "Spirebluff Canal" }, - { - "count": 2, - "name": "Ral, Crackling Wit" - }, - { - "count": 2, - "name": "Shivan Reef" - }, { "count": 4, - "name": "Stormchaser's Talent" + "name": "Divide by Zero" } ], "sideboard": [ @@ -796,12 +780,12 @@ "name": "Flashfreeze" }, { - "count": 1, - "name": "Iroh's Demonstration" + "count": 2, + "name": "Abrade" }, { - "count": 1, - "name": "Firebending Lesson" + "count": 2, + "name": "Accumulate Wisdom" }, { "count": 1, @@ -812,16 +796,16 @@ "name": "Boomerang Basics" }, { - "count": 2, - "name": "Accumulate Wisdom" + "count": 1, + "name": "Iroh's Demonstration" }, { - "count": 2, - "name": "Abrade" + "count": 1, + "name": "Firebending Lesson" }, { "count": 2, - "name": "Soul-Guide Lantern" + "name": "Quantum Riddler" }, { "count": 1, @@ -829,7 +813,7 @@ }, { "count": 2, - "name": "Quantum Riddler" + "name": "Soul-Guide Lantern" }, { "count": 1, diff --git a/client/public/feeds/mtggoldfish-standard.json b/client/public/feeds/mtggoldfish-standard.json index 416e94868f..bfff835fca 100644 --- a/client/public/feeds/mtggoldfish-standard.json +++ b/client/public/feeds/mtggoldfish-standard.json @@ -5,7 +5,7 @@ "icon": "G", "format": "standard", "version": 1, - "updated": "2026-08-09T00:00:00Z", + "updated": "2026-08-10T00:00:00Z", "source": "https://www.mtggoldfish.com/metagame/standard", "decks": [ { @@ -147,6 +147,138 @@ } ] }, + { + "name": "Jeskai Lessons", + "author": "MTGGoldfish", + "colors": [ + "W", + "U", + "R" + ], + "tags": [ + "metagame" + ], + "main": [ + { + "count": 1, + "name": "Mistrise Village" + }, + { + "count": 4, + "name": "Gran-Gran" + }, + { + "count": 1, + "name": "Three Steps Ahead" + }, + { + "count": 1, + "name": "Flashback" + }, + { + "count": 4, + "name": "Great Hall of the Biblioplex" + }, + { + "count": 3, + "name": "Hallowed Fountain" + }, + { + "count": 4, + "name": "Jeskai Revelation" + }, + { + "count": 2, + "name": "Sundown Pass" + }, + { + "count": 4, + "name": "Combustion Technique" + }, + { + "count": 3, + "name": "Island" + }, + { + "count": 2, + "name": "Iroh's Demonstration" + }, + { + "count": 4, + "name": "Firebending Lesson" + }, + { + "count": 4, + "name": "Accumulate Wisdom" + }, + { + "count": 3, + "name": "Stock Up" + }, + { + "count": 4, + "name": "Abandon Attachments" + }, + { + "count": 2, + "name": "It'll Quench Ya!" + }, + { + "count": 3, + "name": "Riverpyre Verge" + }, + { + "count": 4, + "name": "Steam Vents" + }, + { + "count": 4, + "name": "Tablet of Discovery" + }, + { + "count": 3, + "name": "Spirebluff Canal" + } + ], + "sideboard": [ + { + "count": 1, + "name": "Disdainful Stroke" + }, + { + "count": 1, + "name": "Flashfreeze" + }, + { + "count": 4, + "name": "Price of Freedom" + }, + { + "count": 1, + "name": "Avengers Disassembled" + }, + { + "count": 1, + "name": "Ghost Vacuum" + }, + { + "count": 2, + "name": "Day of Judgment" + }, + { + "count": 2, + "name": "Spell Pierce" + }, + { + "count": 2, + "name": "Emeritus of Ideation" + }, + { + "count": 1, + "name": "Ral, Crackling Wit" + } + ] + }, { "name": "Selesnya Ouroboroid", "author": "MTGGoldfish", @@ -334,138 +466,6 @@ } ] }, - { - "name": "Jeskai Lessons", - "author": "MTGGoldfish", - "colors": [ - "W", - "U", - "R" - ], - "tags": [ - "metagame" - ], - "main": [ - { - "count": 1, - "name": "Mistrise Village" - }, - { - "count": 4, - "name": "Gran-Gran" - }, - { - "count": 1, - "name": "Three Steps Ahead" - }, - { - "count": 1, - "name": "Flashback" - }, - { - "count": 4, - "name": "Great Hall of the Biblioplex" - }, - { - "count": 3, - "name": "Hallowed Fountain" - }, - { - "count": 4, - "name": "Jeskai Revelation" - }, - { - "count": 2, - "name": "Sundown Pass" - }, - { - "count": 4, - "name": "Combustion Technique" - }, - { - "count": 3, - "name": "Island" - }, - { - "count": 2, - "name": "Iroh's Demonstration" - }, - { - "count": 4, - "name": "Firebending Lesson" - }, - { - "count": 4, - "name": "Accumulate Wisdom" - }, - { - "count": 3, - "name": "Stock Up" - }, - { - "count": 4, - "name": "Abandon Attachments" - }, - { - "count": 2, - "name": "It'll Quench Ya!" - }, - { - "count": 3, - "name": "Riverpyre Verge" - }, - { - "count": 4, - "name": "Steam Vents" - }, - { - "count": 4, - "name": "Tablet of Discovery" - }, - { - "count": 3, - "name": "Spirebluff Canal" - } - ], - "sideboard": [ - { - "count": 1, - "name": "Disdainful Stroke" - }, - { - "count": 1, - "name": "Flashfreeze" - }, - { - "count": 4, - "name": "Price of Freedom" - }, - { - "count": 1, - "name": "Avengers Disassembled" - }, - { - "count": 1, - "name": "Ghost Vacuum" - }, - { - "count": 2, - "name": "Day of Judgment" - }, - { - "count": 2, - "name": "Spell Pierce" - }, - { - "count": 2, - "name": "Emeritus of Ideation" - }, - { - "count": 1, - "name": "Ral, Crackling Wit" - } - ] - }, { "name": "Izzet Spellementals", "author": "MTGGoldfish", @@ -593,18 +593,18 @@ "name": "4c Control", "author": "MTGGoldfish", "colors": [ - "W", - "B", "U", - "R" + "R", + "W", + "B" ], "tags": [ "metagame" ], "main": [ { - "count": 1, - "name": "North Wind Avatar" + "count": 2, + "name": "Together as One" }, { "count": 4, @@ -612,18 +612,14 @@ }, { "count": 1, - "name": "Sundown Pass" + "name": "Spell Snare" }, { - "count": 1, - "name": "Sunbillow Verge" + "count": 2, + "name": "Shattered Sanctum" }, { "count": 3, - "name": "Consult the Star Charts" - }, - { - "count": 2, "name": "Firebending Lesson" }, { @@ -632,113 +628,101 @@ }, { "count": 1, - "name": "Stormcarved Coast" - }, - { - "count": 1, - "name": "Plains" - }, - { - "count": 1, - "name": "Godless Shrine" + "name": "Island" }, { "count": 1, - "name": "Cori Mountain Monastery" + "name": "Pest Control" }, { "count": 2, - "name": "Shattered Sanctum" - }, - { - "count": 1, - "name": "Mistrise Village" + "name": "Sacred Foundry" }, { "count": 4, "name": "Great Hall of the Biblioplex" }, { - "count": 2, - "name": "Hallowed Fountain" - }, - { - "count": 2, - "name": "Gloomlake Verge" + "count": 3, + "name": "Riverpyre Verge" }, { "count": 3, - "name": "Sacred Foundry" + "name": "Bleachbone Verge" }, { "count": 4, - "name": "Steam Vents" + "name": "Stock Up" }, { "count": 2, - "name": "Day of Judgment" + "name": "Deadly Cover-Up" }, { - "count": 4, - "name": "Stock Up" + "count": 2, + "name": "Undercity Sewers" }, { "count": 1, - "name": "Negate" + "name": "Duress" }, { "count": 2, - "name": "Sear" + "name": "Nowhere to Run" }, { - "count": 1, - "name": "Meticulous Archive" + "count": 2, + "name": "Sear" }, { - "count": 1, - "name": "Multiversal Passage" + "count": 4, + "name": "Blood Crypt" }, { "count": 2, - "name": "No More Lies" + "name": "Starting Town" + }, + { + "count": 1, + "name": "Swamp" }, { "count": 2, - "name": "Lightning Helix" + "name": "Shoot the Sheriff" }, { "count": 4, "name": "Jeskai Revelation" }, { - "count": 4, + "count": 2, "name": "Inevitable Defeat" }, { "count": 1, - "name": "Island" + "name": "Plains" + }, + { + "count": 1, + "name": "Steam Vents" + }, + { + "count": 2, + "name": "Consult the Star Charts" } ], "sideboard": [ - { - "count": 2, - "name": "Emeritus of Ideation" - }, { "count": 1, - "name": "Disdainful Stroke" + "name": "Return the Favor" }, { "count": 1, - "name": "Day of Judgment" + "name": "Disdainful Stroke" }, { "count": 2, - "name": "Strategic Betrayal" - }, - { - "count": 1, - "name": "Outrageous Robbery" + "name": "Sage of the Skies" }, { "count": 1, @@ -746,27 +730,27 @@ }, { "count": 1, - "name": "Pyroclasm" + "name": "Outrageous Robbery" }, { "count": 1, - "name": "Riverchurn Monument" + "name": "Day of Black Sun" }, { - "count": 1, - "name": "Spell Snare" + "count": 2, + "name": "Flashfreeze" }, { "count": 2, - "name": "Flashfreeze" + "name": "Thor, God of Thunder" }, { "count": 1, - "name": "Pest Control" + "name": "Riverchurn Monument" }, { - "count": 1, - "name": "Ancient Vendetta" + "count": 3, + "name": "Duress" } ] }, From ee76bc54aee4941f20c126b49c5d6b54a36d86c5 Mon Sep 17 00:00:00 2001 From: phase-rs release bot Date: Mon, 10 Aug 2026 10:38:52 +0000 Subject: [PATCH 08/15] release: v0.50.0 --- Cargo.lock | 26 +++++++++++++------------- Cargo.toml | 2 +- client/package.json | 2 +- client/src-tauri/Cargo.lock | 2 +- client/src-tauri/Cargo.toml | 2 +- client/src-tauri/tauri.conf.json | 2 +- lobby-worker/broker-wasm/Cargo.lock | 4 ++-- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 290fcde2e0..5ace0b9d44 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -728,7 +728,7 @@ checksum = "780955b8b195a21ab8e4ac6b60dd1dbdcec1dc6c51c0617964b08c81785e12c9" [[package]] name = "draft-core" -version = "0.49.1" +version = "0.50.0" dependencies = [ "phase-engine", "rand 0.9.4", @@ -740,7 +740,7 @@ dependencies = [ [[package]] name = "draft-wasm" -version = "0.49.1" +version = "0.50.0" dependencies = [ "console_error_panic_hook", "draft-core", @@ -812,7 +812,7 @@ dependencies = [ [[package]] name = "engine-inventory-gen" -version = "0.49.1" +version = "0.50.0" dependencies = [ "anyhow", "proc-macro2", @@ -825,7 +825,7 @@ dependencies = [ [[package]] name = "engine-wasm" -version = "0.49.1" +version = "0.50.0" dependencies = [ "console_error_panic_hook", "getrandom 0.3.4", @@ -877,7 +877,7 @@ checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "feed-scraper" -version = "0.49.1" +version = "0.50.0" dependencies = [ "clap", "reqwest", @@ -1683,7 +1683,7 @@ checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "lobby-broker" -version = "0.49.1" +version = "0.50.0" dependencies = [ "phase-engine", "serde", @@ -1720,7 +1720,7 @@ checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" [[package]] name = "manabrew-compat" -version = "0.49.1" +version = "0.50.0" dependencies = [ "manabrew-protocol", "phase-engine", @@ -1837,7 +1837,7 @@ dependencies = [ [[package]] name = "mtgish-import" -version = "0.49.1" +version = "0.50.0" dependencies = [ "anyhow", "phase-engine", @@ -2065,7 +2065,7 @@ dependencies = [ [[package]] name = "phase-ai" -version = "0.49.1" +version = "0.50.0" dependencies = [ "flate2", "mimalloc", @@ -2083,7 +2083,7 @@ dependencies = [ [[package]] name = "phase-engine" -version = "0.49.1" +version = "0.50.0" dependencies = [ "assert_matches", "flate2", @@ -2115,7 +2115,7 @@ dependencies = [ [[package]] name = "phase-server" -version = "0.49.1" +version = "0.50.0" dependencies = [ "axum", "clap", @@ -2835,7 +2835,7 @@ dependencies = [ [[package]] name = "seat-reducer" -version = "0.49.1" +version = "0.50.0" dependencies = [ "phase-ai", "phase-engine", @@ -3024,7 +3024,7 @@ dependencies = [ [[package]] name = "server-core" -version = "0.49.1" +version = "0.50.0" dependencies = [ "draft-core", "lobby-broker", diff --git a/Cargo.toml b/Cargo.toml index 3efb7a8112..5be92803be 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,7 +9,7 @@ members = ["crates/*"] exclude = ["client/src-tauri", "lobby-worker/broker-wasm"] [workspace.package] -version = "0.49.1" +version = "0.50.0" license = "MIT OR Apache-2.0" [workspace.dependencies] diff --git a/client/package.json b/client/package.json index 13fbb6e3a5..0fcef530eb 100644 --- a/client/package.json +++ b/client/package.json @@ -1,7 +1,7 @@ { "name": "phase-rs-client", "private": true, - "version": "0.49.1", + "version": "0.50.0", "type": "module", "scripts": { "dev": "vite", diff --git a/client/src-tauri/Cargo.lock b/client/src-tauri/Cargo.lock index 8df07c132e..537799a5e7 100644 --- a/client/src-tauri/Cargo.lock +++ b/client/src-tauri/Cargo.lock @@ -2616,7 +2616,7 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "phase-tauri" -version = "0.49.1" +version = "0.50.0" dependencies = [ "futures-util", "minisign-verify", diff --git a/client/src-tauri/Cargo.toml b/client/src-tauri/Cargo.toml index b9f6832e3b..668879b9dd 100644 --- a/client/src-tauri/Cargo.toml +++ b/client/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "phase-tauri" -version = "0.49.1" +version = "0.50.0" edition = "2021" license = "MIT OR Apache-2.0" diff --git a/client/src-tauri/tauri.conf.json b/client/src-tauri/tauri.conf.json index 0aa671161a..a80c1dd43f 100644 --- a/client/src-tauri/tauri.conf.json +++ b/client/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://raw.githubusercontent.com/tauri-apps/tauri/dev/crates/tauri-cli/config.schema.json", "productName": "Phase", - "version": "0.49.1", + "version": "0.50.0", "identifier": "rs.phase.app", "build": { "frontendDist": "../bootstrap/dist", diff --git a/lobby-worker/broker-wasm/Cargo.lock b/lobby-worker/broker-wasm/Cargo.lock index ced20ecd8f..189a72fae2 100644 --- a/lobby-worker/broker-wasm/Cargo.lock +++ b/lobby-worker/broker-wasm/Cargo.lock @@ -186,7 +186,7 @@ checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "lobby-broker" -version = "0.49.0" +version = "0.50.0" dependencies = [ "phase-engine", "serde", @@ -239,7 +239,7 @@ dependencies = [ [[package]] name = "phase-engine" -version = "0.49.0" +version = "0.50.0" dependencies = [ "im", "indexmap", From 9dc397041bcbe3d346ced6f325749b9517853048 Mon Sep 17 00:00:00 2001 From: "@Lcola98" <75585494+keloide@users.noreply.github.com> Date: Mon, 10 Aug 2026 16:04:34 +0200 Subject: [PATCH 09/15] Add Exuberant Wolfbear (#7204) * fix(parser): support Exuberant Wolfbear * test(PR-7204): select trigger target before may choice --------- Co-authored-by: matthewevans --- .../src/parser/oracle_effect/subject.rs | 54 +++- crates/engine/src/parser/oracle_tests.rs | 119 +++++++++ .../exuberant_wolfbear_base_pt_target.rs | 233 ++++++++++++++++++ crates/engine/tests/integration/main.rs | 1 + 4 files changed, 401 insertions(+), 6 deletions(-) create mode 100644 crates/engine/tests/integration/exuberant_wolfbear_base_pt_target.rs diff --git a/crates/engine/src/parser/oracle_effect/subject.rs b/crates/engine/src/parser/oracle_effect/subject.rs index b6f37e533a..eedbe53139 100644 --- a/crates/engine/src/parser/oracle_effect/subject.rs +++ b/crates/engine/src/parser/oracle_effect/subject.rs @@ -40,7 +40,9 @@ use super::super::oracle_static::{ parse_continuous_modifications, parse_continuous_subject_filter, parse_static_line, parse_static_line_multi, peel_compound_all_quantified_conjuncts, }; -use super::super::oracle_target::{parse_target, parse_target_with_ctx, parse_type_phrase}; +use super::super::oracle_target::{ + parse_target, parse_target_with_ctx, parse_target_with_syntax, parse_type_phrase, TargetSyntax, +}; use super::super::oracle_util::{ merge_or_filters, parse_number, TextPair, SELF_REF_PARSE_ONLY_PHRASES, SELF_REF_TYPE_PHRASES, }; @@ -1195,8 +1197,48 @@ fn try_parse_subject_base_pt_set_clause_ast( .parse(parse_lower) .ok() }; - let (subject, axes, remainder) = - if let Some((rest_lower, (axes, _, subject_lower, _, _, _))) = inverted { + let targeted_inverted = if is_change { + // Transitive inverted genitive: "change the base power [and toughness] + // of target to " (Exuberant Wolfbear). The subject is + // a target phrase rather than a possessive, so retain its syntax: only + // the explicit `target` keyword creates a target slot on the effect. + // Parse the grammatical prefix before delegating the subject phrase to + // the shared target parser; then consume the transitive copula from + // that parser's exact remainder so a `to` inside the subject cannot be + // mistaken for the value boundary. + preceded( + tag::<_, _, VE>("the "), + terminated(parse_base_pt_axes, tag(" of ")), + ) + .parse(parse_lower) + .ok() + .and_then(|(after_of_lower, axes)| { + let target_text = &parse_body[parse_body.len() - after_of_lower.len()..]; + let (filter, target_remainder, syntax) = parse_target_with_syntax(target_text, ctx); + if !matches!(syntax, TargetSyntax::TargetKeyword) { + // Durationless inverted-transitive descriptor effects (such as + // Brine Hag) need duration provenance the existing + // `GenericEffect` representation cannot yet express. Keep + // them unsupported rather than lowering them incorrectly as + // until-end-of-turn effects; this targeted arm is for cards + // such as Exuberant Wolfbear with an explicit duration. + return None; + } + let target_remainder_lower = target_remainder.to_lowercase(); + let (after_to_lower, _) = tag::<_, _, VE>(" to ") + .parse(target_remainder_lower.as_str()) + .ok()?; + let remainder = &target_remainder[target_remainder.len() - after_to_lower.len()..]; + let application = subject_filter_application(filter, true)?; + Some((axes, remainder, application)) + }) + } else { + None + }; + let (subject, axes, remainder, target_application) = + if let Some((axes, remainder, application)) = targeted_inverted { + ("", axes, remainder, Some(application)) + } else if let Some((rest_lower, (axes, _, subject_lower, _, _, _))) = inverted { // `subject_lower` is a sub-slice of `parse_lower`; its byte offset is // the pointer delta. Recover original case at the same span. let subject_start = subject_lower.as_ptr() as usize - parse_lower.as_ptr() as usize; @@ -1204,7 +1246,7 @@ fn try_parse_subject_base_pt_set_clause_ast( .get(subject_start..subject_start + subject_lower.len())? .trim(); let remainder = &parse_body[parse_body.len() - rest_lower.len()..]; - (subject, axes, remainder) + (subject, axes, remainder, None) } else { // Possessive: "'s base power [and toughness]" followed by the // copula (" to " for the transitive "change" frame, else "become[s] "). @@ -1230,7 +1272,7 @@ fn try_parse_subject_base_pt_set_clause_ast( let (rest_lower, ()) = parse_base_pt_copula(rest_lower, is_change).ok()?; let subject = parse_body[..subject_lower.len()].trim(); let remainder = &parse_body[parse_body.len() - rest_lower.len()..]; - (subject, axes, remainder) + (subject, axes, remainder, None) }; // Parse the value side. The transitive "change … to" frame carries a bare @@ -1249,7 +1291,7 @@ fn try_parse_subject_base_pt_set_clause_ast( // Parse the optional trailing keyword-grant conjunct ("and they gain trample"). let keywords = parse_base_pt_set_trailing_keywords(after_pt); - let application = parse_subject_application(subject, ctx)?; + let application = target_application.or_else(|| parse_subject_application(subject, ctx))?; let affected = static_affected_for_application(&application); // CR 208.1 + CR 613.4b: emit per-axis layer-7b set modifications. Fixed diff --git a/crates/engine/src/parser/oracle_tests.rs b/crates/engine/src/parser/oracle_tests.rs index f0020adc7f..8e01aefb99 100644 --- a/crates/engine/src/parser/oracle_tests.rs +++ b/crates/engine/src/parser/oracle_tests.rs @@ -2839,6 +2839,125 @@ fn sita_varma_full_card_supported_inverted_genitive_base_pt() { ); } +/// CR 603.2 + CR 115.1 + CR 208.1 + CR 613.4b: Exuberant Wolfbear's attack +/// trigger uses the transitive inverted-genitive base-P/T form, "change the +/// base power and toughness of target Human you control to this creature's +/// power and toughness." The target must remain a real target slot (rather +/// than a resolution-time descriptor), and each axis reads the attacking source. +#[test] +fn exuberant_wolfbear_full_oracle_attack_trigger_targets_human_and_sets_dynamic_base_pt() { + const ORACLE: &str = "Whenever this creature attacks, you may change the base power and toughness of target Human you control to this creature's power and toughness until end of turn."; + + let parsed = parse( + ORACLE, + "Exuberant Wolfbear", + &[], + &["Creature"], + &["Wolf", "Bear"], + ); + assert_eq!( + parsed.triggers.len(), + 1, + "expected one attack trigger: {parsed:#?}" + ); + assert!( + parsed + .abilities + .iter() + .all(|ability| !matches!(ability.effect.as_ref(), Effect::Unimplemented { .. })), + "Wolfbear must not produce standalone Unimplemented abilities: {parsed:#?}" + ); + + let trigger = &parsed.triggers[0]; + assert_eq!(trigger.mode, TriggerMode::Attacks); + assert!(trigger.optional, "'you may' must keep the trigger optional"); + let execute = trigger + .execute + .as_deref() + .expect("attack trigger must have an execute body"); + + fn assert_no_unimplemented(definition: &AbilityDefinition) { + assert!( + !matches!(definition.effect.as_ref(), Effect::Unimplemented { .. }), + "unexpected unimplemented effect: {definition:#?}" + ); + if let Some(sub_ability) = definition.sub_ability.as_deref() { + assert_no_unimplemented(sub_ability); + } + } + assert_no_unimplemented(execute); + + let Effect::GenericEffect { + static_abilities, + duration, + target, + .. + } = execute.effect.as_ref() + else { + panic!("expected base-P/T GenericEffect, got {:#?}", execute.effect); + }; + assert_eq!(*duration, Some(Duration::UntilEndOfTurn)); + assert_eq!( + target, + &Some(TargetFilter::Typed( + TypedFilter::new(TypeFilter::Subtype("Human".to_string())) + .controller(ControllerRef::You) + )), + "the explicit target keyword must produce a Human-you-control target slot" + ); + + let modifications = &static_abilities[0].modifications; + for (label, modification) in [ + ( + "power", + ContinuousModification::SetPowerDynamic { + value: QuantityExpr::Ref { + qty: QuantityRef::Power { + scope: ObjectScope::Source, + }, + }, + }, + ), + ( + "toughness", + ContinuousModification::SetToughnessDynamic { + value: QuantityExpr::Ref { + qty: QuantityRef::Toughness { + scope: ObjectScope::Source, + }, + }, + }, + ), + ] { + assert!( + modifications.contains(&modification), + "Wolfbear must set dynamic base {label} from the source: {modifications:#?}" + ); + } +} + +/// Regression: Brine Hag's durationless, descriptor-scoped inverted transitive +/// base-P/T effect must remain an explicit parser gap. Only the `target` +/// syntactic form can use the new target-slot lowering path. +#[test] +fn brine_hag_durationless_descriptor_base_pt_effect_remains_unimplemented() { + const ORACLE: &str = "When this creature dies, change the base power and toughness of all creatures that dealt damage to it this turn to 0/2. (This effect lasts indefinitely.)"; + + let parsed = parse(ORACLE, "Brine Hag", &[], &["Creature"], &[]); + assert_eq!( + parsed.triggers.len(), + 1, + "expected Brine Hag's dies trigger: {parsed:#?}" + ); + assert!( + has_unimplemented_mentioning( + &parsed, + "change the base power and toughness of all creatures that dealt damage to it this turn to 0/2", + ), + "the durationless descriptor form must not lower through the target-only path: {parsed:#?}" + ); +} + /// CR 601.2a + CR 609.4b + CR 601.3b: Azula, Cunning Usurper — the /// cast-from-exile static line must lower to a supported /// `StaticMode::ExileCastPermission` carrying the persistent Cast permission, diff --git a/crates/engine/tests/integration/exuberant_wolfbear_base_pt_target.rs b/crates/engine/tests/integration/exuberant_wolfbear_base_pt_target.rs new file mode 100644 index 0000000000..e919071fac --- /dev/null +++ b/crates/engine/tests/integration/exuberant_wolfbear_base_pt_target.rs @@ -0,0 +1,233 @@ +//! Exuberant Wolfbear's attack trigger targets a Human its controller controls +//! and sets that Human's base power and toughness to the attacker's current P/T +//! until end of turn. + +use engine::game::scenario::{GameRunner, GameScenario, P0, P1}; +use engine::types::actions::GameAction; +use engine::types::game_state::WaitingFor; +use engine::types::identifiers::ObjectId; +use engine::types::phase::Phase; + +use super::rules::AttackTarget; + +const WOLFBEAR_ORACLE: &str = "Whenever this creature attacks, you may change the base power and toughness of target Human you control to this creature's power and toughness until end of turn."; + +fn power_toughness(runner: &GameRunner, object_id: ObjectId) -> (Option, Option) { + let object = runner + .state() + .objects + .get(&object_id) + .expect("test permanent must remain on the battlefield"); + (object.power, object.toughness) +} + +fn setup() -> (GameRunner, ObjectId, ObjectId, ObjectId, ObjectId) { + let mut scenario = GameScenario::new(); + scenario.at_phase(Phase::PreCombatMain); + let wolfbear = scenario + .add_creature_from_oracle(P0, "Exuberant Wolfbear", 7, 5, WOLFBEAR_ORACLE) + .id(); + let chosen_human = scenario + .add_creature(P0, "Chosen Human", 1, 1) + .with_subtypes(vec!["Human"]) + .id(); + let other_human = scenario + .add_creature(P0, "Other Human", 1, 1) + .with_subtypes(vec!["Human"]) + .id(); + let opponent_human = scenario + .add_creature(P1, "Opponent Human", 1, 1) + .with_subtypes(vec!["Human"]) + .id(); + + ( + scenario.build(), + wolfbear, + chosen_human, + other_human, + opponent_human, + ) +} + +fn attack_until_target_selection(runner: &mut GameRunner, wolfbear: ObjectId) { + runner.pass_both_players(); + runner + .act(GameAction::DeclareAttackers { + attacks: vec![(wolfbear, AttackTarget::Player(P1))], + bands: vec![], + }) + .expect("Wolfbear attack declaration must succeed"); + + for _ in 0..16 { + match runner.state().waiting_for.clone() { + WaitingFor::TriggerTargetSelection { source_id, .. } => { + assert_eq!( + source_id, + Some(wolfbear), + "Wolfbear must own the target prompt" + ); + return; + } + WaitingFor::OrderTriggers { .. } => { + engine::game::triggers::drain_order_triggers_with_identity(runner.state_mut()); + } + WaitingFor::Priority { .. } => runner.pass_both_players(), + other => { + panic!("expected Wolfbear's target selection, got waiting state {other:?}") + } + } + } + panic!("Wolfbear attack trigger did not reach target selection"); +} + +fn target_selected_until_optional_choice(runner: &mut GameRunner, wolfbear: ObjectId) { + for _ in 0..16 { + match runner.state().waiting_for.clone() { + WaitingFor::OptionalEffectChoice { source_id, .. } => { + assert_eq!(source_id, wolfbear, "Wolfbear must own the may prompt"); + return; + } + WaitingFor::OrderTriggers { .. } => { + engine::game::triggers::drain_order_triggers_with_identity(runner.state_mut()); + } + WaitingFor::Priority { .. } => runner.pass_both_players(), + other => panic!("expected Wolfbear's optional choice, got waiting state {other:?}"), + } + } + panic!("Wolfbear attack trigger did not reach its optional choice"); +} + +fn finish_current_turn(runner: &mut GameRunner, turn_number: u32) { + for _ in 0..32 { + if runner.state().turn_number > turn_number { + return; + } + match runner.state().waiting_for.clone() { + WaitingFor::Priority { .. } => runner.pass_both_players(), + WaitingFor::DeclareBlockers { .. } => { + runner + .act(GameAction::DeclareBlockers { + assignments: vec![], + }) + .expect("defender may declare no blockers"); + } + WaitingFor::OrderTriggers { .. } => { + engine::game::triggers::drain_order_triggers_with_identity(runner.state_mut()); + } + other => panic!("unexpected state while advancing to cleanup: {other:?}"), + } + } + panic!("turn did not advance through cleanup"); +} + +#[test] +fn exuberant_wolfbear_accepts_only_controlled_humans_and_expires_at_cleanup() { + let (mut runner, wolfbear, chosen_human, other_human, opponent_human) = setup(); + let current_turn = runner.state().turn_number; + + attack_until_target_selection(&mut runner, wolfbear); + + let chosen_target = match runner.state().waiting_for.clone() { + WaitingFor::TriggerTargetSelection { + target_slots, + selection, + .. + } => { + let legal_targets = &target_slots[selection.current_slot].legal_targets; + let legal_object_ids: Vec<_> = legal_targets + .iter() + .filter_map(|target| match target { + engine::types::ability::TargetRef::Object(id) => Some(*id), + engine::types::ability::TargetRef::Player(_) => None, + }) + .collect(); + assert!( + legal_object_ids.contains(&chosen_human) && legal_object_ids.contains(&other_human), + "both controlled Humans must be legal targets: {legal_targets:?}" + ); + assert!( + !legal_object_ids.contains(&opponent_human), + "opponent's Human must not be a legal target: {legal_targets:?}" + ); + legal_targets + .iter() + .find(|target| { + matches!(target, engine::types::ability::TargetRef::Object(id) if *id == chosen_human) + }) + .cloned() + .expect("chosen controlled Human must be offered by the engine") + } + other => panic!("expected target selection after accepting Wolfbear: {other:?}"), + }; + runner + .act(GameAction::ChooseTarget { + target: Some(chosen_target), + }) + .expect("select the engine-offered controlled Human target"); + target_selected_until_optional_choice(&mut runner, wolfbear); + runner + .act(GameAction::DecideOptionalEffect { accept: true }) + .expect("controller may accept Wolfbear's trigger"); + runner.advance_until_stack_empty(); + + assert_eq!( + power_toughness(&runner, chosen_human), + (Some(7), Some(5)), + "selected Human must take Wolfbear's 7/5 base P/T this turn" + ); + assert_eq!( + power_toughness(&runner, other_human), + (Some(1), Some(1)), + "unchosen controlled Human must stay 1/1" + ); + assert_eq!( + power_toughness(&runner, opponent_human), + (Some(1), Some(1)), + "opponent's Human must stay 1/1" + ); + + finish_current_turn(&mut runner, current_turn); + assert_eq!( + power_toughness(&runner, chosen_human), + (Some(1), Some(1)), + "until-end-of-turn base P/T must expire during cleanup" + ); +} + +#[test] +fn exuberant_wolfbear_decline_leaves_controlled_human_unchanged() { + let (mut runner, wolfbear, chosen_human, _other_human, _opponent_human) = setup(); + + attack_until_target_selection(&mut runner, wolfbear); + let chosen_target = match runner.state().waiting_for.clone() { + WaitingFor::TriggerTargetSelection { + target_slots, + selection, + .. + } => target_slots[selection.current_slot] + .legal_targets + .iter() + .find(|target| { + matches!(target, engine::types::ability::TargetRef::Object(id) if *id == chosen_human) + }) + .cloned() + .expect("chosen controlled Human must be offered by the engine"), + other => panic!("expected target selection before optional choice: {other:?}"), + }; + runner + .act(GameAction::ChooseTarget { + target: Some(chosen_target), + }) + .expect("select the engine-offered controlled Human target"); + target_selected_until_optional_choice(&mut runner, wolfbear); + runner + .act(GameAction::DecideOptionalEffect { accept: false }) + .expect("controller may decline Wolfbear's trigger"); + runner.advance_until_stack_empty(); + + assert_eq!( + power_toughness(&runner, chosen_human), + (Some(1), Some(1)), + "declining Wolfbear's optional trigger must leave the Human unchanged" + ); +} diff --git a/crates/engine/tests/integration/main.rs b/crates/engine/tests/integration/main.rs index b089ac90aa..0cde5467e9 100644 --- a/crates/engine/tests/integration/main.rs +++ b/crates/engine/tests/integration/main.rs @@ -210,6 +210,7 @@ mod exile_dynamic_from_top; mod export_runtime_canaries; mod exquisite_blood_routing; mod extract_power_each_player_exile; +mod exuberant_wolfbear_base_pt_target; mod eyetwitch_learn_decline_lesson; mod fact_or_fiction_pile_separation; mod fantastic_four_bounded_loop; From 6bad30e99b0cdbe775007ff01047d661ce2c10f3 Mon Sep 17 00:00:00 2001 From: Lindsey Gray Date: Mon, 10 Aug 2026 10:03:03 -0500 Subject: [PATCH 10/15] docs: name the phase-engine package in every cargo invocation (#7205) * docs: name the phase-engine package in every cargo invocation Eight comments and script strings tell a reader to run `cargo ... -p engine ...`. None of them can work. The workspace package is `phase-engine`; `engine` is only the lib TARGET name, so `-p engine` names a package that does not exist: $ cargo test -p engine --lib pool_structure_census -- --list error: package ID specification `engine` did not match any packages $ cargo pkgid -p engine error: package ID specification `engine` did not match any packages $ cargo pkgid -p phase-engine path+file:///.../crates/engine#phase-engine@0.50.0 The authority is `crates/engine/Cargo.toml`: `[package] name = "phase-engine"` against `[lib] name = "engine"`. Every one of these strings is an instruction someone is meant to follow -- a perf benchmark's `#[ignore]` reason, a census test's reproduce line, a migration script's closing "Verify with:" -- so each one costs its reader a failed command and a detour before they work out that the package is named something else. The corrected forms resolve, and resolve to the intended tests rather than to nothing: $ cargo test -p phase-engine --lib pool_structure_census -- --list parser::oracle_ir::feature::pool_structure_census::census: test 1 test, 0 benchmarks Running the fully corrected `--ignored` form reaches the test body and stops on the environment variable the comment itself tells you to set (`ORACLE_POOL_DIR`), which is the expected outcome and the point: the package selector, target filter and test filter all resolve, and only the documented setup step remains. Cargo agrees -- its own rerun hint prints `-p phase-engine --lib`. Three further instances of this defect exist in `game_state_size.rs`, `bin/interaction_bindings.rs` and the generated `client/src/adapter/generated/ interaction/index.ts`; they are fixed by a separate in-flight PR and are deliberately untouched here so the two changes cannot conflict in either merge order. Seven more live in `.claude/wf/*.md` planning documents and are left for maintainer discretion. A naive `grep -rn -- '-p engine'` also matches `.cargo/config.toml`'s `-p engine-inventory-gen`. That is a substring hit, not a defect -- `engine-inventory-gen` is a real package and `cargo pkgid` resolves it. Assisted-by: ClaudeCode:claude-opus-5 * docs(PR-7205): correct remaining phase-engine selectors Completes the live documentation selector migration for the generated interaction bindings and GameState size measurement instructions. Co-authored-by: Lindsey Gray --------- Co-authored-by: matthewevans --- client/src/adapter/generated/interaction/index.ts | 2 +- crates/engine/src/bin/interaction_bindings.rs | 2 +- crates/engine/src/game/combat.rs | 2 +- crates/engine/src/game/stack.rs | 2 +- crates/engine/src/game/token_presets.rs | 2 +- crates/engine/src/game/triggers.rs | 2 +- crates/engine/src/parser/oracle_ir/feature.rs | 2 +- crates/engine/src/types/game_state_size.rs | 2 +- crates/engine/tests/integration/squirrel_perf_probe.rs | 2 +- scripts/migrate-mana-target-roles.mjs | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/client/src/adapter/generated/interaction/index.ts b/client/src/adapter/generated/interaction/index.ts index fff6e5b18f..1d77fdb7b3 100644 --- a/client/src/adapter/generated/interaction/index.ts +++ b/client/src/adapter/generated/interaction/index.ts @@ -1,4 +1,4 @@ -// @generated by `cargo run -p engine --features interaction-bindings --bin interaction-bindings -- --write`. +// @generated by `cargo run -p phase-engine --features interaction-bindings --bin interaction-bindings -- --write`. // Do not edit by hand. export type InteractionSessionId = string & { readonly __brand: "InteractionSessionId" }; diff --git a/crates/engine/src/bin/interaction_bindings.rs b/crates/engine/src/bin/interaction_bindings.rs index 7cf60696bc..2ade424c1c 100644 --- a/crates/engine/src/bin/interaction_bindings.rs +++ b/crates/engine/src/bin/interaction_bindings.rs @@ -21,7 +21,7 @@ use engine::types::interaction::{ }; use ts_rs::{Config, TS}; -const HEADER: &str = "// @generated by `cargo run -p engine --features interaction-bindings --bin interaction-bindings -- --write`.\n// Do not edit by hand.\n\n"; +const HEADER: &str = "// @generated by `cargo run -p phase-engine --features interaction-bindings --bin interaction-bindings -- --write`.\n// Do not edit by hand.\n\n"; fn export_decl(config: &Config) -> String { let declaration = T::decl(config); diff --git a/crates/engine/src/game/combat.rs b/crates/engine/src/game/combat.rs index bd8494ba74..0e43a938f7 100644 --- a/crates/engine/src/game/combat.rs +++ b/crates/engine/src/game/combat.rs @@ -14656,7 +14656,7 @@ mod tests { /// `compute_combat_tax` hot path after #4312/#4329: go-wide attackers /// against several active tax statics. Run explicitly with: /// - /// `cargo test -p engine combat_tax_profile_gate_go_wide_board -- --ignored --nocapture` + /// `cargo test -p phase-engine combat_tax_profile_gate_go_wide_board -- --ignored --nocapture` #[test] #[ignore = "perf benchmark; run manually"] fn combat_tax_profile_gate_go_wide_board() { diff --git a/crates/engine/src/game/stack.rs b/crates/engine/src/game/stack.rs index 2af1ebe66b..8ce1bd9436 100644 --- a/crates/engine/src/game/stack.rs +++ b/crates/engine/src/game/stack.rs @@ -9795,7 +9795,7 @@ mod tests { /// /// Self-skips when `/tmp/gamestate.json` is absent (CI lacks the repro). /// `#[ignore]` by default: depends on a local-only 27MB snapshot. Run with - /// `cargo test -p engine -- --ignored real_scute_board`. + /// `cargo test -p phase-engine -- --ignored real_scute_board`. /// Re-parse every `StaticCondition::Unrecognized` carried in a snapshot's /// static definitions through the live `parse_inner_condition`, replacing /// any that now parse to a typed condition. The snapshot's stored text has diff --git a/crates/engine/src/game/token_presets.rs b/crates/engine/src/game/token_presets.rs index d585bda2a6..d150021fc9 100644 --- a/crates/engine/src/game/token_presets.rs +++ b/crates/engine/src/game/token_presets.rs @@ -558,7 +558,7 @@ mod tests { (state, source) } - /// Forces `LazyLock` evaluation in `cargo test -p engine` so an unknown + /// Forces `LazyLock` evaluation in `cargo test -p phase-engine` so an unknown /// `Keyword`/`CoreType`/`ManaColor` variant or a duplicate id panics in /// CI rather than at first production access. (Malformed TOML fails /// earlier, in `build.rs`; the structural conversion there cannot catch diff --git a/crates/engine/src/game/triggers.rs b/crates/engine/src/game/triggers.rs index d7495c5730..9d4975afda 100644 --- a/crates/engine/src/game/triggers.rs +++ b/crates/engine/src/game/triggers.rs @@ -37538,7 +37538,7 @@ pub mod tests { /// Requires `/tmp/gamestate.json` to be present (the captured snapshot /// is not committed). Skips cleanly when absent. #[test] - #[ignore = "perf benchmark; run with `cargo test -p engine scute_swarm_throughput -- --ignored --nocapture`"] + #[ignore = "perf benchmark; run with `cargo test -p phase-engine scute_swarm_throughput -- --ignored --nocapture`"] fn scute_swarm_throughput() { let path = "/tmp/gamestate.json"; let raw = match std::fs::read_to_string(path) { diff --git a/crates/engine/src/parser/oracle_ir/feature.rs b/crates/engine/src/parser/oracle_ir/feature.rs index 4edd371b75..0d78cca00e 100644 --- a/crates/engine/src/parser/oracle_ir/feature.rs +++ b/crates/engine/src/parser/oracle_ir/feature.rs @@ -689,7 +689,7 @@ mod tests { /// checkout does not have. Point it at one and run it explicitly: /// /// ```text -/// ORACLE_POOL_DIR=/path/to/data cargo test -p engine --lib pool_structure_census \ +/// ORACLE_POOL_DIR=/path/to/data cargo test -p phase-engine --lib pool_structure_census \ /// -- --ignored --nocapture /// ``` #[cfg(test)] diff --git a/crates/engine/src/types/game_state_size.rs b/crates/engine/src/types/game_state_size.rs index 05961d41a7..f7ef80dc73 100644 --- a/crates/engine/src/types/game_state_size.rs +++ b/crates/engine/src/types/game_state_size.rs @@ -30,7 +30,7 @@ //! //! ```text //! CARGO_TARGET_DIR=/tmp/gs-size RUSTFLAGS="-Zprint-type-sizes" \ -//! cargo build -p engine --lib \ +//! cargo build -p phase-engine --lib \ //! | grep 'print-type-size type: `types::game_state::GameState`:' //! ``` //! diff --git a/crates/engine/tests/integration/squirrel_perf_probe.rs b/crates/engine/tests/integration/squirrel_perf_probe.rs index 24fd2d1007..27edb9b8ec 100644 --- a/crates/engine/tests/integration/squirrel_perf_probe.rs +++ b/crates/engine/tests/integration/squirrel_perf_probe.rs @@ -1,7 +1,7 @@ //! One-off perf probe for the turn-40 squirrel board (Cryptolith Rite + ~700 //! Squirrel tokens). Loads a saved frontend game-state JSON and measures where //! the `legal_actions` clone-storm bites. Run with: -//! SQUIRREL_STATE=/path/to/state.json cargo test -p engine --test integration -- --nocapture --ignored squirrel_perf_probe +//! SQUIRREL_STATE=/path/to/state.json cargo test -p phase-engine --test integration -- --nocapture --ignored squirrel_perf_probe //! Diagnostic only; ignored by default so it never runs in CI. use std::time::Instant; diff --git a/scripts/migrate-mana-target-roles.mjs b/scripts/migrate-mana-target-roles.mjs index 884d9a6bab..c212382c94 100644 --- a/scripts/migrate-mana-target-roles.mjs +++ b/scripts/migrate-mana-target-roles.mjs @@ -57,7 +57,7 @@ * 2. Apply this migration: * node scripts/migrate-mana-target-roles.mjs * 3. Verify: - * cargo test -p engine --test integration + * cargo test -p phase-engine --test integration * In particular `mana_role_fixture_migration` asserts Carpet of Flowers is * a CountSource and Belbe is a Recipient — it is the canary for a mapping * that silently flipped. @@ -459,4 +459,4 @@ if (lineCount !== 1) { process.exit(1); } console.log(`\nWrote ${fixturePath} (canonical gzip -9 -n; ${out.length} JSON bytes).`); -console.log("Verify with: cargo test -p engine --test integration"); +console.log("Verify with: cargo test -p phase-engine --test integration"); From 231b0164e180c64c487b3bc9228ca9f2faea1441 Mon Sep 17 00:00:00 2001 From: Lindsey Gray Date: Mon, 10 Aug 2026 11:03:11 -0500 Subject: [PATCH 11/15] ci: split Rust test job into four nextest shards (#7206) * ci: split Rust test job into four nextest shards The two-shard matrix puts each rust-test shard near its 30-minute ceiling. nextest's count partition distributes execution evenly, so four shards roughly halve per-shard test wall-clock; the per-shard workspace build cost is unchanged (each shard already builds the whole workspace, see the disk-cleanup comment) and stays absorbed by sccache. The rust-check aggregation job reads the matrix-wide result, so no downstream job changes. Assisted-by: ClaudeCode:claude-fable-5 * ci: lower rust-test shard timeout to 20 minutes With four shards each runs well under the old two-shard wall-clock, so the 30-minute ceiling sized for two shards is slack; 20 minutes still leaves headroom over the per-shard build + quarter-partition run. Assisted-by: ClaudeCode:claude-fable-5 --- .github/workflows/ci.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0108d9c4cc..607d306fb7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -118,13 +118,13 @@ jobs: ./scripts/check-test-card-data-load.sh "$BASE" rust-test: - name: Rust tests (shard ${{ matrix.shard }}/2) + name: Rust tests (shard ${{ matrix.shard }}/4) runs-on: ubuntu-latest - timeout-minutes: 30 + timeout-minutes: 20 strategy: fail-fast: false matrix: - shard: [1, 2] + shard: [1, 2, 3, 4] steps: - uses: actions/checkout@v4 @@ -174,7 +174,7 @@ jobs: # caught before it lands on the branch that feeds staging/preview. env: PROPTEST_CASES: ${{ github.event_name == 'pull_request' && '32' || '256' }} - run: cargo nextest run --profile ci --partition count:${{ matrix.shard }}/2 --workspace --exclude phase-tauri --exclude mtgish-import --features engine/proptest --status-level fail --final-status-level fail + run: cargo nextest run --profile ci --partition count:${{ matrix.shard }}/4 --workspace --exclude phase-tauri --exclude mtgish-import --features engine/proptest --status-level fail --final-status-level fail card-data-gate: name: Card data (generate, validate, coverage) From fb15645e680aad3b28ec2b45db25faaa349c2887 Mon Sep 17 00:00:00 2001 From: Matt Evans <1388610+matthewevans@users.noreply.github.com> Date: Mon, 10 Aug 2026 08:42:42 -0700 Subject: [PATCH 12/15] docs(contributing): stop rejecting frontier models with opaque model ids (#7207) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AI-CONTRIBUTOR.md aborted a run whenever the model could not emit an exact identifier, which gates on identifier availability rather than capability. Harnesses like GitHub Copilot never hand the running model its own id, so compliant frontier sessions were told to abort. - §0.1.1: replace the blanket "cannot determine your model, abort" with three-way routing; a harness-reported name declares via a hedged `Model: (via ; canonical id not exposed)` form. - §0.1.1: state the version-ordering rule the `+` suffix implied but never defined, including separator normalization and variant suffixes, so `gpt-5.6-sol` resolves against the `gpt-5-5` floor instead of aborting. - §0.1.1: a trailer naming a harness rather than a model neither corroborates nor contradicts a declaration, so its silence is not grounds for a close. - Appendix B.3: correct the Opus floor (4.7 -> 4.8), add Sonnet 5 and the Codex below-floor case, and carry the harness allowance into the self-contained prompt. Tier: routing is unchanged -- `Tier: Frontier` still gates, and the hedged Model line still matches the `^\s*\**Model:` reader in pr-review-loop. Co-authored-by: matthewevans --- .github/PULL_REQUEST_TEMPLATE.md | 8 +++++-- docs/AI-CONTRIBUTOR.md | 38 +++++++++++++++++++++++++------- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 7b886c3283..cfd1758e72 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -12,12 +12,16 @@ ## LLM -Model: +Model: Tier: Thinking: +must report their actual Frontier model, Tier: Frontier, and thinking level. +If your harness does not expose an exact model identifier, report the name it +does give you — e.g. "Model: gpt-5.6-sol (via GitHub Copilot; canonical id not +exposed)" — rather than guessing an identifier. See AI-CONTRIBUTOR.md +§0.1.1. --> ## Implementation method (required) diff --git a/docs/AI-CONTRIBUTOR.md b/docs/AI-CONTRIBUTOR.md index b590d35200..1e013c63e9 100644 --- a/docs/AI-CONTRIBUTOR.md +++ b/docs/AI-CONTRIBUTOR.md @@ -12,7 +12,7 @@ If you are the LLM executing this: read top to bottom and follow every step. Do Before Step 1, confirm the following. **Tool support** and **Autonomy** are hard requirements: without them, abort. **Model** is load-bearing — see §0.1 for tier routing; report your actual model accurately on a `Model:` line in the PR body. **Thinking level** is advisory. -- **Model (load-bearing, and now a hard gate):** §0.1 requires a **Frontier-tier** model; if you are not one, abort. Report your model on a single canonical line in the PR body (e.g. `Model: claude-opus-4-8`, `Model: gpt-5-5`, `Model: codex-5-5`). Do not editorialize this line — `/pr-contribution-handler` parses it (and the matching `Tier:` line in §0.1.4). **Report it accurately.** Misreporting your model to clear the gate is the one thing here that will get the account itself blocked rather than the PR closed: your commit trailers and output are legible to us, so a false `Model:` line is caught, and it converts an out-of-policy PR into a trust problem. +- **Model (load-bearing, and now a hard gate):** §0.1 requires a **Frontier-tier** model; if you are not one, abort. Report your model on a single canonical line in the PR body (e.g. `Model: claude-opus-4-8`, `Model: gpt-5-5`, `Model: codex-5-5`). If your harness never exposes an exact identifier, §0.1.1 gives you a hedged form to declare instead — that case is not an abort. Do not editorialize this line — `/pr-contribution-handler` parses it (and the matching `Tier:` line in §0.1.4). **Report it accurately.** Misreporting your model to clear the gate is the one thing here that will get the account itself blocked rather than the PR closed: your commit trailers and output are legible to us, so a false `Model:` line is caught, and it converts an out-of-policy PR into a trust problem. - **Thinking (advisory):** High or higher. On Claude Code this is available for Opus; on Codex CLI pass `--reasoning high` or higher. Report on a `Thinking:` line in the PR body. - **Tool support (required):** You can invoke skills, use `WebFetch`, run shell commands, and use an independent reviewer or fresh context when requested. Without these, you cannot run `$engine-implementer` and must abort. - **Autonomy (required):** You will not pause for human input during the run. Every decision fork defaults to the architecturally idiomatic path as defined by `CLAUDE.md`, `AGENTS.md`, and the skills under `.claude/skills/`. @@ -29,11 +29,21 @@ Skill references in this section use the `$skill` / `/skill` convention defined |----------|--------|-----------| | Frontier | **Anthropic:** `claude-opus-4-8`+, `claude-sonnet-5`+ · **OpenAI:** `gpt-5-5`+ · **Cursor/Codex:** `codex-5-5`+ | Full pipeline per §4 onward. | -**Frontier-tier models only.** There is no longer a Standard tier. The floor is per-vendor and is stated by exact model, not by family wildcard — `claude-sonnet-5` is accepted while `claude-sonnet-4-6` is not, so a `claude-sonnet-*` reading of this table is wrong. **Not accepted:** `claude-opus-4-7` and below, `claude-sonnet-4-6` and below, every `claude-haiku-*` including `claude-haiku-4-5`, every `composer-*`, `gpt-5-4` and below including `gpt-5-3`, and `codex-5-4` and below. If that is your model, abort per §0 rather than opening a PR. A PR declaring a non-Frontier model, or whose commits show one, will be closed as out-of-policy without an implementation review. This is not a judgement about those models generally; it reflects that review capacity here is the scarce resource, and sub-Frontier runs have consistently consumed several maintainer rounds per PR to reach a standard a Frontier run reaches on the first pass. +**Frontier-tier models only.** There is no longer a Standard tier. The floor is per-vendor and is stated by exact model, not by family wildcard — `claude-sonnet-5` is accepted while `claude-sonnet-4-6` is not, so a `claude-sonnet-*` reading of this table is wrong (but a *newer* version than the one named does qualify — see the reading rule below). **Not accepted:** `claude-opus-4-7` and below, `claude-sonnet-4-6` and below, every `claude-haiku-*` including `claude-haiku-4-5`, every `composer-*`, `gpt-5-4` and below including `gpt-5-3`, and `codex-5-4` and below. If that is your model, abort per §0 rather than opening a PR. A PR declaring a non-Frontier model, or whose commits show one, will be closed as out-of-policy without an implementation review. This is not a judgement about those models generally; it reflects that review capacity here is the scarce resource, and sub-Frontier runs have consistently consumed several maintainer rounds per PR to reach a standard a Frontier run reaches on the first pass. **How commit evidence is read.** The gate is about the model that *wrote the change*, so a `Co-Authored-By:` trailer is read against the commits that carry the implementation. A session that starts on a Frontier model and falls back to a sub-Frontier one part-way through — a usage limit, a harness default — leaves sub-Frontier trailers on later commits without the PR having been generated below the floor. That is a fixable declaration problem, not dishonesty: expect to be asked to confirm which model did the work. What earns a close is the whole run sitting below the floor; what escalates to an account-level problem is a `Model:`/`Tier:` line that contradicts the trailers in a direction that clears the gate. -If you cannot determine your model, abort — do not guess and do not proceed on the assumption that you qualify. Tier cannot satisfy the artifact gate or authorize architecture scope. +A trailer that names a *harness* rather than a model — `Copilot`, `Cursor`, and similar — neither corroborates nor contradicts the declaration, because those harnesses never expose the underlying model to the trailer. Its silence is not evidence of misreporting and is not grounds for a close; ask which model did the work if it matters. Only a trailer naming an actual sub-floor model can contradict a declaration. + +**Reading the table — `+` means that version or anything later.** `claude-sonnet-5`+ admits `claude-sonnet-5` and every later version in that same family from that vendor, so a model that postdates the last edit of this table qualifies without being enumerated. Compare versions after normalizing separators — `gpt-5.6` and `gpt-5-6` are the same version — and treat a vendor variant suffix (`-sol`, `-thinking`, `-preview`, a date stamp) as still inside its family: `gpt-5.6-sol` sits above the `gpt-5-5` floor and qualifies. The "not a family wildcard" rule points *downward* only: it forbids reading `claude-sonnet-*` as admitting `claude-sonnet-4-6`, which sits below the floor. Do not abort merely because your exact identifier is not printed above — normalize it and check it against the floor for your family instead. + +**If your harness does not expose an exact model identifier.** The gate is on capability, not on your ability to emit a canonical id string. Several harnesses — GitHub Copilot, IDE assistants, and hosted chat UIs with a model picker — never hand the running model its own identifier. That is not a disqualification. Route as follows: + +- You can establish vendor, family, and enough version detail to place yourself at or above a floor in the table above → **proceed**, and declare the canonical id if you have one. +- You know which model the harness selected (its picker name, the name in your system context, or the name your user stated) but not a canonical id → **proceed**, and declare it in exactly that form on a single line: `Model: (via ; canonical id not exposed)`, e.g. `Model: gpt-5.6-sol (via GitHub Copilot; canonical id not exposed)`. `Tier: Frontier` still applies. +- You cannot establish vendor, family, and version at all, or the version you can establish sits below the floor → **abort** per §0. + +Do not guess upward. Report the name your harness reports; the hedged form above clears the gate on its own, so inventing a canonical id you were never given buys nothing and lands in the §0 misreporting case. Tier cannot satisfy the artifact gate or authorize architecture scope. **Applies to PRs opened on or after 2026-07-24.** Pull requests opened before that date are judged on their code, not their declared tier — the Standard tier was accepted policy when they were written, and a contributor who reported a Sonnet, Haiku, or Composer run accurately was following the rules as published. `claude-haiku-4-5` in particular was named in the Standard row of the tier table until 2026-07-24T02:03:45Z, so Haiku trailers on a PR opened before that are evidence of compliance, not of a violation. Do not close an older PR for a declaration that was correct when it was made. This grandfathering covers the declaration only: every other gate in this document applies to open PRs regardless of age. @@ -356,6 +366,8 @@ Method: /engine-implementer ## LLM Model: # Frontier tier only — see §0.1.1 + Tier: Frontier Thinking: @@ -459,13 +471,23 @@ appointment or a linked issue labeled `accepted`, stop instead of opening a PR. You are going to implement one Magic: The Gathering card in the phase-rs/phase repository end-to-end and open a pull request. Do not pause to ask me anything. -Requirements: Frontier-tier model REQUIRED — Claude Opus 4.7+, GPT-5.5+, or -Codex 5.5+ at high+ thinking. If your runtime is below that (Sonnet, Haiku, -Composer, or any older model), STOP and tell me rather than opening a PR; it +Requirements: Frontier-tier model REQUIRED — Claude Opus 4.8+, Claude Sonnet 5+, +GPT-5.5+, or Codex 5.5+ at high+ thinking. "+" means that version or anything +later, so a newer model than the ones named here qualifies; compare versions +ignoring separator style ("5.6" == "5-6"), and a variant suffix like "-sol" or +"-thinking" stays in its family (gpt-5.6-sol qualifies). If your runtime is +below that floor (Claude Sonnet 4.6 or older, any Haiku, any Composer, GPT-5.4 +or older, Codex 5.4 or older), STOP and tell me rather than opening a PR; it will be closed as out-of-policy. Report your actual model on a single canonical "Model:" line and the exact "Tier: Frontier" line in the PR body (e.g. -"Model: claude-opus-4-8"). Do NOT editorialize either line or overstate the -model. Hard requirements: you can +"Model: claude-opus-4-8"). +If your harness never exposes an exact model identifier (GitHub Copilot, IDE +assistants, and picker-based chat UIs typically do not), do NOT abort for that +reason alone — declare the name your harness reports, in the form +"Model: gpt-5.6-sol (via GitHub Copilot; canonical id not exposed)", and +keep "Tier: Frontier". Abort only if you cannot establish your vendor, family, +and version at all, or you know you are below the floor. Do NOT editorialize +either line or overstate the model. Hard requirements: you can invoke skills, run shell commands, and you will not pause for input. Steps: From 58d70436cf37c4fda9c0679360794b0b26e2f1b8 Mon Sep 17 00:00:00 2001 From: traemyn Date: Mon, 10 Aug 2026 11:06:12 -0500 Subject: [PATCH 13/15] Fix Emperor of Bones (#7200) * Fix Emperor of Bones * Fix replacement prompt preservation * Fix replacement prompt precedence * test: cover replacement prompt pause and resume --- .../src/game/engine_resolution_choices.rs | 1 + crates/engine/src/game/replacement.rs | 10 +- crates/engine/src/game/zone_pipeline.rs | 6 +- .../issue_1515_emperor_of_bones.rs | 191 +++++++++++++++++- 4 files changed, 201 insertions(+), 7 deletions(-) diff --git a/crates/engine/src/game/engine_resolution_choices.rs b/crates/engine/src/game/engine_resolution_choices.rs index 2b930cff13..eb9c5e96ec 100644 --- a/crates/engine/src/game/engine_resolution_choices.rs +++ b/crates/engine/src/game/engine_resolution_choices.rs @@ -3961,6 +3961,7 @@ pub(super) fn handle_resolution_choice( primary_enter_tapped, rest_destination, }; + state.waiting_for = WaitingFor::Priority { player }; let events_before_partition = events.len(); match apply_search_partition( state, diff --git a/crates/engine/src/game/replacement.rs b/crates/engine/src/game/replacement.rs index 1ef4053226..ff08ad6c75 100644 --- a/crates/engine/src/game/replacement.rs +++ b/crates/engine/src/game/replacement.rs @@ -1003,10 +1003,14 @@ pub fn replacement_choice_waiting_for(player: PlayerId, state: &GameState) -> Wa } /// CR 614.12a: Park on the replacement choice for `player`, unless a downstream -/// effect (a Devour as-enters Sacrifice `EffectZoneChoice`) already surfaced its -/// own interactive prompt — then leave it so the pending choice isn't clobbered. +/// as-enters effect already surfaced its own interactive prompt. Leave that prompt +/// in place so the entry choice completes before the surrounding ability resumes. pub fn park_waiting_for(state: &mut GameState, player: PlayerId) { - if matches!(state.waiting_for, WaitingFor::EffectZoneChoice { .. }) { + if matches!( + state.waiting_for, + WaitingFor::CopyTargetChoice { .. } | WaitingFor::ReturnAsAuraTarget { .. } + ) || super::engine_resolution_choices::handles(&state.waiting_for) + { return; } state.waiting_for = replacement_choice_waiting_for(player, state); diff --git a/crates/engine/src/game/zone_pipeline.rs b/crates/engine/src/game/zone_pipeline.rs index 88e578cc00..71a33bde4b 100644 --- a/crates/engine/src/game/zone_pipeline.rs +++ b/crates/engine/src/game/zone_pipeline.rs @@ -861,7 +861,7 @@ pub(crate) fn move_object_with_terminal( ReplacementResult::NeedsChoice(player) => { // CR 616.1: park at the single unparked origin (mirrors // `execute_zone_move`'s NeedsChoice arm) so the prompt surfaces. - replacement::park_waiting_for(state, player); + state.waiting_for = replacement::replacement_choice_waiting_for(player, state); // CR 701.24a: stash the requested library placement on the // parked record so the resume path // (`engine_replacement::handle_replacement_choice`) threads it @@ -938,7 +938,7 @@ pub(crate) fn move_object_with_terminal( // `valid_card: None` class is destination-gated to Graveyard), so // this is unreachable for the current pool — parked for // correctness if a future to-Hand redirect surfaces a choice. - replacement::park_waiting_for(state, player); + state.waiting_for = replacement::replacement_choice_waiting_for(player, state); ZoneMoveTerminalResult::NeedsChoice(player) } }; @@ -3134,7 +3134,7 @@ fn execute_zone_move_with_applied_terminal( // delivery-tail NeedsChoice path above is NOT parked here — its // wait state is already set by the counter-pause / devour machinery // (`replacement_pause_delivery_result` reads it). - replacement::park_waiting_for(state, player); + state.waiting_for = replacement::replacement_choice_waiting_for(player, state); ZoneMoveTerminalResult::NeedsChoice(player) } } diff --git a/crates/engine/tests/integration/issue_1515_emperor_of_bones.rs b/crates/engine/tests/integration/issue_1515_emperor_of_bones.rs index 4594815bfd..e0085b9eea 100644 --- a/crates/engine/tests/integration/issue_1515_emperor_of_bones.rs +++ b/crates/engine/tests/integration/issue_1515_emperor_of_bones.rs @@ -6,19 +6,32 @@ use engine::game::effects::resolve_ability_chain; use engine::game::scenario::{GameScenario, P0}; use engine::parser::oracle_effect::parse_effect_chain; use engine::types::ability::{ - AbilityKind, ContinuousModification, DelayedTriggerCondition, Effect, TargetFilter, + AbilityCost, AbilityDefinition, AbilityKind, ChoiceType, ChosenAttribute, + ContinuousModification, DelayedTriggerCondition, Effect, QuantityExpr, QuantityRef, + ReplacementDefinition, TargetFilter, }; +use engine::types::actions::GameAction; use engine::types::counter::CounterType; use engine::types::game_state::{ExileLink, ExileLinkKind, WaitingFor}; use engine::types::identifiers::ObjectId; use engine::types::keywords::Keyword; use engine::types::phase::Phase; +use engine::types::player::PlayerId; +use engine::types::replacements::ReplacementEvent; use engine::types::zones::Zone; const EMPEROR_COUNTER_TRIGGER_EFFECT: &str = "put a creature card exiled with this creature onto \ the battlefield under your control with a finality counter on it. it gains haste. sacrifice it at \ the beginning of the next end step."; +const ANOINTED_PEACEKEEPER: &str = "Vigilance\n\ +As this creature enters, look at an opponent's hand, then choose any card name.\n\ +Spells your opponents cast with the chosen name cost {2} more to cast.\n\ +Activated abilities of sources with the chosen name cost {2} more to activate unless they're mana abilities."; + +const P1: PlayerId = PlayerId(1); +const NAMED_CARD: &str = "Llanowar Elves"; + fn creature_has_haste_from_transient_effects( state: &engine::types::game_state::GameState, creature: ObjectId, @@ -153,3 +166,179 @@ fn issue_1515_emperor_of_bones_binds_haste_and_delayed_sacrifice_to_returned_cre "the delayed sacrifice must not sacrifice Emperor" ); } + +/// CR 614.12a + CR 400.7j: An as-enters choice on the returned permanent must +/// complete without losing later instructions that refer to that permanent. +#[test] +fn emperor_of_bones_resumes_riders_after_anointed_peacekeepers_as_enters_choices() { + let mut scenario = GameScenario::new_n_player(2, 7); + scenario.at_phase(Phase::PreCombatMain); + let emperor = scenario.add_creature(P0, "Emperor of Bones", 2, 2).id(); + let _opponent_card = scenario.add_card_to_hand(P1, "Opponent Secret"); + let peacekeeper = { + let mut builder = scenario.add_creature_to_exile(P0, "Anointed Peacekeeper", 3, 3); + builder.from_oracle_text(ANOINTED_PEACEKEEPER); + builder.id() + }; + + let mut runner = scenario.build(); + runner.state_mut().all_card_names = std::sync::Arc::from([NAMED_CARD.to_string()]); + runner.state_mut().exile_links.push(ExileLink { + exiled_id: peacekeeper, + source_id: emperor, + kind: ExileLinkKind::TrackedBySource, + }); + + let definition = parse_effect_chain(EMPEROR_COUNTER_TRIGGER_EFFECT, AbilityKind::Spell); + let ability = build_resolved_from_def(&definition, emperor, P0); + let mut events = Vec::new(); + resolve_ability_chain(runner.state_mut(), &ability, &mut events, 0) + .expect("Emperor of Bones return must reach Peacekeeper's as-enters choice"); + + let WaitingFor::NamedChoice { + choice_type, + options, + .. + } = runner.state().waiting_for.clone() + else { + panic!( + "Peacekeeper must ask which opponent to look at, got {}", + runner.waiting_for_kind() + ); + }; + assert!(matches!(choice_type, ChoiceType::Opponent { .. })); + assert_eq!(options, vec![P1.0.to_string()]); + runner + .act(GameAction::ChooseOption { + choice: P1.0.to_string(), + }) + .expect("choose the opponent whose hand Peacekeeper looks at"); + + let WaitingFor::NamedChoice { choice_type, .. } = runner.state().waiting_for.clone() else { + panic!( + "Peacekeeper must ask for a card name after looking, got {}", + runner.waiting_for_kind() + ); + }; + assert!(matches!(choice_type, ChoiceType::CardName)); + runner + .act(GameAction::ChooseOption { + choice: NAMED_CARD.to_string(), + }) + .expect("choose the card name for Peacekeeper"); + + let state = runner.state(); + let returned = &state.objects[&peacekeeper]; + assert_eq!(returned.zone, Zone::Battlefield); + assert!(returned.chosen_attributes.iter().any( + |attribute| matches!(attribute, ChosenAttribute::CardName(name) if name == NAMED_CARD) + )); + assert_eq!( + returned + .counters + .get(&CounterType::Finality) + .copied() + .unwrap_or(0), + 1, + "Peacekeeper must retain Emperor's finality entry modifier" + ); + assert!( + creature_has_haste_from_transient_effects(state, peacekeeper), + "Emperor's forwarded haste rider must resume after both as-enters choices" + ); + assert_eq!( + state.delayed_triggers.len(), + 1, + "Emperor's delayed sacrifice rider must resume after both as-enters choices" + ); + assert_eq!( + state.delayed_triggers[0].ability.targets, + vec![engine::types::ability::TargetRef::Object(peacekeeper)] + ); +} + +/// A synthetic as-enters replacement that opens a PayAmountChoice before the +/// returning permanent finishes entering. This mirrors the shape of a printed +/// Moved replacement while keeping the regression independent of card data. +fn pay_amount_choice_replacement() -> ReplacementDefinition { + ReplacementDefinition::new(ReplacementEvent::Moved) + .destination_zone(Zone::Battlefield) + .valid_card(TargetFilter::SelfRef) + .execute(AbilityDefinition::new( + AbilityKind::Spell, + Effect::PayCost { + cost: AbilityCost::PayLife { + amount: QuantityExpr::Ref { + qty: QuantityRef::Variable { + name: "X".to_string(), + }, + }, + }, + scale: None, + payer: TargetFilter::Controller, + }, + )) +} + +/// CR 614.12a + CR 400.7j: A previously unlisted resolution-owned prompt must +/// survive the replacement pause and resume the Emperor continuation. +#[test] +fn emperor_of_bones_preserves_pay_amount_choice_through_replacement_pipeline() { + let mut scenario = GameScenario::new_n_player(2, 7); + scenario.at_phase(Phase::PreCombatMain); + let emperor = scenario.add_creature(P0, "Emperor of Bones", 2, 2).id(); + let peacekeeper = { + let mut builder = scenario.add_creature_to_exile(P0, "Anointed Peacekeeper", 3, 3); + builder.from_oracle_text(ANOINTED_PEACEKEEPER); + builder.id() + }; + + let mut runner = scenario.build(); + runner.state_mut().exile_links.push(ExileLink { + exiled_id: peacekeeper, + source_id: emperor, + kind: ExileLinkKind::TrackedBySource, + }); + runner + .state_mut() + .objects + .get_mut(&peacekeeper) + .unwrap() + .replacement_definitions = vec![pay_amount_choice_replacement()].into(); + + let definition = parse_effect_chain(EMPEROR_COUNTER_TRIGGER_EFFECT, AbilityKind::Spell); + let ability = build_resolved_from_def(&definition, emperor, P0); + let mut events = Vec::new(); + resolve_ability_chain(runner.state_mut(), &ability, &mut events, 0) + .expect("Emperor of Bones return must reach the replacement PayAmountChoice"); + + let WaitingFor::PayAmountChoice { + player, min, max, .. + } = runner.state().waiting_for.clone() + else { + panic!( + "the replacement must preserve its PayAmountChoice, got {}", + runner.waiting_for_kind() + ); + }; + assert_eq!(player, P0); + assert_eq!(min, 0); + assert!(max > 0); + + runner + .act(GameAction::SubmitPayAmount { amount: 0 }) + .expect("answer the replacement PayAmountChoice through GameRunner::act"); + + let state = runner.state(); + assert_eq!(state.objects[&peacekeeper].zone, Zone::Battlefield); + assert!(matches!( + state.waiting_for, + WaitingFor::Priority { player: P0 } + )); + assert!(state.stack.is_empty()); + assert_eq!( + state.delayed_triggers.len(), + 1, + "the Emperor delayed sacrifice rider must resume after the replacement choice" + ); +} From 1bb6c1d02ee5934e40fa10805f7e4ff69a27e64b Mon Sep 17 00:00:00 2001 From: Matt Evans <1388610+matthewevans@users.noreply.github.com> Date: Mon, 10 Aug 2026 09:20:44 -0700 Subject: [PATCH 14/15] chore(card-data): refresh MTGJSON token & subtype catalogs (#7209) --- crates/engine/data/mtgjson-vintage | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/engine/data/mtgjson-vintage b/crates/engine/data/mtgjson-vintage index 96d70ec068..03d87f1551 100644 --- a/crates/engine/data/mtgjson-vintage +++ b/crates/engine/data/mtgjson-vintage @@ -1 +1 @@ -2026-08-09 +2026-08-10 From a50d51ba496eb366c6a5a53c6908d50eadf329d0 Mon Sep 17 00:00:00 2001 From: traemyn Date: Mon, 10 Aug 2026 13:58:10 -0500 Subject: [PATCH 15/15] Fix zero-count mana color prompts --- crates/engine/src/game/effects/mana.rs | 2 +- crates/engine/src/game/mana_abilities.rs | 40 ++++++++++++++++--- .../coalition_relic_integration.rs | 8 ++++ 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/crates/engine/src/game/effects/mana.rs b/crates/engine/src/game/effects/mana.rs index ad9f8309c0..ed7bc934ea 100644 --- a/crates/engine/src/game/effects/mana.rs +++ b/crates/engine/src/game/effects/mana.rs @@ -198,7 +198,7 @@ pub fn resolve( &ability.effect, state, ability.source_id, - Some(ability), + Some(count_ability), ) }) .flatten(); diff --git a/crates/engine/src/game/mana_abilities.rs b/crates/engine/src/game/mana_abilities.rs index f7f593aee6..d926a781e7 100644 --- a/crates/engine/src/game/mana_abilities.rs +++ b/crates/engine/src/game/mana_abilities.rs @@ -943,7 +943,13 @@ pub(crate) fn mana_choice_prompt( }; match produced { ManaProduction::AnyOneColor { color_options, .. } if color_options.len() > 1 => { - Some(ManaChoicePrompt::SingleColor { + let produces_mana = ability + .map(|ability| { + !super::effects::mana::resolve_mana_types_for_ability(produced, state, ability) + .is_empty() + }) + .unwrap_or(true); + produces_mana.then(|| ManaChoicePrompt::SingleColor { options: color_options.iter().map(mana_color_to_type).collect(), }) } @@ -978,7 +984,13 @@ pub(crate) fn mana_choice_prompt( .into_iter() .map(|color| mana_color_to_type(&color)) .collect::>(); - if options.len() > 1 { + let produces_mana = ability + .map(|ability| { + !super::effects::mana::resolve_mana_types_for_ability(produced, state, ability) + .is_empty() + }) + .unwrap_or(true); + if options.len() > 1 && produces_mana { Some(ManaChoicePrompt::SingleColor { options }) } else { None @@ -1038,7 +1050,13 @@ pub(crate) fn mana_choice_prompt( owner, source_id, ); - if options.len() > 1 { + let produces_mana = ability + .map(|ability| { + !super::effects::mana::resolve_mana_types_for_ability(produced, state, ability) + .is_empty() + }) + .unwrap_or(true); + if options.len() > 1 && produces_mana { Some(ManaChoicePrompt::SingleColor { options }) } else { None @@ -1051,7 +1069,13 @@ pub(crate) fn mana_choice_prompt( ManaProduction::AnyInCommandersColorIdentity { .. } => { let owner = state.objects.get(&source_id).map(|obj| obj.controller)?; let identity = super::commander::commander_color_identity(state, owner); - if identity.len() > 1 { + let produces_mana = ability + .map(|ability| { + !super::effects::mana::resolve_mana_types_for_ability(produced, state, ability) + .is_empty() + }) + .unwrap_or(true); + if identity.len() > 1 && produces_mana { Some(ManaChoicePrompt::SingleColor { options: identity.iter().map(mana_color_to_type).collect(), }) @@ -1067,7 +1091,13 @@ pub(crate) fn mana_choice_prompt( ManaProduction::OpponentLandColors { .. } => { let owner = state.objects.get(&source_id).map(|obj| obj.controller)?; let options = super::mana_sources::opponent_land_color_options(state, owner); - if options.len() > 1 { + let produces_mana = ability + .map(|ability| { + !super::effects::mana::resolve_mana_types_for_ability(produced, state, ability) + .is_empty() + }) + .unwrap_or(true); + if options.len() > 1 && produces_mana { Some(ManaChoicePrompt::SingleColor { options }) } else { None diff --git a/crates/engine/tests/integration/coalition_relic_integration.rs b/crates/engine/tests/integration/coalition_relic_integration.rs index f1bc91b9ec..c1949e8cd1 100644 --- a/crates/engine/tests/integration/coalition_relic_integration.rs +++ b/crates/engine/tests/integration/coalition_relic_integration.rs @@ -235,4 +235,12 @@ fn coalition_relic_with_zero_charge_counters_produces_no_mana() { 0, "zero counters → zero mana" ); + assert!( + matches!( + state.waiting_for, + engine::types::game_state::WaitingFor::Priority { .. } + ), + "zero counters must not prompt for a mana color; got {:?}", + state.waiting_for + ); }

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 z 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