ARIADNE
measured, not asserted

Removing a column is only a control if what remains cannot rebuild it

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.

income-classifier v3, 12 features, measured on the live instance

What the deployed model can still rebuild

attributegroup comparedaucrows
marital_statusNever married v Married0.9085171,747
citizenshipNot a citizen v Born in the US0.8949158,940
citizenshipNaturalised v Born in the US0.8686167,115
nativityForeign born v Native born0.8672196,604
raceAsian alone v White alone0.8295154,425
raceBlack alone v White alone0.8174130,210
sexFemale v Male0.8125196,604
raceAmerican Indian alone v White alone0.7379122,913
raceTwo or more races v White alone0.6669129,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.

hypotheses written down before measuring

Most of them were wrong, and they stay in the register

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
the same warehouse, judged four ways

One column, four answers, each citing its provision

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.

columncanadaecoaemployment_useu_ai_act
age prohibitedconditionalprohibitedexamine
marital_status_code prohibitedprohibitedexamineexamine
public_coverage_flag nothing to reportnothing to reportnothing to reportexamine

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.