jobhunt-platform/docs/adr/0003-v11-scope.md
hermes 5e539ba713
Some checks failed
CI / api-tests (push) Failing after 31s
CI / package-tests (push) Failing after 25s
CI / web-tests (push) Failing after 35s
ADR-0003 v1.1 scope + wave A dispatch cards (feel-alive: email watch, notify, dedupe, tailor, deadlines)
2026-07-30 20:36:02 +00:00

27 lines
2.3 KiB
Markdown

# ADR-0003: v1.1 scope (feel-alive features + killer demo)
Status: accepted (2026-07-30)
## Features
1. **Email reply tracking (read-only)**: IMAP poll (stdlib imaplib, env `IMAP_HOST/PORT/USER/PASS`, flag `EMAIL_WATCH_ENABLED` default false) every 15 min via scheduler. New messages matched to applications by contact domain/company; cheap-LLM classify into `interview_invite | rejection | question | noise`. Result stored as `suggestion` rows; user confirms card moves (state transitions stay user-gated per ADR-0001, no auto-move in v1.1).
2. **Notifications**: `NotificationChannel` interface; v1.1 implementations: `LogChannel` (default), `WebhookChannel` (generic POST to user URL, documented Hermes-webhook example). Triggers: daily digest (07:30), interview-invite suggestion. Payload: text + data JSON.
3. **Agency duplicate detection**: deterministic similarity (packages/matching with rapidfuzz: normalized employer name match OR token_set_ratio(title)>=85 AND token_set_ratio(description)>=80 -> same cluster). No LLM. `cluster_id` groups postings; API surfaces alternates ("same role via 3 agencies").
4. **CV tailoring per posting**: strong-class task `cv_tailor` -> tailored CV variant JSON (reordered skills, rephrased bullets toward posting keywords, unchanged facts — hallucination guard: only reorder/rephrase existing content, never invent). Stored as artifact(kind=cv) variant linked to application. ATS keyword report: deterministic keyword coverage (tokenizer intersection, no LLM).
5. **Deadline radar**: cheap extraction task `deadline_extract` during scoring; nullable `apply_by date` on job_posting (migration 004); /today adds `deadlines` strip (next 7 days).
## Rules kept
- Approval gate untouched; email watch is read-only.
- Zero-config still works: everything above degrades to mock/log/no-op.
- No paid-provider fallback for cheap classes.
## v1.1 delivery shape
Wave A (parallel, no shared files):
- WA1 apps/api: email watch + notifications + suggestion endpoints (owns main.py/schemas.py/migrations this wave)
- WA2 packages/matching (new) + packages/llm-gateway (mock additions only)
Wave B (after merge):
- WB1 apps/api: dedupe integration + cv-tailor + deadline endpoints (owns main.py etc.)
- WB2 apps/web: v1.1 UI (suggestions inbox strip, cluster alternates, tailor button + variant viewer, deadlines strip, notification settings stub)