EDORA Learn — Pipelines
System Exit and Longitudinal Follow-Up (Tracking Outcomes Over Time)
Pipeline 09E
Transparency note: post-exit outcomes are derived from linked administrative datasets. Attrition due to unmatched records or migration is quantified, and confidence cues are applied when coverage falls below 85%.
Overview
When youth leave supervision or placement, longitudinal follow-up helps measure stability and change. Outcomes are tracked using cross-agency data on education, employment, and recidivism. A stable cohort design—anchored to an exit date—ensures comparability across time and programs. This page describes how those follow-ups are constructed and interpreted.
What We Track
Exit Definitions
- End of formal involvement recorded with an exit date
- Probation closure
- Release from placement
- End of court jurisdiction
- Exit reason coded (completion, time-served, transfer, other)
Observation Windows
- Fixed follow-ups: 6 / 12 / 24 months from exit date
- Window completeness checked (left/right censoring flags)
Education & Employment
- Enrollment & attendance (term-based) post-exit
- Diploma/GED completion verified (date, credential type)
- Employment/wage records matched to UI/workforce data (coverage noted)
Recidivism & Re-engagement
- New referrals / petitions / arrests within each window
- Charge severity & time-to-event captured (survival-friendly)
Attrition & Censoring
- Unmatched records & migration coded (out-of-state, unknown)
- Sealed/expunged cases excluded with censor timestamp
Typical Flow
- Define exit cohort by closure date/program/jurisdiction
- Verify follow-up windows are feasible for each exit month
- Link datasets (justice, education, workforce, health)
- Use common IDs or probabilistic rules; record match score & review status
- Calculate outcomes for each window
- Education: enrollment/attendance, diploma/GED
- Employment: any UI-covered earnings; wages/hours where available
- Justice: new referral/petition/arrest; time-to-event
- Adjust denominators for attrition & censoring
- Flag incomplete windows; consider weights for representativeness
- Publish indicators with transparency notes
- Document coverage, definitions, series breaks, and small-n handling
Fields
Field | Type | Required | Codeset | Description |
---|---|---|---|---|
pipeline_place_id | uuid | ✅ | — | Unique identifier for this exit-window record. |
pipeline_stage_id | enum | ✅ | stages.yml#stage_key(8)
| One of the canonical stages; here = reentry_aftercare. |
pipeline_place_key | enum | ✅ | pipeline_places.yml#place_key(45)
| Canonical key for this place (maps to route/slug). |
youth_id | string | ✅ | — | Salted/hashed or state UID. No plaintext PII. |
staff_id | string | — | Staff responsible for follow-up coordination (ID only). | |
occurred_datetime | datetime | ✅ | — | Anchor timestamp for row creation/update (e.g., window closeout). |
jurisdiction_code | string | ✅ | — | County/parish/circuit or standardized local code. |
legal_case_id | string | — | Case/docket identifier if exit linked to court jurisdiction. | |
source_system | string | ✅ | — | Origin system name. |
source_file | string | — | Source batch/file id if flatfile. | |
extract_run_id | string | — | ETL run id for lineage. | |
series_break_flag | boolean | — | Comparability break applies to this row. | |
series_break_reason | enum | series_breaks.yml#reason(4)
| Reason for break (policy/process/tool change). | |
exit_date | date | ✅ | — | Date of exit from formal involvement (cohort anchor). |
exit_type_code | enum | ✅ | exit_types.yml#type(3)
| probation_closure, placement_release, end_of_court_jurisdiction. |
exit_reason_code | enum | exit_reasons.yml#reason(5)
| completion, time_served, transfer, administrative, other. | |
followup_window_code | enum | ✅ | followup_windows.yml#window(4)
| 6m, 12m, 24m (fixed windows from exit_date). |
window_start_date | date | ✅ | — | Inclusive start of observation window (typically = exit_date). |
window_end_date | date | ✅ | — | Exclusive end date of the observation window. |
window_complete_flag | boolean | ✅ | — | True if full window observed (no right-censoring). |
left_censor_flag | boolean | — | True if pre-window data missing (rare for exit-based cohorts). | |
right_censor_flag | boolean | — | True if observation ended before window_end_date. | |
censor_timestamp | datetime | — | Timestamp when censoring occurred (sealed/expunged/moved). | |
migration_status_code | enum | migration_statuses.yml#status(3)
| in_state, out_of_state, unknown. | |
post_exit_enrollment_status_code | enum | education_status.yml#status(6)
| Enrollment status during the window. | |
post_exit_attendance_days_present | integer | — | Days present accrued within the window (if available). | |
post_exit_attendance_days_enrolled | integer | — | Days enrolled within the window. | |
diploma_credential_type_code | enum | credential_types.yml#type(6)
| HS diploma, GED/HiSET, industry_cert, etc., if completed within window. | |
diploma_credential_awarded_date | date | — | Award date of diploma/GED within the window. | |
workforce_match_method_code | enum | matching_methods.yml#method(3)
| deterministic, probabilistic, clerical_review. | |
workforce_match_score | number | — | Probabilistic match score (if applicable). | |
workforce_match_outcome_code | enum | match_outcomes.yml#outcome(6)
| auto_match, clerical_queue, confirmed_no_match, confirmed_match. | |
ui_coverage_status_code | enum | employment_coverage_statuses.yml#status(4)
| full, partial, none, unknown (UI data coverage for the youth/window). | |
any_ui_earnings_flag | boolean | — | True if any UI-covered wages observed within window. | |
earnings_observation_quarter_count | integer | — | Count of quarters with UI-covered wages in window (0–4). | |
recidivism_event_type_codes | array<string> | recidivism_event_types.yml#type(5)
| New referral/petition/arrest/adjudication within window; semicolon-delimited. | |
first_event_datetime | datetime | — | Timestamp of first qualifying event within the window. | |
first_event_severity_code | enum | event_severity_levels.yml#level(4)
| Severity category of first event (local mapping). | |
survival_days_to_first_event | integer | — | Days from window_start_date to first_event_datetime (structural store; non-negative). | |
coverage_note_code | enum | coverage_notes.yml#note(6)
| Notes about data coverage (e.g., sealed_case_excluded, moved_out_of_state). | |
Download CSVwhat_we_track.csv |
Data & Methods
Longitudinal follow-up uses cohort-based denominators and fixed observation windows (e.g., 12 months post-exit). Each dataset’s coverage is validated by match rates and duplication checks. Attrition is handled through right-censoring or weighting adjustments per Attrition & Censoring. Cross-agency data integration follows Data Linkage & Integration and Data Interoperability & Architecture. Confidence intervals and suppression rules follow Suppression & Small-n, and time trends are interpreted using Trend Interpretation & Baseline Selection.