Adapter Slice Plan
Rule for every slice: it ships one coherent Adapter path, validates through
ObservationSchema, and deletes any same-source code it replaces. No parallel
submitted shapes and no compatibility layer left behind.
Current State
Landed direct TypeScript Adapters:
jobs-chjobup-chostjob-chzentraljob-chnzz-jobs
Shared helpers:
schema-org-jobposting.tsbuilds the canonicalObservation.schema-org-detail.tsfetches a detail URL viaEnv.fetchand delegates to the parser.yousty.tsis the current multi-source Adapter factory pattern.
Slice Order
- Greenhouse multi-tenant family. Public JSON API, many tenants, cleanest proof of the config-driven family pattern.
- SmartRecruiters + Lever. Both are JSON API families and should mirror the Greenhouse factory shape.
- Workday. Larger value, more endpoint variance; do it after the simpler factories are proven.
- Oracle HCM. JSON family, smaller but high-value enterprise coverage.
- SuccessFactors HTML. HTML + JSON-LD details.
- SuccessFactors SPA / RMK and Phenom. Embedded-state first, browser runtime only when static extraction fails.
- LinkedIn. Requires runtime support for a browser-capable
Env.fetchselected by Adaptermethod; keep the Adapter itself source-specific and fixture-driven. - Personio, Ashby, Hibob, Workable, Recruitee, RSS, Teamtailor, Refline, Prospective, Softgarden, Umantis. One family per slice unless two shapes are genuinely identical.
- General boards and niche Swiss sources. Indeed, Xing, Adzuna, Reed, jobwatch, Stellenanzeiger, Swiss employers, universities, NGOs, hotel and pharma boards.
Per-Slice Template
Every value slice includes:
- Adapter source at
adapters/<source-or-family>.ts; family adapters export a typed source list plus a factory. - Registration in
adapters/registry.ts. - Fixture-backed tests in
test/adapters/<source-or-family>.test.ts. - Observation validation through
ObservationSchema. - Defunct-source metadata instead of silent deletion when a source is known to have migrated away.
- Validation:
bun --filter @cv/jobcache-ingest testbun --filter @cv/jobcache-ingest check
Rust/WASM Track
The Rust Adapter track can run in parallel once the host dock is stable:
crates/jobcachemirrors the shared contract and URL x language id logic.- Each Rust Adapter crate must produce the same
Observationfixture output as the TypeScript Adapter it replaces. - A TypeScript source Adapter is deleted in the same slice that its Rust/WASM replacement becomes the registered implementation.
The product model stays the same: Adapter code runs on a Device; together
they are a scraper. Devices submit Observations through the broker path.