What problem does it solve? Setting up recurring background tasks in OrangeHRM requires understanding how the framework's Crunz-based scheduler connects host-level cron, plugin configuration interfaces, and console commands — a pattern that is easy to get wrong, leading to tasks that silently never run. ## Core Features & Use Cases - Task Registration: Implement SchedulerConfigurationInterface on a plugin's configuration class to register Task objects with cron expressions via the Schedule value object. - Fluent Scheduling API: Use Crunz methods like ->dailyAt(), ->everyFiveMinutes(), ->weekdays(), and ->timezone() to define when tasks run, with UTC as the default evaluation timezone. - Execution Logging & Debugging: Every run is recorded in the ohrm_task_scheduler_log table with command, input, timestamps, and exit status, plus error traces in src/log/scheduler.log. - Use Case: Schedule an LDAP user sync command to run every N hours only when LDAP is enabled in config, mirroring the built-in LDAPAuthenticationPluginConfiguration pattern. ## Quick Start Add a scheduled task that runs my widget:cleanup console command every day at 02:00 UTC using the OrangeHRM scheduler.