Composite study

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.

4
Approach points
4
Tools in the pack
4
Layers covered
3
Challenges documented

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.

Industry pattern this is grounded in

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

Typical launch bar: Block until pass rules hold on the money, identity, or safety path.

Challenges

01

Vendors claimed “bias tested” without showing the method.

02

Legal and people teams disagreed on what we were allowed to measure.

03

Deleting a candidate in the ATS left vectors in the RAG index.

How we tested

01

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.

02

Require a human review path; the model cannot send a rejection that is the company’s sole decision without an owner.

03

Candidate PII isolation across reqs. GDPR delete actually deletes embeddings.

04

Copilot must not add experience that is not on the CV.

Starting point vs what we required

Starting point versus the controls we required
Starting pointWhat 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

01

LLM traces / evals

  • LangSmith — Summary grounding vs the CV
02

API / contract

  • Postman — Req isolation and delete completeness
03

Adversarial evals

  • Promptfoo — Invented-employment probes
04

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

Testing stack used on this product class
LayerToolWhat we validated
LLM traces / evalsLangSmithSummary grounding vs the CV
API / contractPostmanReq isolation and delete completeness
Adversarial evalsPromptfooInvented-employment probes
Journeys / UIPlaywrightPipeline, 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.