0020 — V2 scope: AI relevance only; score orders, never filters; embeddings deferred¶
Status: accepted
V2 candidates were: AI relevance (extraction + scoring), embeddings, more ATS adapters (BambooHR/Workday + a generalized POST/pagination contract), and the openjobdata evaluation. Building them together couples an LLM feature to source-expansion work that ADR-0017 may make redundant.
Decision.
- V2 is AI relevance only:
int_jobs_structured(typed extraction) +int_jobs_scored(fit score) + a score-aware digest. Implementation contract:docs/v2-plan.md. - The fit score orders the digest, it does not filter it. Every new posting is still delivered, best-fit first with the score shown. Same posture as ADR-0015: annotate, never drop — until the score has earned trust against real deliveries, a threshold would silently hide mis-scored postings exactly when the model is least calibrated. Revisit a threshold in V3's feedback loop.
- Embeddings are deferred out of V2. Their two stated jobs have no current payoff: as a cost pre-filter they save pennies at this scale, and cross-source near-duplicate collapse is moot while each company lives on exactly one ATS. Reconsider when either premise changes (openjobdata adoption would change both).
- Adapters and openjobdata stay parked behind their ADR-0013/0017 gates, unchanged.
- The candidate profile is private config like the company list (ADR-0011):
config/resume.yaml(gitignored) with a committedconfig/resume.example.yaml; a typed loader renders the deterministic, versioned prompt block the scoring model consumes. (Refined by ADR-0027: the profile was originally specified as lists of skills and became a corpus of work-history bullets, which is why the filenames say resume. The posture here — private config, typed loader, versioned prompt — is unchanged.)