Summary
Scheduled Vercel opportunities total 2,887 per day in this repository. Moving
only the schedule does not reduce processor invocations; processor moves do.
Overlap safety classes
Cutover safety depends on whether two owners can run the same slot without duplicating a side effect. Cron Control’s slot claim deduplicates its own ticks, not a concurrent Vercel tick.Vercel Cron jobs
The Web cron catalog lists deadline reminders every four hours, but the deployed
Vercel entry runs every five minutes. Preserve the live cadence; do not run
sync-web-crons, which would also drop report automation from the schedule.
pg_cron jobs
Live jobs after replaying every migration’s schedule and unschedule calls.process-notification-batches was unscheduled by a later migration.
Retained exceptions. Each retained job runs a single statement against
Postgres tables with no HTTP, storage or provider side effect. A Cloudflare
trigger would add a Worker invocation and a service-key HTTP round trip per tick
to execute the same SQL in the same database: more cost and credential exposure,
no compute moved off Supabase. Owners should still review the three every-minute
jobs’ cadence. Any job that gains an outbound call loses its exception.
Next.js after() continuations
These run after the response on the hosting function, with no durable owner. A
crashed or recycled function silently loses them.
Processors without a hosted schedule
These routes exist but no Vercel entry, pg_cron job or Worker trigger calls them. They may have relied on the retired Docker runner; confirm the intended owner before scheduling any of them.
Workspace managed cron jobs (
workspace_cron_jobs) have a due-job claim RPC
but no live scheduler since the Docker runner retired; only run-now routes
execute them. A Cron Control job draining that claim RPC is the target, gated on
a product decision because enabling it starts user-defined outbound requests.
Existing Cloudflare owner
apps/cron-control runs every five minutes, requeues stale push batches and
calls the Web immediate-delivery processor only when a pending immediate batch
exists. See Cloudflare Cron Control.
Migration waves
- Scheduler move, default off. Add every Vercel job and the exchange-rate pg_net job to Cron Control with flags off. Enable cheapest first: cleanup media, products, smart schedule, trust cache; then claim-fenced Web jobs; then handover jobs; the every-minute sampler last, after its retirement decision.
- Processor moves. Start with checkout expiry (atomic RPC), then cleanup media (durable cursor), products and trust cache as Worker processors.
- Queues. Move notification, email, announcement and report delivery, then
the
after()sites, onto Queue consumers with attempt budgets aligned to their existing claims. - Retirements. Decide the Docker-era sampler and alerts and the Hive simulation route with their owners.