What problem does it solve? When implementing Pokémon battle abilities in src/battle/abilities, it is easy to tangle activation detection with effect logic in one listener, producing code that is hard to test and reason about. This Skill defines when and how to split an ability into a detection listener that fires triggerAbility and a separate effect listener on UnitTriggerAbility. ## Core Features & Use Cases - Detection/effect split pattern: Detection listeners guard conditions and call triggerAbility; effect listeners ride UnitTriggerAbility at EventPriority.Exact and apply the effect using only event.source, event.ability, and closure state. - Field-presence abilities: Maintains a closure Set of on-field holders (Unnerve, Cloud Nine, Damp) via UnitEntersField/UnitLeavesField/UnitFaints so suppression checks reduce to holders.size > 0. - Inline exceptions: Documents when to keep effects inline — when the effect mutates the detection event (Shield Dust, Run Away), needs context the trigger cannot carry (Static, Pickup, Synchronize), or one ability id covers multiple effect contexts (Dry Skin). - Use Case: While refactoring Flash Fire, you move its chance roll and condition guards into the detection listener and its boost logic into a UnitTriggerAbility effect listener, keeping the visual cue firing only on real-attempt events. ## Quick Start Refactor the ability in src/battle/abilities to split its detection listener from its effect listener using the trigger-driven pattern.