TwinEthosRequest access

Control

Protected-attribute proxies used as AI features without a disparity evaluation

When features that can stand in for protected traits (personal names, postal codes or census tracts, language or dialect, device or IP geolocation) feed AI ranking, pricing, content moderation, or ad targeting, outcomes are compared across the groups those features can proxy for before launch and on a schedule, and any disparity is either mitigated or justified and documented. Narrower than cond.no-documented-proxy-variable-analysis in requiring a measured outcome comparison, and broader than cond.protected-or-proxy-attribute-in-ai-decision in covering ranking, pricing, moderation, and ad targeting as well as decisions about people.

Informational data, not legal advice. Summaries are TwinEthos's own words and rules have not been reviewed by a lawyer: check the official text before relying on any of it. A guard addresses an item; adding it is not a statement that your code meets any law.

Family: AI is used without bias, fairness, or proxy-discrimination controls · control id cond.proxy-features-without-disparity-evaluation

Reach

1items this one guard addresses
0jurisdictions where binding law on it is in force
0more where it is enacted, not yet applying
0standards and frameworks on the same control

The guard to add

Consider comparing outcomes across the groups that name, postal-code, language, or geolocation features can stand in for, before launch and on a schedule.

Consider adding a disparity evaluation wherever proxy-capable features (personal names, ZIP or postal code or census tract, language, locale or dialect, IP or device geolocation) feed a model that prices, ranks, moderates, or targets ads: in the training or evaluation pipeline and as a scheduled job on live outcomes, compare price, rank position, removal rate, or ad delivery across the proxied groups (for example via census-tract demographics or BISG-inferred race and ethnicity, using fairlearn MetricFrame with sensitive_features). Prefer recording each proxy feature in the model card or a feature-review record with the measured disparity and the outcome: mitigated, coarsened, removed, or justified. Removing or coarsening the feature after a documented review is a reasonable alternative to ongoing measurement.

Where it goes: 1 application source code, 11 CI/CD pipeline, 12 repository artifacts, 13 tests and evals.

What reviewers look for: for each model whose feature list names a proxy-capable column and whose output sets a price, rank, moderation action, or ad audience, a disparity evaluation (MetricFrame, demographic_parity_difference, AIF360 metrics, Fairness Indicators, or an outcome-by-group comparison) in tests or a scheduled job, plus a model card or feature-review entry with the result and the justification or mitigation; or evidence the feature was removed or coarsened after review.

Example (scikit-learn pricing model + fairlearn), before:

features = ['basket_size', 'zip_code', 'device_type', 'visits_30d']
model = GradientBoostingRegressor().fit(train[features], train['price_multiplier'])

After:

features = ['basket_size', 'zip_code', 'device_type', 'visits_30d']
model = GradientBoostingRegressor().fit(train[features], train['price_multiplier'])
# compare quoted prices across groups the ZIP feature can stand in for
groups = tract_demographics.majority_group(test['census_tract'])
mf = MetricFrame(metrics={'mean_price': lambda y_t, y_p: y_p.mean()},
                 y_true=test['price_multiplier'], y_pred=model.predict(test[features]),
                 sensitive_features=groups)
record_feature_review('zip_code', by_group=mf.by_group, gap=mf.difference())

Engineering guidance, not legal advice. Each provision below may add its own details (a cadence, a deadline, a required notice element): open it for those.

Every rule this guard addresses

TwinEthos recommendation (not law) (1)

Related incidents