Inspiration
I run agency-side recruiting and Meta Ads work alongside my CS degree, and I've watched recruiters lose real hours to manual resume review, then watch the AI tools built to fix that get distrusted anyway, because a black-box score isn't something you can defend to a hiring manager or a candidate who asks "why wasn't I shortlisted?" Keyword filters reject people for formatting. AI rankers reject people, and nobody can say why. Build Week was the forcing function to actually ship the fix instead of just complaining about it.
What it does
ScreenLoop takes a job description and a batch of resumes and runs three GPT-5.6 agents in sequence: a Parser that structures each resume, an Evaluator that scores every candidate requirement-by-requirement and must cite a verbatim quote from the actual resume for each judgment, and an Advocate that reviews the bottom half of the ranking specifically to argue for candidates a stricter filter would reject. If the Advocate's case is strong, the candidate is re-scored, and both numbers stay visible.
The result is a ranked shortlist where every score traces back to evidence a recruiter can inspect, override, or defend. One click drafts personalised outreach; the full reasoning trail exports as JSON or Markdown.
How we built it
GPT-5.6 first turns the job description into discrete, checkable requirements, then powers all three agents with structured JSON outputs, no agent framework, just a plain Python orchestrator so every handoff stays readable in one sitting. Codex scaffolded the FastAPI backend and Next.js frontend, wrote the PDF/TXT extraction layer, built the SSE progress streaming, generated the synthetic resume test set, and wrote the pytest suite.
The engineering decision I care most about: the backend never trusts the model's self-reported score. Every evidence quote is checked against the literal resume text before it counts, and the final score is computed server-side from verified, weighted requirement coverage, not whatever number the LLM says. That's what makes "auditable" a real property of the system instead of a marketing line.
Challenges we ran into
The sharpest bug showed up during my own QA, not in a code review: requirement extraction from the job description originally ran on plain regex, not the model. Any JD that wasn't already formatted with bullet points collapsed into a single giant requirement, which meant every candidate's score could only land on 0, 50, or 100 the entire evidence-based ranking flattened into noise. Worse, it was reachable straight through the UI: the JD text box was editable even in the free, no-API-key demo mode, so anyone testing the app without setting up billing could trigger it silently, with no error shown.
The fix took two passes: first, replace the regex step with a real GPT-5.6 structured call (with the old heuristic kept only as a last-resort fallback), but that only protects the path where a real API key exists. Demo mode still needed its own guard, so the JD and requirement controls are now disabled client-side, and the backend independently forces the canonical requirement set at the API boundary regardless of what gets submitted, defence at both layers, verified by trying to bypass the frontend directly and confirming the backend still holds.
What we learned
The novel-sounding part of an AI product (three agents, an Advocate that argues for overlooked candidates) is not where trust actually breaks. Trust breaks in the boring preprocessing step nobody looks at twice. The most valuable audit isn't "does the model reason well"; it's "does literally every input this system might see get handled, including the ones the developer didn't imagine while building the happy path."
What's next
I already have outreach in flight to recruiting agencies as part of separate agency work. ScreenLoop is the first thing I can show them instead of just describing. Next steps: pilot with 1-2 real agencies on real (consented) resume batches, and extend the Advocate's reasoning to flag not just false negatives but requirement ambiguity the recruiter should clarify before the JD goes live.
Built With
- asyncio
- codex
- fastapi
- gpt-5-6
- nextjs
- openai-api
- pydantic
- pypdf
- pytest
- python
- react
- server-sent-events
- typescript
Log in or sign up for Devpost to join the conversation.