Cron recipe
Cron jobs are one-shot CLI scripts on the shared console bootstrap: boot once, run one use case, exit. Each run opens the resources it needs and closes them before exiting:
// bin/send-reminders.php
$app = require dirname(__DIR__) . '/bootstrap.php';
$app->boot();
$app->container()->get(SendReminders::class)();
0 7 * * * php /srv/app/bin/send-reminders.php
No scheduler inside the framework, no simulated request: the schedule lives in cron (or systemd timers), the work in an application use case.
Cron does not know whether the previous run is still going. When runs must not overlap, the use case takes a lock (see the locking recipe).