Studio agent — built in-houseTalent · Screening
Recruitment Screening Agent
Screens a whole candidate pool the way a senior recruiter would — and shows its reasoning.
$npm run recruit
$ npm run recruit
Recruitment Screening Agent · 12 synthetic candidates
Screening a Senior Backend (Payments) role. The full recorded run: read the spec, screen twelve candidates, rank the shortlist, enforce the notice-period deal-breaker, and draft outreach for the top three.
4
Axes scored per candidate
12
Candidates screened in the run
90-day
Deal-breaker it enforced
3
Outreach messages drafted
Screening is judgment at volume, and the two cheap ways to do it both fail. Keyword filters pass a confident-sounding résumé that has never touched the actual problem, and quietly drop a perfect candidate who phrased it differently. A human reading every profile is right, but does not scale to a pool arriving every day. The job needed something that reasons about fit — domain depth, seniority, and the constraints that actually kill a hire, like a notice period — not something that pattern-matches on tokens.
A ReAct loop with a small set of tools. The agent reads the job spec, pulls the full pool, and scores each candidate 0–100 on skills, experience, domain depth, and availability. The deal-breaker logic is explicit: a notice period past the threshold demotes an otherwise-elite engineer below a weaker-but-available one, and the flag says exactly why. The model only ever decides; the harness owns the data and the tools, and every step is logged so the run can be replayed.
A runnable agent. In the recorded run it screened a pool of twelve candidates for a Senior Backend (Payments) role, ranked a five-person shortlist, and — the part that matters — demoted the single strongest engineer in the pool to the bottom because a 90-day notice period broke a stated deal-breaker, saying so in plain language. It then wrote specific, non-generic outreach for the top three. The transcript below is that exact run, on synthetic candidate data.
Capabilities
Built with
4 tools, one decision loop.
read_job
Loads the role spec — must-haves, nice-to-haves, and the deal-breakers the screen has to honour.
get_pool
Pulls every candidate profile in one call so the agent reasons across the whole pool, not one résumé at a time.
shortlist
Persists a ranked shortlist with per-axis scores, an overall, and honest risk flags — validated against real candidate ids by the harness.
draft_outreach
Writes a genuine, specific message per top candidate, led by the single most compelling reason the role fits them.
The calls that decide whether it survives contact.
Deal-breakers beat raw talent
The strongest technical profile in the pool was ranked last, because a 90-day notice contradicted a hard requirement to hire inside a quarter. An agent that quietly forwards an un-hireable candidate wastes everyone’s time; this one is built to make the constraint louder than the pedigree.
The model decides, the harness acts
The agent never touches the data store directly — it emits an action, the harness executes it and returns the observation. That boundary is what makes every screen auditable after the fact, and what keeps a model from inventing a candidate that was never in the pool.
Outreach is written, not templated
Each message is generated against that candidate’s actual background and a chosen angle, not filled into a mail-merge. A recruiter can send it or edit it, but it never reads like a blast.
Full transparency
This is one of our own studio agents, not client work. It runs on sample data we built ourselves, and the terminal above replays a real recorded run — the reasoning, tool calls, errors and timings are exactly what happened, only the playback is paced for watching. We show it because it is the honest version of “we build AI agents”: code you could run, not a slide.