income_features was written deliberately without the protected attributes the
canonical benchmark ships with. That is the intent. The question this page answers is
whether the intent survived contact with the rest of the table.
Ariadne fits a model to predict each attribute from the features the classifier actually uses. A high score does not mean anything is unlawful. It means the column you removed is still in the room.
| attribute | group compared | auc | rows |
|---|---|---|---|
| marital_status | Never married v Married | 0.9085 | 171,747 |
| citizenship | Not a citizen v Born in the US | 0.8949 | 158,940 |
| citizenship | Naturalised v Born in the US | 0.8686 | 167,115 |
| nativity | Foreign born v Native born | 0.8672 | 196,604 |
| race | Asian alone v White alone | 0.8295 | 154,425 |
| race | Black alone v White alone | 0.8174 | 130,210 |
| sex | Female v Male | 0.8125 | 196,604 |
| race | American Indian alone v White alone | 0.7379 | 122,913 |
| race | Two or more races v White alone | 0.6669 | 129,888 |
Fifteen measurements across five attributes, and the ones that found less are kept rather than dropped. A report showing only what fired cannot be told apart from one where the rest never ran.
Five proxy hypotheses were declared in a file before any of them were measured, so the ones that failed cannot be quietly deleted afterwards.
Four moved the number by more than the threshold the exposure check fires on. One did not, and it stays in the register marked refuted rather than being removed. That is what makes the four that fired mean anything.
python tools/screen.py
244328 rows, 5 baseline features from workforce-classifier v3
baseline rebuilds disability at 0.7337 before any candidate
candidate alone lift verdict
PUBCOV public_coverage_flag 0.7012 +0.0529 fires
HINS4 medicaid_coverage_flag 0.6638 +0.0365 fires
SSIP supplementary_security_.. 0.5894 +0.0243 fires
HINS3 medicare_coverage_flag 0.5940 +0.0230 fires
VEH vehicles_available 0.6219 +0.0107 silent
4 of 5 moved it by more than 0.0200
1 did not, and stays as refuted rather than deleted
Which columns count as restricted is declared in a policy pack, not written into the checks. Packs name attributes rather than columns, so a pack moves to a different warehouse unchanged. The disagreement between them is the point.
| column | canada | ecoa | employment_us | eu_ai_act |
|---|---|---|---|---|
age |
prohibited | conditional | prohibited | examine |
marital_status_code |
prohibited | prohibited | examine | examine |
public_coverage_flag |
nothing to report | nothing to report | nothing to report | examine |
Three of the four are correct to stay quiet about the coverage flag: insurance coverage genuinely is not a protected characteristic in US employment law. The difference between silence and a finding is a line of YAML, not a code change.
On timing. ECOA, Title VII with the ADEA and ADA, and the Canadian Human Rights Act are in force today. The EU AI Act pack describes an obligation that is coming rather than one that binds: the Digital Omnibus approved on 29 June 2026 moved standalone Annex III high risk duties to 2 December 2027. What the Articles ask for did not change, only when. The full mapping.
Every figure on this page was produced by a command, and the command is in the repository.