Why screening breaks rules-based automation
High-volume candidate screening is the textbook case for AI automation, and the textbook case for why keyword filters fail at it. A CV is unstructured. The same experience gets described five different ways. Filter on keywords and you reject strong candidates who used the wrong noun. Loosen the filter and you are back to reading everything by hand.
So most teams end up doing both: a crude filter that removes the obvious no, and a human reading whatever survives. The filter creates false negatives nobody ever sees. The human creates a bottleneck everybody feels.
What we built
An agent that reads each application in full, evaluates it against the criteria for that specific role, and produces a score with the reasoning attached. Not a keyword match. An assessment, with an explanation a hiring manager can argue with.
- Extraction: unstructured CVs and applications parsed into a consistent structure.
- Evaluation: scored against role-specific criteria, not a global keyword list.
- Reasoning: every score carries the justification that produced it.
- Escalation: low-confidence and borderline cases routed to a human rather than decided.
- Audit trail: every decision logged, so a rejection can be explained months later.
The part that mattered most was not the scoring
It was the escalation. A screening system that confidently rejects the wrong person is worse than no system at all, because the failure is invisible. Nobody ever finds out about the good candidate who was filtered out.
So we built it to know when it is uncertain and hand over rather than guess. That is what made it trustworthy enough to actually deploy on real hiring decisions.
The audit trail exists for the same reason. Hiring decisions have to be defensible, sometimes long after the fact. An agent that cannot explain itself cannot be used for this, no matter how accurate it is.
The stack
React for the reviewer interface, Express and MongoDB for the pipeline and decision log, OpenAI for extraction and evaluation. Deliberately unexotic. The difficulty here was in the guardrails and the escalation logic, not in the model.
Results
Filtering time down 60%. Support load down 40%. Hiring accuracy doubled.