Build a resume screening agent
· Avery NXR
You post a job. You get 400 resumes. You read 20. The other 380 get a generic rejection email or no response at all.
The math is brutal. Reading a resume carefully takes 90 seconds. Four hundred resumes is 10 hours of recruiter time per role. Most recruiting teams don't have that, so they skim, miss great candidates, and complain about the talent pool.
The right candidate is probably in the 380 you didn't read.
This post is the build for a local-first AI agent that screens resumes against your job description, scores fit, and drafts personalized screening emails for the strong candidates. With explicit bias-aware patterns and EEOC compliance considerations.
The cost of bad screening
The financial cost is the obvious one. Recruiter time, agency fees, prolonged time-to-hire. For a typical engineering hire, the total cost of a slow process is in the tens of thousands.
The hidden cost is bigger. The candidates you don't reach out to keep applying elsewhere. The good ones find jobs at competitors. The patterns repeat. Six months later, you're still hiring, and the candidates you missed are now happy in their new roles.
Manual screening doesn't scale. Outsourcing to agencies introduces a different filter (recruiter incentives don't always align with your hiring quality). Cloud AI tools route candidate PII to OpenAI which raises GDPR and EEOC questions.
The right answer for most companies is a local-first agent that screens consistently, fast, and with documented criteria.
What the agent does
The functional flow:
Resume ingestion. The agent watches your ATS or a designated folder for incoming resumes. As they arrive, they enter the processing queue.
PDF parsing. The agent extracts the resume text. For each candidate, structured data: name (anonymized in the scoring step), email, phone, current role, experience years, education, skills, recent companies, key projects.
JD matching. The agent compares the candidate's data against the job description. Scoring based on required vs preferred skills, experience level match, recent role relevance, education fit.
Fit classification. Each candidate gets a fit level: strong, medium, low. Documented reasoning for each classification.
Screening email drafting. For strong candidates, the agent drafts a personalized screening email. Not "Dear Candidate, your background looks interesting." Actually personalized: mentioning specific projects or experiences, framing the role around what they care about based on their resume.
Routing. Strong candidates surface in the recruiter's queue with the drafted email. Medium candidates queue for human review. Low candidates get a polite, prompt rejection (the kindest thing for a job seeker is a fast no).
Audit logging. Every screening decision logged. For EEOC compliance and for tuning the criteria over time.
The agent does this in minutes for hundreds of resumes. Five Avery NXR CRs, three to four focused days.
The Avery NXR build
CR 1: Resume ingestion.
"Build an ATS webhook listener for Greenhouse/Lever/Ashby (pick your ATS). On new candidate application, parse and store as Candidate record with fields: id, ats_id, job_id, applied_at, status (enum: new, parsed, scored, classified, drafted, routed, closed). Save the resume PDF to S3 with a deterministic filename. Acknowledge to ATS within 5 seconds."
CR 2: Resume parsing.
"For each Candidate in 'new' status, extract resume text from PDF. Parse into structured fields: full_name, email, phone, location, current_role, current_company, years_experience, education (list of {institution, degree, field, year}), skills (list), past_roles (list of {company, title, start, end, description}), projects (list). Store as CandidateProfile table. Anonymize the candidate name and contact info in a separate AnonymizedProfile table used for scoring."
The anonymization step matters for bias mitigation. The scoring should not see names or contact info that proxy for protected categories.
CR 3: JD matching and scoring.
"For each Candidate with parsed profile, score against the JobDescription using the local model. The prompt provides the JD's required skills, preferred skills, experience level, and key responsibilities. The model scores each candidate on: required skill match (0-100), preferred skill match (0-100), experience level fit (0-100), recent role relevance (0-100), trajectory positive signal (0-100). Output overall fit score (weighted average) and reasoning. Store as ScoringResult table."
CR 4: Classification.
"Based on the ScoringResult, classify each candidate as strong (>75), medium (50-75), or low (<50). Store classification with the reasoning. For each strong candidate, generate three specific reasons they're a fit (referencing their actual resume content) and one potential concern (if any). For medium candidates, generate the gap that prevents strong classification."
CR 5: Screening email drafting.
"For each strong candidate, draft a personalized screening email. Reference specific projects or experiences from their resume. Frame the role around what their background suggests they'd care about. Use the company's voice (provide 3 examples from past successful outreach). Include a CTA for a 15-minute initial conversation. Output as a draft for human review before sending."
CR 6: Routing and rejection handling.
"For strong candidates, push the drafted email to the recruiter's review queue. For medium candidates, queue for human review (no drafted email yet). For low candidates, send a polite rejection within 24 hours using a templated message. Log every routing decision."
CR 7: EEOC audit log.
"Build a comprehensive audit log capturing every screening decision. For each candidate: the structured data used for scoring (anonymized), the scoring criteria applied, the score breakdown, the classification, and the routing. Retain for 3 years (federal requirement). Provide an export interface for legal or EEOC review."
That's the system. Seven CRs, four focused days for a typical recruiting team.
The EEOC compliance pattern
This is where most "AI for recruiting" deployments get into trouble. The EEOC has specific expectations for AI in hiring.
The Avery NXR build addresses these:
Documented criteria. The scoring is based on job-related criteria documented in the JD. No magic AI judgment. The auditor can see exactly what was evaluated.
Consistent application. Every candidate is scored against the same criteria. No criteria drift between candidates.
Anonymization for scoring. The scoring model doesn't see name, photo, or other proxies for protected categories. Bias has fewer vectors to enter.
Human in the loop for adverse decisions. Rejections go out after the agent classifies, but the classification criteria are pre-documented and auditable. For roles where you want even more conservative handling, route rejections through human review before sending.
Audit trail. Every decision logged. Every score documented. Every classification reasoned. Auditors love this.
Bias monitoring. Periodically pull the audit log and look for disparate impact. Are the classification rates similar across genders (inferred from names where possible) or other observable characteristics? If you see disparity, investigate the criteria, not the candidates.
This pattern is more defensible than the typical "we use our gut" hiring process. Documented and consistent beats opaque human judgment from a discrimination liability standpoint.
What still requires human review
Worth being explicit about the boundaries.
Final hiring decisions. The agent screens; the human decides. Always.
Edge cases the agent classifies as medium. The diamond candidates often have non-traditional backgrounds the algorithm misjudges. Human review catches them.
Anything where the candidate's resume notes context the algorithm can't read (career gaps for caregiving, non-linear paths, recent immigration). Human review handles these humanely.
Roles where the JD is poorly written. The agent only knows what the JD specifies. If the JD doesn't reflect what you actually need, the screening reflects the JD's problems.
Internal candidates and referrals. These typically need different handling and shouldn't go through the standard screening flow.
The right framing: the agent does the mechanical filtering. The human does the judgment.
Real outcomes from a deployment
A deployment at a 300-person tech company hiring 20 engineers per quarter:
Pre-agent: 100 hours of recruiter screening time per quarter. 8 percent of applicants made it to first interview. The team complained constantly about lead quality.
Post-agent: 15 hours of recruiter screening time per quarter (focused on the medium-fit candidates). 22 percent of applicants made it to first interview (because the agent surfaced strong candidates the rushed manual screening had been missing).
Time-to-hire dropped from 47 days to 28 days. Candidates appreciated the fast, personalized first contact. Hiring managers loved getting better candidates faster.
The build took 60 engineering hours spread across three weeks. The ROI was apparent in the first hiring cycle.
The voice extraction matters
The biggest single quality factor in the drafted screening emails is voice. Generic AI-drafted outreach reads as AI-drafted outreach. Candidates can tell.
Solution: provide the agent with examples of your recruiting team's best emails. Five to ten examples is enough. The model extracts the voice patterns and applies them.
The result: emails that sound like a thoughtful recruiter who actually read the resume. Candidates respond at much higher rates because the outreach feels personal.
For each role family (engineering, sales, design, etc.), maintain a separate voice example set. The right tone for engineering outreach is different from sales outreach. Match the patterns.
When this doesn't work
A few cases where the agent isn't the right answer.
Very low volume. If you hire 2 people per year, the screening time isn't enough to justify the build.
Highly creative roles where resume signal is weak (artists, certain design roles). Portfolio review can't be automated easily; human is the bar.
Senior leadership roles where every candidate gets a phone call regardless of paper fit. The funnel shape is different.
Very small companies where every applicant gets a personal response from the founder. Don't lose the founder touch by automating it away.
For most engineering, product, sales, and operations roles at scale, the agent works.
The cost comparison
For a 300-person company hiring 50 roles per year:
Manual screening: 50 hours per role times 50 roles is 2,500 recruiter hours per year. Real money in salary.
Off-the-shelf AI recruiting tools: per-candidate fees or per-job-post fees. Add up fast at hiring volume.
Custom local agent: build cost plus operational cost. The build pays back in months at this hiring volume.
For a smaller company hiring 10 roles per year, the math still works because the marginal hour saved per role compounds.
The integration with your ATS
Greenhouse: webhook for new candidates, API for updates, custom fields for the scoring metadata. Reasonable integration story.
Lever: similar pattern. Webhooks and API.
Ashby: same.
Workday Recruiting: harder. Complex integration patterns. Plan extra time.
Smaller ATS: usually have an API. Check it before committing to the build.
If your ATS doesn't have decent API support, you might end up doing email-based ingestion (forward resumes to a watched inbox). Less elegant but works.
The v1.1 additions
After the core ships, the natural extensions:
Phone screen scheduling. For candidates who accept the initial outreach, the agent handles scheduling against the recruiter's calendar.
Interview prep. For each candidate moving forward, the agent generates suggested interview questions based on their resume and the role.
Reference check workflows. The agent helps gather references and follow up with reference-givers.
Post-hire feedback loop. After a hire's been on the team for 90 days, capture whether the manager is happy. Tune scoring criteria based on which screening signals correlated with successful hires.
Each is a separate CR set. Ship the screening core first.
The strategic value
Hiring is one of the highest-leverage activities at any company. A great hire compounds; a bad hire creates years of pain.
Better screening means more great hires. More great hires means the company executes better. The compounding is real.
For most companies, the screening process is the bottleneck. Recruiters can only read so many resumes. The good candidates get lost in the volume.
A local-first screening agent doesn't replace recruiter judgment. It expands recruiter capacity, surfaces candidates manual screening misses, and produces faster, more personalized outreach.
The build is doable. The ROI is fast. The strategic impact compounds.
avery.software