# JobTracker AI workload inventory

Date: 2026-08-02

This inventory is code-derived, not a production measurement. Typical sizes and latency targets are initial evaluation bands for synthetic benchmarks; they are not observed production SLOs. Current provider means the repository default path, not a verified production setting.

Privacy classes used by the next policy package:

- `P0 public`: synthetic/public job text without user data.
- `P1 account`: user settings or application metadata without CV/email bodies.
- `P2 private`: CV/profile, notes, drafts, contacts or email content.
- `P3 credential`: provider tokens/secrets; never a model input.

| ID | Task and reachable path | Input / typical → max | Output | Language | Target / quality | Privacy and fallback candidate | Mode | Deterministic? | Current provider/model | Pro |
|---|---|---|---|---|---|---|---|---|---|---|
| DOC-EXTRACT | CV/attachment text extraction; `/extract-text` | PDF/DOCX/image/text; 50 KB–2 MB → API 5 MB, sidecar 8 MB | text + OCR metadata | any OCR-supported | background ≤30 s; high | P2; external prohibited | interactive/background | parser/OCR, not generative | local parser/Tesseract | Yes when used for AI CV import/context |
| CV-NORMALIZE | CV structure normalization; `/cv/normalize` | extracted CV text; 2k–15k → 50k chars | strict profile JSON | EN/NO/mixed | background ≤45 s; critical factuality | P2; local default, external only explicit future consent | background | deterministic parser first; AI only unresolved structure | configurable `/cv/*`, default Ollama `qwen2.5:7b` | Yes |
| CV-CLASSIFY | ambiguous CV block classification; `/cv/classify-block` | one block; 100–2k → 6k chars | strict classification JSON | EN/NO/mixed | background ≤10 s; medium/high | P2; same as CV-NORMALIZE | background | deterministic headings first | configurable `/cv/*`, default Ollama `qwen2.5:7b` | Yes |
| PROFILE-EXTRACT | Career Profile extraction in `BuildStructuredCvAsync` | CV text; 2k–15k → composed prompt 20k | strict `StructuredCvProfile` JSON | EN/NO/mixed | background ≤60 s; critical | P2; external prohibited by default | background | deterministic parsing/fallback remains required | `/cv/rewrite`, default Ollama `qwen2.5:7b` | Yes |
| PROFILE-DIFF | conservative import/merge suggestions | old/new structured profile | field diff with explicit accept/reject | any | interactive <1 s; critical | P2; no fallback needed | interactive | Yes: `CvProfileDiffService`; keep AI out | local C# | No model call |
| JOB-CLEAN | language, stop words, keyword/phrase/skill cleanup | job advert; 200–15k → 20k chars | language/tags/phrases | EN/NO/mixed | <1 s; high precision | P0/P1; no external need | interactive/background | Yes for language/basic tags; semantic phrase extraction may be evaluated separately | local `LanguageDetector`/`SkillTagger` | No model call |
| JOB-SUMMARY | create/detail/refresh/enrichment summary | job text; 500–10k → 20k chars | short text + sidecar signals | EN/NO | interactive ≤5 s or queued; medium | P0–P2 when notes included; local default | both | AI for abstractive summary; tags stay deterministic | local `sshleifer/distilbart-cnn-12-6` `/summarize` | Yes for model call |
| JOB-MATCH | skills/missing skills/score | job text + reviewed profile | score, matched/missing skills, evidence | EN/NO | <1 s; high/reproducible | P2; no external need | interactive | Yes: `JobCvMatchService`/`ApplicationIntelligenceService` | local C# | No model call |
| STRATEGY | candidate fit, focus plan, Strategy Snapshot | job + CV + optional notes/email/attachments; 4k–20k | typed DTO/markdown narrative | EN/NO/mixed | queued target ≤60 s; high | P2; external prohibited by default | interactive → durable background planned | deterministic match evidence first; AI narrative | `/cv/rewrite`, default Ollama `qwen2.5:7b` | Yes |
| CV-TAILOR | tailored CV/headline/bullets | reviewed profile + job + optional private context; 4k–20k | editable CV draft | EN/NO | queued ≤90 s; critical factuality | P2; external prohibited by default | interactive → background planned | No, but deterministic evidence selection should constrain prompt | `/cv/rewrite`, default Ollama `qwen2.5:7b` | Yes |
| APPLICATION-DRAFT | cover letter/application answer/recruiter message | CV + job + optional email/notes; 4k–20k | editable text variants | EN/NO | queued ≤90 s; high | P2; external prohibited by default | interactive → background planned | No | `/cv/rewrite`, default Ollama `qwen2.5:7b` | Yes |
| FOLLOWUP-DRAFT | follow-up email draft | job/application state + saved drafts + optional email; 1k–20k | editable subject/body | EN/NO | interactive/queued ≤30 s; high | P2; external prohibited by default; never auto-send | interactive | No; mode/recipient validation deterministic | `/cv/rewrite`, default Ollama `qwen2.5:7b` | Yes |
| EMAIL-CLASSIFY | pipeline status from received email | subject/body; 50–10k | status suggestion + signal | EN/NO | <1 s; high precision | P2; no external need | background/interactive | Yes: `EmailStatusClassifier` | local C# | No model call |
| RECRUITMENT-DETECT | detect/link recruitment messages | headers/body/job/company signals | suggested link/category/confidence | EN/NO | background <1 s; high precision | P2; no external need for current rules | background | Yes until measured semantic gap | local C# matching/import rules | No model call |
| INTERVIEW | generated interview brief/questions | job + profile + saved state | editable brief/questions | EN/NO | queued ≤45 s; high | P2; external prohibited by default | interactive → background planned | checklist/board CRUD deterministic; brief generative | `/cv/rewrite`, default Ollama `qwen2.5:7b` | Yes |
| WRITING | CV Builder improve/shorten/expand/ATS/bullets/summary/tailor | selected user text + optional role; 50–20k | editable suggestion | EN/NO/mixed | interactive ≤20 s; high factuality | P2; external prohibited by default | interactive | grammar-only may use local deterministic tools later; no current equivalent | `/cv/rewrite`, default Ollama `qwen2.5:7b` | Yes |
| HEALTH-PROBE | service capability/latency probe | fixed synthetic sentence | metrics only | EN | ≤10 s; operational | P0; external provider probe requires later explicit policy | background/admin | fixed local request | `/summarize`; local DistilBART | Admin/operational |

## Reachability and policy observations

- `/summarize` always uses local DistilBART in the current sidecar. `/cv/*` routes dispatch through `AI_PROVIDER`, whose repository default is local Ollama but which can currently be set globally to Gemini or Groq.
- The current global provider switch cannot enforce the task/privacy distinctions above. POL-002/AI-002 must replace it before external fallback is enabled.
- `ISummarizerService` truncates composed rewrite prompts at 20,000 characters. Sidecar request models cap rewrite text at 20,000, CV normalization at 50,000, classification blocks at 6,000, and extraction bytes at 8 MB; the application CV upload boundary is 5 MB.
- Deterministic keyword cleanup, skill matching, profile diffing and email classification must not be routed through a model.
- P3 credentials are configuration inputs only and must never appear in prompts, fixtures, logs or provider payloads.

## Synthetic evaluation data

Machine-readable cases are in `JobTrackerApi.Tests/Fixtures/AiEvaluation/cases.json`. They cover all required English/Norwegian/mixed/noisy/sparse/technology/email/follow-up/strategy/strict-JSON/adversarial/injection/long/empty/invalid categories. Expected assertions are constraints rather than golden prose so later model comparisons do not reward one exact wording.
