Runbooks
For the full corpus-ingest pipeline (catalog → planner → broker → device → ads), how to run a device sink in each format, the four drain-rate limiters, and the cockpit panels that diagnose ingestion, see Ingest Operations.
Deploy
The Render jobcache-interface compatibility service is provider-suspended.
Pushing this repository must not be treated as a JobCache product deployment.
The target App API and MCP are separate Cloudflare Workers. Provision their
production D1, rate-limit bindings, service binding or HTTPS Core URL, distinct
capability secrets, domains, and authenticated erasure-drain schedule through
the canonical OpenTofu workspace at cloud/tofu/cf-jobcache/. Apply the
CareerVector D1 and Core Crate lifecycle migrations before binding worker
credentials. Remove the legacy Crate-backed session routes before reactivating
Core, then cut DNS and the compatibility smoke contract in the same coordinated
change. There is no JobCache App UI deployment in this phase.
Planning Device Work
Hourly CircleCI jobcache_planner runs from .circleci/config.yml on
resource_class: corbet/unraid and hits POST /api/planner/run with the
control token. The job uses JOBCACHE_API_URL and only queues device tasks; it
does not scrape centrally.
Manual planner tick:
curl -X POST \
-H "Authorization: Bearer $JOBCACHE_CONTROL_TOKEN" \
-H "Content-Type: application/json" \
--data '{"max_tasks":25,"max_urls_per_binding":5}' \
"$JOBCACHE_API_URL/api/planner/run"
Devices then lease work and submit Observations through the broker endpoints.
Drain control commands
If a workspace queues control commands for jobcache (e.g. via
careervector-api's jobcache-commands route), they accumulate in the DB
until a drain runs.
curl -X POST \
-H "Authorization: Bearer $JOBCACHE_CONTROL_TOKEN" \
'https://jobcache.corbet.ch/api/commands/drain'
Capability credentials
The general Core control credential, Core lifecycle credential, App delivery credential, App lifecycle credential, and CareerVector erasure-worker credential are distinct capabilities. Configured values must be pairwise different and at least 24 characters. Rotate and distribute them through the canonical OpenTofu/sops workflow; never collapse them into one legacy control token. See API credentials for the exact ownership and route matrix.