> ## Documentation Index
> Fetch the complete documentation index at: https://docs.encoreos.io/llms.txt
> Use this file to discover all available pages before exploring further.

# EEO Internal Selection — Compliance Evidence

> Evidence for EEO-compliant internal selection under Title VII, the EEOC Uniform Guidelines, and OFCCP recordkeeping rules.

**Regulations:** Title VII (42 U.S.C. §2000e), EEOC Uniform Guidelines on Employee Selection Procedures (29 CFR Part 1607), OFCCP recordkeeping (41 CFR 60-1.12)
**Date:** 2026-05-22
**Status:** ✅ Phase 1 Implemented

***

## 1. Regulatory Context

Internal job postings, applications, dispositions, and transfers constitute "employee selection procedures" under the EEOC Uniform Guidelines (§1607.2(B)) and must be:

* **Job-related and consistent with business necessity** (§1607.3)
* **Applied uniformly** across all eligible internal applicants
* **Documented** with sufficient records to support adverse-impact analysis for at least two years (§1607.4(A))
* **Free from retaliatory exposure** — current managers should not learn of an employee's interest in another role before the employee elects to disclose it (Title VII §704(a) anti-retaliation)

***

## 2. Controls Implemented (Phase 1)

### 2.1 Privacy Default (Anti-Retaliation)

| Control                                                                                                          | Implementation                                                                                                        | Evidence                                               |
| ---------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ |
| `notify_current_manager` defaults to **false** at apply time                                                     | `hr_internal_applications.notify_current_manager BOOLEAN NOT NULL DEFAULT FALSE`                                      | Migration `20260522033003_*.sql`                       |
| Current manager cannot see the application until either the employee opts in OR status advances to `shortlisted` | SECURITY DEFINER helper `hr_internal_application_visible(p_application_id, p_user_id)` consulted by SELECT RLS policy | Migration `20260522033003_*.sql` (helper + policy)     |
| Apply UI surfaces the privacy toggle prominently with explanatory copy                                           | `<InternalApplyDialog>` in `src/cores/hr/components/internal-mobility/`                                               | Component test: `useSubmitInternalApplication.test.ts` |

### 2.2 Standardized Disposition Codes (Adverse-Impact Analysis)

| Control                                                                               | Implementation                                                                                                                                                          | Evidence                                                            |
| ------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- |
| Terminal status (`rejected` / `declined` / `withdrawn`) requires a `disposition_code` | Trigger `trg_hr_internal_apps_validate_disposition` (BEFORE INSERT/UPDATE) raises `hr.internal_application.disposition_required`                                        | Migration `20260522033003_*.sql`                                    |
| Disposition values constrained to EEOC-aligned picklist `hr_application_disposition`  | PF-15 picklist seeded per-org by `hr_35_seed_disposition_picklist_for_org()`                                                                                            | Migration `<ts>_hr_35_seed_disposition_picklist_for_org.sql` (T1.7) |
| Seeded codes                                                                          | `selected_other_candidate`, `not_qualified`, `withdrew_application`, `position_closed`, `did_not_respond`, `failed_background_check`, `failed_reference_check`, `other` | Same migration; `metadata` extensible per tenant                    |
| New orgs auto-receive picklist                                                        | AFTER INSERT trigger `trg_hr_35_seed_disposition_picklist` on `pf_organizations`                                                                                        | Same migration                                                      |

### 2.3 Audit Trail (29 CFR 1607.4(A))

| Control                                                               | Implementation                                                                                      | Evidence                                                     |
| --------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ |
| Every status transition recorded with actor + timestamp + disposition | `hr_internal_application_stage_audit` table (append-only) populated by `transitionStatus()` library | `src/cores/hr/lib/internal-applications/transitionStatus.ts` |
| Append-only enforcement                                               | RLS denies UPDATE/DELETE on `hr_internal_application_stage_audit`                                   | Migration `20260522033003_*.sql`                             |
| Tenant isolation                                                      | `organization_id` + `FORCE ROW LEVEL SECURITY` on all three HR-35 tables                            | Same migration                                               |
| Retention                                                             | Records retained indefinitely (no scheduled purge); satisfies 2-year minimum                        | N/A                                                          |

### 2.4 Compliance Export

| Control                                                                                     | Implementation                              | Evidence                                |
| ------------------------------------------------------------------------------------------- | ------------------------------------------- | --------------------------------------- |
| Permission-gated CSV export of internal applicant pool                                      | `hr.internal_application.report` permission | `src/platform/permissions/constants.ts` |
| Export **excludes** narrative `cover_note` (subjective text not used in selection analysis) | Export builder field allow-list             | (Implementation pending T13 — tracked)  |

### 2.5 Event Publishing (Downstream Audit)

| Event                               | Payload                                                                  | PHI? |
| ----------------------------------- | ------------------------------------------------------------------------ | ---- |
| `hr_internal_application_submitted` | `application_id`, `employee_id`, `position_id`, `notify_current_manager` | No   |
| `hr_internal_application_advanced`  | `application_id`, `from_status`, `to_status`, `disposition_code`         | No   |
| `hr_employee_transferred`           | `employee_id`, `from_position_id`, `to_position_id`, `effective_date`    | No   |

All three events are registered in `KnownEventName` (`src/platform/events/types.ts`) for type-safe publishing.

***

## 3. Open Items

* **T13 Compliance CSV export** — endpoint exists in plan, full builder pending.
* **HR-15 pay-preview integration** — promotion pay-change preview deferred to Phase 2.
* **Adverse-impact reporting widget** — deferred (recruiter dashboard surfaces raw counts only in Phase 1).

***

## 4. References

* Spec: [`specs/hr/specs/HR-35-internal-mobility-talent-marketplace.md`](https://github.com/Encore-OS/encoreos/blob/development/specs/hr/specs/HR-35-internal-mobility-talent-marketplace.md)
* Integration: [`docs/architecture/integrations/HR-35-internal-mobility-INTEGRATION.md`](https://github.com/Encore-OS/encoreos/blob/development/docs/architecture/integrations/HR-35-internal-mobility-INTEGRATION.md)
* Implementation log: [`specs/hr/IMPLEMENTATION_LOG.md`](https://github.com/Encore-OS/encoreos/blob/development/specs/hr/IMPLEMENTATION_LOG.md) (2026-05-22 entry)
* EEOC Uniform Guidelines: [https://www.ecfr.gov/current/title-29/subtitle-B/chapter-XIV/part-1607](https://www.ecfr.gov/current/title-29/subtitle-B/chapter-XIV/part-1607)
