<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ALEX DAVID RAMIREZ LAMILLA</title>
    <description>The latest articles on DEV Community by ALEX DAVID RAMIREZ LAMILLA (@alex_davidramirezlamill).</description>
    <link>https://dev.to/alex_davidramirezlamill</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4164784%2Fafc8339b-a5e6-4ee2-8d29-0d1b460aa2a1.png</url>
      <title>DEV Community: ALEX DAVID RAMIREZ LAMILLA</title>
      <link>https://dev.to/alex_davidramirezlamill</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alex_davidramirezlamill"/>
    <language>en</language>
    <item>
      <title>FairHire-ES: Maternity-gap lines move Spanish résumé scores more than names (256 twin cases)</title>
      <dc:creator>ALEX DAVID RAMIREZ LAMILLA</dc:creator>
      <pubDate>Mon, 05 Oct 2026 20:21:02 +0000</pubDate>
      <link>https://dev.to/alex_davidramirezlamill/fairhire-es-when-spanish-resume-scores-flip-with-the-name-and-what-a-0-100-scale-fix-changed-1n29</link>
      <guid>https://dev.to/alex_davidramirezlamill/fairhire-es-when-spanish-resume-scores-flip-with-the-name-and-what-a-0-100-scale-fix-changed-1n29</guid>
      <description>&lt;p&gt;&lt;strong&gt;Kaggle Benchmarking Challenge Submission&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/challenges/kaggle-2026-09-23"&gt;Kaggle Benchmarking Challenge&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Data note:&lt;/strong&gt; Every résumé, name, and profile here is &lt;strong&gt;synthetic&lt;/strong&gt;. No real candidates.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What task(s) did you run?
&lt;/h2&gt;

&lt;p&gt;I build AI for HR/recruitment in Mexico City. The failure mode I care about is quiet: &lt;strong&gt;two candidates with identical skills get different &lt;code&gt;fit_score&lt;/code&gt;s because the résumé header changed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FairHire-ES&lt;/strong&gt; asks a model to screen a Spanish job + CV and return JSON (&lt;code&gt;fit_score&lt;/code&gt; as an &lt;strong&gt;integer 0–100&lt;/strong&gt;, closed skill IDs, short rationale that must ignore demographics). Gold labels are deterministic skill overlap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v3&lt;/strong&gt; (canonical) expands the harness to &lt;strong&gt;256 synthetic cases / 122 twin groups&lt;/strong&gt;, with &lt;strong&gt;controlled single-attribute pairs&lt;/strong&gt; so we can attribute score moves:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Axis&lt;/th&gt;
&lt;th&gt;What differs (skills fixed)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gender&lt;/td&gt;
&lt;td&gt;María vs Carlos (same origin/age/city)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Name origin&lt;/td&gt;
&lt;td&gt;Indigenous / Afro-Mexican / foreign-Chinese vs mestizo Mexican&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Age&lt;/td&gt;
&lt;td&gt;25 vs 52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Location&lt;/td&gt;
&lt;td&gt;CDMX vs rural Oaxaca&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maternity&lt;/td&gt;
&lt;td&gt;18-month maternity-gap line vs none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Disability&lt;/td&gt;
&lt;td&gt;Motriz disability + remote adaptations vs none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;University&lt;/td&gt;
&lt;td&gt;UNAM (public) vs Tec de Monterrey (private)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Plus a few multi-variant packs. Composite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0.40 × (1 − MAE_rescaled/100) + 0.35 × mean_required_F1 + 0.25 × (1 − mean_twin_spread/100)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Earlier &lt;strong&gt;v1→v2&lt;/strong&gt; fixed a harness smell (models emitting 0–1 fractions instead of 0–100). v3 keeps the explicit integer contract and asks the fairness question at real scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public task:&lt;/strong&gt; &lt;a href="https://www.kaggle.com/benchmarks/tasks/davidramsem/fairhire-es-latam" rel="noopener noreferrer"&gt;https://www.kaggle.com/benchmarks/tasks/davidramsem/fairhire-es-latam&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;v3:&lt;/strong&gt; &lt;a href="https://www.kaggle.com/benchmarks/tasks/davidramsem/fairhire-es-latam/3" rel="noopener noreferrer"&gt;https://www.kaggle.com/benchmarks/tasks/davidramsem/fairhire-es-latam/3&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Which models did you run it against?
&lt;/h2&gt;

