Skip to content

Add San Bernardino County General Relief program - #9160

Draft
hua7450 wants to merge 3 commits into
mainfrom
ca-sbd-gr
Draft

Add San Bernardino County General Relief program#9160
hua7450 wants to merge 3 commits into
mainfrom
ca-sbd-gr

Conversation

@hua7450

@hua7450 hua7450 commented Jul 27, 2026

Copy link
Copy Markdown
Collaborator

Summary

Implements San Bernardino County's General Relief (GR) program — a 100% county-funded monthly cash assistance program that the county Transitional Assistance Department (TAD) administers as a repayable loan under W&I Code §17000 et seq. and the Board-approved GR Policy Handbook (GRPHB) Chapter A. The implementation models the flat-grant design in effect since June 1, 2021: a maximum basic grant by assistance unit (AU) size, reduced dollar for dollar by countable income, behind county-residence, immigration, linkage, other-cash-assistance, treatment-facility, income, and resource gates. The benefit attaches to the SPM unit with a monthly definition period, matching the six existing CA county GR/GA implementations.

Fixes #9159

Regulatory authority

The handbook letters are Legistar .docx/.doc attachments, which do not honor PDF page anchors; citations therefore state GRPHB Chapter A page numbers in the citation text.

Income eligibility tests

  • An assistance unit is income-eligible when countable income is below the maximum basic grant for its AU size (strict <; Chapter A states no explicit boundary, and a zero payment implies no need — the Orange County GR precedent, noted in a code comment).
  • All AU income counts: the unit sums every member's earned and unearned income, including the SSI or SSP and wages of a member barred from the AU for receiving other cash assistance (GRPHB HL Update Delaware income tax references for 2025 #7358, Chapter A p. A-3: "All income in the AU must be taken into consideration"). CAPI cash is the one deliberate exception (see the other-cash decision below).

