Files
jobtrackingapp/docs/ai/workload-inventory.md
T

45 lines
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 KB2 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; 2k15k → 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; 1002k → 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; 2k15k → 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; 20015k → 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; 50010k → 20k chars | short text + sidecar signals | EN/NO | interactive ≤5 s or queued; medium | P0P2 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; 4k20k | 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; 4k20k | 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; 4k20k | 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; 1k20k | 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; 5010k | 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; 5020k | 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.