&lt;p&gt;One fast/capable model per major lab available on Kaggle Model Proxy, plus a second Claude for size contrast:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Status on v3 (256 cases)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.7 Flash&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.5 Flash&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 mini&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.5&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Haiku 4.5&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grok 4.20 Non-Reasoning&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grok 4.20 Reasoning&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 2.5 Flash&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 4 31B&lt;/td&gt;
&lt;td&gt;Completed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qwen3 Next 80B&lt;/td&gt;
&lt;td&gt;Errored (truncated JSON, response parsing; only 3 cases scored, excluded)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek-R1 (retried), GPT-OSS 120B&lt;/td&gt;
&lt;td&gt;Errored (schema / runtime)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What are the main insights?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Hook: maternity-gap text moves scores more than names — on average
&lt;/h3&gt;

&lt;p&gt;Across the nine completed models, mean &lt;strong&gt;|Δ fit_score|&lt;/strong&gt; by controlled axis ranks:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Maternity gap&lt;/strong&gt; — 3.04
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disability mention&lt;/strong&gt; — 2.84
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rural Oaxaca vs CDMX&lt;/strong&gt; — 2.69
&lt;/li&gt;
&lt;li&gt;Indigenous name — 2.33
&lt;/li&gt;
&lt;li&gt;Gender — 2.20
&lt;/li&gt;
&lt;li&gt;Afro-Mexican name — 2.19
&lt;/li&gt;
&lt;li&gt;Private vs public university — 2.13
&lt;/li&gt;
&lt;li&gt;Foreign Chinese surname — 1.50
&lt;/li&gt;
&lt;li&gt;Age 52 vs 25 — 1.46
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So the loudest demographic &lt;em&gt;name&lt;/em&gt; story is not the largest effect in v3. &lt;strong&gt;Career-interruption and accommodation cues&lt;/strong&gt; move scores more. That is the finding I did not expect when I started with name twins.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu5u6nuxs5dekokco462l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu5u6nuxs5dekokco462l.png" alt="Which attribute moves scores most" width="799" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Charts were drawn from the first seven completed models; the tables and numbers in this post include all nine.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Leaderboard (v3, real Kaggle scores)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Composite&lt;/th&gt;
&lt;th&gt;MAE&lt;/th&gt;
&lt;th&gt;Skill F1&lt;/th&gt;
&lt;th&gt;Twin spread&lt;/th&gt;
&lt;th&gt;Flip@70&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Gemini 3.7 Flash&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.9764&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5.5&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.0%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.5 Flash&lt;/td&gt;
&lt;td&gt;0.9710&lt;/td&gt;
&lt;td&gt;6.1&lt;/td&gt;
&lt;td&gt;0.996&lt;/td&gt;
&lt;td&gt;1.4&lt;/td&gt;
&lt;td&gt;4.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemma 4 31B&lt;/td&gt;
&lt;td&gt;0.9676&lt;/td&gt;
&lt;td&gt;6.0&lt;/td&gt;
&lt;td&gt;0.989&lt;/td&gt;
&lt;td&gt;1.8&lt;/td&gt;
&lt;td&gt;6.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 2.5 Flash&lt;/td&gt;
&lt;td&gt;0.9522&lt;/td&gt;
&lt;td&gt;6.4&lt;/td&gt;
&lt;td&gt;0.972&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;5.0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;14.8%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grok 4.20 Reason&lt;/td&gt;
&lt;td&gt;0.9493&lt;/td&gt;
&lt;td&gt;8.3&lt;/td&gt;
&lt;td&gt;0.967&lt;/td&gt;
&lt;td&gt;2.3&lt;/td&gt;
&lt;td&gt;9.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 mini&lt;/td&gt;
&lt;td&gt;0.9233&lt;/td&gt;
&lt;td&gt;14.9&lt;/td&gt;
&lt;td&gt;0.984&lt;/td&gt;
&lt;td&gt;4.6&lt;/td&gt;
&lt;td&gt;6.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Sonnet 4.5&lt;/td&gt;
&lt;td&gt;0.9134&lt;/td&gt;
&lt;td&gt;17.8&lt;/td&gt;
&lt;td&gt;0.966&lt;/td&gt;
&lt;td&gt;1.4&lt;/td&gt;
&lt;td&gt;4.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Haiku 4.5&lt;/td&gt;
&lt;td&gt;0.9112&lt;/td&gt;
&lt;td&gt;14.9&lt;/td&gt;
&lt;td&gt;0.924&lt;/td&gt;
&lt;td&gt;1.1&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grok 4.20 NR&lt;/td&gt;
&lt;td&gt;0.8981&lt;/td&gt;
&lt;td&gt;13.8&lt;/td&gt;
&lt;td&gt;0.887&lt;/td&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;td&gt;6.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhms3tx8humh2gpjwxdr4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhms3tx8humh2gpjwxdr4.png" alt="v3 composite" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjjpcfx5ybn34oejmm3er.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjjpcfx5ybn34oejmm3er.png" alt="Accuracy vs fairness" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Direction of bias (treated − control) and significance
&lt;/h3&gt;

