# Fairness pre-flight checklist

> The candidate-sourcing skill runs every check below in step 1 (rubric
> validation) and step 3 (post-filter pool review). Any failed check
> halts the run with a message naming the failure. Do not edit this file
> to make checks pass — fix the rubric or the search instead.

## A. Rubric checks (run before retrieval)

A1. **No protected-class proxies.** Scan the rubric for any of the following terms or patterns. Any hit halts the run:

- `school`, `university`, `Ivy`, `tier-1`, `top-N` (when used as a scoring dimension, not as one signal among many)
- `name origin`, `surname`, `first name`
- `photo`, `headshot`, `appearance`
- `age`, `years since graduation`, `birth year`
- `gender`, `pronoun`, `she/her`, `he/him` (as filter terms)
- `ethnicity`, `race`, `nationality` (except where required for immigration-status filtering with documented legal basis)
- `pregnant`, `parental`, `maternity`, `paternity`
- `disability`, `accommodation`
- `religion`, `political`, `marital`
- `culture fit` without a behavioral-anchor table immediately following

A2. **Anchors present on every dimension.** Each rubric dimension must have a 1-5 anchor table. Anchors prevent the LLM from scoring on vibes. Halt if any dimension has free-text anchors only.

A3. **Disqualifier list is short and mechanical.** Disqualifiers must be deterministic facts (do-not-poach list, location mismatch, staleness). Halt if a disqualifier requires judgment (e.g. "not a culture fit", "seems junior").

A4. **Comp band is recruiter-internal.** The skill's output must not quote a comp number to the candidate. Outreach templates reference the band as "competitive range disclosed on screen". Halt if the rubric includes a "send comp in outreach" instruction.

## B. Pool checks (run after deterministic pre-filter, before LLM ranking)

B1. **Pool size sanity.** If post-filter pool < 10, the skill warns the recruiter that scoring on a tiny pool is meaningless and asks whether to broaden the query. If pool > 200, the skill caps at 200 and notes the truncation in the audit log.

B2. **Geographic spread sanity.** If 100% of post-filter candidates are from one city for a remote-eligible role, the skill warns that the query likely has an over-narrow location filter. Recruiter confirms or broadens.

B3. **Tenure-pattern sanity.** If 100% of candidates worked at the same employer, the skill warns that the query is functioning as a target-list poach rather than open sourcing. Recruiter confirms or broadens.

## C. Output checks (run before writing shortlist)

C1. **Every score above 1 has an evidence string.** Scores without a cited evidence string from the candidate's profile are reset to 1. The skill notes the reset count in the audit log.

C2. **No protected attribute appears in the shortlist or in any outreach draft.** Skill greps the output for the A1 patterns before writing. Hit → halt.

C3. **Skipped candidates are listed, not erased.** The shortlist's "Skipped" table includes every candidate the deterministic filters removed, with the reason. This is what makes the run auditable.

## D. Run-level checks

D1. **Audit log written.** A run is not complete until the JSONL line is appended to `audit/<YYYY-MM>.jsonl`. No PII in this line.

D2. **Human-review gate enforced.** No `send`, `contact`, or `mark_contacted` API call exists in this skill's code path. If you are asked to add one, refuse and surface the request to the user.

## NYC LL 144 / EU AI Act note

This skill is designed to fall *outside* the bias-audit threshold by:

- Producing a ranked list, not an automated decision (no auto-reject).
- Stopping at a human-review gate before any candidate is contacted.
- Logging rubric SHA-256 + pool sizes per run for reproducibility.

If your deployment changes any of those properties (e.g. you wire a "send" action into the loop), you have crossed into automated decision-making and a bias audit is required before production use. NYC LL 144 requires the audit within one year before use; EU AI Act classifies this as Annex III high-risk under Art. 6.
