Overnight loop — CrateDB cutover cleanup + observability — 2026-06-08

Autonomous /loop on careervector + jobcache while you slept ("make it more workable; try e2e; use the admin interfaces; observe everything"). Centered on the fallout of the CockroachDB → CrateDB cutover. All work pushed to main.

Verdict

The cutover had left real breakage this loop was ideal for catching: the operator cockpit was fully broken against CrateDB, the control-plane catalog was never re-synced after the DB wipe (so ingestion had nothing to plan against), and the test suite had 3 latent failures. All fixed + deployed + live-verified. The system is now stable, observable, and configured + ready — the corpus is empty only because the planner hasn't been triggered (your call: it starts live scraping).

Shipped + pushed (commits b7888939cd7628f5)

  • #68 Tier-2 headless ingestion — Rust render device + capability routing (landed; suites green).
  • jobcache ops cockpit → CrateDB (100%) — it pointed at the dead Cockroach AND ran Cockroach-shaped SQL (every direct-DB panel read "down"). Ported the whole DB layer (crdb.ts fetch_types/ssl; percentile/ROW_NUMBER/array_length/info_schema 'doc'; raw OBJECT audit write; the reserved-word AS "user" live-only bug), repurposed the Cockroach RU panel → CrateDB sys.* disk/health, lifted the snapshot schema (#77), swapped the worker secret to the CrateDB DSN, redeployed both workers. Verified live across API/UI/MCP/snapshot.
  • Whole test suite green — fixed 3 latent failures: a 2nd stale jobcache_planner CI assertion (lanes removed in f750f8fa), a bundle-equivalence hook-timeout flake (bumped hookTimeout), and wiki graph-claim path rot from the June-5 infra-repo split. bun 52 pkgs + cargo 16 crates = exit 0.
  • Source catalog re-synced — the missing post-wipe step (POST /api/catalog/sync, its designed purpose): 5 sources, 5 adapters, 6 active bindings restored; fleet confirmed alive (3 devices, heartbeats).
  • Cockpit readiness diagnosis (#79)/ingestion-health now returns a readiness block; live = DORMANT — 5 sources / 6 active bindings configured, 3/3 devices alive; 0 tasks queued, planner has not run. No more misleading zeros.
  • Post-cutover naming hygiene (createCratedbSessionStore, database_url_required) + stray committed-binary cleanup.

Current state

  • jobcache LIVE on CrateDB; cockpit operational (GREEN, 12/12 tables, ~176 ms); fleet alive; corpus empty + DORMANT (awaiting planner).
  • CV unaffected (runs on D1); app + ops cockpit + status all healthy.
  • Tests green; observability solid (every cockpit panel dug + verified accurate).

Needs you (gated — I deliberately did NOT act)

  1. Start ingestion → fills the corpus, makes jobcache demonstrable. The control-plane is ready; this triggers live scraping of the Swiss boards (jobs.ch, jobup.ch, …) — a prod op (you said "dev not prod"), so yours to fire. Start small + watch the cockpit readiness flip dormant→active + ads appear:
    curl -X POST https://api.jobcache.corbet.ch/api/planner/run \
      -H "Authorization: Bearer $JOBCACHE_CONTROL_TOKEN" -H 'content-type: application/json' \
      -d '{"max_tasks":5,"max_urls_per_binding":2}'
    
    (token = sops -d ~/.agent/secrets/jobcache-control.yml | yq -r .api_key)
  2. #78 — CV ops CF-quota panel is dark (rolls CV ops up to not_configured). Fix = mint a read-only Account Analytics:Read CF token, set CV_CF_ACCOUNT_ID (f2b2e900…) + CV_CF_API_TOKEN secrets on careervector-ops-api. I held off because it's credential creation. Approve-and-go; restores quota observability + flips the rollup operational.
  3. #72 — jobcache product dashboard (jobcache.corbet.ch config over @cv/public-ui): needs a design session for the tabs.
  4. #66 — the sporewright orchestrator (on alwaysdata) that auto-drives the planner = the biggest lever; #70 (verify-stall, symptom cleared by the wipe) folds in here.

Loop left running in light monitoring mode (watching for new commits / planner activity / errors).

kind: journal nodes:

  • jobcache-cratedb-cutover-cleanup-2026-06-08 summary: "Working record of the JobCache CrateDB cutover cleanup on 2026-06-08." links: event:
    • jobcache-cratedb-cutover-2026-06-08 implementation:
    • jobcache-cratedb-migration

Source: wiki/content/working-memory/CRATEDB-CUTOVER-CLEANUP-2026-06-08.md