PolicyEngine / PolicyEngine/policyengine-us
Orange County General Relief: audit findings vs. GR Regulations Manual and Handbook
- Dominant language
- Python
- Stars
- 162
- Forks
- 212
- Avg merge
- 3d 3h
- Merged PRs (30d)
- 97
Description
## Summary
The Orange County General Relief implementation (`ca_oc_general_relief`, under `policyengine_us/{variables,parameters}/gov/local/ca/oc/general_relief/`) was compared against Orange County's official sources:
- **GR Regulations Manual** — the legal basis (W&I Code §§17000–17410, county-delegated); sections published at [ssa.ocgov.com](https://www.ssa.ocgov.com/page/general-relief-regulations).
- **GR Handbook** — the caseworker procedures manual (obtained via a public-records request). The Handbook matters here because it contains the actual **MAP** and **component-value** figures that the Regulations Manual omits.
The model is **faithful for the dominant case** — a single childless adult with cash income. The items below are discrepancies or gaps found against the primary-source text. Each was verified against the actual Manual/Handbook language. **Filing for a more careful review later — not yet actioned.**
## Verified faithful (no change expected)
- Benefit = MAP − net countable income, floored at 0 (Manual §80.2.d).
- MAP size-1 = **$355**, effective 10/1/2016 — corroborated by the Handbook §80.3 grant-computation example.
- Earned-income **20% standard deduction**; deductions for health-insurance premiums and verified court-ordered child/spousal support (§70.2.o/p).
- Energy Assistance and CalFresh allotments correctly excluded from counted income (§70.2.d, §70.3.a).
- Personal-property limit **$1,000**; vehicle exclusion **$4,650** (§60.2.a, §60.4.c).
- Adult age ≥ 18; children excluded from the MAP (§10.6.v, §80.3.d(1)).
- Immigration list (CITIZEN, LPR, withholding-of-deportation) matches the two eligible non-citizen categories named in §40.1.
## Discrepancies (verified against primary sources)
| Finding | Severity | Source | Code |
|---|---|---|---|
| **Shared-housing reduction is a flat 15%, but the regulation is tiered 15% / 20% / 25%** for sharing with 1 / 2 / 3+ others. The model keys off the boolean `is_shared_living` and never counts co-residents, so it overpays units sharing with 2+ people. (Structural — a fix needs household size minus EU size.) | Medium | Manual §80.3.a(3) (p.45) | `payment/shared_housing_reduction.yaml`, `payment/ca_oc_general_relief_max_aid_payment.py` |
| **Outdated comment + unmodeled component-value deductions.** `ca_oc_general_relief.py` says component-value deductions aren't modeled "because Orange County does not publish the component-value dollar amounts" — but the Handbook §80.3 publishes the percentages (**Housing/Utilities 65%, Food 28%, Transportation 5%, Clothing 2%**), so the dollar values are derivable as %×MAP. The Housing/Utility Excess Component Value and the free-component deductions are genuinely unmodeled (applying them needs household shelter-cost inputs PolicyEngine generally lacks). At minimum the comment should be corrected. | Medium | Handbook §80.3 (Grant Computation) | `ca_oc_general_relief.py` |
| **$50 liquid-resource rule unmodeled.** Cash/liquid resources over $50 should reduce the initial-month MAP (§60.2.a) and count as income (§70.2.g); the model uses cash only for the $1,000 property test. The integration-test comment "cash … no longer counted as income" appears to be a mistaken rationale (it conflates active §70.2.g with the deleted §70.2.e). | Medium | Manual §60.2.a (p.35), §70.2.g (p.39) | `resources/ca_oc_general_relief_countable_property.py`, `income/ca_oc_general_relief_countable_income_person.py` |
| **MAP table provenance / currency.** The table is sourced from a 2015 OC HCA "DUI Program Standards" document and a 2017 Continuum-of-Care application — not the official "GR MAP Tables" (which appear only as an external hyperlink in the Handbook, not in any obtained record). Sizes 2–10 are assumed (flat +$5, self-documented in the YAML) and all values are frozen at 2016. Only size-1 is independently documented. Recommend obtaining the live GR MAP Tables to verify multi-person amounts and the current-year value. | Medium | Handbook §80.3 (external link) | `payment/max_aid_payment.yaml` |
| **GR/CalWORKs split-EU MAP-differencing never reached.** CalWORKs/CAPI receipt is read at the SPM-unit level and flags every member, so a mixed unit (e.g. a child-only CalWORKs case plus a GR-needing adult) is marked categorically ineligible and gets $0, whereas §80.3.a(1) would pay MAP(all members) − MAP(CalWORKs members). | Medium | Manual §20.4.b, §80.3.a(1) (p.12/45) | `eligibility/ca_oc_general_relief_receives_other_cash_assistance.py`, `eligibility/ca_oc_general_relief_eligible_person_count.py` |
| **Fully-employed categorical bar not applied.** §30.9 makes a fully-employed adult categorically ineligible; the model applies only the income test, and the 20% disregard lets someone grossing ≈ the grant still pass and collect ~20% of MAP. | Medium | Manual §30.9.a-b | `eligibility/ca_oc_general_relief_income_eligible.py` |
| **Excluded non-PA member's income over-counted.** For an excluded member who isn't on other cash aid (e.g. an ineligible-noncitizen earner), only income above that member's own MAP-needs should be deemed to the aided unit (§70.3.a); the model counts their full income. | Medium | Manual §70.3.a | `income/ca_oc_general_relief_countable_income_person.py` |
| **Shared-housing exemption proxy mismatch.** The regulation exempts those in Housing Support Programs / homeless shelters / transitional housing; the model proxies this with `receives_housing_assistance` (HUD Section 8 / public housing), a different concept. | Low | Manual §80.3.a(3) | `payment/ca_oc_general_relief_max_aid_payment.py` |
| **Real-property limit not modeled** ($5,000 primary residence; secondary real property within the $1,000 cap) — only cash + vehicle are checked. Documented as a partner-data limitation. | Low | Manual §50.2 (p.32) | `resources/ca_oc_general_relief_countable_property.py` |
## Known framework limitations (listed for completeness; generally not fixable in a static model)
90-day/12-month employable time limit (§30.7.c); employability classification and mandatory GRWP/CFET participation (§30.6/30.7); incarcerated/institutionalized bar (§30.10); mandatory SSI/SSP application as a condition of aid (§30.4); cross-program sanction / lump-sum / property-disposal bars (§10.3); 15-day durational county residence (§40.2); sponsor income/resource deeming (§90.2); responsible-relative / community-property deeming (§90.1); period of ineligibility for lump sums (§70.2.i/r); 2-year disqualifying property transfers (§50.8/60.5); probation-violator / fleeing-felon bars (§30.11/30.12); roomer/boarder and educational-grant income refinements (§70.2.c/m/n).
## Notes
- Findings were cross-checked against the actual Manual/Handbook text; page numbers refer to the compiled PDFs.
- The single-adult cash case — by far the largest share of the GR caseload — is modeled correctly; the discrepancies mostly affect shared-housing units, mixed-aid households, and recipients with in-kind support or below-component-value shelter costs.
---
🤖 Issue drafted with [Claude Code](https://claude.com/claude-code) from an audit of the implementation against Orange County's GR Regulations Manual and GR Handbook.
Contributor guide
Research direction
Start by reading the cited implementation files and the corresponding Regulations Manual or Handbook sections. The findings span payment, eligibility, income, resources, and MAP provenance, so first choose and scope one discrepancy. Done means the selected behavior matches its cited source, or the limitation and rationale are explicitly documented.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100