🤖 Agentic AI
Application Copilot — HITL Agent
A human-in-the-loop copilot that tailors resumes and drafts screening answers from a learning memory bank — built around hardened browser automation with safety governors and human review.
Overview
An application copilot built around one idea: an agent should get cheaper and more accurate the more it runs, and it should ask a human when it’s genuinely unsure. It tailors a resume to a role, reads screening questions off a page, and drafts answers — but every low-confidence answer routes to a human for review, and every approved answer is cached so it’s instant next time.
Architecture
flowchart TD
A["Candidate profile<br/>+ target role"] --> B["Resume engine<br/>LLM tailor → DOCX / PDF"]
A --> C["Discovery<br/>public job boards"]
C --> D["Browser automation<br/>(Playwright)"]
D --> E["Screening questions<br/>read from form"]
E --> F["Answer agent<br/>memory bank → LLM"]
F --> G{"Confident?"}
G -->|"yes"| H["Draft answer<br/>+ cache to memory"]
G -->|"defer"| I["Human-in-the-loop<br/>review → approve"]
Engineering decisions
- Memory-first answering — a screening question is resolved by an exact bank hit first (instant, zero-cost), else by LLM reasoning over per-candidate memory + profile that self-scores its confidence and defers to a human when stuck. Approved answers flow back into the bank.
- Hardened browser automation — a Playwright loop that drives form controls (radio / checkbox / short / long / numeric), snaps free-text onto exact visible options so clicks always land, and survives DOM drift: a bad page is screenshotted and logged as failed without ever killing the run.
- Safety as a first-class concern — per-day caps seeded from the current count, randomized human-like delays, block-detection that aborts to protect the account, and a hard LLM timeout so a stalled call can’t freeze the session.
Highlights
- Strict per-candidate isolation — every row scoped by
candidate_id, with a separate on-disk browser profile per candidate. - Pluggable sources — a connector registry (apply / discover / profile) ingesting public job boards with skill-overlap fit scoring, behind a 46-route FastAPI backend and a Next.js “mission control” dashboard.