TwinEthos homeRequest access

Control

AI-only screening outcomes not recorded by race and ethnicity for the report a law requires

Where a law requires an employer that lets AI alone decide who advances to a later hiring stage to report applicants' race and ethnicity by outcome, the screening pipeline records each applicant's AI outcome (advanced or not), whether they were hired, and their self-identified race and ethnicity, and produces the periodic report from those records.

Informational data, not legal advice. Summaries and rules have not been reviewed by a lawyer: always verify official law text for decisions. A suggested guard is intended to address each rule; adding it is not a statement of compliance to that law.

Family: AI is used without bias, fairness, or proxy-discrimination controls · control id cond.ai-screening-outcomes-not-recorded-by-race-ethnicity

Reach

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

enacted, not yet applying in Illinois (US-IL).

Trust and provenance

How far the rules this guard addresses have been checked. Each rule links to its provision, with its citation, official text and its own panel.

This control
Audit-grade: meets all 3 checks of the TwinEthos audit standard that apply to it.
Lanes
Binding law — not yet in force or stayed 1
Verification
Sources last verified 2 Oct 2026; each provision states how.
Data release
Data release 2026.10.03, data as of 2 Oct 2026, schema 0.3.9.
Legal review
None of the 1 rule has been reviewed by a lawyer; no TwinEthos rule has been legally reviewed yet. Treat each as research to check against the official text; it is not legal advice. Open questions for counsel on them: 1.
Audit standard
1 of 1 rule audit-grade. The audit standard is TwinEthos's own quality bar for provenance, dates, applicability, detectors, fixtures, remediation and licences; it is not a legal review.
Detectors
2 detectors, all experimental: written from the rule's text and not yet measured for precision on real code, so treat a hit as a lead to verify. Each provision lists its detectors' known limits.

The guard to add

Record each applicant's AI screening and hire outcomes with self-identified race and ethnicity, kept apart from the model's inputs, and build the required report from them.

When the AI analysis decides whether an applicant advances (for example to an in-person interview), the screening service writes an outcome row (applicant id, advanced or not, model version, date) and the hiring system later adds whether the applicant was hired. Race and ethnicity come from a separate voluntary self-identification form, are stored in their own table keyed by applicant id, and are never passed to the model. A scheduled report job joins the two for the reporting period, counts applicants advanced, not advanced and hired by race and ethnicity, and produces the file to submit before the deadline; the job's schedule and the last submission are recorded.

Where it goes: 1 application source code, 2 data models, 11 CI/CD pipeline, 12 repository artifacts.

What reviewers look for: in the module that turns the AI analysis into an advance or reject outcome, an outcome record per applicant; a self-identification table with race and ethnicity that the model's feature or prompt builder never reads; a report job or SQL that aggregates outcomes by race and ethnicity for the statutory period, with a schedule ahead of the filing deadline.

Example (Python + SQLAlchemy), before:

score = video_model.score(interview)
if score >= CUTOFF:
    invite_to_in_person_interview(applicant)
else:
    reject(applicant)

After:

score = video_model.score(interview)                 # race/ethnicity never in the model input
advanced = score >= CUTOFF
screening_outcomes.insert(applicant_id=applicant.id, advanced=advanced,
                          model_version=MODEL_VERSION, decided_on=date.today())
invite_to_in_person_interview(applicant) if advanced else reject(applicant)

# jobs/demographic_report.py, scheduled each December
def demographic_report(period_start, period_end):
    return db.execute(REPORT_SQL, {'start': period_start, 'end': period_end})  # counts by race_ethnicity x advanced x hired

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

Binding law — not yet in force or stayed (1)

Related incidents

No guardrail sits on this exact control; these incidents are cited by guardrails on related controls.

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.