JobCache/CareerVector URL-Language Handoff

Status on 2026-05-29:

  • CareerVector bottom-up job.create still uses the workspace job URL as the public workspace identity.
  • Shared ad identity is URL x language when a language is known, and URL-only und when it is not.
  • CareerVector-origin public ad writes must be Observation envelopes queued as D1 jobcache_commands.submit_observation; no new flat payload wrapper should be added.

Current CareerVector-side contract:

  • lookupJobcacheAd sends language=<normalized-language> to /api/ads/lookup when a workspace job has an ad language.
  • job.create forwards attributes.language into the server-side jobcache ensure hook.
  • Ensure-ad commands include payload.language only for known language buckets; unknown language continues to omit it and remains the URL-only und shell.
  • RADAR/scrape Observations already carry language through the shared Observation field vocabulary when the scrape/extract path knows it.

Remaining JobCache-side work:

  • Extend the shared lookup API behind /api/ads/lookup to accept optional language without changing the Observation envelope.
  • In the Cockroach lookup, when language is provided, prefer exact (normalized_url, language) or adIdFromUrlLanguage(url, language).
  • Fallback from a requested concrete language should only use the und shell; it should not silently hydrate a different concrete language.
  • Keep all scraping, chunking, embedding, and enrichment as device/provider-emitted Observation data. The lookup path should stay a cheap read.
Source: wiki/content/working-memory/jobcache-cv-url-language-handoff.md