central-worker-6 0dbc81684b #2980: ticketing:auto-close is scheduled by this snap-in, not by the shell
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>
2026-09-27 04:29:21 -07:00
2026-04-08 14:12:03 -07:00
Description
Ticketing snap-in for dashboard-shell
Readme 756 KiB
Languages
PHP 100%