Income deductions and exemptions

  • Earned income disregard: the first $10 plus 20% of the balance is exempt per AU, applied after summing earned income to the unit — countable earned income equals 0.8 × max(gross earned − $10, 0) (GRPHB HL Update Delaware income tax references for 2025 #7358, Chapter A p. A-3). For example, $210 of monthly gross earnings yields $160 countable: (210 − 10) × 0.8.
  • Earned sources (3): employment income, self-employment income, and specified-service-trade self-employment income. The unit-level earned sum floors at zero, so self-employment losses cannot offset unearned income.
  • Unearned income counts in full with no exemptions or deductions (GRPHB HL Update Delaware income tax references for 2025 #7358, Chapter A p. A-3). The source list has 23 entries, including Social Security, unemployment compensation, CA State Disability Insurance, veterans benefits, pensions and retirement distributions, support payments, interest, dividends, capital gains, net rental income (REQ-021's "net income from any kind of property"), educational assistance, and SSI (see the excluded-member decision below). SSP (ca_state_supplement) enters countable income at the SPM-unit level in the countable-income formula, since it is a unit-level variable and cannot sit in the person-level source list; CAPI is intentionally excluded (see the other-cash decision below).
  • Educational grants and scholarships count gross. GRPHB HL Update Delaware income tax references for 2025 #7358, Chapter A p. A-3 deducts tuition, books, supplies, and transportation expenses from educational assistance, but the approved scope excludes this carve-out by design (post-review amendment; REQ-020 in the Not modeled table): no expense-breakdown input exists, so educational_assistance counts in full as an intentional approved approximation, documented in the parameter file.
  • In-kind income and vendor payments are not counted, matching the rule in effect since June 1, 2021 (GRPHB HL Update Delaware income tax references for 2025 #7358, Chapter A p. A-1); this is a no-op because no in-kind input exists.

Resource tests

All three tests must pass, and every limit is inclusive (<=):

Test Limit Source
Liquid assets (cash, bank accounts, stocks, bonds) $50 per AU GRPHB HL #7358, Chapter A p. A-4
Personal property (cash assets + personal property + vehicle value above the exemption) $500 per AU GRPHB HL #7358, Chapter A p. A-4
Real property, combined assessed value $32,000 GRPHB HL #7358, Chapter A p. A-4

The first $3,000 of each vehicle's net market value is exempt, applied through an average-value proxy (aggregate household vehicle value divided by vehicle count) because PolicyEngine stores vehicle values in aggregate (GRPHB HL #7356, Chapter A p. A-5). When the household lives in a vehicle, one average-value vehicle moves from the personal-property path to the $32,000 real-property test (GRPHB HL #7358, Chapter A pp. A-1/A-4 — a Banda settlement change).

Income standards

The maximum basic grant doubles as the income limit (income-eligible when countable income falls below it). Maximum Basic Grant Levels by AU size across the six eras (GRPHB HL #7364, Chapter A p. A-7; identical schedule in the executed December 7, 2021 Board item):

AU size 6/1/2021 7/1/2022 7/1/2023 7/1/2024 7/1/2025 7/1/2026 (ongoing)
1 $332 $365 $402 $442 $486 $504
2 $445 $487 $529 $572 $615 $641
3 $558 $612 $667 $722 $777 $809
4 $672 $738 $804 $871 $938 $977
5 or more $785 $863 $941 $1,020 $1,099 $1,145

Eras turn over each July 1 after the initial June 1, 2021 start. The July 1, 2026 schedule is ongoing with no cost-of-living adjustment provision; the endpoint aligns with 2020-21 CalWORKs maximum aid payment levels.

Benefit calculation

GR = max(maximum basic grant − max(countable income, 0), 0) — the countable-income floor keeps net self-employment or rental losses from inflating the grant, and the outer floor keeps the benefit at zero when income reaches the grant. For example, a two-person AU with $500 of monthly countable income in January 2026 receives $615 − $500 = $115.

AU size is the count of GR-eligible persons, clipped to the 1–5 grant rows. Person-level eligibility requires:

  • a qualified immigration status (10 statuses; see decisions below),
  • not receiving SSI, SSP (ca_state_supplement), or CalWORKs (receipt bars the person from the AU, not the whole unit),
  • not residing in a medical treatment facility, and
  • linkage: incapacitated (is_incapable_of_self_care), or employable (unemployed or working under 100 hours per month, not self-employed, not a student — full-time or part-time college), or child linkage (under 16, or 16–18 attending high school full time).

Unit-level eligibility requires San Bernardino County residence, the post-June-2021 in_effect gate, at least one eligible adult (18 or older; children participate only through a parent applicant), the income test, and all three resource tests.

Requirements coverage

Research catalogued 38 requirements. The user-approved scope, as amended after review round 1, implements 23 of them with executable logic and dedicated tests, plus 2 in-scope requirements that are documented no-ops in the flat-grant era: REQ-024 (the current rule requires ignoring in-kind/vendor payments, and no such input exists) and REQ-034 (homeless AUs receive the full grant — which every eligible unit already receives under the flat design). The remaining 13 requirements are excluded by design (table below); the post-review amendment moved REQ-020's education-expense carve-out into that group. The requirements tracker verified all in-scope requirements against the files on disk with zero gaps, and the 141 test cases across 17 files all use 0.01 error margins. Every grant era has a boundary test (January 2022 through January 2027), January 2021 verifies that pre-program periods pay $0, and round-1 additions pin the month-level boundaries at the June 1, 2021 start (May vs June 2021) and the July 1, 2025 era flip (June vs July 2025), plus whole-year summation cases for 2021 (7 × $332 = $2,324) and 2026 (6 × $486 + 6 × $504 = $5,940).

Not modeled

Item Source Why excluded
Must apply for and accept potentially available income (UIB, SDI, SSI/SSP, pensions, VA) GRPHB HL #7358, Ch. A p. A-2; orientation deck p. 6 Application-behavior requirement; compliance assumed (standard treatment across sibling county programs)
Employable time limit: 3 months of aid per 12-month period GRPHB HL #7356, Ch. A pp. A-1/A-6; W&I §17001.5(a)(4) Requires month-by-month aid-receipt history; PolicyEngine carries no benefit-history state. Annualized results can overstate an employable recipient's GR (noted in the variable docstring)
Work-program compliance and sanction (WDD registration, 10 contacts/week, 30-day sanction) GRPHB HL #7356, Ch. A p. A-6; orientation deck p. 7; W&I §17001.5(a)(3),(5) Compliance behavior and sanction history are not simulatable; compliance assumed
Conduct bars (parole/probation violators, fleeing felons, voluntary quit within 90 days) Orientation deck p. 8 No criminal-justice-status or job-separation inputs exist
Room-rental 10%-of-gross rule and other real-estate expense netting GRPHB HL #7358, Ch. A p. A-3 PolicyEngine has a single net rental_income input; the net-unearned treatment (REQ-021) subsumes both approximately
Education-expense carve-out: tuition, books, supplies, and transportation deducted from grants and scholarships (REQ-020) GRPHB HL #7358, Ch. A p. A-3 Excluded by approved scope amendment; educational_assistance counts gross because no expense-breakdown input exists — an intentional approved approximation documented in the unearned-sources parameter
Lump sum excluded in month of receipt GRPHB HL #7356, Ch. A p. A-1; HL #7358, Ch. A p. A-3 No lump-sum-receipt input; the later-months effect is already captured by the $500 resource test
Micro resource exemptions (one cemetery plot per person, tools of trade, insurance cash surrender value) GRPHB HL #7356, Ch. A p. A-5 No corresponding inputs; the generic personal_property input carries reported non-cash personalty
Partial-month proration GRPHB HL #7358, Ch. A grant-levels section; HL #7364, Ch. A p. A-7 The model evaluates whole months; no entry/exit-date state (universal sibling treatment)
Pre-June-2021 needs-based era GRPHB HL #7356, Ch. A p. A-7 (5/1/1992 schedule) Era-coverage scope decision; see historical notes
Special Need items and the CalWORKs-MAP cap GRPHB HL #7358, Ch. A pp. A-8/A-9; HL #7379 (2022, removes Food Special Need) Discretionary, need-triggered vendor items with no triggering inputs; the MAP cap binds only through these unmodeled add-ons
Emergency Grocery Assistance ($0.90/person/day vendor payment) GRPHB HL #7358, Ch. A pp. A-10/A-11 Emergency bridging aid keyed to payment-delay timing; not a steady-state benefit
Loan character, repayment, lien, EBT-theft replacement, and reporting mechanics GRPHB Ch. A "Repayment" (HL #7386 p. A-1); Form GR 1; W&I §17109, §17403 PolicyEngine models the cash flow as a benefit, the standard GA/GR treatment; the loan character is documented in the top-level variable

Key modeling decisions

The following choices were made by the user during scope review and, where noted, amended after review round 1:

  • Program era: the model covers the flat-grant design only, gated by an in_effect parameter that switches to true on 2021-06-01.
  • Immigration list: eligibility follows the June 2025 GR 101 brochure wording — "U.S. citizen, legal permanent resident, or other non-citizen authorized to live in the United States" — with the third category mapped to all ten lawfully present immigration statuses in the model. The 2021 handbook text names only citizens and legal permanent residents; both sources are cited on the parameter.
  • Other-cash-assistance bar (amended after round 1): SSI, SSP (ca_state_supplement), and CalWORKs (TANF) receipt bar a person. An SSP-only recipient is treated exactly like an SSI recipient: barred from the AU, with the SSP counted toward the unit's income. CAPI receipt intentionally does not bar eligibility, and CAPI cash is intentionally not counted in unearned income — a user decision that diverges from the literal "all income in the AU" reading; both margins are documented in the parameter file and pinned by tests.
  • Excluded-member income: a person barred for SSI/SSP/CalWORKs receipt does not count toward AU size, but all members' income — including the barred member's SSI or SSP and wages — counts toward the unit's countable income, following the "all income in the AU" text.
  • Student bar (amended after round 1): any student fails the employable linkage path — both full-time students and part-time college students (is_part_time_college_student, the model's only part-time enrollment input). The handbook bars an employable who is "attending school" without qualifying full- or part-time attendance. The incapacity carve-out is retained: an incapacitated student stays linked through the incapacity arm. The child high-school path keeps its full-time requirement, which HL Implement Vermont H-0619 Millionaire Tax #7356 states explicitly.
  • Liquid-asset limit: the handbook's "$50 per person or per GR AU" wording is applied as a flat $50 limit per assistance unit.
  • Incapacity proxy: the "incapacitated" linkage category uses the existing is_incapable_of_self_care input.
  • Treatment-facility exclusion: uses the existing ssi_lives_in_medical_treatment_facility input; GR's facility definition is broader than SSI's medical-facility concept (documented in the variable).

Historical notes

  • Banda v. County of San Bernardino: filed December 2019 in San Bernardino Superior Court by Inland Counties Legal Services, Western Center on Law & Poverty, and the Public Interest Law Project; settled December 14, 2021. The settlement drove the 2021 redesign: the county removed needs-based budgeting, adopted the six-step grant schedule through July 1, 2026 (aligned to 2020-21 CalWORKs maximum aid payment levels), cut required job-search contacts from 20 to 10 per week, pays homeless AUs the full grant, treats vehicles used as residences as real property, starts aid from the application date, and moved to annual re-verification. Settlement terms remain in effect through at least December 2028, with the case open for monitoring. WCLP reports fewer than 200 GR recipients county-wide as of January 2020, and that the county denied 2,057 of 2,245 applications (92%) between July 2018 and April 2019.
  • Pre-June-2021 era: the prior needs-based design paid component-based grants (rent, utilities, food, personal and incidentals) under a schedule effective May 1, 1992, totaling $280 for an AU of one. The approved scope excludes this era; in_effect returns false before June 2021, so the model pays no San Bernardino GR in earlier periods.
  • Evidence limitations: the executed Banda settlement agreement is not publicly posted; its terms are mirrored in the Board-approved handbook letters and the WCLP press release. GRPHB Chapters B and later are administrative chapters approved by the TAD director and are not published online; Chapter A is the Board-approved standards document and the basis for this implementation.

Review

The implementation went through two full /review-program rounds. Round 1 (REQUEST CHANGES: 2 critical, 10 should-address, 10 suggestions) drove the scope amendments noted above plus: a new max_unit_size parameter replacing the hard-coded grant-table cap, an age < 19 comparison fix so float ages keep 18-year-olds in the child-student band (the parameter stays 18, matching the source text), quoted reference titles across all 16 parameter files (unquoted # had truncated the loaded titles), corrected Chapter A page citations, relocation of the in_sbd test to mirror the variable's path, and 22 new test cases. Round 2 confirmed all 22 round-1 findings resolved, with zero open critical findings and zero PDF mismatches across 75 verified values; final severity COMMENT.

Verification TODO

  • Adult age threshold: the value 18 in eligibility/age_threshold.yaml is an inference — GRPHB Chapter A limits GR to "needy adults" without stating a numeric age; the parameter file discloses the inference. Verify against county practice if documentation surfaces.
  • CI green on the current head: the initial head ran fully green; the round-1 head's run was in progress at review time.

Files added

52 files changed (+3,652 lines): 16 parameter files, 17 variable files, 17 test files (141 cases), 1 changelog fragment, and a programs.yaml entry.

parameters/gov/local/ca/sbd/general_relief/          # 16 files
  in_effect.yaml
  eligibility/
    age_threshold.yaml
    qualified_immigration_status.yaml
    child_linkage/{age_limit,student_age_limit}.yaml
    employable/monthly_hours_limit.yaml
  income/
    earned_exemption/{flat,rate}.yaml
    sources/{earned,unearned}.yaml
  payment/{maximum_basic_grant,max_unit_size}.yaml
  resources/{liquid_asset_limit,personal_property_limit,
             real_property_limit,vehicle_exemption}.yaml

variables/gov/local/ca/sbd/                          # 17 files
  in_sbd.py
  general_relief/
    ca_sbd_general_relief.py
    eligibility/   # 8: eligible, eligible_person, assistance_unit_size,
                   #    immigration_status_eligible, income_eligible,
                   #    meets_linkage_requirements,
                   #    receives_other_cash_assistance, resources_eligible
    income/        # 3: countable_income, gross_earned_income,
                   #    gross_unearned_income
    payment/       # 1: maximum_basic_grant
    resources/     # 3: countable_resources, countable_vehicle_value,
                   #    real_property_value

tests/policy/baseline/gov/local/ca/sbd/              # 17 files, 141 cases
  in_sbd.yaml       # at sbd/ level, mirroring variables/gov/local/ca/sbd/in_sbd.py
  general_relief/
    integration.yaml
    eligibility/ (8), income/ (3), payment/ (1), resources/ (3)

changelog.d/ca-sbd-gr.added.md
policyengine_us/programs.yaml                        # entry added

🤖 Generated with Claude Code

hua7450 and others added 3 commits July 27, 2026 14:35
…9159)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add San Bernardino County General Relief program

1 participant