What problem does it solve? OrangeHRM's event system has no automatic subscriber discovery, so developers frequently write subscribers that never fire, dispatch events with mismatched names, or struggle to understand listener priority and propagation. This Skill documents the exact conventions for defining events, writing subscribers, and registering them so decoupled pub-sub works correctly across plugins. ## Core Features & Use Cases - Event Definition Conventions: Covers the <Plugin>Events constant-holder class, Event-extending payload classes, naming rules, and dispatching from services via EventDispatcherTrait. - Subscriber Authoring & Registration: Explains AbstractEventSubscriber, getSubscribedEvents() priority arrays, and the mandatory addSubscriber() call in <Plugin>PluginConfiguration::initialize(). - Framework vs Domain Events: Maps Symfony KernelEvents listeners (authentication, authorization, exception handling) versus OHRM business events like EmployeeSavedEvent and LeaveApply, including priority ordering and stopPropagation(). - Use Case: You need to react whenever an employee is saved. Use this Skill to create a subscriber listening to EmployeeEvents::EMPLOYEE_SAVED, register it in your plugin configuration, and debug why it might not fire. ## Quick Start Ask the agent to create a new domain event and a subscriber that reacts to it in an OrangeHRM plugin, following the events skill conventions.