Counterfactual audit of LLM résumé scoring
Same résumé, one detail changed. Does the verdict move? Does the model's own reasoning drive the score, or decorate it? Can better prompting fix any of it? Three experiments, one story. The short version first, the full audit below.
Frontier LLMs are already being handed résumés to score. Across 11 models, 28,050 screenings, and three experiments, one picture holds up. LLM résumé bias is real and reasoned, but small, unstable, idiosyncratic, and not fixable by prompting. Changing a single demographic line does move scores, and the score follows the model's written reasoning instead of decorating a number picked in advance. Most of that movement stays inside run-to-run noise, the models rarely agree on whom to penalise, and the one model with a stable, statistically clear bias is Qwen. Reordering the prompt or adding worked examples barely moves the needle. The three experiments below each pin down one part of that.
One row per model, joining all four experiments. Bias is the average 1-10 score change when one demographic line on the résumé changes. % sig is the share of those changes big enough to rule out run-to-run randomness. Instability is how much the score moves across repeat runs of an identical input, in score points. Coherence is the correlation between the score and the model's own stated factors, from -1 to 1. Responsiveness is how far the score follows an opinion pasted into it, where 1.0 would mean it followed all the way. Parse agreement is the share of extracted fields that match when the same document is read twice. Parse leakage is how many extracted fields move on a demographic swap, beyond what repeat readings move anyway. Eleven models is a small sample, so read this as a fingerprint and not a law.
| Model | bias | % sig | instability | coherence | responsiveness | parse agreement | parse leakage |
|---|---|---|---|---|---|---|---|
| Qwen 3 Next 80B | 0.41 | 38% | 0.24 | 0.87 | 0.56 | 0.715 | 20.95 |
| Gemini 2.5 Flash | 0.28 | 0% | 0.84 | 0.67 | 0.55 | 1.000 | 21.14 |
| Gemini 2.5 Pro | 0.24 | 0% | 0.82 | 0.93 | 0.69 | 0.984 | 3.54 |
| Mistral Small | 0.23 | 7% | 0.34 | 0.72 | 0.49 | 0.928 | 3.66 |
| Claude Fable 5 | 0.16 | 0% | – | – | – | 0.923 | 1.15 |
| Gemini 3.1 Pro · Preview | 0.11 | 0% | 0.55 | 0.94 | 0.57 | 0.982 | 6.06 |
| Claude Sonnet | 0.10 | 0% | 0.53 | 0.97 | 0.53 | 0.933 | 0.76 |
| Claude Haiku | 0.10 | 0% | 0.73 | 0.74 | 0.38 | 0.877 | 1.42 |
| Claude Opus | 0.08 | 3% | 0.40 | 0.98 | 0.41 | 0.908 | 1.64 |
| Mistral Large | 0.07 | 0% | 0.00 | 0.75 | 0.41 | 0.972 | 1.37 |
| Llama 4 Maverick | 0.07 | 0% | 0.11 | 0.21 | 0.34 | 0.974 | 2.23 |
Claude Fable 5 appears in the audit only. It is excluded from the transplant and prompt-lab experiments, so its follow-up columns are blank.
Change one demographic line, hold the rest. Scores move, but only about 4% clear the noise floor and models barely agree. Read it below. 2 · The reasoning transplant
Feed the model its own most-positive and most-negative assessment. The score follows the reasoning (+3.62 pts, 319/320 directional), so the bias is reasoned rather than made up after the fact. 3 · The prompt lab
Six prompt strategies against the naive one. Score-last backfired and few-shot only nudged the numbers. The instability is intrinsic.
Each dot is a model. Horizontal is how biased it is (from the audit), vertical is how far its score follows transplanted reasoning. The upward tilt is the throughline. The models that let reasoning drive the score most are also the most biased, with Qwen furthest out on both.
Pearson r is about 0.61 across 10 models. That fits the chain from identity to reasoning to score, though it is not statistically significant at this sample size.
The first of the three experiments, in full. This is the demographic bias audit the fingerprint above is built from.
A fair evaluator scores a résumé on its merits. Change only a demographic signal on it, the candidate's name, country, alma mater, or a gap in employment, and leave every other word untouched, and the score should not move. The optimistic assumption we put to the test is that frontier LLMs already behave this way, that they are effectively identity-blind and swapping a name leaves the verdict intact.
A counterfactual audit. Hold the résumé, job and model fixed, change one demographic line, and watch the score.
Step 1. Take one real résumé as the baseline and generate variants that each differ from it by a single demographic line. For example, the baseline candidate becomes Maria Rodriguez for a first-name swap, or the address country becomes India, with every other word left identical.
Step 2. Score the baseline and every variant with the same model on the same job, several times each. For example, all 11 models score the 30 résumé variants across 17 jobs, repeated over multiple runs.
Step 3. For each variant measure the delta, its mean score minus the baseline's, and check whether that gap clears the run to run noise. For example, a model that scores the baseline 6.2 and the India variant 5.6 has dropped the score by 0.6.
Step 4. Pool the deltas two ways. By model, to see which is least even-handed, and by dimension, to see which swapped signal moves scores the most. The two tables below are exactly those two views.
Step 5. Read it. If demographic swaps leave the score flat, the model is identity-blind and the assumption holds. If the score moves, and moves the same way across runs and across models, the evaluator is not judging the work alone.
When the only change is United States (the Company Locations axis), Gemini 2.5 Flash shifts its score by -3.40 on the role Junior / Mid-Level Fullstack Developer.
Each row is one model. We measure how far that model's score moves, on average, when we swap a single demographic signal on the résumé. The higher the number, the less even-handed the model. "Most penalised" and "most rewarded" call out the single variant that swung scores furthest in each direction.
| Model | Bias index | Mean |Δ| | Mean signed Δ | % sig | Cells | Most penalised | Most rewarded |
|---|---|---|---|---|---|---|---|
| Qwen 3 Next 80B | 0.405 | -0.396 | 38% | 29 | First Name · Maria Rodriguez (-1.05) | Address Country · Bangalore, India (+0.05) | |
| Gemini 2.5 Flash | 0.276 | -0.276 | 0% | 29 | Career Gap · Unexplained (-0.64) | Graduation Year · 1998 (-0.05) | |
| Gemini 2.5 Pro | 0.243 | -0.221 | 0% | 29 | Graduation Year · 1998 (-0.55) | School · ETH Zürich, Zürich (+0.09) | |
| Mistral Small | 0.229 | -0.198 | 7% | 29 | First Name · Aisha Okonkwo (-0.67) | Career Gap · Caregiving (+0.14) | |
| Claude Fable 5 | 0.158 | -0.146 | 0% | 29 | Company Locations · Brazil (-0.31) | Address Country · Lagos, Nigeria (+0.07) | |
| Gemini 3.1 Pro · Preview | 0.110 | -0.063 | 0% | 29 | Anonymize · Name blind (-0.24) | Graduation Year · 2005 (+0.22) | |
| Claude Sonnet | 0.101 | -0.032 | 0% | 29 | Career Gap · Unexplained (-0.31) | Address Country · San Francisco, USA (+0.19) | |
| Claude Haiku | 0.101 | +0.014 | 0% | 29 | Career Gap · Caregiving (-0.26) | Company Names · FAANG (Google/Meta/Amazon) (+0.31) | |
| Claude Opus | 0.084 | -0.041 | 3% | 29 | First Name · Mohammed Al-Said (-0.20) | Company Names · Non-western (Naver/Tencent/MercadoLibre) (+0.14) | |
| Mistral Large | 0.072 | -0.062 | 0% | 29 | Company Locations · India (-0.31) | Address Country · Bucharest, Romania (+0.05) | |
| Llama 4 Maverick | 0.068 | +0.016 | 0% | 29 | Company Locations · Kenya (-0.09) | Address Country · San Francisco, USA (+0.20) |
Same data, grouped by what we changed instead of who did the changing. The mean |Δ| pools every model, variant, and job for each demographic axis. The axis at the top is the one models react to most reliably.
| Dimension | Bias index | Mean |Δ| | Mean signed Δ | % sig | Cells |
|---|---|---|---|---|---|
| First Name | 0.261 | -0.246 | 12% | 66 | |
| Career Gap | 0.242 | -0.226 | 9% | 22 | |
| Company Locations | 0.185 | -0.166 | 2% | 44 | |
| Anonymize | 0.169 | -0.136 | 5% | 22 | |
| Company Names | 0.133 | -0.064 | 2% | 44 | |
| Graduation Year | 0.129 | -0.052 | 5% | 22 | |
| Address Country | 0.123 | -0.068 | 0% | 55 | |
| School | 0.083 | -0.034 | 0% | 44 |
The identity-blind assumption does not hold, but the failure is messier than "the models are biased". Scores do move when only a demographic line changes. The most sensitive model, Qwen 3 Next 80B, shifts its score by 0.405 per swap on average, and the signal that moves scores the most is First Name at 0.261. No model here is truly identity-blind.
What keeps this short of clean discrimination is that only about 4% of individual score shifts clear the run to run noise floor, and the models barely agree on direction (mean pairwise correlation +0.07, near zero). That reads as instability more than stable prejudice. Each model is an unstable judge whose number wobbles when any part of the input changes, which is its own reason not to hand it a hiring decision unsupervised. The methodology covers the noise floor, and the heatmap the model-by-model agreement.