# 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.