This is a product-class write-up, not a named-client story and not a results press release. Counts below describe the pack we actually write (approach points, tools, layers) — not invented bug totals or conversion lifts.
Overview
The dashboard showed a single “fit” score. Recruiters sorted by it. Proxy features (sport, certain colleges, years of a given hobby) encoded gender and age.
The LLM rewrite of recruiter notes also invented jobs the candidate never listed.
Amazon scrapped an internal recruiting engine after it penalized the word “women’s” and graduates of two women’s colleges (Reuters, 2018). EU-style high-risk AI rules treat employment scoring as a different class of product.
Highlights
- Slice testing where lawful
- Human review as a control
- Embedding-store inclusion in GDPR delete
Typical launch bar: Block until pass rules hold on the money, identity, or safety path.
Challenges
Vendors claimed “bias tested” without showing the method.
Legal and people teams disagreed on what we were allowed to measure.
Deleting a candidate in the ATS left vectors in the RAG index.
How we tested
Slice outcomes and scores by available demographic flags in a lawful test set — or use synthetic resumes that differ only on a protected-attribute proxy the client is allowed to test.
Require a human review path; the model cannot send a rejection that is the company’s sole decision without an owner.
Candidate PII isolation across reqs. GDPR delete actually deletes embeddings.
Copilot must not add experience that is not on the CV.
Starting point vs what we required
| Starting point | What we required |
|---|---|
| Vendors claimed “bias tested” without showing the method. | Slice outcomes and scores by available demographic flags in a lawful test set — or use synthetic resumes that differ only on a protected-attribute proxy the client is allowed to test. |
| Legal and people teams disagreed on what we were allowed to measure. | Require a human review path; the model cannot send a rejection that is the company’s sole decision without an owner. |
| Deleting a candidate in the ATS left vectors in the RAG index. | Candidate PII isolation across reqs. GDPR delete actually deletes embeddings. |
What we delivered
LLM traces / evals
- LangSmith — Summary grounding vs the CV
API / contract
- Postman — Req isolation and delete completeness
Adversarial evals
- Promptfoo — Invented-employment probes
Journeys / UI
- Playwright — Pipeline, offer, rejection templates
Outcomes
We would not rubber-stamp a fairness claim. We reported slice gaps, proxy features, and the missing challenge path as High. Invented experience failed a grounded-summary eval.
Delete-path tests included the vector store. Recruiter isolation was an API test.
Stack
| Layer | Tool | What we validated |
|---|---|---|
| LLM traces / evals | LangSmith | Summary grounding vs the CV |
| API / contract | Postman | Req isolation and delete completeness |
| Adversarial evals | Promptfoo | Invented-employment probes |
| Journeys / UI | Playwright | Pipeline, offer, rejection templates |
Same method as the rest of our work: severity-ranked findings, pass rules in writing, and a ship / wait / block call. See the evaluation method and tool comparison.