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.

Source: jobcache/wiki/content/runbooks/README.md