Vercel Daemons + Celery Redis probe
Editorial example; not a completed deployment tutorial.

Archive layout:
  vercel.json
  worker/Dockerfile
  worker/.dockerignore
  worker/requirements.txt
  worker/app.py
  worker/send_probe.py
  worker/test_probe.py

The image pins Python 3.12.15 slim-bookworm by digest. The Python package
versions target Python 3.12/Linux and include Celery 5.6.3 and Redis client 6.4.0.
The deployment config starts one daemon in iad1 with one Celery process slot,
1Gi memory and an explicit 60-second termination grace period.

BEFORE USE
Use an isolated project and a dedicated TLS Redis broker. Prepare the native
Redis TCP endpoint, credentials, certificate trust, network access, queue/ACL
permissions, persistence/eviction settings and connection limits.
The example uses queue daemon-probe. No result backend is configured.
It sleeps for a bounded interval and prints synthetic job IDs; it does not send
email, modify a database, prevent duplicates, or implement business retries.

LOCAL TEST WITH A REAL BROKER (not executed by the editor)
Prepare a private .env.worker file at the archive root. Docker env-file values
are raw values, not shell commands. Do not commit the file. Example shape:
CELERY_BROKER_URL=rediss://USER:ENCODED_PASSWORD@BROKER_HOST:6379/0?ssl_cert_reqs=required
Replace the placeholders with your provider's TLS connection details.

At the archive root:
docker build --platform=linux/amd64 -t vercel-celery-probe worker/
docker run --rm --name celery-probe --env-file .env.worker vercel-celery-probe

In a separate terminal at the same root:
docker run --rm --env-file .env.worker vercel-celery-probe python send_probe.py --seconds 2

The sender prints submitted plus task_id/job_id. This is publication only.
Correlate the worker's received log and started/completed JSON records.
Use --seconds 90 only in a dedicated interruption test. Observe the actual
SIGTERM time; beginning a deployment is not the same as beginning shutdown.
--job-id accepts a lowercase 32-character UUID hex value. Reusing it publishes
another task; it is not deduplicated by this script.

Record versions from the actual image:
docker run --rm vercel-celery-probe python --version
docker run --rm vercel-celery-probe celery --version
docker image inspect vercel-celery-probe --format '{{.Id}}'

VERCEL
Merge the archive's vercel.json at the actual project root; do not overwrite
unrelated settings. The dashboard project Root Directory must not be a subfolder
during this beta. Set CELERY_BROKER_URL in the project's Production environment,
then deploy the intended project to production. Preview and vercel dev do not
run daemons. Changing environment variables requires a new production deployment.
Filter dashboard Logs by source daemon and name celery-worker.
Check scaling overrides if the observed instance count differs from vercel.json.

ACKNOWLEDGEMENT AND RECOVERY
The probe has late ACK and reject-on-worker-lost enabled. Redis visibility timeout
is explicitly 120 seconds for this bounded test. These settings do not guarantee
exactly-once execution, instant redelivery, or automatic retries for all failures.
Crash loops can repeatedly requeue a task. Do not copy these choices into an
email or payment task without durable idempotency and a failure/quarantine plan.

EDITORIAL VERIFICATION
Four offline Celery tests passed on local Python 3.9.6 with Celery 5.6.3.
The task body ran eagerly with sockets forbidden; it did not use Redis or a worker.
Configuration was checked against the downloaded official schema.
Docker is not installed in the editorial environment, so Python 3.12 image build,
Linux prefork/signals, broker delivery, Vercel rollout and redelivery are unverified.

Official references:
https://vercel.com/docs/daemons
https://vercel.com/docs/daemons/config-reference
https://vercel.com/docs/daemons/limits
https://openapi.vercel.sh/vercel.json
https://docs.celeryq.dev/en/stable/getting-started/backends-and-brokers/redis.html
https://docs.celeryq.dev/en/stable/userguide/configuration.html
