2.3 KiB
2.3 KiB
ADR-0003: v1.1 scope (feel-alive features + killer demo)
Status: accepted (2026-07-30)
Features
- Email reply tracking (read-only): IMAP poll (stdlib imaplib, env
IMAP_HOST/PORT/USER/PASS, flagEMAIL_WATCH_ENABLEDdefault false) every 15 min via scheduler. New messages matched to applications by contact domain/company; cheap-LLM classify intointerview_invite | rejection | question | noise. Result stored assuggestionrows; user confirms card moves (state transitions stay user-gated per ADR-0001, no auto-move in v1.1). - Notifications:
NotificationChannelinterface; 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. - 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_idgroups postings; API surfaces alternates ("same role via 3 agencies"). - 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). - Deadline radar: cheap extraction task
deadline_extractduring scoring; nullableapply_by dateon job_posting (migration 004); /today addsdeadlinesstrip (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)