JobCache/CareerVector URL-Language Handoff
Status on 2026-05-29:
- CareerVector bottom-up
job.createstill 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
undwhen it is not. - CareerVector-origin public ad writes must be
Observationenvelopes queued as D1jobcache_commands.submit_observation; no new flat payload wrapper should be added.
Current CareerVector-side contract:
lookupJobcacheAdsendslanguage=<normalized-language>to/api/ads/lookupwhen a workspace job has an ad language.job.createforwardsattributes.languageinto the server-side jobcache ensure hook.- Ensure-ad commands include
payload.languageonly for known language buckets; unknown language continues to omit it and remains the URL-onlyundshell. - 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/lookupto accept optional language without changing the Observation envelope. - In the Cockroach lookup, when language is provided, prefer exact
(normalized_url, language)oradIdFromUrlLanguage(url, language). - Fallback from a requested concrete language should only use the
undshell; 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.