# Driver eligibility policy

> **Generated** from `server/lib/driver-eligibility-adjudication.js` on 2026-08-21.
> Do not edit this file by hand — run `node scripts/generate-eligibility-policy.mjs`.

This is what Unique Pickups enforces when Checkr results are imported. Applicants are screened against these rules. What you are told and what the software does are the same source.

## What “approve” requires

- A Checkr **result** of `clear`, `pass`, or `passed` is **mandatory**.
- A report **status** of `complete` is **not** a pass. `complete` only means the report finished; the result may still be `consider`.
- Unfinished reports (`pending`, `suspended`, `dispute`, etc.) never approve.
- An undated record that would otherwise be a hard deny goes to **human review**, never to an automatic denial.
- Non-empty charge text that the engine cannot classify goes to **human review**, never to an automatic approval.

`hasClearBackgroundResult("complete")` = **false**.  
`hasClearBackgroundResult("clear")` = **true**.

## Automatic deny

| Condition | Threshold / rule |
|---|---|
| Under minimum age | Age &lt; **21** |
| License expired / suspended / invalid | Any of these flags |
| Vehicle too old | Vehicle age &gt; **15** years |
| Sex-offender registry | When `eligibility_deny_registered_sex_offender` is **true** |
| Open warrant | When `eligibility_deny_open_warrant` is **true** |
| Too many minor violations | Count &gt; **3** (count as reported by Checkr; not re-dated) |
| DUI/DWI/OWI **with a parseable year inside the window** | Year within **7** years of today |
| Major moving violation (reckless / hit-and-run / etc.) **with year inside window** | Year within **7** years |
| Fatal accident | When `eligibility_deny_fatal_accident` is **true** |
| Sexual offense | When `eligibility_deny_sexual_offense` is **true** |
| Violent felony | When `eligibility_deny_violent_felony` is **true** |
| Theft/fraud felony | When `eligibility_deny_theft_felony` is **true** |
| Weapons felony | When `eligibility_deny_weapons_felony` is **true** |
| Invalid insurance | When `eligibility_require_valid_insurance` is **true** and insurance is invalid |

## Manual review

| Condition | Notes |
|---|---|
| License tenure short | Licensed &lt; **1** year(s) |
| Minor violations in review band | Count ≥ **2** and ≤ deny threshold |
| DUI/DWI **outside** the lookback window | Year older than **7** years → review, not deny |
| DUI/DWI **without a parseable date** | Review — never auto-deny |
| Major violation outside window or undated | Same three-case pattern as DUI |
| Theft misdemeanor | Default — `eligibility_theft_misdemeanor_deny` is **false** → review, not deny |
| Drug / other recognised categories without a hard-deny rule | Manual review (e.g. possession with intent) |
| Charge text present but not classified | Manual review — never auto-approve |
| Other criminal categories not mapped to hard denies | Review |
| Insurance expiring soon | ≤ **14** days |
| Checkr result `consider` or unknown | Review |
| Missing Checkr result | Review |
| Incomplete report status | Review |

## Lookback windows — applied to dates or not

| Setting | Default | Applied to dates? |
|---|---|---|
| `eligibility_dui_review_years` | **7** | **applied_to_dates** |
| `eligibility_major_violation_lookback_years` | **7** | **applied_to_dates** |
| `eligibility_mvr_lookback_years` | **3** | **not_applied_count_only** (minor counts are Checkr-aggregated) |
| `eligibility_criminal_lookback_years` | **7** | **not_applied** (categories deny by type; Checkr filters upstream) |

**Undated records:** any DUI or major-driving signal without a parseable year goes to **manual review**, never automatic denial.

## How decisions are made

1. Export pending applicants → Checkr (manual bulk).
2. Upload Checkr results CSV.
3. Engine `adjudicateCandidate` returns approve / deny / review.
4. Preview and commit use the **same** engine.

Contact support if you believe a decision was based on incomplete information.