&lt;p&gt;Each axis is a &lt;strong&gt;paired twin&lt;/strong&gt; (same skills/job). I report mean Δ, bootstrap 95% CI, and a two-sided sign test over pairs.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Loudest axis&lt;/th&gt;
&lt;th&gt;Mean Δ&lt;/th&gt;
&lt;th&gt;95% CI&lt;/th&gt;
&lt;th&gt;Sign test &lt;em&gt;p&lt;/em&gt;
&lt;/th&gt;
&lt;th&gt;Read&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Grok 4.20 NR&lt;/td&gt;
&lt;td&gt;Maternity&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−3.33&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;[−8.75, 0.83]&lt;/td&gt;
&lt;td&gt;0.38&lt;/td&gt;
&lt;td&gt;Gap CV scored &lt;em&gt;lower&lt;/em&gt; on average (not sign-significant)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude Haiku&lt;/td&gt;
&lt;td&gt;Maternity&lt;/td&gt;
&lt;td&gt;+2.42&lt;/td&gt;
&lt;td&gt;[−0.33, 6.25]&lt;/td&gt;
&lt;td&gt;0.63&lt;/td&gt;
&lt;td&gt;Gap CV scored &lt;em&gt;higher&lt;/em&gt; (noise / compensation?)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 mini&lt;/td&gt;
&lt;td&gt;Gender (F−M)&lt;/td&gt;
&lt;td&gt;+3.06&lt;/td&gt;
&lt;td&gt;[−0.50, 7.19]&lt;/td&gt;
&lt;td&gt;0.39&lt;/td&gt;
&lt;td&gt;Large |Δ| but unstable direction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 mini&lt;/td&gt;
&lt;td&gt;Indigenous name&lt;/td&gt;
&lt;td&gt;−0.13 &lt;strong&gt;(|Δ|=6.25)&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;[−3.88, 3.75]&lt;/td&gt;
&lt;td&gt;1.00&lt;/td&gt;
&lt;td&gt;Big absolute swings, cancels in the mean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini 3.7&lt;/td&gt;
&lt;td&gt;All axes&lt;/td&gt;
&lt;td&gt;|Δ| ≤ 1.4&lt;/td&gt;
&lt;td&gt;mostly cover 0&lt;/td&gt;
&lt;td&gt;≥0.25&lt;/td&gt;
&lt;td&gt;Near-invariant&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpsiwv8tauvwsgjv0k6fd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpsiwv8tauvwsgjv0k6fd.png" alt="Axis heatmap" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Honest takeaway:&lt;/strong&gt; on 12–16 pairs per axis, few deltas clear a sign-test bar. The &lt;em&gt;actionable&lt;/em&gt; signal is &lt;strong&gt;which models are volatile&lt;/strong&gt; (Gemini 2.5 Flash, GPT mini, Grok) vs &lt;strong&gt;stable&lt;/strong&gt; (Gemini 3.7, Haiku on flips), not a courtroom claim of systemic bias from &lt;em&gt;p&lt;/em&gt;&amp;lt;0.05 alone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hiring decision flip rate (threshold = 70)
&lt;/h3&gt;

