0dbc81684bed40732c3fdf92d2a45001e8b67c3c
A spawn of [dashboard-shell] #2965. The shell's routes/console.php carried Schedule::command('ticketing:auto-close') ->dailyAt(ScheduleStagger::dailyAt('ticketing:auto-close')); for a command only this repository defines, and two repositories deploy at different moments. On 2026-09-26 01:10 PDT production met the other end of that: `Command "admissions:remind-unconfirmed-links" is not defined`, exit 1, every tick for nine and a half hours, with nothing an operator could press — the code the schedule named was not on the box yet. TicketingServiceProvider::boot() now registers the event itself, beside the $this->commands() call that defines AutoCloseTickets. A box has both or neither, because they arrive in the same commit; a shell without this snap-in gets no row in `schedule:list` rather than a nightly failure about one. WHAT DID NOT MOVE. The time: ScheduleStagger is the shell's one place a start time is chosen — a bare ->daily() is 00:00:00, where the hourly and quarter-hourly maps already meet ([dashboard-shell] #1910) — so the provider asks dailyAt() and the job stays at 00:12 exactly. And the absence of a lock: the shell's line carried no withoutOverlapping() and this adds none, because a mutex grown in passing is a behaviour change wearing a move's clothes. PAIRED with the shell half on card/2980: the console line, the TheShellSchedulesNoSnapInCommandTest::BASELINE entry and the ScheduledJobCatalog::NOT_A_REGISTERED_JOB excuse all go in the same round as this lands, and tests/Feature/Ops/TicketingSchedulesItsOwnAutoCloseTest asserts both ends at once. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
dashboard-ticketing
Description
Languages
PHP
100%