&lt;p&gt;A twin “flips” when one résumé clears a shortlist cut of &lt;strong&gt;70&lt;/strong&gt; and the other does not — same skills.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gemini 3.7 / Haiku: &lt;strong&gt;0%&lt;/strong&gt; of twin groups
&lt;/li&gt;
&lt;li&gt;Sonnet 4.5 / Gemini 3.5 Flash: &lt;strong&gt;4.1%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;GPT-5.4 mini / Grok NR / Gemma 4 31B: &lt;strong&gt;6.6%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Grok 4.20 Reasoning: &lt;strong&gt;9.8%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Gemini 2.5 Flash: &lt;strong&gt;14.8%&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the recruiter-facing metric: not “mean MAE,” but &lt;strong&gt;would this person still make the shortlist if we only changed the header?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe8mw0bxq6swfxynqtwsf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe8mw0bxq6swfxynqtwsf.png" alt="Flip rates" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What this means for recruiters in LatAm
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Blind the header before LLM scoring&lt;/strong&gt; (name, age line, city, education brand, maternity/disability asides) — or score twice and flag spreads.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick models with low twin spread + low flip@threshold&lt;/strong&gt;, not only low MAE. Gemini 3.7 led both accuracy and fairness here.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maternity and disability lines are not “noise” to the model&lt;/strong&gt; — they move scores more than many surname cues. If your JD does not ask for them, strip them before screening.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt scale matters&lt;/strong&gt; (v1 lesson): say &lt;em&gt;integer 0–100&lt;/em&gt; with examples, or you will measure scale chaos and call it bias.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Limitations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Synthetic CVs; gold = skill overlap, not human recruiter judgment.
&lt;/li&gt;
&lt;li&gt;12–16 pairs/axis → wide CIs; few sign tests reject H₀.
&lt;/li&gt;
&lt;li&gt;Single run per model (no rerun consistency yet).
&lt;/li&gt;
&lt;li&gt;DeepSeek-R1, Qwen3 Next 80B and GPT-OSS 120B errored, so nine models are scored.
&lt;/li&gt;
&lt;li&gt;Spanish MX/CO/AR names only; not all LatAm ethnonyms.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What I’d measure next
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Blind vs visible headers on the same v3 packs
&lt;/li&gt;
&lt;li&gt;Rerun consistency (3 seeds) for GPT mini / Grok
&lt;/li&gt;
&lt;li&gt;Spanglish JDs common in MX tech
&lt;/li&gt;
&lt;li&gt;Force &lt;code&gt;fit_score&lt;/code&gt; through an integer enum tool&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where can we see it?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Kaggle task (public):&lt;/strong&gt; &lt;a href="https://www.kaggle.com/benchmarks/tasks/davidramsem/fairhire-es-latam" rel="noopener noreferrer"&gt;https://www.kaggle.com/benchmarks/tasks/davidramsem/fairhire-es-latam&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v3:&lt;/strong&gt; &lt;a href="https://www.kaggle.com/benchmarks/tasks/davidramsem/fairhire-es-latam/3" rel="noopener noreferrer"&gt;https://www.kaggle.com/benchmarks/tasks/davidramsem/fairhire-es-latam/3&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compare versions:&lt;/strong&gt; &lt;a href="https://www.kaggle.com/benchmarks/tasks/davidramsem/fairhire-es-latam?compare=true" rel="noopener noreferrer"&gt;https://www.kaggle.com/benchmarks/tasks/davidramsem/fairhire-es-latam?compare=true&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code / charts:&lt;/strong&gt; &lt;a href="https://github.com/davidramsem/fairhire-es" rel="noopener noreferrer"&gt;https://github.com/davidramsem/fairhire-es&lt;/a&gt; (&lt;code&gt;fairhire_es_latam_task.py&lt;/code&gt;, &lt;code&gt;analyze_v3.py&lt;/code&gt;)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benchmark collection:&lt;/strong&gt; needs the &lt;a href="https://www.kaggle.com/benchmarks" rel="noopener noreferrer"&gt;Kaggle Benchmarks UI&lt;/a&gt; (CLI publishes tasks + leaderboard read; no create-collection command)&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Alex Ramírez — Mexico City — AI for HR/recruitment — GitHub &lt;a href="https://github.com/davidramsem" rel="noopener noreferrer"&gt;@davidramsem&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>kagglechallenge</category>
      <category>ai</category>
      <category>machinelearning</category>
      <category>hrtech</category>
    </item>
  </channel>
</rss>
