From 10030978a840187ca4f639197ba3c8a942ed818d Mon Sep 17 00:00:00 2001 From: Ziming Date: Sat, 3 Oct 2026 20:13:54 -0400 Subject: [PATCH 1/6] Add California regular utility HEAP schedules and income rules --- changelog.d/ca-liheap-wave2c.added.md | 1 + .../gov/states/ca/csd/liheap/README.md | 99 + .../liheap/eligibility/applicant_min_age.yaml | 12 + .../liheap/income/earned_income_min_age.yaml | 11 + .../ca/csd/liheap/income/earned_sources.yaml | 17 + .../ca/csd/liheap/income/fpg_year_lag.yaml | 12 + .../income/monthly_rounding_increment.yaml | 12 + .../liheap/income/poverty_group_rates.yaml | 15 + .../income/smi_annual_rounding_increment.yaml | 12 + .../states/ca/csd/liheap/income/smi_rate.yaml | 12 + .../income/smi_rounding_size_limit.yaml | 12 + .../csd/liheap/income/support_deductions.yaml | 14 + .../csd/liheap/income/unearned_sources.yaml | 31 + .../payment/additional_person_amount.yaml | 11 + .../maximum_payment_household_size.yaml | 11 + .../liheap/payment/utility_base_amount.yaml | 534 ++ policyengine_us/programs.yaml | 10 +- .../csd/liheap/ca_liheap_household_size.yaml | 65 + .../csd/liheap/ca_liheap_utility_heating.yaml | 5102 +++++++++++++++++ .../ca_liheap_categorically_eligible.yaml | 90 + .../ca_liheap_income_eligible.yaml | 2722 +++++++++ .../eligibility/ca_liheap_income_limit.yaml | 1335 +++++ .../ca_liheap_utility_eligible.yaml | 211 + .../ca_liheap_countable_earned_income.yaml | 79 + .../income/ca_liheap_countable_income.yaml | 474 ++ .../payment/ca_liheap_income_group.yaml | 341 ++ .../ca/csd/liheap/ca_liheap_household_size.py | 14 + .../csd/liheap/ca_liheap_utility_heating.py | 26 + .../ca_liheap_categorically_eligible.py | 13 + .../eligibility/ca_liheap_income_eligible.py | 16 + .../eligibility/ca_liheap_income_limit.py | 46 + .../eligibility/ca_liheap_utility_eligible.py | 34 + .../ca_liheap_countable_earned_income.py | 16 + .../income/ca_liheap_countable_income.py | 32 + .../liheap/payment/ca_liheap_income_group.py | 33 + 35 files changed, 11474 insertions(+), 1 deletion(-) create mode 100644 changelog.d/ca-liheap-wave2c.added.md create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/README.md create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/eligibility/applicant_min_age.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/income/earned_income_min_age.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/income/earned_sources.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/income/fpg_year_lag.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/income/monthly_rounding_increment.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/income/poverty_group_rates.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_annual_rounding_increment.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_rate.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_rounding_size_limit.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/income/support_deductions.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/income/unearned_sources.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/payment/additional_person_amount.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/payment/maximum_payment_household_size.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/payment/utility_base_amount.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_household_size.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_utility_heating.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_categorically_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_limit.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/ca_liheap_income_group.yaml create mode 100644 policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_household_size.py create mode 100644 policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_utility_heating.py create mode 100644 policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_categorically_eligible.py create mode 100644 policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_eligible.py create mode 100644 policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_limit.py create mode 100644 policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.py create mode 100644 policyengine_us/variables/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.py create mode 100644 policyengine_us/variables/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.py create mode 100644 policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_income_group.py diff --git a/changelog.d/ca-liheap-wave2c.added.md b/changelog.d/ca-liheap-wave2c.added.md new file mode 100644 index 00000000000..b34f8a76fad --- /dev/null +++ b/changelog.d/ca-liheap-wave2c.added.md @@ -0,0 +1 @@ +Add California FY2026 regular gas and electric utility HEAP, including county schedules and shared income and household calculations; wood, propane and oil assistance remains incomplete. diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/README.md b/policyengine_us/parameters/gov/states/ca/csd/liheap/README.md new file mode 100644 index 00000000000..f6090b2043d --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/README.md @@ -0,0 +1,99 @@ +# California LIHEAP regular heating support + +`ca_liheap_utility_heating` estimates the regular gas/electric utility HEAP +schedule for all 58 California counties. It is an annual SPM-unit amount. +FY2026 is the researched season. Undated formulas and parameter backfilling +produce unverified historical estimates for earlier years; they do not extend +verified coverage. FY2027 evidence acquired during research was a draft. + +Regular wood/propane/oil assistance remains within the requested program scope, +but is not yet calculated. Local energy-burden group thresholds are unresolved; +wood valuation also requires local cord prices and heating-degree-day treatment. +The utility output is not a total California LIHEAP award. A zero utility +component for WPO or other unsupported fuels does not establish ineligibility +for regular assistance. No generic `ca_liheap` final award is provided. Solar, +coal, OTHER and UNSPECIFIED fuels have no supported utility-table crosswalk. + +## Supported calculations + +- Qualified household size counts citizen/legal-immigrant SPM-unit members. + Income includes excluded nonqualified members. The SPM unit approximates the + actual group sharing home energy costs. +- Earnings of members under 18 are excluded. Existing net business inputs + include non-SSTB/SSTB, Schedule F farm operations and partnership/S-corporation + income. No additional business-expense deduction is applied. Reported rental + and farm-rental income are assumed nonnegative. +- Federal SSI and California SSP are aggregated from monthly values. CalWORKs + is included once as the annual state benefit. Pension and retirement-account + aggregates include their components once; non-SSA survivor benefits remain + separate. SNAP affects categorical eligibility but is not countable income. +- Mandated support paid and reported allowable medical-insurance premiums are + deducted. Per person, positive `health_insurance_premiums` takes precedence + over `health_insurance_premiums_without_medicare_part_b`; they are not summed. + Modeled Medicare premiums are not added: their deduction is deferred under + the agreed implementation scope. +- CalFresh/SNAP or CalWORKs receipt bypasses the SMI income ceiling. An + over-ceiling categorically eligible household always uses poverty group 4, + including large households whose ordinary group-4 interval is empty. +- The utility award is county/group base amount plus $19 for each additional + qualified member through size 6. There is no unsupported actual-bill cap, + utility vulnerability supplement or statewide priority cutoff. + +## Guideline reuse and rounding + +The federal `fpg` helper uses a relative one-year lag, reproducing the 2025 +guidelines used by the FY2026 matrix. Ordinary groups end at 100%, 125% and 150% +of FPG, rounded to monthly cents with ties upward. Boundary comparisons use +integer monthly cents to avoid float32 storage moving published boundaries. + +The federal `smi` helper and shared four-person state amounts provide SMI. The +following inferred rounding reproduces all 25 explicit FY2026 matrix rows: + +1. Truncate 60% of four-person annual SMI to a dollar: $128,144 × 60% → $76,886. +2. For sizes through 12, apply the federal size factor, truncate annual dollars, + then divide by 12 and truncate monthly cents. +3. Above size 12, extend its $9,610.75 monthly amount by $192.215 per additional + member, derived from the shared 3% factor, and truncate the result to cents. + +The source does **not** explicitly prescribe this rounding or size-12 switch. +This is a numerical modeling inference, validated against every published row, +not a legal instruction. Sizes above 25 are unverified extrapolations. The +current agency income webpage instead says to add $192.21 after size 10; that +conflicts by cents with the final matrix starting at size 11. This implementation +follows the explicit final-matrix rows. + +## Existing-input limitations + +The application-period income rules require current monthly documentation; +annual inputs divided by 12 approximate steady income. Application timing, +identity, emancipation, temporary absence, live-in attendants, shared meters, +prior awards and local funding priority are not exactly represented. The +eligibility formula requires a qualified adult; it cannot identify an +emancipated minor who may legally apply. + +Known utility heat with a positive matching expense establishes energy +responsibility. Unsubsidized heat included in rent is also allowed as a proxy +for a documented embedded charge. A subsidized household needs a reported +positive energy charge. Missing embedded-charge detail is an input limitation, +not a blanket legal prohibition on subsidized or heat-in-rent applicants. +County values use existing model geography, whose missing-county fallback can +select the first county in a state; accurate estimates need the actual county. + +The raw premium totals do not distinguish vision, dental, long-term care and +all Medicare categories. Separately reported LTC and Medicare values are not +added or subtracted because their overlap with those totals is unspecified. +For exact calculations, the chosen raw premium input must represent allowable +non-Medicare medical coverage only. Otherwise premium deductions remain an +approximation. Alimony inputs also lack separate proof of a mandate. + +Existing inputs cannot isolate income earmarked directly for housing, excluded +IHSS/live-in-aide earnings, interest retained rather than used for household +support, royalties, jury pay and some unusual insurance receipts. These are +mapping limits, not new income exclusions. General cash gifts, loans, capital +gains and in-kind assistance are omitted under the source exclusions. + +## References + +- [CSD final FY2026 LIHEAP State Plan](https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=6,7,9,182,183,184,185,186,187,188,193,196,202,203,205,217,218,219,229,230,231,232,233,234,235,236,237,238,239,240,243,244,245,246,247,248,249,250,257,279,363,364): utility matrix, eligibility guide and unresolved regular WPO rules. +- [CSD FY2026 income eligibility webpage](https://www.csd.ca.gov/Pages/LIHEAP-Income-Eligibility.aspx): larger-household rounding conflict. +- [CSD publication index](https://www.csd.ca.gov/Pages/LIHEAPProgram.aspx): final FY2026 and draft FY2027 status, checked October 3, 2026. diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/eligibility/applicant_min_age.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/eligibility/applicant_min_age.yaml new file mode 100644 index 00000000000..ad28baa231d --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/eligibility/applicant_min_age.yaml @@ -0,0 +1,12 @@ +description: California requires applicants to be at least this age, unless emancipated under the Low Income Home Energy Assistance Program. +# Emancipation cannot be identified from existing inputs. +values: + 2025-10-01: 18 + +metadata: + unit: year + period: year + label: California LIHEAP minimum applicant age + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=219 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/earned_income_min_age.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/earned_income_min_age.yaml new file mode 100644 index 00000000000..e18cedc6626 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/earned_income_min_age.yaml @@ -0,0 +1,11 @@ +description: California counts earnings of household members beginning at this age under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 18 + +metadata: + unit: year + period: year + label: California LIHEAP minimum age for countable earnings + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=247 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/earned_sources.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/earned_sources.yaml new file mode 100644 index 00000000000..8c53a55c16b --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/earned_sources.yaml @@ -0,0 +1,17 @@ +description: California counts these earned income sources under the Low Income Home Energy Assistance Program. +# Existing net business inputs include current partnership profit or loss; no extra business-expense deduction is applied. Minor earnings are excluded. +values: + 2025-10-01: + - employment_income + - self_employment_income + - sstb_self_employment_income + - farm_operations_income + - partnership_s_corp_income + +metadata: + unit: list + period: year + label: California LIHEAP countable earned income sources + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=7,231,240,247 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/fpg_year_lag.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/fpg_year_lag.yaml new file mode 100644 index 00000000000..e78ba5037dc --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/fpg_year_lag.yaml @@ -0,0 +1,12 @@ +description: California uses federal poverty guidelines from this many years before the modeled heating season to assign poverty groups under the Low Income Home Energy Assistance Program. +# FY2026 matrix uses 2025 guidelines. Other years are unverified. +values: + 2025-10-01: 1 + +metadata: + unit: year + period: year + label: California LIHEAP federal poverty guideline year lag + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/monthly_rounding_increment.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/monthly_rounding_increment.yaml new file mode 100644 index 00000000000..9586c3b7f2e --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/monthly_rounding_increment.yaml @@ -0,0 +1,12 @@ +description: California publishes monthly income thresholds in increments of this amount under the Low Income Home Energy Assistance Program. +# Nearest-cent FPG thresholds and truncated SMI thresholds are inferred from the published rows, not express rounding directions. +values: + 2025-10-01: 0.01 + +metadata: + unit: currency-USD + period: year + label: California LIHEAP monthly income rounding increment + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/poverty_group_rates.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/poverty_group_rates.yaml new file mode 100644 index 00000000000..98160d4c724 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/poverty_group_rates.yaml @@ -0,0 +1,15 @@ +description: California uses these federal poverty guideline rates as ordinary poverty-group upper boundaries under the Low Income Home Energy Assistance Program. +# Upper bounds are inclusive after monthly-cent rounding. Above-SMI categorically eligible households use the fourth group even when their ordinary fourth-group interval is empty. +values: + 2025-10-01: + - 1 + - 1.25 + - 1.5 + +metadata: + unit: list + period: year + label: California LIHEAP poverty group upper rates + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_annual_rounding_increment.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_annual_rounding_increment.yaml new file mode 100644 index 00000000000..fabd5600687 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_annual_rounding_increment.yaml @@ -0,0 +1,12 @@ +description: California publishes state median income limits reproduced by truncating annual amounts to this increment under the Low Income Home Energy Assistance Program. +# Inferred: truncate the four-person 60% SMI base, then the size-adjusted annual amount through size12 before truncating monthly cents. Validated for all25 published FY2026 rows. +values: + 2025-10-01: 1 + +metadata: + unit: currency-USD + period: year + label: California LIHEAP SMI annual rounding increment + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_rate.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_rate.yaml new file mode 100644 index 00000000000..deab30c1acf --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_rate.yaml @@ -0,0 +1,12 @@ +description: California limits ordinary income eligibility to this share of state median income under the Low Income Home Energy Assistance Program. +# CalFresh or CalWORKs recipients bypass this income test. +values: + 2025-10-01: 0.6 + +metadata: + unit: /1 + period: year + label: California LIHEAP state median income limit rate + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=9,184 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_rounding_size_limit.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_rounding_size_limit.yaml new file mode 100644 index 00000000000..5669b0e4257 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_rounding_size_limit.yaml @@ -0,0 +1,12 @@ +description: California publishes state median income limits reproduced by changing the rounding method above this household size under the Low Income Home Energy Assistance Program. +# Inferred numerical method, not an express rule: above size12, add the shared federal additional-person factor times the truncated annual four-person base before monthly-cent truncation. Sizes above25 and other years are unverified. +values: + 2025-10-01: 12 + +metadata: + unit: person + period: year + label: California LIHEAP SMI rounding household size limit + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/support_deductions.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/support_deductions.yaml new file mode 100644 index 00000000000..945b87fedc9 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/support_deductions.yaml @@ -0,0 +1,14 @@ +description: California deducts these legally mandated support payments from household income under the Low Income Home Energy Assistance Program. +# Child-support input specifies legally mandated payments; alimony mandate verification is not separately modeled. +values: + 2025-10-01: + - child_support_expense + - alimony_expense + +metadata: + unit: list + period: year + label: California LIHEAP support payment deductions + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=247 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/unearned_sources.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/unearned_sources.yaml new file mode 100644 index 00000000000..90a3aa6c24f --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/unearned_sources.yaml @@ -0,0 +1,31 @@ +description: California counts these unearned income sources under the Low Income Home Energy Assistance Program. +# SSI and state SSP are monthly and are annualized once by aggregation. Pension and retirement-distribution aggregates include their own subcomponents. Interest use, housing-directed cash aid, royalties, jury pay and unusual insurance receipts need more detail than existing inputs provide. SNAP and friends/relative cash gifts are excluded. +values: + 2025-10-01: + - unemployment_compensation + - strike_benefits + - social_security + - ssi + - ca_state_supplement + - pension_income + - retirement_distributions + - general_assistance + - ca_tanf + - rental_income + - farm_rent_income + - alimony_income + - child_support_received + - interest_income + - dividend_income + - workers_compensation + - disability_benefits + - veterans_benefits + - survivor_benefits + +metadata: + unit: list + period: year + label: California LIHEAP countable unearned income sources + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=7,229,230,232,234,236,237,238,239,240,243,244,245,247 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/additional_person_amount.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/additional_person_amount.yaml new file mode 100644 index 00000000000..3438be453f2 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/additional_person_amount.yaml @@ -0,0 +1,11 @@ +description: California adds this amount for each additional qualified household member under the regular utility heating schedule under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 19 + +metadata: + unit: currency-USD + period: year + label: California LIHEAP utility additional person amount + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/maximum_payment_household_size.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/maximum_payment_household_size.yaml new file mode 100644 index 00000000000..7c000c19ed4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/maximum_payment_household_size.yaml @@ -0,0 +1,11 @@ +description: California caps regular utility payment household-size increments at this many qualified members under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 6 + +metadata: + unit: person + period: year + label: California LIHEAP maximum utility payment household size + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/utility_base_amount.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/utility_base_amount.yaml new file mode 100644 index 00000000000..e657ff9f2c6 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/utility_base_amount.yaml @@ -0,0 +1,534 @@ +description: California provides these county base benefits by poverty group for a one-person household under the regular utility heating component of the Low Income Home Energy Assistance Program. +metadata: + propagate_metadata_to_children: true + unit: currency-USD + period: year + label: California LIHEAP utility base benefit + reference: + - title: California FY2026 LIHEAP State Plan, county utility payment matrix + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=182,183,184 +# Only the 58 California counties are represented. The formula safely masks +# counties outside this table before lookup instead of creating zero policies +# for every other county. Provider rows repeat the same county amounts. +ALAMEDA_COUNTY_CA: + 1: + 2025-10-01: 484 + 2: + 2025-10-01: 404 + 3: + 2025-10-01: 356 + 4: + 2025-10-01: 308 +ALPINE_COUNTY_CA: + 1: + 2025-10-01: 688 + 2: + 2025-10-01: 566 + 3: + 2025-10-01: 492 + 4: + 2025-10-01: 419 +AMADOR_COUNTY_CA: + 1: + 2025-10-01: 738 + 2: + 2025-10-01: 605 + 3: + 2025-10-01: 526 + 4: + 2025-10-01: 446 +BUTTE_COUNTY_CA: + 1: + 2025-10-01: 692 + 2: + 2025-10-01: 569 + 3: + 2025-10-01: 495 + 4: + 2025-10-01: 421 +CALAVERAS_COUNTY_CA: + 1: + 2025-10-01: 715 + 2: + 2025-10-01: 587 + 3: + 2025-10-01: 510 + 4: + 2025-10-01: 433 +COLUSA_COUNTY_CA: + 1: + 2025-10-01: 718 + 2: + 2025-10-01: 589 + 3: + 2025-10-01: 512 + 4: + 2025-10-01: 435 +CONTRA_COSTA_COUNTY_CA: + 1: + 2025-10-01: 618 + 2: + 2025-10-01: 510 + 3: + 2025-10-01: 445 + 4: + 2025-10-01: 381 +DEL_NORTE_COUNTY_CA: + 1: + 2025-10-01: 674 + 2: + 2025-10-01: 554 + 3: + 2025-10-01: 482 + 4: + 2025-10-01: 411 +EL_DORADO_COUNTY_CA: + 1: + 2025-10-01: 714 + 2: + 2025-10-01: 586 + 3: + 2025-10-01: 509 + 4: + 2025-10-01: 433 +FRESNO_COUNTY_CA: + 1: + 2025-10-01: 716 + 2: + 2025-10-01: 588 + 3: + 2025-10-01: 511 + 4: + 2025-10-01: 434 +GLENN_COUNTY_CA: + 1: + 2025-10-01: 698 + 2: + 2025-10-01: 574 + 3: + 2025-10-01: 499 + 4: + 2025-10-01: 424 +HUMBOLDT_COUNTY_CA: + 1: + 2025-10-01: 525 + 2: + 2025-10-01: 436 + 3: + 2025-10-01: 383 + 4: + 2025-10-01: 330 +IMPERIAL_COUNTY_CA: + 1: + 2025-10-01: 621 + 2: + 2025-10-01: 512 + 3: + 2025-10-01: 447 + 4: + 2025-10-01: 382 +INYO_COUNTY_CA: + 1: + 2025-10-01: 530 + 2: + 2025-10-01: 440 + 3: + 2025-10-01: 386 + 4: + 2025-10-01: 333 +KERN_COUNTY_CA: + 1: + 2025-10-01: 648 + 2: + 2025-10-01: 534 + 3: + 2025-10-01: 466 + 4: + 2025-10-01: 397 +KINGS_COUNTY_CA: + 1: + 2025-10-01: 635 + 2: + 2025-10-01: 523 + 3: + 2025-10-01: 457 + 4: + 2025-10-01: 390 +LAKE_COUNTY_CA: + 1: + 2025-10-01: 802 + 2: + 2025-10-01: 656 + 3: + 2025-10-01: 568 + 4: + 2025-10-01: 480 +LASSEN_COUNTY_CA: + 1: + 2025-10-01: 660 + 2: + 2025-10-01: 543 + 3: + 2025-10-01: 473 + 4: + 2025-10-01: 403 +LOS_ANGELES_COUNTY_CA: + 1: + 2025-10-01: 487 + 2: + 2025-10-01: 407 + 3: + 2025-10-01: 358 + 4: + 2025-10-01: 310 +MADERA_COUNTY_CA: + 1: + 2025-10-01: 702 + 2: + 2025-10-01: 576 + 3: + 2025-10-01: 501 + 4: + 2025-10-01: 426 +MARIN_COUNTY_CA: + 1: + 2025-10-01: 652 + 2: + 2025-10-01: 537 + 3: + 2025-10-01: 468 + 4: + 2025-10-01: 399 +MARIPOSA_COUNTY_CA: + 1: + 2025-10-01: 719 + 2: + 2025-10-01: 590 + 3: + 2025-10-01: 513 + 4: + 2025-10-01: 435 +MENDOCINO_COUNTY_CA: + 1: + 2025-10-01: 610 + 2: + 2025-10-01: 504 + 3: + 2025-10-01: 440 + 4: + 2025-10-01: 376 +MERCED_COUNTY_CA: + 1: + 2025-10-01: 674 + 2: + 2025-10-01: 554 + 3: + 2025-10-01: 482 + 4: + 2025-10-01: 411 +MODOC_COUNTY_CA: + 1: + 2025-10-01: 614 + 2: + 2025-10-01: 507 + 3: + 2025-10-01: 442 + 4: + 2025-10-01: 378 +MONO_COUNTY_CA: + 1: + 2025-10-01: 622 + 2: + 2025-10-01: 514 + 3: + 2025-10-01: 448 + 4: + 2025-10-01: 383 +MONTEREY_COUNTY_CA: + 1: + 2025-10-01: 502 + 2: + 2025-10-01: 418 + 3: + 2025-10-01: 368 + 4: + 2025-10-01: 318 +NAPA_COUNTY_CA: + 1: + 2025-10-01: 628 + 2: + 2025-10-01: 518 + 3: + 2025-10-01: 452 + 4: + 2025-10-01: 386 +NEVADA_COUNTY_CA: + 1: + 2025-10-01: 837 + 2: + 2025-10-01: 684 + 3: + 2025-10-01: 591 + 4: + 2025-10-01: 499 +ORANGE_COUNTY_CA: + 1: + 2025-10-01: 542 + 2: + 2025-10-01: 450 + 3: + 2025-10-01: 394 + 4: + 2025-10-01: 339 +PLACER_COUNTY_CA: + 1: + 2025-10-01: 663 + 2: + 2025-10-01: 546 + 3: + 2025-10-01: 476 + 4: + 2025-10-01: 405 +PLUMAS_COUNTY_CA: + 1: + 2025-10-01: 620 + 2: + 2025-10-01: 512 + 3: + 2025-10-01: 447 + 4: + 2025-10-01: 382 +RIVERSIDE_COUNTY_CA: + 1: + 2025-10-01: 633 + 2: + 2025-10-01: 522 + 3: + 2025-10-01: 456 + 4: + 2025-10-01: 389 +SACRAMENTO_COUNTY_CA: + 1: + 2025-10-01: 580 + 2: + 2025-10-01: 480 + 3: + 2025-10-01: 420 + 4: + 2025-10-01: 360 +SAN_BENITO_COUNTY_CA: + 1: + 2025-10-01: 544 + 2: + 2025-10-01: 451 + 3: + 2025-10-01: 396 + 4: + 2025-10-01: 340 +SAN_BERNARDINO_COUNTY_CA: + 1: + 2025-10-01: 590 + 2: + 2025-10-01: 488 + 3: + 2025-10-01: 426 + 4: + 2025-10-01: 365 +SAN_DIEGO_COUNTY_CA: + 1: + 2025-10-01: 492 + 2: + 2025-10-01: 411 + 3: + 2025-10-01: 362 + 4: + 2025-10-01: 313 +SAN_FRANCISCO_COUNTY_CA: + 1: + 2025-10-01: 469 + 2: + 2025-10-01: 392 + 3: + 2025-10-01: 346 + 4: + 2025-10-01: 300 +SAN_JOAQUIN_COUNTY_CA: + 1: + 2025-10-01: 697 + 2: + 2025-10-01: 572 + 3: + 2025-10-01: 498 + 4: + 2025-10-01: 423 +SAN_LUIS_OBISPO_COUNTY_CA: + 1: + 2025-10-01: 522 + 2: + 2025-10-01: 434 + 3: + 2025-10-01: 381 + 4: + 2025-10-01: 328 +SAN_MATEO_COUNTY_CA: + 1: + 2025-10-01: 576 + 2: + 2025-10-01: 477 + 3: + 2025-10-01: 417 + 4: + 2025-10-01: 358 +SANTA_BARBARA_COUNTY_CA: + 1: + 2025-10-01: 437 + 2: + 2025-10-01: 367 + 3: + 2025-10-01: 325 + 4: + 2025-10-01: 283 +SANTA_CLARA_COUNTY_CA: + 1: + 2025-10-01: 546 + 2: + 2025-10-01: 453 + 3: + 2025-10-01: 397 + 4: + 2025-10-01: 341 +SANTA_CRUZ_COUNTY_CA: + 1: + 2025-10-01: 541 + 2: + 2025-10-01: 449 + 3: + 2025-10-01: 394 + 4: + 2025-10-01: 339 +SHASTA_COUNTY_CA: + 1: + 2025-10-01: 758 + 2: + 2025-10-01: 621 + 3: + 2025-10-01: 538 + 4: + 2025-10-01: 456 +SIERRA_COUNTY_CA: + 1: + 2025-10-01: 648 + 2: + 2025-10-01: 534 + 3: + 2025-10-01: 465 + 4: + 2025-10-01: 397 +SISKIYOU_COUNTY_CA: + 1: + 2025-10-01: 673 + 2: + 2025-10-01: 553 + 3: + 2025-10-01: 482 + 4: + 2025-10-01: 410 +SOLANO_COUNTY_CA: + 1: + 2025-10-01: 579 + 2: + 2025-10-01: 479 + 3: + 2025-10-01: 419 + 4: + 2025-10-01: 359 +SONOMA_COUNTY_CA: + 1: + 2025-10-01: 563 + 2: + 2025-10-01: 467 + 3: + 2025-10-01: 409 + 4: + 2025-10-01: 351 +STANISLAUS_COUNTY_CA: + 1: + 2025-10-01: 659 + 2: + 2025-10-01: 542 + 3: + 2025-10-01: 472 + 4: + 2025-10-01: 403 +SUTTER_COUNTY_CA: + 1: + 2025-10-01: 721 + 2: + 2025-10-01: 592 + 3: + 2025-10-01: 514 + 4: + 2025-10-01: 437 +TEHAMA_COUNTY_CA: + 1: + 2025-10-01: 753 + 2: + 2025-10-01: 617 + 3: + 2025-10-01: 535 + 4: + 2025-10-01: 454 +TRINITY_COUNTY_CA: + 1: + 2025-10-01: 503 + 2: + 2025-10-01: 419 + 3: + 2025-10-01: 368 + 4: + 2025-10-01: 318 +TULARE_COUNTY_CA: + 1: + 2025-10-01: 618 + 2: + 2025-10-01: 510 + 3: + 2025-10-01: 445 + 4: + 2025-10-01: 381 +TUOLUMNE_COUNTY_CA: + 1: + 2025-10-01: 723 + 2: + 2025-10-01: 593 + 3: + 2025-10-01: 515 + 4: + 2025-10-01: 437 +VENTURA_COUNTY_CA: + 1: + 2025-10-01: 459 + 2: + 2025-10-01: 384 + 3: + 2025-10-01: 340 + 4: + 2025-10-01: 295 +YOLO_COUNTY_CA: + 1: + 2025-10-01: 565 + 2: + 2025-10-01: 468 + 3: + 2025-10-01: 410 + 4: + 2025-10-01: 352 +YUBA_COUNTY_CA: + 1: + 2025-10-01: 713 + 2: + 2025-10-01: 585 + 3: + 2025-10-01: 508 + 4: + 2025-10-01: 432 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 756dc2c4988..6c1f253f9db 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -802,7 +802,7 @@ programs: category: Benefits agency: HHS status: partial - coverage: OR, DC, Riverside County, MA, IL, KS, MS, TX + coverage: OR, DC, CA utility heating, MA, IL, KS, MS, TX state_implementations: - state: OR status: in_progress @@ -846,6 +846,14 @@ programs: variable: tx_ceap parameter_prefix: gov.states.tx.tdhca.ceap notes: Models the FPG income limit, the FY2024-only SMI limit, benefit amounts, and categorical eligibility through TANF enrollment, SNAP eligibility, and SSI receipt. Not modeled - net rather than gross gambling winnings, the Medicare premium deduction from counted Social Security, and the exclusion of means-tested veterans' pensions from counted income (10 TAC 6.4(c)) + - state: CA + status: partial + name: California utility HEAP + full_name: California Home Energy Assistance Program utility heating component + variable: ca_liheap_utility_heating + parameter_prefix: gov.states.ca.csd.liheap + verified_years: "2026" + notes: FY2026 regular gas and electric utility heating only. Wood, propane and oil regular assistance is still incomplete. Annual inputs approximate application-month circumstances and SPM units approximate energy households; local priorities, detailed income exclusions and allowable medical-premium composition are not fully represented. Earlier backfills are unverified historical estimates. Crisis, cooling, weatherization and equipment are outside scope. # --- SSA programs --- - id: ssi diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_household_size.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_household_size.yaml new file mode 100644 index 00000000000..4753beebc5b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_household_size.yaml @@ -0,0 +1,65 @@ +# https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=196,202,203 +# Nonqualified residents remain income sources but are excluded from size. + +- name: Case 1, actual qualified household members determine size. + period: 2026 + # Qualified size is one in each mixed-status household, zero when all members + # are nonqualified, and zero for the Oregon component. No size inputs forced. + input: + people: + person1: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person2: {age: 30, is_citizen_or_legal_immigrant: false, ssi: 0} + person3: {age: 35, is_citizen_or_legal_immigrant: false, ssi: 0} + person4: {age: 30, is_citizen_or_legal_immigrant: false, ssi: 0} + person5: {age: 5, is_citizen_or_legal_immigrant: true, ssi: 0} + person6: {age: 35, is_citizen_or_legal_immigrant: false, ssi: 0} + person7: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person8: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + spm_units: + spm_unit1: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person3, person4, person5] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person6] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person7, person8] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1, person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person3, person4, person5] + state_code: CA + county: ALAMEDA_COUNTY_CA + household3: + members: [person6] + state_code: CA + county: ALAMEDA_COUNTY_CA + household4: + members: [person7, person8] + state_code: OR + county: MULTNOMAH_COUNTY_OR + output: + ca_liheap_household_size: [1, 1, 0, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_utility_heating.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_utility_heating.yaml new file mode 100644 index 00000000000..abbc35b022a --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_utility_heating.yaml @@ -0,0 +1,5102 @@ +# https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=182,183,184,202,203,217,218,219,246,247,279 +# Utility component only; unresolved regular WPO awards are not tested or denied. +# Every integrated award is calculated from raw facts, with no forced intermediates. + +- name: Case 1, every county utility table amount in poverty group 1. + period: 2026 + # All 58 county rows are independently parsed from original plan pages 182–183. + # County names are alphabetic. One qualified adult and monthly income 1000 + # place every row in group 1. Actual gas bill 100 is not a benefit cap. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person4: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person6: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person7: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person8: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person9: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person10: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person11: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person12: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person13: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person14: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person15: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person16: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person17: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person18: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person19: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person20: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person21: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person22: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person23: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person24: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person25: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person26: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person27: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person28: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person29: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person30: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person31: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person32: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person33: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person34: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person35: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person36: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person37: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person38: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person39: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person40: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person41: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person42: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person43: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person44: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person45: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person46: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person47: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person48: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person49: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person50: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person51: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person52: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person53: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person54: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person55: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person56: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person57: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + person58: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person4] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person5] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit6: + members: [person6] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit7: + members: [person7] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit8: + members: [person8] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit9: + members: [person9] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit10: + members: [person10] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit11: + members: [person11] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit12: + members: [person12] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit13: + members: [person13] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit14: + members: [person14] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit15: + members: [person15] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit16: + members: [person16] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit17: + members: [person17] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit18: + members: [person18] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit19: + members: [person19] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit20: + members: [person20] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit21: + members: [person21] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit22: + members: [person22] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit23: + members: [person23] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit24: + members: [person24] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit25: + members: [person25] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit26: + members: [person26] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit27: + members: [person27] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit28: + members: [person28] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit29: + members: [person29] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit30: + members: [person30] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit31: + members: [person31] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit32: + members: [person32] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit33: + members: [person33] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit34: + members: [person34] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit35: + members: [person35] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit36: + members: [person36] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit37: + members: [person37] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit38: + members: [person38] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit39: + members: [person39] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit40: + members: [person40] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit41: + members: [person41] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit42: + members: [person42] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit43: + members: [person43] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit44: + members: [person44] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit45: + members: [person45] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit46: + members: [person46] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit47: + members: [person47] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit48: + members: [person48] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit49: + members: [person49] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit50: + members: [person50] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit51: + members: [person51] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit52: + members: [person52] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit53: + members: [person53] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit54: + members: [person54] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit55: + members: [person55] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit56: + members: [person56] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit57: + members: [person57] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit58: + members: [person58] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: ALPINE_COUNTY_CA + household3: + members: [person3] + state_code: CA + county: AMADOR_COUNTY_CA + household4: + members: [person4] + state_code: CA + county: BUTTE_COUNTY_CA + household5: + members: [person5] + state_code: CA + county: CALAVERAS_COUNTY_CA + household6: + members: [person6] + state_code: CA + county: COLUSA_COUNTY_CA + household7: + members: [person7] + state_code: CA + county: CONTRA_COSTA_COUNTY_CA + household8: + members: [person8] + state_code: CA + county: DEL_NORTE_COUNTY_CA + household9: + members: [person9] + state_code: CA + county: EL_DORADO_COUNTY_CA + household10: + members: [person10] + state_code: CA + county: FRESNO_COUNTY_CA + household11: + members: [person11] + state_code: CA + county: GLENN_COUNTY_CA + household12: + members: [person12] + state_code: CA + county: HUMBOLDT_COUNTY_CA + household13: + members: [person13] + state_code: CA + county: IMPERIAL_COUNTY_CA + household14: + members: [person14] + state_code: CA + county: INYO_COUNTY_CA + household15: + members: [person15] + state_code: CA + county: KERN_COUNTY_CA + household16: + members: [person16] + state_code: CA + county: KINGS_COUNTY_CA + household17: + members: [person17] + state_code: CA + county: LAKE_COUNTY_CA + household18: + members: [person18] + state_code: CA + county: LASSEN_COUNTY_CA + household19: + members: [person19] + state_code: CA + county: LOS_ANGELES_COUNTY_CA + household20: + members: [person20] + state_code: CA + county: MADERA_COUNTY_CA + household21: + members: [person21] + state_code: CA + county: MARIN_COUNTY_CA + household22: + members: [person22] + state_code: CA + county: MARIPOSA_COUNTY_CA + household23: + members: [person23] + state_code: CA + county: MENDOCINO_COUNTY_CA + household24: + members: [person24] + state_code: CA + county: MERCED_COUNTY_CA + household25: + members: [person25] + state_code: CA + county: MODOC_COUNTY_CA + household26: + members: [person26] + state_code: CA + county: MONO_COUNTY_CA + household27: + members: [person27] + state_code: CA + county: MONTEREY_COUNTY_CA + household28: + members: [person28] + state_code: CA + county: NAPA_COUNTY_CA + household29: + members: [person29] + state_code: CA + county: NEVADA_COUNTY_CA + household30: + members: [person30] + state_code: CA + county: ORANGE_COUNTY_CA + household31: + members: [person31] + state_code: CA + county: PLACER_COUNTY_CA + household32: + members: [person32] + state_code: CA + county: PLUMAS_COUNTY_CA + household33: + members: [person33] + state_code: CA + county: RIVERSIDE_COUNTY_CA + household34: + members: [person34] + state_code: CA + county: SACRAMENTO_COUNTY_CA + household35: + members: [person35] + state_code: CA + county: SAN_BENITO_COUNTY_CA + household36: + members: [person36] + state_code: CA + county: SAN_BERNARDINO_COUNTY_CA + household37: + members: [person37] + state_code: CA + county: SAN_DIEGO_COUNTY_CA + household38: + members: [person38] + state_code: CA + county: SAN_FRANCISCO_COUNTY_CA + household39: + members: [person39] + state_code: CA + county: SAN_JOAQUIN_COUNTY_CA + household40: + members: [person40] + state_code: CA + county: SAN_LUIS_OBISPO_COUNTY_CA + household41: + members: [person41] + state_code: CA + county: SAN_MATEO_COUNTY_CA + household42: + members: [person42] + state_code: CA + county: SANTA_BARBARA_COUNTY_CA + household43: + members: [person43] + state_code: CA + county: SANTA_CLARA_COUNTY_CA + household44: + members: [person44] + state_code: CA + county: SANTA_CRUZ_COUNTY_CA + household45: + members: [person45] + state_code: CA + county: SHASTA_COUNTY_CA + household46: + members: [person46] + state_code: CA + county: SIERRA_COUNTY_CA + household47: + members: [person47] + state_code: CA + county: SISKIYOU_COUNTY_CA + household48: + members: [person48] + state_code: CA + county: SOLANO_COUNTY_CA + household49: + members: [person49] + state_code: CA + county: SONOMA_COUNTY_CA + household50: + members: [person50] + state_code: CA + county: STANISLAUS_COUNTY_CA + household51: + members: [person51] + state_code: CA + county: SUTTER_COUNTY_CA + household52: + members: [person52] + state_code: CA + county: TEHAMA_COUNTY_CA + household53: + members: [person53] + state_code: CA + county: TRINITY_COUNTY_CA + household54: + members: [person54] + state_code: CA + county: TULARE_COUNTY_CA + household55: + members: [person55] + state_code: CA + county: TUOLUMNE_COUNTY_CA + household56: + members: [person56] + state_code: CA + county: VENTURA_COUNTY_CA + household57: + members: [person57] + state_code: CA + county: YOLO_COUNTY_CA + household58: + members: [person58] + state_code: CA + county: YUBA_COUNTY_CA + output: + ca_liheap_income_group: + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + - 1 + ca_liheap_utility_heating: + - 484 + - 688 + - 738 + - 692 + - 715 + - 718 + - 618 + - 674 + - 714 + - 716 + - 698 + - 525 + - 621 + - 530 + - 648 + - 635 + - 802 + - 660 + - 487 + - 702 + - 652 + - 719 + - 610 + - 674 + - 614 + - 622 + - 502 + - 628 + - 837 + - 542 + - 663 + - 620 + - 633 + - 580 + - 544 + - 590 + - 492 + - 469 + - 697 + - 522 + - 576 + - 437 + - 546 + - 541 + - 758 + - 648 + - 673 + - 579 + - 563 + - 659 + - 721 + - 753 + - 503 + - 618 + - 723 + - 459 + - 565 + - 713 + +- name: Case 2, every county utility table amount in poverty group 2. + period: 2026 + # All 58 county rows are independently parsed from original plan pages 182–183. + # County names are alphabetic. One qualified adult and monthly income 1500 + # place every row in group 2. Actual gas bill 100 is not a benefit cap. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person4: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person6: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person7: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person8: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person9: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person10: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person11: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person12: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person13: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person14: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person15: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person16: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person17: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person18: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person19: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person20: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person21: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person22: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person23: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person24: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person25: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person26: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person27: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person28: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person29: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person30: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person31: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person32: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person33: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person34: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person35: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person36: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person37: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person38: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person39: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person40: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person41: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person42: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person43: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person44: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person45: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person46: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person47: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person48: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person49: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person50: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person51: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person52: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person53: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person54: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person55: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person56: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person57: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + person58: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 18_000 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person4] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person5] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit6: + members: [person6] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit7: + members: [person7] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit8: + members: [person8] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit9: + members: [person9] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit10: + members: [person10] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit11: + members: [person11] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit12: + members: [person12] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit13: + members: [person13] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit14: + members: [person14] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit15: + members: [person15] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit16: + members: [person16] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit17: + members: [person17] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit18: + members: [person18] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit19: + members: [person19] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit20: + members: [person20] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit21: + members: [person21] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit22: + members: [person22] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit23: + members: [person23] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit24: + members: [person24] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit25: + members: [person25] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit26: + members: [person26] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit27: + members: [person27] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit28: + members: [person28] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit29: + members: [person29] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit30: + members: [person30] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit31: + members: [person31] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit32: + members: [person32] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit33: + members: [person33] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit34: + members: [person34] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit35: + members: [person35] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit36: + members: [person36] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit37: + members: [person37] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit38: + members: [person38] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit39: + members: [person39] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit40: + members: [person40] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit41: + members: [person41] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit42: + members: [person42] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit43: + members: [person43] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit44: + members: [person44] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit45: + members: [person45] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit46: + members: [person46] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit47: + members: [person47] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit48: + members: [person48] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit49: + members: [person49] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit50: + members: [person50] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit51: + members: [person51] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit52: + members: [person52] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit53: + members: [person53] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit54: + members: [person54] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit55: + members: [person55] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit56: + members: [person56] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit57: + members: [person57] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit58: + members: [person58] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: ALPINE_COUNTY_CA + household3: + members: [person3] + state_code: CA + county: AMADOR_COUNTY_CA + household4: + members: [person4] + state_code: CA + county: BUTTE_COUNTY_CA + household5: + members: [person5] + state_code: CA + county: CALAVERAS_COUNTY_CA + household6: + members: [person6] + state_code: CA + county: COLUSA_COUNTY_CA + household7: + members: [person7] + state_code: CA + county: CONTRA_COSTA_COUNTY_CA + household8: + members: [person8] + state_code: CA + county: DEL_NORTE_COUNTY_CA + household9: + members: [person9] + state_code: CA + county: EL_DORADO_COUNTY_CA + household10: + members: [person10] + state_code: CA + county: FRESNO_COUNTY_CA + household11: + members: [person11] + state_code: CA + county: GLENN_COUNTY_CA + household12: + members: [person12] + state_code: CA + county: HUMBOLDT_COUNTY_CA + household13: + members: [person13] + state_code: CA + county: IMPERIAL_COUNTY_CA + household14: + members: [person14] + state_code: CA + county: INYO_COUNTY_CA + household15: + members: [person15] + state_code: CA + county: KERN_COUNTY_CA + household16: + members: [person16] + state_code: CA + county: KINGS_COUNTY_CA + household17: + members: [person17] + state_code: CA + county: LAKE_COUNTY_CA + household18: + members: [person18] + state_code: CA + county: LASSEN_COUNTY_CA + household19: + members: [person19] + state_code: CA + county: LOS_ANGELES_COUNTY_CA + household20: + members: [person20] + state_code: CA + county: MADERA_COUNTY_CA + household21: + members: [person21] + state_code: CA + county: MARIN_COUNTY_CA + household22: + members: [person22] + state_code: CA + county: MARIPOSA_COUNTY_CA + household23: + members: [person23] + state_code: CA + county: MENDOCINO_COUNTY_CA + household24: + members: [person24] + state_code: CA + county: MERCED_COUNTY_CA + household25: + members: [person25] + state_code: CA + county: MODOC_COUNTY_CA + household26: + members: [person26] + state_code: CA + county: MONO_COUNTY_CA + household27: + members: [person27] + state_code: CA + county: MONTEREY_COUNTY_CA + household28: + members: [person28] + state_code: CA + county: NAPA_COUNTY_CA + household29: + members: [person29] + state_code: CA + county: NEVADA_COUNTY_CA + household30: + members: [person30] + state_code: CA + county: ORANGE_COUNTY_CA + household31: + members: [person31] + state_code: CA + county: PLACER_COUNTY_CA + household32: + members: [person32] + state_code: CA + county: PLUMAS_COUNTY_CA + household33: + members: [person33] + state_code: CA + county: RIVERSIDE_COUNTY_CA + household34: + members: [person34] + state_code: CA + county: SACRAMENTO_COUNTY_CA + household35: + members: [person35] + state_code: CA + county: SAN_BENITO_COUNTY_CA + household36: + members: [person36] + state_code: CA + county: SAN_BERNARDINO_COUNTY_CA + household37: + members: [person37] + state_code: CA + county: SAN_DIEGO_COUNTY_CA + household38: + members: [person38] + state_code: CA + county: SAN_FRANCISCO_COUNTY_CA + household39: + members: [person39] + state_code: CA + county: SAN_JOAQUIN_COUNTY_CA + household40: + members: [person40] + state_code: CA + county: SAN_LUIS_OBISPO_COUNTY_CA + household41: + members: [person41] + state_code: CA + county: SAN_MATEO_COUNTY_CA + household42: + members: [person42] + state_code: CA + county: SANTA_BARBARA_COUNTY_CA + household43: + members: [person43] + state_code: CA + county: SANTA_CLARA_COUNTY_CA + household44: + members: [person44] + state_code: CA + county: SANTA_CRUZ_COUNTY_CA + household45: + members: [person45] + state_code: CA + county: SHASTA_COUNTY_CA + household46: + members: [person46] + state_code: CA + county: SIERRA_COUNTY_CA + household47: + members: [person47] + state_code: CA + county: SISKIYOU_COUNTY_CA + household48: + members: [person48] + state_code: CA + county: SOLANO_COUNTY_CA + household49: + members: [person49] + state_code: CA + county: SONOMA_COUNTY_CA + household50: + members: [person50] + state_code: CA + county: STANISLAUS_COUNTY_CA + household51: + members: [person51] + state_code: CA + county: SUTTER_COUNTY_CA + household52: + members: [person52] + state_code: CA + county: TEHAMA_COUNTY_CA + household53: + members: [person53] + state_code: CA + county: TRINITY_COUNTY_CA + household54: + members: [person54] + state_code: CA + county: TULARE_COUNTY_CA + household55: + members: [person55] + state_code: CA + county: TUOLUMNE_COUNTY_CA + household56: + members: [person56] + state_code: CA + county: VENTURA_COUNTY_CA + household57: + members: [person57] + state_code: CA + county: YOLO_COUNTY_CA + household58: + members: [person58] + state_code: CA + county: YUBA_COUNTY_CA + output: + ca_liheap_income_group: + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + - 2 + ca_liheap_utility_heating: + - 404 + - 566 + - 605 + - 569 + - 587 + - 589 + - 510 + - 554 + - 586 + - 588 + - 574 + - 436 + - 512 + - 440 + - 534 + - 523 + - 656 + - 543 + - 407 + - 576 + - 537 + - 590 + - 504 + - 554 + - 507 + - 514 + - 418 + - 518 + - 684 + - 450 + - 546 + - 512 + - 522 + - 480 + - 451 + - 488 + - 411 + - 392 + - 572 + - 434 + - 477 + - 367 + - 453 + - 449 + - 621 + - 534 + - 553 + - 479 + - 467 + - 542 + - 592 + - 617 + - 419 + - 510 + - 593 + - 384 + - 468 + - 585 + +- name: Case 3, every county utility table amount in poverty group 3. + period: 2026 + # All 58 county rows are independently parsed from original plan pages 182–183. + # County names are alphabetic. One qualified adult and monthly income 1800 + # place every row in group 3. Actual gas bill 100 is not a benefit cap. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person4: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person6: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person7: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person8: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person9: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person10: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person11: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person12: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person13: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person14: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person15: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person16: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person17: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person18: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person19: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person20: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person21: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person22: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person23: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person24: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person25: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person26: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person27: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person28: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person29: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person30: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person31: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person32: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person33: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person34: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person35: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person36: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person37: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person38: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person39: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person40: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person41: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person42: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person43: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person44: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person45: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person46: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person47: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person48: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person49: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person50: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person51: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person52: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person53: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person54: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person55: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person56: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person57: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + person58: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 21_600 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person4] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person5] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit6: + members: [person6] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit7: + members: [person7] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit8: + members: [person8] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit9: + members: [person9] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit10: + members: [person10] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit11: + members: [person11] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit12: + members: [person12] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit13: + members: [person13] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit14: + members: [person14] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit15: + members: [person15] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit16: + members: [person16] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit17: + members: [person17] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit18: + members: [person18] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit19: + members: [person19] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit20: + members: [person20] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit21: + members: [person21] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit22: + members: [person22] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit23: + members: [person23] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit24: + members: [person24] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit25: + members: [person25] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit26: + members: [person26] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit27: + members: [person27] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit28: + members: [person28] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit29: + members: [person29] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit30: + members: [person30] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit31: + members: [person31] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit32: + members: [person32] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit33: + members: [person33] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit34: + members: [person34] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit35: + members: [person35] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit36: + members: [person36] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit37: + members: [person37] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit38: + members: [person38] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit39: + members: [person39] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit40: + members: [person40] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit41: + members: [person41] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit42: + members: [person42] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit43: + members: [person43] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit44: + members: [person44] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit45: + members: [person45] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit46: + members: [person46] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit47: + members: [person47] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit48: + members: [person48] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit49: + members: [person49] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit50: + members: [person50] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit51: + members: [person51] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit52: + members: [person52] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit53: + members: [person53] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit54: + members: [person54] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit55: + members: [person55] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit56: + members: [person56] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit57: + members: [person57] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit58: + members: [person58] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: ALPINE_COUNTY_CA + household3: + members: [person3] + state_code: CA + county: AMADOR_COUNTY_CA + household4: + members: [person4] + state_code: CA + county: BUTTE_COUNTY_CA + household5: + members: [person5] + state_code: CA + county: CALAVERAS_COUNTY_CA + household6: + members: [person6] + state_code: CA + county: COLUSA_COUNTY_CA + household7: + members: [person7] + state_code: CA + county: CONTRA_COSTA_COUNTY_CA + household8: + members: [person8] + state_code: CA + county: DEL_NORTE_COUNTY_CA + household9: + members: [person9] + state_code: CA + county: EL_DORADO_COUNTY_CA + household10: + members: [person10] + state_code: CA + county: FRESNO_COUNTY_CA + household11: + members: [person11] + state_code: CA + county: GLENN_COUNTY_CA + household12: + members: [person12] + state_code: CA + county: HUMBOLDT_COUNTY_CA + household13: + members: [person13] + state_code: CA + county: IMPERIAL_COUNTY_CA + household14: + members: [person14] + state_code: CA + county: INYO_COUNTY_CA + household15: + members: [person15] + state_code: CA + county: KERN_COUNTY_CA + household16: + members: [person16] + state_code: CA + county: KINGS_COUNTY_CA + household17: + members: [person17] + state_code: CA + county: LAKE_COUNTY_CA + household18: + members: [person18] + state_code: CA + county: LASSEN_COUNTY_CA + household19: + members: [person19] + state_code: CA + county: LOS_ANGELES_COUNTY_CA + household20: + members: [person20] + state_code: CA + county: MADERA_COUNTY_CA + household21: + members: [person21] + state_code: CA + county: MARIN_COUNTY_CA + household22: + members: [person22] + state_code: CA + county: MARIPOSA_COUNTY_CA + household23: + members: [person23] + state_code: CA + county: MENDOCINO_COUNTY_CA + household24: + members: [person24] + state_code: CA + county: MERCED_COUNTY_CA + household25: + members: [person25] + state_code: CA + county: MODOC_COUNTY_CA + household26: + members: [person26] + state_code: CA + county: MONO_COUNTY_CA + household27: + members: [person27] + state_code: CA + county: MONTEREY_COUNTY_CA + household28: + members: [person28] + state_code: CA + county: NAPA_COUNTY_CA + household29: + members: [person29] + state_code: CA + county: NEVADA_COUNTY_CA + household30: + members: [person30] + state_code: CA + county: ORANGE_COUNTY_CA + household31: + members: [person31] + state_code: CA + county: PLACER_COUNTY_CA + household32: + members: [person32] + state_code: CA + county: PLUMAS_COUNTY_CA + household33: + members: [person33] + state_code: CA + county: RIVERSIDE_COUNTY_CA + household34: + members: [person34] + state_code: CA + county: SACRAMENTO_COUNTY_CA + household35: + members: [person35] + state_code: CA + county: SAN_BENITO_COUNTY_CA + household36: + members: [person36] + state_code: CA + county: SAN_BERNARDINO_COUNTY_CA + household37: + members: [person37] + state_code: CA + county: SAN_DIEGO_COUNTY_CA + household38: + members: [person38] + state_code: CA + county: SAN_FRANCISCO_COUNTY_CA + household39: + members: [person39] + state_code: CA + county: SAN_JOAQUIN_COUNTY_CA + household40: + members: [person40] + state_code: CA + county: SAN_LUIS_OBISPO_COUNTY_CA + household41: + members: [person41] + state_code: CA + county: SAN_MATEO_COUNTY_CA + household42: + members: [person42] + state_code: CA + county: SANTA_BARBARA_COUNTY_CA + household43: + members: [person43] + state_code: CA + county: SANTA_CLARA_COUNTY_CA + household44: + members: [person44] + state_code: CA + county: SANTA_CRUZ_COUNTY_CA + household45: + members: [person45] + state_code: CA + county: SHASTA_COUNTY_CA + household46: + members: [person46] + state_code: CA + county: SIERRA_COUNTY_CA + household47: + members: [person47] + state_code: CA + county: SISKIYOU_COUNTY_CA + household48: + members: [person48] + state_code: CA + county: SOLANO_COUNTY_CA + household49: + members: [person49] + state_code: CA + county: SONOMA_COUNTY_CA + household50: + members: [person50] + state_code: CA + county: STANISLAUS_COUNTY_CA + household51: + members: [person51] + state_code: CA + county: SUTTER_COUNTY_CA + household52: + members: [person52] + state_code: CA + county: TEHAMA_COUNTY_CA + household53: + members: [person53] + state_code: CA + county: TRINITY_COUNTY_CA + household54: + members: [person54] + state_code: CA + county: TULARE_COUNTY_CA + household55: + members: [person55] + state_code: CA + county: TUOLUMNE_COUNTY_CA + household56: + members: [person56] + state_code: CA + county: VENTURA_COUNTY_CA + household57: + members: [person57] + state_code: CA + county: YOLO_COUNTY_CA + household58: + members: [person58] + state_code: CA + county: YUBA_COUNTY_CA + output: + ca_liheap_income_group: + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + - 3 + ca_liheap_utility_heating: + - 356 + - 492 + - 526 + - 495 + - 510 + - 512 + - 445 + - 482 + - 509 + - 511 + - 499 + - 383 + - 447 + - 386 + - 466 + - 457 + - 568 + - 473 + - 358 + - 501 + - 468 + - 513 + - 440 + - 482 + - 442 + - 448 + - 368 + - 452 + - 591 + - 394 + - 476 + - 447 + - 456 + - 420 + - 396 + - 426 + - 362 + - 346 + - 498 + - 381 + - 417 + - 325 + - 397 + - 394 + - 538 + - 465 + - 482 + - 419 + - 409 + - 472 + - 514 + - 535 + - 368 + - 445 + - 515 + - 340 + - 410 + - 508 + +- name: Case 4, every county utility table amount in poverty group 4. + period: 2026 + # All 58 county rows are independently parsed from original plan pages 182–183. + # County names are alphabetic. One qualified adult and monthly income 2500 + # place every row in group 4. Actual gas bill 100 is not a benefit cap. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person4: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person6: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person7: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person8: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person9: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person10: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person11: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person12: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person13: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person14: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person15: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person16: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person17: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person18: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person19: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person20: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person21: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person22: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person23: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person24: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person25: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person26: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person27: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person28: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person29: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person30: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person31: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person32: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person33: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person34: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person35: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person36: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person37: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person38: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person39: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person40: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person41: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person42: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person43: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person44: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person45: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person46: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person47: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person48: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person49: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person50: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person51: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person52: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person53: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person54: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person55: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person56: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person57: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + person58: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 30_000 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person4] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person5] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit6: + members: [person6] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit7: + members: [person7] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit8: + members: [person8] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit9: + members: [person9] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit10: + members: [person10] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit11: + members: [person11] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit12: + members: [person12] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit13: + members: [person13] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit14: + members: [person14] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit15: + members: [person15] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit16: + members: [person16] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit17: + members: [person17] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit18: + members: [person18] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit19: + members: [person19] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit20: + members: [person20] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit21: + members: [person21] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit22: + members: [person22] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit23: + members: [person23] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit24: + members: [person24] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit25: + members: [person25] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit26: + members: [person26] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit27: + members: [person27] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit28: + members: [person28] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit29: + members: [person29] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit30: + members: [person30] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit31: + members: [person31] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit32: + members: [person32] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit33: + members: [person33] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit34: + members: [person34] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit35: + members: [person35] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit36: + members: [person36] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit37: + members: [person37] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit38: + members: [person38] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit39: + members: [person39] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit40: + members: [person40] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit41: + members: [person41] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit42: + members: [person42] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit43: + members: [person43] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit44: + members: [person44] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit45: + members: [person45] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit46: + members: [person46] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit47: + members: [person47] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit48: + members: [person48] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit49: + members: [person49] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit50: + members: [person50] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit51: + members: [person51] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit52: + members: [person52] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit53: + members: [person53] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit54: + members: [person54] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit55: + members: [person55] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit56: + members: [person56] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit57: + members: [person57] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit58: + members: [person58] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: ALPINE_COUNTY_CA + household3: + members: [person3] + state_code: CA + county: AMADOR_COUNTY_CA + household4: + members: [person4] + state_code: CA + county: BUTTE_COUNTY_CA + household5: + members: [person5] + state_code: CA + county: CALAVERAS_COUNTY_CA + household6: + members: [person6] + state_code: CA + county: COLUSA_COUNTY_CA + household7: + members: [person7] + state_code: CA + county: CONTRA_COSTA_COUNTY_CA + household8: + members: [person8] + state_code: CA + county: DEL_NORTE_COUNTY_CA + household9: + members: [person9] + state_code: CA + county: EL_DORADO_COUNTY_CA + household10: + members: [person10] + state_code: CA + county: FRESNO_COUNTY_CA + household11: + members: [person11] + state_code: CA + county: GLENN_COUNTY_CA + household12: + members: [person12] + state_code: CA + county: HUMBOLDT_COUNTY_CA + household13: + members: [person13] + state_code: CA + county: IMPERIAL_COUNTY_CA + household14: + members: [person14] + state_code: CA + county: INYO_COUNTY_CA + household15: + members: [person15] + state_code: CA + county: KERN_COUNTY_CA + household16: + members: [person16] + state_code: CA + county: KINGS_COUNTY_CA + household17: + members: [person17] + state_code: CA + county: LAKE_COUNTY_CA + household18: + members: [person18] + state_code: CA + county: LASSEN_COUNTY_CA + household19: + members: [person19] + state_code: CA + county: LOS_ANGELES_COUNTY_CA + household20: + members: [person20] + state_code: CA + county: MADERA_COUNTY_CA + household21: + members: [person21] + state_code: CA + county: MARIN_COUNTY_CA + household22: + members: [person22] + state_code: CA + county: MARIPOSA_COUNTY_CA + household23: + members: [person23] + state_code: CA + county: MENDOCINO_COUNTY_CA + household24: + members: [person24] + state_code: CA + county: MERCED_COUNTY_CA + household25: + members: [person25] + state_code: CA + county: MODOC_COUNTY_CA + household26: + members: [person26] + state_code: CA + county: MONO_COUNTY_CA + household27: + members: [person27] + state_code: CA + county: MONTEREY_COUNTY_CA + household28: + members: [person28] + state_code: CA + county: NAPA_COUNTY_CA + household29: + members: [person29] + state_code: CA + county: NEVADA_COUNTY_CA + household30: + members: [person30] + state_code: CA + county: ORANGE_COUNTY_CA + household31: + members: [person31] + state_code: CA + county: PLACER_COUNTY_CA + household32: + members: [person32] + state_code: CA + county: PLUMAS_COUNTY_CA + household33: + members: [person33] + state_code: CA + county: RIVERSIDE_COUNTY_CA + household34: + members: [person34] + state_code: CA + county: SACRAMENTO_COUNTY_CA + household35: + members: [person35] + state_code: CA + county: SAN_BENITO_COUNTY_CA + household36: + members: [person36] + state_code: CA + county: SAN_BERNARDINO_COUNTY_CA + household37: + members: [person37] + state_code: CA + county: SAN_DIEGO_COUNTY_CA + household38: + members: [person38] + state_code: CA + county: SAN_FRANCISCO_COUNTY_CA + household39: + members: [person39] + state_code: CA + county: SAN_JOAQUIN_COUNTY_CA + household40: + members: [person40] + state_code: CA + county: SAN_LUIS_OBISPO_COUNTY_CA + household41: + members: [person41] + state_code: CA + county: SAN_MATEO_COUNTY_CA + household42: + members: [person42] + state_code: CA + county: SANTA_BARBARA_COUNTY_CA + household43: + members: [person43] + state_code: CA + county: SANTA_CLARA_COUNTY_CA + household44: + members: [person44] + state_code: CA + county: SANTA_CRUZ_COUNTY_CA + household45: + members: [person45] + state_code: CA + county: SHASTA_COUNTY_CA + household46: + members: [person46] + state_code: CA + county: SIERRA_COUNTY_CA + household47: + members: [person47] + state_code: CA + county: SISKIYOU_COUNTY_CA + household48: + members: [person48] + state_code: CA + county: SOLANO_COUNTY_CA + household49: + members: [person49] + state_code: CA + county: SONOMA_COUNTY_CA + household50: + members: [person50] + state_code: CA + county: STANISLAUS_COUNTY_CA + household51: + members: [person51] + state_code: CA + county: SUTTER_COUNTY_CA + household52: + members: [person52] + state_code: CA + county: TEHAMA_COUNTY_CA + household53: + members: [person53] + state_code: CA + county: TRINITY_COUNTY_CA + household54: + members: [person54] + state_code: CA + county: TULARE_COUNTY_CA + household55: + members: [person55] + state_code: CA + county: TUOLUMNE_COUNTY_CA + household56: + members: [person56] + state_code: CA + county: VENTURA_COUNTY_CA + household57: + members: [person57] + state_code: CA + county: YOLO_COUNTY_CA + household58: + members: [person58] + state_code: CA + county: YUBA_COUNTY_CA + output: + ca_liheap_income_group: + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + - 4 + ca_liheap_utility_heating: + - 308 + - 419 + - 446 + - 421 + - 433 + - 435 + - 381 + - 411 + - 433 + - 434 + - 424 + - 330 + - 382 + - 333 + - 397 + - 390 + - 480 + - 403 + - 310 + - 426 + - 399 + - 435 + - 376 + - 411 + - 378 + - 383 + - 318 + - 386 + - 499 + - 339 + - 405 + - 382 + - 389 + - 360 + - 340 + - 365 + - 313 + - 300 + - 423 + - 328 + - 358 + - 283 + - 341 + - 339 + - 456 + - 397 + - 410 + - 359 + - 351 + - 403 + - 437 + - 454 + - 318 + - 381 + - 437 + - 295 + - 352 + - 432 + +- name: Case 5, Alameda exact monthly boundaries determine final utility awards. + period: 2026 + # Apply Alameda groups 484/404/356/308 to the source monthly cent bands. + # Noncategorical 3331.67 exceeds SMI and receives zero utility benefit. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 15_650.04 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 15_650.16 + person4: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 19_562.52 + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 19_562.64 + person6: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 23_475 + person7: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 23_475.12 + person8: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 39_979.92 + person9: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 39_980.04 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person4] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person5] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit6: + members: [person6] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit7: + members: [person7] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit8: + members: [person8] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit9: + members: [person9] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + household3: + members: [person3] + state_code: CA + county: ALAMEDA_COUNTY_CA + household4: + members: [person4] + state_code: CA + county: ALAMEDA_COUNTY_CA + household5: + members: [person5] + state_code: CA + county: ALAMEDA_COUNTY_CA + household6: + members: [person6] + state_code: CA + county: ALAMEDA_COUNTY_CA + household7: + members: [person7] + state_code: CA + county: ALAMEDA_COUNTY_CA + household8: + members: [person8] + state_code: CA + county: ALAMEDA_COUNTY_CA + household9: + members: [person9] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_utility_heating: [484, 484, 404, 404, 356, 356, 308, 308, 0] + +- name: Case 6, qualified member increments stop at six. + period: 2026 + # Nevada group 1 base 837 plus 19 for each additional qualified person through + # six:837,856,913,932,932. No extra payment for the seventh member. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person3: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person4: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person5: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person6: {age: 10, is_citizen_or_legal_immigrant: true, ssi: 0} + person7: {age: 12, is_citizen_or_legal_immigrant: true, ssi: 0} + person8: {age: 14, is_citizen_or_legal_immigrant: true, ssi: 0} + person9: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person10: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person11: {age: 10, is_citizen_or_legal_immigrant: true, ssi: 0} + person12: {age: 12, is_citizen_or_legal_immigrant: true, ssi: 0} + person13: {age: 14, is_citizen_or_legal_immigrant: true, ssi: 0} + person14: {age: 16, is_citizen_or_legal_immigrant: true, ssi: 0} + person15: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person16: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person17: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person18: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person19: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person20: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person21: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2, person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person4, person5, person6, person7, person8] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person9, person10, person11, person12, person13, person14] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person15, person16, person17, person18, person19, person20, person21] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: NEVADA_COUNTY_CA + household2: + members: [person2, person3] + state_code: CA + county: NEVADA_COUNTY_CA + household3: + members: [person4, person5, person6, person7, person8] + state_code: CA + county: NEVADA_COUNTY_CA + household4: + members: [person9, person10, person11, person12, person13, person14] + state_code: CA + county: NEVADA_COUNTY_CA + household5: + members: [person15, person16, person17, person18, person19, person20, person21] + state_code: CA + county: NEVADA_COUNTY_CA + output: + ca_liheap_utility_heating: [837, 856, 913, 932, 932] + +- name: Case 7, categorical large households receive the source group-four award. + period: 2026 + # Categorical above-SMI awards use Nevada group 4 base 499+5*19=594. + # The same income without categorical receipt fails the income ceiling. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 117_635.64 + person2: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person3: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person4: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person5: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person6: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person7: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person8: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person9: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person10: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person11: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person12: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person13: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person14: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 145_314.6 + person15: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person16: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person17: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person18: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person19: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person20: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person21: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person22: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person23: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person24: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person25: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person26: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person27: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person28: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person29: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person30: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person31: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person32: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person33: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person34: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person35: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person36: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person37: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person38: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person39: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 117_635.64 + person40: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person41: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person42: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person43: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person44: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person45: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person46: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person47: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person48: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person49: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person50: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person51: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person52: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 145_314.6 + person53: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person54: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person55: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person56: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person57: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person58: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person59: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person60: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person61: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person62: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person63: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person64: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person65: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person66: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person67: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person68: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person69: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person70: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person71: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person72: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person73: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person74: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person75: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person76: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + spm_units: + spm_unit1: + members: + - person1 + - person2 + - person3 + - person4 + - person5 + - person6 + - person7 + - person8 + - person9 + - person10 + - person11 + - person12 + - person13 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 1_200 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: + - person14 + - person15 + - person16 + - person17 + - person18 + - person19 + - person20 + - person21 + - person22 + - person23 + - person24 + - person25 + - person26 + - person27 + - person28 + - person29 + - person30 + - person31 + - person32 + - person33 + - person34 + - person35 + - person36 + - person37 + - person38 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 1_200 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: + - person39 + - person40 + - person41 + - person42 + - person43 + - person44 + - person45 + - person46 + - person47 + - person48 + - person49 + - person50 + - person51 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: + - person52 + - person53 + - person54 + - person55 + - person56 + - person57 + - person58 + - person59 + - person60 + - person61 + - person62 + - person63 + - person64 + - person65 + - person66 + - person67 + - person68 + - person69 + - person70 + - person71 + - person72 + - person73 + - person74 + - person75 + - person76 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: + - person1 + - person2 + - person3 + - person4 + - person5 + - person6 + - person7 + - person8 + - person9 + - person10 + - person11 + - person12 + - person13 + state_code: CA + county: NEVADA_COUNTY_CA + household2: + members: + - person14 + - person15 + - person16 + - person17 + - person18 + - person19 + - person20 + - person21 + - person22 + - person23 + - person24 + - person25 + - person26 + - person27 + - person28 + - person29 + - person30 + - person31 + - person32 + - person33 + - person34 + - person35 + - person36 + - person37 + - person38 + state_code: CA + county: NEVADA_COUNTY_CA + household3: + members: + - person39 + - person40 + - person41 + - person42 + - person43 + - person44 + - person45 + - person46 + - person47 + - person48 + - person49 + - person50 + - person51 + state_code: CA + county: NEVADA_COUNTY_CA + household4: + members: + - person52 + - person53 + - person54 + - person55 + - person56 + - person57 + - person58 + - person59 + - person60 + - person61 + - person62 + - person63 + - person64 + - person65 + - person66 + - person67 + - person68 + - person69 + - person70 + - person71 + - person72 + - person73 + - person74 + - person75 + - person76 + state_code: CA + county: NEVADA_COUNTY_CA + output: + ca_liheap_categorically_eligible: [true, true, false, false] + ca_liheap_income_eligible: [true, true, false, false] + ca_liheap_utility_heating: [594, 594, 0, 0] + +- name: Case 8, mixed immigration and child income affect the final amount. + period: 2026 + # Nonqualified wages 24_000 remain countable with size 1: group 4 gives 308. + # Minor earnings are excluded: size 2 group 1 gives 484+19=503. Age 18 wages + # and minor unearned income 36_000 each yield size 2 group 4:308+19=327. + input: + people: + person1: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person2: + age: 30 + is_citizen_or_legal_immigrant: false + ssi: 0 + employment_income: 24_000 + person3: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person4: + age: 17 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 36_000 + person5: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person6: + age: 18 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 36_000 + person7: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person8: + age: 17 + is_citizen_or_legal_immigrant: true + ssi: 0 + social_security_survivors: 36_000 + spm_units: + spm_unit1: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person3, person4] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person5, person6] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person7, person8] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1, person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person3, person4] + state_code: CA + county: ALAMEDA_COUNTY_CA + household3: + members: [person5, person6] + state_code: CA + county: ALAMEDA_COUNTY_CA + household4: + members: [person7, person8] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_household_size: [1, 2, 2, 2] + ca_liheap_countable_income: [24_000, 0, 36_000, 36_000] + ca_liheap_utility_heating: [308, 503, 327, 327] + +- name: Case 9, support deductions alter the amount without double counting. + period: 2026 + # Legally mandated support 100 monthly reduces 2000 to 1900: Alameda group 3 + # gives 356. Without that deduction group 4 gives 308. Counts are annualized. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 24_000 + child_support_expense: 1_200 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 24_000 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_countable_income: [22_800, 24_000] + ca_liheap_income_group: [3, 4] + ca_liheap_utility_heating: [356, 308] + +- name: Case 10, county amount is isolated across states and invalid applicants. + period: 2026 + # Los Angeles size 2=487+19=506; Alameda=484+19=503. Oregon county + # lookup must not fail or leak a CA award. All-nonqualified and minor-only + # qualified applicants receive zero under the represented applicant rule. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person2: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person4: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person6: {age: 35, is_citizen_or_legal_immigrant: false, ssi: 0} + person7: {age: 35, is_citizen_or_legal_immigrant: false, ssi: 0} + person8: {age: 17, is_citizen_or_legal_immigrant: true, ssi: 0} + spm_units: + spm_unit1: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person3, person4] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person5] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person6] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person7, person8] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1, person2] + state_code: CA + county: LOS_ANGELES_COUNTY_CA + household2: + members: [person3, person4] + state_code: CA + county: ALAMEDA_COUNTY_CA + household3: + members: [person5] + state_code: OR + county: MULTNOMAH_COUNTY_OR + household4: + members: [person6] + state_code: CA + county: ALAMEDA_COUNTY_CA + household5: + members: [person7, person8] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_utility_heating: [506, 503, 0, 0, 0] + +- name: Case 11, housing small bills and vulnerability do not add unsupported limits. + period: 2026 + # Alameda base 484 can exceed a 100 bill. Utility matrix has no separate + # vulnerability addition. Unsubsidized heat-in-rent is supported by proxy; + # subsidized rent needs a reported positive energy charge. NONE has no heat. + input: + people: + person1: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person2: + age: 65 + is_citizen_or_legal_immigrant: true + ssi: 0 + is_disabled: true + is_veteran: true + person3: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person4: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person5: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person6: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + gas_expense: 0 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + heat_expense_included_in_rent: true + spm_unit4: + members: [person4] + heating_type: NATURAL_GAS + gas_expense: 0 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + heat_expense_included_in_rent: true + receives_housing_assistance: true + spm_unit5: + members: [person5] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + heat_expense_included_in_rent: true + receives_housing_assistance: true + spm_unit6: + members: [person6] + heating_type: NONE + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + household3: + members: [person3] + state_code: CA + county: ALAMEDA_COUNTY_CA + household4: + members: [person4] + state_code: CA + county: ALAMEDA_COUNTY_CA + household5: + members: [person5] + state_code: CA + county: ALAMEDA_COUNTY_CA + household6: + members: [person6] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_utility_heating: [484, 484, 484, 0, 484, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_categorically_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_categorically_eligible.yaml new file mode 100644 index 00000000000..6bb5dc26e23 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_categorically_eligible.yaml @@ -0,0 +1,90 @@ +# https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=6,217,218 +# SNAP and CalWORKs qualify; SSI and VA alone do not. + +- name: Case 1, categorical status uses the two selected programs and is state guarded. + period: 2026 + # Positive annual receipt is the existing-input proxy for current receipt. + # SSI/VA alone and no receipt do not qualify; Oregon remains outside CA. + input: + people: + person1: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person2: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person3: {age: 8, is_citizen_or_legal_immigrant: true, ssi: 0} + person4: {age: 65, is_citizen_or_legal_immigrant: true, ssi: 6_000} + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + veterans_benefits: 6_000 + person6: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person7: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 1_200 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2, person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 1_200 + ca_state_supplement: 0 + spm_unit3: + members: [person4] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person5] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person6] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit6: + members: [person7] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 1_200 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2, person3] + state_code: CA + county: ALAMEDA_COUNTY_CA + household3: + members: [person4] + state_code: CA + county: ALAMEDA_COUNTY_CA + household4: + members: [person5] + state_code: CA + county: ALAMEDA_COUNTY_CA + household5: + members: [person6] + state_code: CA + county: ALAMEDA_COUNTY_CA + household6: + members: [person7] + state_code: OR + county: MULTNOMAH_COUNTY_OR + output: + ca_liheap_categorically_eligible: [true, true, false, false, false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_eligible.yaml new file mode 100644 index 00000000000..6708080ae05 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_eligible.yaml @@ -0,0 +1,2722 @@ +# https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=6,184,217,218 +# Boolean boundaries are exact; one monthly cent equals 0.12 annual dollars. + +- name: Case 1, every published monthly SMI ceiling is inclusive. + period: 2026 + # For each actual size 1 through 25, gross annual wages equal 12 times the + # source monthly ceiling. Every noncategorical household is income eligible. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 39_979.92 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 52_281.96 + person3: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person4: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 64_584 + person5: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person6: {age: 10, is_citizen_or_legal_immigrant: true, ssi: 0} + person7: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 76_885.92 + person8: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person9: {age: 10, is_citizen_or_legal_immigrant: true, ssi: 0} + person10: {age: 12, is_citizen_or_legal_immigrant: true, ssi: 0} + person11: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 89_187 + person12: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person13: {age: 10, is_citizen_or_legal_immigrant: true, ssi: 0} + person14: {age: 12, is_citizen_or_legal_immigrant: true, ssi: 0} + person15: {age: 14, is_citizen_or_legal_immigrant: true, ssi: 0} + person16: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 101_488.92 + person17: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person18: {age: 10, is_citizen_or_legal_immigrant: true, ssi: 0} + person19: {age: 12, is_citizen_or_legal_immigrant: true, ssi: 0} + person20: {age: 14, is_citizen_or_legal_immigrant: true, ssi: 0} + person21: {age: 16, is_citizen_or_legal_immigrant: true, ssi: 0} + person22: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 103_795.92 + person23: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person24: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person25: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person26: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person27: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person28: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person29: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 106_101.96 + person30: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person31: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person32: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person33: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person34: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person35: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person36: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person37: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 108_408.96 + person38: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person39: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person40: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person41: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person42: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person43: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person44: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person45: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person46: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 110_715 + person47: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person48: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person49: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person50: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person51: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person52: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person53: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person54: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person55: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person56: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 113_022 + person57: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person58: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person59: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person60: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person61: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person62: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person63: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person64: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person65: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person66: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person67: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 115_329 + person68: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person69: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person70: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person71: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person72: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person73: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person74: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person75: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person76: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person77: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person78: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person79: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 117_635.52 + person80: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person81: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person82: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person83: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person84: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person85: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person86: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person87: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person88: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person89: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person90: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person91: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person92: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 119_942.16 + person93: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person94: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person95: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person96: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person97: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person98: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person99: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person100: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person101: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person102: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person103: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person104: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person105: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person106: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 122_248.68 + person107: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person108: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person109: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person110: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person111: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person112: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person113: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person114: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person115: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person116: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person117: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person118: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person119: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person120: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person121: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 124_555.32 + person122: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person123: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person124: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person125: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person126: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person127: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person128: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person129: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person130: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person131: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person132: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person133: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person134: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person135: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person136: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person137: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 126_861.84 + person138: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person139: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person140: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person141: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person142: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person143: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person144: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person145: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person146: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person147: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person148: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person149: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person150: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person151: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person152: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person153: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person154: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 129_168.48 + person155: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person156: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person157: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person158: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person159: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person160: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person161: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person162: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person163: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person164: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person165: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person166: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person167: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person168: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person169: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person170: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person171: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person172: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 131_475 + person173: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person174: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person175: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person176: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person177: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person178: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person179: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person180: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person181: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person182: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person183: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person184: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person185: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person186: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person187: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person188: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person189: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person190: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person191: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 133_781.64 + person192: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person193: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person194: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person195: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person196: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person197: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person198: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person199: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person200: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person201: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person202: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person203: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person204: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person205: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person206: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person207: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person208: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person209: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person210: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person211: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 136_088.16 + person212: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person213: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person214: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person215: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person216: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person217: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person218: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person219: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person220: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person221: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person222: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person223: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person224: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person225: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person226: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person227: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person228: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person229: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person230: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person231: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person232: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 138_394.8 + person233: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person234: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person235: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person236: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person237: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person238: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person239: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person240: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person241: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person242: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person243: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person244: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person245: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person246: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person247: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person248: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person249: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person250: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person251: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person252: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person253: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person254: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 140_701.32 + person255: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person256: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person257: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person258: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person259: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person260: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person261: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person262: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person263: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person264: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person265: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person266: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person267: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person268: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person269: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person270: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person271: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person272: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person273: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person274: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person275: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person276: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person277: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 143_007.96 + person278: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person279: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person280: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person281: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person282: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person283: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person284: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person285: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person286: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person287: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person288: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person289: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person290: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person291: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person292: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person293: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person294: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person295: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person296: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person297: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person298: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person299: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person300: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person301: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 145_314.48 + person302: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person303: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person304: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person305: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person306: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person307: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person308: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person309: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person310: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person311: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person312: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person313: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person314: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person315: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person316: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person317: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person318: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person319: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person320: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person321: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person322: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person323: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person324: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person325: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2, person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person4, person5, person6] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person7, person8, person9, person10] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person11, person12, person13, person14, person15] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit6: + members: [person16, person17, person18, person19, person20, person21] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit7: + members: [person22, person23, person24, person25, person26, person27, person28] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit8: + members: + - person29 + - person30 + - person31 + - person32 + - person33 + - person34 + - person35 + - person36 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit9: + members: + - person37 + - person38 + - person39 + - person40 + - person41 + - person42 + - person43 + - person44 + - person45 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit10: + members: + - person46 + - person47 + - person48 + - person49 + - person50 + - person51 + - person52 + - person53 + - person54 + - person55 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit11: + members: + - person56 + - person57 + - person58 + - person59 + - person60 + - person61 + - person62 + - person63 + - person64 + - person65 + - person66 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit12: + members: + - person67 + - person68 + - person69 + - person70 + - person71 + - person72 + - person73 + - person74 + - person75 + - person76 + - person77 + - person78 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit13: + members: + - person79 + - person80 + - person81 + - person82 + - person83 + - person84 + - person85 + - person86 + - person87 + - person88 + - person89 + - person90 + - person91 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit14: + members: + - person92 + - person93 + - person94 + - person95 + - person96 + - person97 + - person98 + - person99 + - person100 + - person101 + - person102 + - person103 + - person104 + - person105 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit15: + members: + - person106 + - person107 + - person108 + - person109 + - person110 + - person111 + - person112 + - person113 + - person114 + - person115 + - person116 + - person117 + - person118 + - person119 + - person120 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit16: + members: + - person121 + - person122 + - person123 + - person124 + - person125 + - person126 + - person127 + - person128 + - person129 + - person130 + - person131 + - person132 + - person133 + - person134 + - person135 + - person136 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit17: + members: + - person137 + - person138 + - person139 + - person140 + - person141 + - person142 + - person143 + - person144 + - person145 + - person146 + - person147 + - person148 + - person149 + - person150 + - person151 + - person152 + - person153 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit18: + members: + - person154 + - person155 + - person156 + - person157 + - person158 + - person159 + - person160 + - person161 + - person162 + - person163 + - person164 + - person165 + - person166 + - person167 + - person168 + - person169 + - person170 + - person171 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit19: + members: + - person172 + - person173 + - person174 + - person175 + - person176 + - person177 + - person178 + - person179 + - person180 + - person181 + - person182 + - person183 + - person184 + - person185 + - person186 + - person187 + - person188 + - person189 + - person190 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit20: + members: + - person191 + - person192 + - person193 + - person194 + - person195 + - person196 + - person197 + - person198 + - person199 + - person200 + - person201 + - person202 + - person203 + - person204 + - person205 + - person206 + - person207 + - person208 + - person209 + - person210 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit21: + members: + - person211 + - person212 + - person213 + - person214 + - person215 + - person216 + - person217 + - person218 + - person219 + - person220 + - person221 + - person222 + - person223 + - person224 + - person225 + - person226 + - person227 + - person228 + - person229 + - person230 + - person231 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit22: + members: + - person232 + - person233 + - person234 + - person235 + - person236 + - person237 + - person238 + - person239 + - person240 + - person241 + - person242 + - person243 + - person244 + - person245 + - person246 + - person247 + - person248 + - person249 + - person250 + - person251 + - person252 + - person253 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit23: + members: + - person254 + - person255 + - person256 + - person257 + - person258 + - person259 + - person260 + - person261 + - person262 + - person263 + - person264 + - person265 + - person266 + - person267 + - person268 + - person269 + - person270 + - person271 + - person272 + - person273 + - person274 + - person275 + - person276 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit24: + members: + - person277 + - person278 + - person279 + - person280 + - person281 + - person282 + - person283 + - person284 + - person285 + - person286 + - person287 + - person288 + - person289 + - person290 + - person291 + - person292 + - person293 + - person294 + - person295 + - person296 + - person297 + - person298 + - person299 + - person300 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit25: + members: + - person301 + - person302 + - person303 + - person304 + - person305 + - person306 + - person307 + - person308 + - person309 + - person310 + - person311 + - person312 + - person313 + - person314 + - person315 + - person316 + - person317 + - person318 + - person319 + - person320 + - person321 + - person322 + - person323 + - person324 + - person325 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2, person3] + state_code: CA + county: ALAMEDA_COUNTY_CA + household3: + members: [person4, person5, person6] + state_code: CA + county: ALAMEDA_COUNTY_CA + household4: + members: [person7, person8, person9, person10] + state_code: CA + county: ALAMEDA_COUNTY_CA + household5: + members: [person11, person12, person13, person14, person15] + state_code: CA + county: ALAMEDA_COUNTY_CA + household6: + members: [person16, person17, person18, person19, person20, person21] + state_code: CA + county: ALAMEDA_COUNTY_CA + household7: + members: [person22, person23, person24, person25, person26, person27, person28] + state_code: CA + county: ALAMEDA_COUNTY_CA + household8: + members: + - person29 + - person30 + - person31 + - person32 + - person33 + - person34 + - person35 + - person36 + state_code: CA + county: ALAMEDA_COUNTY_CA + household9: + members: + - person37 + - person38 + - person39 + - person40 + - person41 + - person42 + - person43 + - person44 + - person45 + state_code: CA + county: ALAMEDA_COUNTY_CA + household10: + members: + - person46 + - person47 + - person48 + - person49 + - person50 + - person51 + - person52 + - person53 + - person54 + - person55 + state_code: CA + county: ALAMEDA_COUNTY_CA + household11: + members: + - person56 + - person57 + - person58 + - person59 + - person60 + - person61 + - person62 + - person63 + - person64 + - person65 + - person66 + state_code: CA + county: ALAMEDA_COUNTY_CA + household12: + members: + - person67 + - person68 + - person69 + - person70 + - person71 + - person72 + - person73 + - person74 + - person75 + - person76 + - person77 + - person78 + state_code: CA + county: ALAMEDA_COUNTY_CA + household13: + members: + - person79 + - person80 + - person81 + - person82 + - person83 + - person84 + - person85 + - person86 + - person87 + - person88 + - person89 + - person90 + - person91 + state_code: CA + county: ALAMEDA_COUNTY_CA + household14: + members: + - person92 + - person93 + - person94 + - person95 + - person96 + - person97 + - person98 + - person99 + - person100 + - person101 + - person102 + - person103 + - person104 + - person105 + state_code: CA + county: ALAMEDA_COUNTY_CA + household15: + members: + - person106 + - person107 + - person108 + - person109 + - person110 + - person111 + - person112 + - person113 + - person114 + - person115 + - person116 + - person117 + - person118 + - person119 + - person120 + state_code: CA + county: ALAMEDA_COUNTY_CA + household16: + members: + - person121 + - person122 + - person123 + - person124 + - person125 + - person126 + - person127 + - person128 + - person129 + - person130 + - person131 + - person132 + - person133 + - person134 + - person135 + - person136 + state_code: CA + county: ALAMEDA_COUNTY_CA + household17: + members: + - person137 + - person138 + - person139 + - person140 + - person141 + - person142 + - person143 + - person144 + - person145 + - person146 + - person147 + - person148 + - person149 + - person150 + - person151 + - person152 + - person153 + state_code: CA + county: ALAMEDA_COUNTY_CA + household18: + members: + - person154 + - person155 + - person156 + - person157 + - person158 + - person159 + - person160 + - person161 + - person162 + - person163 + - person164 + - person165 + - person166 + - person167 + - person168 + - person169 + - person170 + - person171 + state_code: CA + county: ALAMEDA_COUNTY_CA + household19: + members: + - person172 + - person173 + - person174 + - person175 + - person176 + - person177 + - person178 + - person179 + - person180 + - person181 + - person182 + - person183 + - person184 + - person185 + - person186 + - person187 + - person188 + - person189 + - person190 + state_code: CA + county: ALAMEDA_COUNTY_CA + household20: + members: + - person191 + - person192 + - person193 + - person194 + - person195 + - person196 + - person197 + - person198 + - person199 + - person200 + - person201 + - person202 + - person203 + - person204 + - person205 + - person206 + - person207 + - person208 + - person209 + - person210 + state_code: CA + county: ALAMEDA_COUNTY_CA + household21: + members: + - person211 + - person212 + - person213 + - person214 + - person215 + - person216 + - person217 + - person218 + - person219 + - person220 + - person221 + - person222 + - person223 + - person224 + - person225 + - person226 + - person227 + - person228 + - person229 + - person230 + - person231 + state_code: CA + county: ALAMEDA_COUNTY_CA + household22: + members: + - person232 + - person233 + - person234 + - person235 + - person236 + - person237 + - person238 + - person239 + - person240 + - person241 + - person242 + - person243 + - person244 + - person245 + - person246 + - person247 + - person248 + - person249 + - person250 + - person251 + - person252 + - person253 + state_code: CA + county: ALAMEDA_COUNTY_CA + household23: + members: + - person254 + - person255 + - person256 + - person257 + - person258 + - person259 + - person260 + - person261 + - person262 + - person263 + - person264 + - person265 + - person266 + - person267 + - person268 + - person269 + - person270 + - person271 + - person272 + - person273 + - person274 + - person275 + - person276 + state_code: CA + county: ALAMEDA_COUNTY_CA + household24: + members: + - person277 + - person278 + - person279 + - person280 + - person281 + - person282 + - person283 + - person284 + - person285 + - person286 + - person287 + - person288 + - person289 + - person290 + - person291 + - person292 + - person293 + - person294 + - person295 + - person296 + - person297 + - person298 + - person299 + - person300 + state_code: CA + county: ALAMEDA_COUNTY_CA + household25: + members: + - person301 + - person302 + - person303 + - person304 + - person305 + - person306 + - person307 + - person308 + - person309 + - person310 + - person311 + - person312 + - person313 + - person314 + - person315 + - person316 + - person317 + - person318 + - person319 + - person320 + - person321 + - person322 + - person323 + - person324 + - person325 + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_income_eligible: + - true + - true + - true + - true + - true + - true + - true + - true + - true + - true + - true + - true + - true + - true + - true + - true + - true + - true + - true + - true + - true + - true + - true + - true + - true + +- name: Case 2, one monthly cent above each published ceiling is ineligible. + period: 2026 + # Increase each published monthly ceiling by 0.01, then annualize by 12. + # No household receives SNAP/CalWORKs; all 25 are above the source limit. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 39_980.04 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 52_282.08 + person3: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person4: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 64_584.12 + person5: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person6: {age: 10, is_citizen_or_legal_immigrant: true, ssi: 0} + person7: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 76_886.04 + person8: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person9: {age: 10, is_citizen_or_legal_immigrant: true, ssi: 0} + person10: {age: 12, is_citizen_or_legal_immigrant: true, ssi: 0} + person11: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 89_187.12 + person12: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person13: {age: 10, is_citizen_or_legal_immigrant: true, ssi: 0} + person14: {age: 12, is_citizen_or_legal_immigrant: true, ssi: 0} + person15: {age: 14, is_citizen_or_legal_immigrant: true, ssi: 0} + person16: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 101_489.04 + person17: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person18: {age: 10, is_citizen_or_legal_immigrant: true, ssi: 0} + person19: {age: 12, is_citizen_or_legal_immigrant: true, ssi: 0} + person20: {age: 14, is_citizen_or_legal_immigrant: true, ssi: 0} + person21: {age: 16, is_citizen_or_legal_immigrant: true, ssi: 0} + person22: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 103_796.04 + person23: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person24: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person25: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person26: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person27: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person28: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person29: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 106_102.08 + person30: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person31: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person32: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person33: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person34: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person35: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person36: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person37: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 108_409.08 + person38: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person39: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person40: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person41: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person42: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person43: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person44: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person45: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person46: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 110_715.12 + person47: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person48: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person49: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person50: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person51: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person52: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person53: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person54: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person55: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person56: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 113_022.12 + person57: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person58: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person59: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person60: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person61: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person62: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person63: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person64: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person65: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person66: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person67: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 115_329.12 + person68: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person69: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person70: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person71: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person72: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person73: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person74: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person75: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person76: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person77: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person78: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person79: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 117_635.64 + person80: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person81: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person82: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person83: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person84: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person85: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person86: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person87: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person88: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person89: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person90: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person91: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person92: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 119_942.28 + person93: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person94: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person95: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person96: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person97: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person98: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person99: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person100: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person101: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person102: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person103: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person104: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person105: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person106: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 122_248.8 + person107: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person108: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person109: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person110: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person111: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person112: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person113: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person114: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person115: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person116: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person117: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person118: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person119: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person120: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person121: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 124_555.44 + person122: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person123: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person124: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person125: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person126: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person127: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person128: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person129: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person130: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person131: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person132: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person133: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person134: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person135: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person136: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person137: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 126_861.96 + person138: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person139: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person140: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person141: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person142: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person143: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person144: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person145: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person146: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person147: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person148: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person149: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person150: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person151: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person152: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person153: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person154: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 129_168.6 + person155: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person156: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person157: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person158: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person159: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person160: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person161: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person162: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person163: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person164: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person165: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person166: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person167: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person168: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person169: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person170: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person171: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person172: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 131_475.12 + person173: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person174: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person175: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person176: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person177: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person178: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person179: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person180: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person181: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person182: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person183: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person184: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person185: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person186: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person187: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person188: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person189: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person190: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person191: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 133_781.76 + person192: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person193: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person194: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person195: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person196: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person197: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person198: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person199: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person200: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person201: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person202: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person203: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person204: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person205: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person206: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person207: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person208: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person209: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person210: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person211: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 136_088.28 + person212: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person213: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person214: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person215: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person216: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person217: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person218: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person219: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person220: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person221: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person222: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person223: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person224: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person225: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person226: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person227: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person228: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person229: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person230: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person231: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person232: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 138_394.92 + person233: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person234: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person235: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person236: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person237: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person238: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person239: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person240: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person241: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person242: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person243: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person244: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person245: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person246: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person247: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person248: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person249: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person250: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person251: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person252: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person253: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person254: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 140_701.44 + person255: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person256: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person257: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person258: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person259: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person260: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person261: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person262: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person263: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person264: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person265: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person266: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person267: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person268: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person269: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person270: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person271: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person272: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person273: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person274: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person275: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person276: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person277: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 143_008.08 + person278: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person279: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person280: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person281: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person282: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person283: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person284: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person285: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person286: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person287: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person288: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person289: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person290: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person291: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person292: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person293: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person294: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person295: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person296: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person297: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person298: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person299: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person300: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person301: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 145_314.6 + person302: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person303: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person304: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person305: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person306: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person307: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person308: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person309: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person310: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person311: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person312: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person313: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person314: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person315: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person316: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person317: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person318: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person319: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person320: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person321: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person322: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person323: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person324: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person325: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2, person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person4, person5, person6] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person7, person8, person9, person10] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person11, person12, person13, person14, person15] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit6: + members: [person16, person17, person18, person19, person20, person21] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit7: + members: [person22, person23, person24, person25, person26, person27, person28] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit8: + members: + - person29 + - person30 + - person31 + - person32 + - person33 + - person34 + - person35 + - person36 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit9: + members: + - person37 + - person38 + - person39 + - person40 + - person41 + - person42 + - person43 + - person44 + - person45 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit10: + members: + - person46 + - person47 + - person48 + - person49 + - person50 + - person51 + - person52 + - person53 + - person54 + - person55 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit11: + members: + - person56 + - person57 + - person58 + - person59 + - person60 + - person61 + - person62 + - person63 + - person64 + - person65 + - person66 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit12: + members: + - person67 + - person68 + - person69 + - person70 + - person71 + - person72 + - person73 + - person74 + - person75 + - person76 + - person77 + - person78 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit13: + members: + - person79 + - person80 + - person81 + - person82 + - person83 + - person84 + - person85 + - person86 + - person87 + - person88 + - person89 + - person90 + - person91 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit14: + members: + - person92 + - person93 + - person94 + - person95 + - person96 + - person97 + - person98 + - person99 + - person100 + - person101 + - person102 + - person103 + - person104 + - person105 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit15: + members: + - person106 + - person107 + - person108 + - person109 + - person110 + - person111 + - person112 + - person113 + - person114 + - person115 + - person116 + - person117 + - person118 + - person119 + - person120 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit16: + members: + - person121 + - person122 + - person123 + - person124 + - person125 + - person126 + - person127 + - person128 + - person129 + - person130 + - person131 + - person132 + - person133 + - person134 + - person135 + - person136 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit17: + members: + - person137 + - person138 + - person139 + - person140 + - person141 + - person142 + - person143 + - person144 + - person145 + - person146 + - person147 + - person148 + - person149 + - person150 + - person151 + - person152 + - person153 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit18: + members: + - person154 + - person155 + - person156 + - person157 + - person158 + - person159 + - person160 + - person161 + - person162 + - person163 + - person164 + - person165 + - person166 + - person167 + - person168 + - person169 + - person170 + - person171 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit19: + members: + - person172 + - person173 + - person174 + - person175 + - person176 + - person177 + - person178 + - person179 + - person180 + - person181 + - person182 + - person183 + - person184 + - person185 + - person186 + - person187 + - person188 + - person189 + - person190 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit20: + members: + - person191 + - person192 + - person193 + - person194 + - person195 + - person196 + - person197 + - person198 + - person199 + - person200 + - person201 + - person202 + - person203 + - person204 + - person205 + - person206 + - person207 + - person208 + - person209 + - person210 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit21: + members: + - person211 + - person212 + - person213 + - person214 + - person215 + - person216 + - person217 + - person218 + - person219 + - person220 + - person221 + - person222 + - person223 + - person224 + - person225 + - person226 + - person227 + - person228 + - person229 + - person230 + - person231 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit22: + members: + - person232 + - person233 + - person234 + - person235 + - person236 + - person237 + - person238 + - person239 + - person240 + - person241 + - person242 + - person243 + - person244 + - person245 + - person246 + - person247 + - person248 + - person249 + - person250 + - person251 + - person252 + - person253 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit23: + members: + - person254 + - person255 + - person256 + - person257 + - person258 + - person259 + - person260 + - person261 + - person262 + - person263 + - person264 + - person265 + - person266 + - person267 + - person268 + - person269 + - person270 + - person271 + - person272 + - person273 + - person274 + - person275 + - person276 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit24: + members: + - person277 + - person278 + - person279 + - person280 + - person281 + - person282 + - person283 + - person284 + - person285 + - person286 + - person287 + - person288 + - person289 + - person290 + - person291 + - person292 + - person293 + - person294 + - person295 + - person296 + - person297 + - person298 + - person299 + - person300 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit25: + members: + - person301 + - person302 + - person303 + - person304 + - person305 + - person306 + - person307 + - person308 + - person309 + - person310 + - person311 + - person312 + - person313 + - person314 + - person315 + - person316 + - person317 + - person318 + - person319 + - person320 + - person321 + - person322 + - person323 + - person324 + - person325 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2, person3] + state_code: CA + county: ALAMEDA_COUNTY_CA + household3: + members: [person4, person5, person6] + state_code: CA + county: ALAMEDA_COUNTY_CA + household4: + members: [person7, person8, person9, person10] + state_code: CA + county: ALAMEDA_COUNTY_CA + household5: + members: [person11, person12, person13, person14, person15] + state_code: CA + county: ALAMEDA_COUNTY_CA + household6: + members: [person16, person17, person18, person19, person20, person21] + state_code: CA + county: ALAMEDA_COUNTY_CA + household7: + members: [person22, person23, person24, person25, person26, person27, person28] + state_code: CA + county: ALAMEDA_COUNTY_CA + household8: + members: + - person29 + - person30 + - person31 + - person32 + - person33 + - person34 + - person35 + - person36 + state_code: CA + county: ALAMEDA_COUNTY_CA + household9: + members: + - person37 + - person38 + - person39 + - person40 + - person41 + - person42 + - person43 + - person44 + - person45 + state_code: CA + county: ALAMEDA_COUNTY_CA + household10: + members: + - person46 + - person47 + - person48 + - person49 + - person50 + - person51 + - person52 + - person53 + - person54 + - person55 + state_code: CA + county: ALAMEDA_COUNTY_CA + household11: + members: + - person56 + - person57 + - person58 + - person59 + - person60 + - person61 + - person62 + - person63 + - person64 + - person65 + - person66 + state_code: CA + county: ALAMEDA_COUNTY_CA + household12: + members: + - person67 + - person68 + - person69 + - person70 + - person71 + - person72 + - person73 + - person74 + - person75 + - person76 + - person77 + - person78 + state_code: CA + county: ALAMEDA_COUNTY_CA + household13: + members: + - person79 + - person80 + - person81 + - person82 + - person83 + - person84 + - person85 + - person86 + - person87 + - person88 + - person89 + - person90 + - person91 + state_code: CA + county: ALAMEDA_COUNTY_CA + household14: + members: + - person92 + - person93 + - person94 + - person95 + - person96 + - person97 + - person98 + - person99 + - person100 + - person101 + - person102 + - person103 + - person104 + - person105 + state_code: CA + county: ALAMEDA_COUNTY_CA + household15: + members: + - person106 + - person107 + - person108 + - person109 + - person110 + - person111 + - person112 + - person113 + - person114 + - person115 + - person116 + - person117 + - person118 + - person119 + - person120 + state_code: CA + county: ALAMEDA_COUNTY_CA + household16: + members: + - person121 + - person122 + - person123 + - person124 + - person125 + - person126 + - person127 + - person128 + - person129 + - person130 + - person131 + - person132 + - person133 + - person134 + - person135 + - person136 + state_code: CA + county: ALAMEDA_COUNTY_CA + household17: + members: + - person137 + - person138 + - person139 + - person140 + - person141 + - person142 + - person143 + - person144 + - person145 + - person146 + - person147 + - person148 + - person149 + - person150 + - person151 + - person152 + - person153 + state_code: CA + county: ALAMEDA_COUNTY_CA + household18: + members: + - person154 + - person155 + - person156 + - person157 + - person158 + - person159 + - person160 + - person161 + - person162 + - person163 + - person164 + - person165 + - person166 + - person167 + - person168 + - person169 + - person170 + - person171 + state_code: CA + county: ALAMEDA_COUNTY_CA + household19: + members: + - person172 + - person173 + - person174 + - person175 + - person176 + - person177 + - person178 + - person179 + - person180 + - person181 + - person182 + - person183 + - person184 + - person185 + - person186 + - person187 + - person188 + - person189 + - person190 + state_code: CA + county: ALAMEDA_COUNTY_CA + household20: + members: + - person191 + - person192 + - person193 + - person194 + - person195 + - person196 + - person197 + - person198 + - person199 + - person200 + - person201 + - person202 + - person203 + - person204 + - person205 + - person206 + - person207 + - person208 + - person209 + - person210 + state_code: CA + county: ALAMEDA_COUNTY_CA + household21: + members: + - person211 + - person212 + - person213 + - person214 + - person215 + - person216 + - person217 + - person218 + - person219 + - person220 + - person221 + - person222 + - person223 + - person224 + - person225 + - person226 + - person227 + - person228 + - person229 + - person230 + - person231 + state_code: CA + county: ALAMEDA_COUNTY_CA + household22: + members: + - person232 + - person233 + - person234 + - person235 + - person236 + - person237 + - person238 + - person239 + - person240 + - person241 + - person242 + - person243 + - person244 + - person245 + - person246 + - person247 + - person248 + - person249 + - person250 + - person251 + - person252 + - person253 + state_code: CA + county: ALAMEDA_COUNTY_CA + household23: + members: + - person254 + - person255 + - person256 + - person257 + - person258 + - person259 + - person260 + - person261 + - person262 + - person263 + - person264 + - person265 + - person266 + - person267 + - person268 + - person269 + - person270 + - person271 + - person272 + - person273 + - person274 + - person275 + - person276 + state_code: CA + county: ALAMEDA_COUNTY_CA + household24: + members: + - person277 + - person278 + - person279 + - person280 + - person281 + - person282 + - person283 + - person284 + - person285 + - person286 + - person287 + - person288 + - person289 + - person290 + - person291 + - person292 + - person293 + - person294 + - person295 + - person296 + - person297 + - person298 + - person299 + - person300 + state_code: CA + county: ALAMEDA_COUNTY_CA + household25: + members: + - person301 + - person302 + - person303 + - person304 + - person305 + - person306 + - person307 + - person308 + - person309 + - person310 + - person311 + - person312 + - person313 + - person314 + - person315 + - person316 + - person317 + - person318 + - person319 + - person320 + - person321 + - person322 + - person323 + - person324 + - person325 + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_income_eligible: + - false + - false + - false + - false + - false + - false + - false + - false + - false + - false + - false + - false + - false + - false + - false + - false + - false + - false + - false + - false + - false + - false + - false + - false + - false + +- name: Case 3, SNAP and CalWORKs bypass the income ceiling but SSI does not. + period: 2026 + # The first two exceed SMI but qualify categorically. SSI alone does not + # create the bypass, even when the household reports actual SSI receipt. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 100_000 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 100_000 + person3: {age: 8, is_citizen_or_legal_immigrant: true, ssi: 0} + person4: + age: 65 + is_citizen_or_legal_immigrant: true + ssi: 1_200 + employment_income: 100_000 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 1_200 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2, person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 2_400 + ca_state_supplement: 0 + spm_unit3: + members: [person4] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2, person3] + state_code: CA + county: ALAMEDA_COUNTY_CA + household3: + members: [person4] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_income_eligible: [true, true, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_limit.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_limit.yaml new file mode 100644 index 00000000000..7c7ed091a1e --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_limit.yaml @@ -0,0 +1,1335 @@ +# https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184 +# All 25 published monthly ceilings were read directly from the final table. +# Expected annual amounts are exactly 12 times those monthly table entries. + +- name: Case 1, all twenty-five published income limits are reproduced. + period: 2026 + absolute_error_margin: 0.01 + # Household sizes 1 through 25 follow table order. Annualize each published + # monthly ceiling by 12; do not replace large-household rows with the conflicting + # webpage 192.21 increment or assume the inferred rounding sequence is law. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person3: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person4: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person5: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person6: {age: 10, is_citizen_or_legal_immigrant: true, ssi: 0} + person7: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person8: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person9: {age: 10, is_citizen_or_legal_immigrant: true, ssi: 0} + person10: {age: 12, is_citizen_or_legal_immigrant: true, ssi: 0} + person11: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person12: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person13: {age: 10, is_citizen_or_legal_immigrant: true, ssi: 0} + person14: {age: 12, is_citizen_or_legal_immigrant: true, ssi: 0} + person15: {age: 14, is_citizen_or_legal_immigrant: true, ssi: 0} + person16: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person17: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person18: {age: 10, is_citizen_or_legal_immigrant: true, ssi: 0} + person19: {age: 12, is_citizen_or_legal_immigrant: true, ssi: 0} + person20: {age: 14, is_citizen_or_legal_immigrant: true, ssi: 0} + person21: {age: 16, is_citizen_or_legal_immigrant: true, ssi: 0} + person22: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person23: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person24: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person25: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person26: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person27: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person28: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person29: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person30: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person31: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person32: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person33: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person34: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person35: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person36: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person37: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person38: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person39: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person40: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person41: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person42: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person43: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person44: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person45: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person46: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person47: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person48: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person49: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person50: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person51: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person52: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person53: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person54: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person55: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person56: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person57: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person58: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person59: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person60: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person61: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person62: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person63: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person64: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person65: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person66: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person67: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person68: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person69: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person70: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person71: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person72: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person73: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person74: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person75: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person76: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person77: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person78: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person79: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person80: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person81: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person82: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person83: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person84: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person85: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person86: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person87: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person88: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person89: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person90: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person91: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person92: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person93: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person94: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person95: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person96: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person97: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person98: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person99: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person100: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person101: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person102: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person103: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person104: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person105: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person106: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person107: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person108: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person109: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person110: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person111: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person112: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person113: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person114: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person115: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person116: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person117: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person118: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person119: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person120: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person121: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person122: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person123: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person124: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person125: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person126: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person127: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person128: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person129: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person130: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person131: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person132: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person133: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person134: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person135: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person136: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person137: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person138: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person139: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person140: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person141: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person142: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person143: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person144: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person145: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person146: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person147: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person148: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person149: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person150: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person151: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person152: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person153: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person154: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person155: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person156: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person157: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person158: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person159: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person160: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person161: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person162: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person163: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person164: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person165: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person166: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person167: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person168: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person169: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person170: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person171: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person172: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person173: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person174: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person175: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person176: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person177: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person178: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person179: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person180: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person181: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person182: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person183: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person184: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person185: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person186: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person187: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person188: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person189: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person190: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person191: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person192: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person193: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person194: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person195: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person196: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person197: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person198: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person199: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person200: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person201: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person202: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person203: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person204: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person205: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person206: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person207: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person208: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person209: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person210: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person211: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person212: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person213: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person214: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person215: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person216: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person217: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person218: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person219: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person220: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person221: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person222: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person223: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person224: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person225: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person226: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person227: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person228: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person229: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person230: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person231: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person232: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person233: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person234: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person235: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person236: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person237: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person238: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person239: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person240: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person241: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person242: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person243: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person244: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person245: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person246: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person247: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person248: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person249: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person250: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person251: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person252: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person253: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person254: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person255: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person256: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person257: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person258: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person259: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person260: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person261: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person262: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person263: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person264: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person265: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person266: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person267: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person268: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person269: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person270: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person271: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person272: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person273: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person274: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person275: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person276: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person277: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person278: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person279: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person280: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person281: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person282: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person283: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person284: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person285: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person286: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person287: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person288: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person289: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person290: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person291: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person292: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person293: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person294: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person295: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person296: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person297: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person298: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person299: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person300: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person301: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person302: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person303: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person304: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person305: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person306: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person307: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person308: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person309: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person310: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person311: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person312: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person313: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person314: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person315: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person316: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person317: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person318: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person319: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person320: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person321: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person322: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person323: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person324: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person325: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2, person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person4, person5, person6] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person7, person8, person9, person10] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person11, person12, person13, person14, person15] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit6: + members: [person16, person17, person18, person19, person20, person21] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit7: + members: [person22, person23, person24, person25, person26, person27, person28] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit8: + members: + - person29 + - person30 + - person31 + - person32 + - person33 + - person34 + - person35 + - person36 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit9: + members: + - person37 + - person38 + - person39 + - person40 + - person41 + - person42 + - person43 + - person44 + - person45 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit10: + members: + - person46 + - person47 + - person48 + - person49 + - person50 + - person51 + - person52 + - person53 + - person54 + - person55 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit11: + members: + - person56 + - person57 + - person58 + - person59 + - person60 + - person61 + - person62 + - person63 + - person64 + - person65 + - person66 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit12: + members: + - person67 + - person68 + - person69 + - person70 + - person71 + - person72 + - person73 + - person74 + - person75 + - person76 + - person77 + - person78 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit13: + members: + - person79 + - person80 + - person81 + - person82 + - person83 + - person84 + - person85 + - person86 + - person87 + - person88 + - person89 + - person90 + - person91 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit14: + members: + - person92 + - person93 + - person94 + - person95 + - person96 + - person97 + - person98 + - person99 + - person100 + - person101 + - person102 + - person103 + - person104 + - person105 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit15: + members: + - person106 + - person107 + - person108 + - person109 + - person110 + - person111 + - person112 + - person113 + - person114 + - person115 + - person116 + - person117 + - person118 + - person119 + - person120 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit16: + members: + - person121 + - person122 + - person123 + - person124 + - person125 + - person126 + - person127 + - person128 + - person129 + - person130 + - person131 + - person132 + - person133 + - person134 + - person135 + - person136 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit17: + members: + - person137 + - person138 + - person139 + - person140 + - person141 + - person142 + - person143 + - person144 + - person145 + - person146 + - person147 + - person148 + - person149 + - person150 + - person151 + - person152 + - person153 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit18: + members: + - person154 + - person155 + - person156 + - person157 + - person158 + - person159 + - person160 + - person161 + - person162 + - person163 + - person164 + - person165 + - person166 + - person167 + - person168 + - person169 + - person170 + - person171 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit19: + members: + - person172 + - person173 + - person174 + - person175 + - person176 + - person177 + - person178 + - person179 + - person180 + - person181 + - person182 + - person183 + - person184 + - person185 + - person186 + - person187 + - person188 + - person189 + - person190 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit20: + members: + - person191 + - person192 + - person193 + - person194 + - person195 + - person196 + - person197 + - person198 + - person199 + - person200 + - person201 + - person202 + - person203 + - person204 + - person205 + - person206 + - person207 + - person208 + - person209 + - person210 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit21: + members: + - person211 + - person212 + - person213 + - person214 + - person215 + - person216 + - person217 + - person218 + - person219 + - person220 + - person221 + - person222 + - person223 + - person224 + - person225 + - person226 + - person227 + - person228 + - person229 + - person230 + - person231 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit22: + members: + - person232 + - person233 + - person234 + - person235 + - person236 + - person237 + - person238 + - person239 + - person240 + - person241 + - person242 + - person243 + - person244 + - person245 + - person246 + - person247 + - person248 + - person249 + - person250 + - person251 + - person252 + - person253 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit23: + members: + - person254 + - person255 + - person256 + - person257 + - person258 + - person259 + - person260 + - person261 + - person262 + - person263 + - person264 + - person265 + - person266 + - person267 + - person268 + - person269 + - person270 + - person271 + - person272 + - person273 + - person274 + - person275 + - person276 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit24: + members: + - person277 + - person278 + - person279 + - person280 + - person281 + - person282 + - person283 + - person284 + - person285 + - person286 + - person287 + - person288 + - person289 + - person290 + - person291 + - person292 + - person293 + - person294 + - person295 + - person296 + - person297 + - person298 + - person299 + - person300 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit25: + members: + - person301 + - person302 + - person303 + - person304 + - person305 + - person306 + - person307 + - person308 + - person309 + - person310 + - person311 + - person312 + - person313 + - person314 + - person315 + - person316 + - person317 + - person318 + - person319 + - person320 + - person321 + - person322 + - person323 + - person324 + - person325 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2, person3] + state_code: CA + county: ALAMEDA_COUNTY_CA + household3: + members: [person4, person5, person6] + state_code: CA + county: ALAMEDA_COUNTY_CA + household4: + members: [person7, person8, person9, person10] + state_code: CA + county: ALAMEDA_COUNTY_CA + household5: + members: [person11, person12, person13, person14, person15] + state_code: CA + county: ALAMEDA_COUNTY_CA + household6: + members: [person16, person17, person18, person19, person20, person21] + state_code: CA + county: ALAMEDA_COUNTY_CA + household7: + members: [person22, person23, person24, person25, person26, person27, person28] + state_code: CA + county: ALAMEDA_COUNTY_CA + household8: + members: + - person29 + - person30 + - person31 + - person32 + - person33 + - person34 + - person35 + - person36 + state_code: CA + county: ALAMEDA_COUNTY_CA + household9: + members: + - person37 + - person38 + - person39 + - person40 + - person41 + - person42 + - person43 + - person44 + - person45 + state_code: CA + county: ALAMEDA_COUNTY_CA + household10: + members: + - person46 + - person47 + - person48 + - person49 + - person50 + - person51 + - person52 + - person53 + - person54 + - person55 + state_code: CA + county: ALAMEDA_COUNTY_CA + household11: + members: + - person56 + - person57 + - person58 + - person59 + - person60 + - person61 + - person62 + - person63 + - person64 + - person65 + - person66 + state_code: CA + county: ALAMEDA_COUNTY_CA + household12: + members: + - person67 + - person68 + - person69 + - person70 + - person71 + - person72 + - person73 + - person74 + - person75 + - person76 + - person77 + - person78 + state_code: CA + county: ALAMEDA_COUNTY_CA + household13: + members: + - person79 + - person80 + - person81 + - person82 + - person83 + - person84 + - person85 + - person86 + - person87 + - person88 + - person89 + - person90 + - person91 + state_code: CA + county: ALAMEDA_COUNTY_CA + household14: + members: + - person92 + - person93 + - person94 + - person95 + - person96 + - person97 + - person98 + - person99 + - person100 + - person101 + - person102 + - person103 + - person104 + - person105 + state_code: CA + county: ALAMEDA_COUNTY_CA + household15: + members: + - person106 + - person107 + - person108 + - person109 + - person110 + - person111 + - person112 + - person113 + - person114 + - person115 + - person116 + - person117 + - person118 + - person119 + - person120 + state_code: CA + county: ALAMEDA_COUNTY_CA + household16: + members: + - person121 + - person122 + - person123 + - person124 + - person125 + - person126 + - person127 + - person128 + - person129 + - person130 + - person131 + - person132 + - person133 + - person134 + - person135 + - person136 + state_code: CA + county: ALAMEDA_COUNTY_CA + household17: + members: + - person137 + - person138 + - person139 + - person140 + - person141 + - person142 + - person143 + - person144 + - person145 + - person146 + - person147 + - person148 + - person149 + - person150 + - person151 + - person152 + - person153 + state_code: CA + county: ALAMEDA_COUNTY_CA + household18: + members: + - person154 + - person155 + - person156 + - person157 + - person158 + - person159 + - person160 + - person161 + - person162 + - person163 + - person164 + - person165 + - person166 + - person167 + - person168 + - person169 + - person170 + - person171 + state_code: CA + county: ALAMEDA_COUNTY_CA + household19: + members: + - person172 + - person173 + - person174 + - person175 + - person176 + - person177 + - person178 + - person179 + - person180 + - person181 + - person182 + - person183 + - person184 + - person185 + - person186 + - person187 + - person188 + - person189 + - person190 + state_code: CA + county: ALAMEDA_COUNTY_CA + household20: + members: + - person191 + - person192 + - person193 + - person194 + - person195 + - person196 + - person197 + - person198 + - person199 + - person200 + - person201 + - person202 + - person203 + - person204 + - person205 + - person206 + - person207 + - person208 + - person209 + - person210 + state_code: CA + county: ALAMEDA_COUNTY_CA + household21: + members: + - person211 + - person212 + - person213 + - person214 + - person215 + - person216 + - person217 + - person218 + - person219 + - person220 + - person221 + - person222 + - person223 + - person224 + - person225 + - person226 + - person227 + - person228 + - person229 + - person230 + - person231 + state_code: CA + county: ALAMEDA_COUNTY_CA + household22: + members: + - person232 + - person233 + - person234 + - person235 + - person236 + - person237 + - person238 + - person239 + - person240 + - person241 + - person242 + - person243 + - person244 + - person245 + - person246 + - person247 + - person248 + - person249 + - person250 + - person251 + - person252 + - person253 + state_code: CA + county: ALAMEDA_COUNTY_CA + household23: + members: + - person254 + - person255 + - person256 + - person257 + - person258 + - person259 + - person260 + - person261 + - person262 + - person263 + - person264 + - person265 + - person266 + - person267 + - person268 + - person269 + - person270 + - person271 + - person272 + - person273 + - person274 + - person275 + - person276 + state_code: CA + county: ALAMEDA_COUNTY_CA + household24: + members: + - person277 + - person278 + - person279 + - person280 + - person281 + - person282 + - person283 + - person284 + - person285 + - person286 + - person287 + - person288 + - person289 + - person290 + - person291 + - person292 + - person293 + - person294 + - person295 + - person296 + - person297 + - person298 + - person299 + - person300 + state_code: CA + county: ALAMEDA_COUNTY_CA + household25: + members: + - person301 + - person302 + - person303 + - person304 + - person305 + - person306 + - person307 + - person308 + - person309 + - person310 + - person311 + - person312 + - person313 + - person314 + - person315 + - person316 + - person317 + - person318 + - person319 + - person320 + - person321 + - person322 + - person323 + - person324 + - person325 + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_income_limit: + - 39_979.92 + - 52_281.96 + - 64_584 + - 76_885.92 + - 89_187 + - 101_488.92 + - 103_795.92 + - 106_101.96 + - 108_408.96 + - 110_715 + - 113_022 + - 115_329 + - 117_635.52 + - 119_942.16 + - 122_248.68 + - 124_555.32 + - 126_861.84 + - 129_168.48 + - 131_475 + - 133_781.64 + - 136_088.16 + - 138_394.8 + - 140_701.32 + - 143_007.96 + - 145_314.48 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.yaml new file mode 100644 index 00000000000..c9643b291dd --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.yaml @@ -0,0 +1,211 @@ +# https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=9,193,202,203,205,219,279 +# This gate covers gas/electric utility heating, not unresolved regular WPO. + +- name: Case 1, a qualified adult applicant is required by the represented inputs. + period: 2026 + # Applicant age 18 qualifies; age 17 does not absent an emancipation input. + # A qualified adult in the unit may apply despite another nonqualified adult. + input: + people: + person1: {age: 17, is_citizen_or_legal_immigrant: true, ssi: 0} + person2: {age: 18, is_citizen_or_legal_immigrant: true, ssi: 0} + person3: {age: 35, is_citizen_or_legal_immigrant: false, ssi: 0} + person4: {age: 17, is_citizen_or_legal_immigrant: true, ssi: 0} + person5: {age: 35, is_citizen_or_legal_immigrant: false, ssi: 0} + person6: {age: 18, is_citizen_or_legal_immigrant: true, ssi: 0} + person7: {age: 35, is_citizen_or_legal_immigrant: false, ssi: 0} + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3, person4] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person5, person6] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person7] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + household3: + members: [person3, person4] + state_code: CA + county: ALAMEDA_COUNTY_CA + household4: + members: [person5, person6] + state_code: CA + county: ALAMEDA_COUNTY_CA + household5: + members: [person7] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_utility_eligible: [false, true, false, true, false] + +- name: Case 2, utility fuel housing and actual matching energy charges determine coverage. + period: 2026 + # Gas/electric utility heat needs its matching charge, or the supported + # unsubsidized rent-inclusive proxy. Subsidized housing with a positive + # reported charge qualifies. Propane belongs to unresolved WPO; its false + # utility gate is not an assertion of no regular WPO entitlement. Unspecified + # fuel has no established utility crosswalk. + input: + people: + person1: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person2: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person3: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person4: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person5: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person6: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person7: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person8: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person9: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + gas_expense: 0 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + pre_subsidy_electricity_expense: 1_200 + spm_unit4: + members: [person4] + heating_type: NATURAL_GAS + gas_expense: 0 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + heat_expense_included_in_rent: true + spm_unit5: + members: [person5] + heating_type: NATURAL_GAS + gas_expense: 0 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + heat_expense_included_in_rent: true + receives_housing_assistance: true + spm_unit6: + members: [person6] + heating_type: NATURAL_GAS + gas_expense: 100 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + heat_expense_included_in_rent: true + receives_housing_assistance: true + spm_unit7: + members: [person7] + heating_type: PROPANE + bottled_gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit8: + members: [person8] + heating_type: NONE + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit9: + members: [person9] + heating_type: UNSPECIFIED + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + heat_expense_included_in_rent: true + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + household3: + members: [person3] + state_code: CA + county: ALAMEDA_COUNTY_CA + household4: + members: [person4] + state_code: CA + county: ALAMEDA_COUNTY_CA + household5: + members: [person5] + state_code: CA + county: ALAMEDA_COUNTY_CA + household6: + members: [person6] + state_code: CA + county: ALAMEDA_COUNTY_CA + household7: + members: [person7] + state_code: CA + county: ALAMEDA_COUNTY_CA + household8: + members: [person8] + state_code: CA + county: ALAMEDA_COUNTY_CA + household9: + members: [person9] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_utility_eligible: + - true + - true + - false + - true + - false + - true + - false + - false + - false diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.yaml new file mode 100644 index 00000000000..314ecc00bff --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.yaml @@ -0,0 +1,79 @@ +# https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=231,240,247 +# Person-level YEAR output; partnership losses remain net business receipts. + +- name: Case 1, adult earnings include net business losses and minor earnings are excluded. + period: 2026 + absolute_error_margin: 0.01 + # Adult total=12_000+2_000+300+700-1_000=14_000. At age 17 earnings + # are excluded; at 18 wages plus net business count. Net loss stays negative + # at Person level; household countable income separately floors at zero. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + self_employment_income: 2_000 + sstb_self_employment_income: 300 + farm_operations_income: 700 + partnership_s_corp_income: -1_000 + person2: + age: 17 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + self_employment_income: 2_000 + person3: + age: 18 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + self_employment_income: 2_000 + person4: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + self_employment_income: -1_000 + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + spm_units: + spm_unit1: + members: [person1, person2, person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person4] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person5] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1, person2, person3] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person4] + state_code: CA + county: ALAMEDA_COUNTY_CA + household3: + members: [person5] + state_code: OR + county: MULTNOMAH_COUNTY_OR + output: + ca_liheap_countable_earned_income: [14_000, 0, 14_000, -1_000, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.yaml new file mode 100644 index 00000000000..2fffb5cd798 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.yaml @@ -0,0 +1,474 @@ +# https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=229,230,231,234,235,240,243,244,245,246,247,248,249,250 +# Annual inputs approximate current-month receipts; SSI and SSP are monthly. +# Raw premium inputs below are assumed to contain allowable medical premiums. + +- name: Case 1, nonqualified wages and minor unearned income remain countable. + period: 2026 + absolute_error_margin: 0.01 + # Nonqualified wages 24_000 count despite size exclusion. The minor wage 12_000 + # is excluded, while minor survivor Social Security 2_400 still counts. + input: + people: + person1: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person2: + age: 30 + is_citizen_or_legal_immigrant: false + ssi: 0 + employment_income: 24_000 + person3: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person4: + age: 17 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 12_000 + social_security_survivors: 2_400 + spm_units: + spm_unit1: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person3, person4] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1, person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person3, person4] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_household_size: [1, 2] + ca_liheap_countable_income: [24_000, 2_400] + +- name: Case 2, pension retirement Social Security survivor and rental aggregates enter once. + period: 2026 + absolute_error_margin: 0.01 + # Pension 3_000 + retirement withdrawals 1_000 + Social Security 2_000 + # + separate survivor 700 + ordinary/farm rent 3_000 =9_700. Each aggregate + # contains its own subcomponents, so none are counted a second time. + input: + people: + person1: + age: 65 + is_citizen_or_legal_immigrant: true + ssi: 0 + taxable_pension_income: 2_000 + tax_exempt_pension_income: 1_000 + taxable_retirement_distributions: 600 + tax_exempt_retirement_distributions: 400 + social_security_survivors: 1_000 + social_security_dependents: 200 + social_security_disability: 300 + social_security_retirement: 500 + survivor_benefits: 700 + rental_income: 1_800 + farm_rent_income: 1_200 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_countable_income: 9_700 + +- name: Case 3, represented unearned receipts and annual CalWORKs enter once. + period: 2026 + absolute_error_margin: 0.01 + # Person receipts total 6_400; annual household CalWORKs 2_400 counts once + # despite two members, giving 8_800. Interest is assumed used for support. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + unemployment_compensation: 1_000 + strike_benefits: 200 + general_assistance: 300 + alimony_income: 400 + child_support_received: 500 + interest_income: 600 + ordinary_dividend_income: 700 + workers_compensation: 800 + disability_benefits: 900 + veterans_benefits: 1_000 + person2: {age: 8, is_citizen_or_legal_immigrant: true, ssi: 0} + spm_units: + spm_unit1: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 2_400 + ca_state_supplement: 0 + households: + household1: + members: [person1, person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_countable_income: 8_800 + +- name: Case 4, monthly federal SSI alone is annualized once with zero state supplement. + period: 2026 + absolute_error_margin: 0.01 + # Federal SSI 1_000 each month gives 12_000 annually. SSP is explicitly zero; + # all members use matching monthly SSI keys. Neither divide nor multiply twice. + input: + people: + person1: + age: 65 + is_citizen_or_legal_immigrant: true + ssi: + 2026-01: 1_000 + 2026-02: 1_000 + 2026-03: 1_000 + 2026-04: 1_000 + 2026-05: 1_000 + 2026-06: 1_000 + 2026-07: 1_000 + 2026-08: 1_000 + 2026-09: 1_000 + 2026-10: 1_000 + 2026-11: 1_000 + 2026-12: 1_000 + person2: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: + 2026-01: 0 + 2026-02: 0 + 2026-03: 0 + 2026-04: 0 + 2026-05: 0 + 2026-06: 0 + 2026-07: 0 + 2026-08: 0 + 2026-09: 0 + 2026-10: 0 + 2026-11: 0 + 2026-12: 0 + spm_units: + spm_unit1: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1, person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_countable_income: 12_000 + +- name: Case 5, nonuniform monthly SSI and SSP add to annual CalWORKs without duplication. + period: 2026 + absolute_error_margin: 0.01 + # SSI=6*500+6*700=7_200. SSP=3*100+9*200=2_100. Annual CalWORKs + # adds 2_400 once: total 11_700. SSP is a household amount, not per person. + input: + people: + person1: + age: 65 + is_citizen_or_legal_immigrant: true + ssi: + 2026-01: 500 + 2026-02: 500 + 2026-03: 500 + 2026-04: 500 + 2026-05: 500 + 2026-06: 500 + 2026-07: 700 + 2026-08: 700 + 2026-09: 700 + 2026-10: 700 + 2026-11: 700 + 2026-12: 700 + person2: + age: 8 + is_citizen_or_legal_immigrant: true + ssi: + 2026-01: 0 + 2026-02: 0 + 2026-03: 0 + 2026-04: 0 + 2026-05: 0 + 2026-06: 0 + 2026-07: 0 + 2026-08: 0 + 2026-09: 0 + 2026-10: 0 + 2026-11: 0 + 2026-12: 0 + spm_units: + spm_unit1: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 2_400 + ca_state_supplement: + 2026-01: 100 + 2026-02: 100 + 2026-03: 100 + 2026-04: 200 + 2026-05: 200 + 2026-06: 200 + 2026-07: 200 + 2026-08: 200 + 2026-09: 200 + 2026-10: 200 + 2026-11: 200 + 2026-12: 200 + households: + household1: + members: [person1, person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_countable_income: 11_700 + +- name: Case 6, direct premiums take precedence with fallback and no Medicare duplication. + period: 2026 + absolute_error_margin: 0.01 + # Positive direct premium 1_200 wins over fallback 2_400; otherwise fallback + # applies. Raw fields are alternative representations, never added together. + # Medicare deductions are deferred; LTC is excluded. Two members deduct + # 1_200+600 from 36_000, giving 34_200. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 24_000 + health_insurance_premiums: 1_200 + health_insurance_premiums_without_medicare_part_b: 2_400 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 24_000 + health_insurance_premiums: 0 + health_insurance_premiums_without_medicare_part_b: 2_400 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 24_000 + health_insurance_premiums: 1_200 + health_insurance_premiums_without_medicare_part_b: 2_400 + medicare_part_b_premiums_reported: 600 + long_term_health_insurance_premiums: 3_000 + person4: + age: 65 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 24_000 + medicare_part_b_premiums_reported: 600 + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 24_000 + health_insurance_premiums: 1_200 + person6: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + pension_income: 12_000 + health_insurance_premiums_without_medicare_part_b: 600 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person4] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person5, person6] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + household3: + members: [person3] + state_code: CA + county: ALAMEDA_COUNTY_CA + household4: + members: [person4] + state_code: CA + county: ALAMEDA_COUNTY_CA + household5: + members: [person5, person6] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_countable_income: [22_800, 21_600, 22_800, 24_000, 34_200] + +- name: Case 7, legally mandated support and allowable premiums are deducted once. + period: 2026 + absolute_error_margin: 0.01 + # 24_000-1_200 child support-600 spousal support-1_200 premiums=21_000. + # Deductions or net business losses cannot make household income negative. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 24_000 + child_support_expense: 1_200 + alimony_expense: 600 + health_insurance_premiums: 1_200 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 1_000 + child_support_expense: 2_000 + health_insurance_premiums: 1_000 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + self_employment_income: -2_000 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + household3: + members: [person3] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_countable_income: [21_000, 0, 0] + +- name: Case 8, cash gifts capital gains prizes SNAP and assets are excluded. + period: 2026 + absolute_error_margin: 0.01 + # Only wages 2_000 count; gifts, gains, lottery winnings, one-time insurance, + # SNAP and asset balances are excluded. The Oregon CA component is zero. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 2_000 + financial_assistance: 5_000 + capital_gains: 10_000 + gambling_winnings: 2_000 + life_insurance_benefits: 2_000 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 2_000 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 1_200 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit_assets: 500_000 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2] + state_code: OR + county: MULTNOMAH_COUNTY_OR + output: + ca_liheap_countable_income: [2_000, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/ca_liheap_income_group.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/ca_liheap_income_group.yaml new file mode 100644 index 00000000000..feaad23d856 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/ca_liheap_income_group.yaml @@ -0,0 +1,341 @@ +# https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184,217,218 +# Monthly table cent boundaries, prior-year FPG and categorical group 4 control. + +- name: Case 1, one-person poverty groups include every published cent boundary. + period: 2026 + # One-person source upper bounds are 1304.17,1630.21 and 1956.25 per month; + # the lower band includes equality and the next starts one cent later. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 0 + person2: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 15_650.04 + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 15_650.16 + person4: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 19_562.52 + person5: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 19_562.64 + person6: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 23_475 + person7: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 23_475.12 + person8: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 39_979.92 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person4] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person5] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit6: + members: [person6] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit7: + members: [person7] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit8: + members: [person8] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + household3: + members: [person3] + state_code: CA + county: ALAMEDA_COUNTY_CA + household4: + members: [person4] + state_code: CA + county: ALAMEDA_COUNTY_CA + household5: + members: [person5] + state_code: CA + county: ALAMEDA_COUNTY_CA + household6: + members: [person6] + state_code: CA + county: ALAMEDA_COUNTY_CA + household7: + members: [person7] + state_code: CA + county: ALAMEDA_COUNTY_CA + household8: + members: [person8] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_income_group: [1, 1, 2, 2, 3, 3, 4, 4] + +- name: Case 2, two-person half-cent rounding follows the printed upper bound. + period: 2026 + # 125% of two-person FPG 21_150 /12=2203.125; the table rounds to 2203.13. + # That printed value is group 2;2203.14 is group 3. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 26_437.56 + person2: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + person3: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 26_437.68 + person4: {age: 33, is_citizen_or_legal_immigrant: true, ssi: 0} + spm_units: + spm_unit1: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person3, person4] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1, person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person3, person4] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_income_group: [2, 3] + +- name: Case 3, categorical over-SMI large households use group four. + period: 2026 + # At size 13 the ordinary group 4 interval disappears; at 25 only group 1 remains. + # The source still explicitly requires group 4 for categorical income above SMI. + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 117_635.64 + person2: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person3: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person4: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person5: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person6: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person7: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person8: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person9: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person10: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person11: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person12: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person13: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person14: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 145_314.6 + person15: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person16: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person17: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person18: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person19: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person20: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person21: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person22: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person23: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person24: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person25: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person26: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person27: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person28: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person29: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person30: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + person31: {age: 25, is_citizen_or_legal_immigrant: true, ssi: 0} + person32: {age: 30, is_citizen_or_legal_immigrant: true, ssi: 0} + person33: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person34: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0} + person35: {age: 45, is_citizen_or_legal_immigrant: true, ssi: 0} + person36: {age: 50, is_citizen_or_legal_immigrant: true, ssi: 0} + person37: {age: 55, is_citizen_or_legal_immigrant: true, ssi: 0} + person38: {age: 20, is_citizen_or_legal_immigrant: true, ssi: 0} + spm_units: + spm_unit1: + members: + - person1 + - person2 + - person3 + - person4 + - person5 + - person6 + - person7 + - person8 + - person9 + - person10 + - person11 + - person12 + - person13 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 1_200 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: + - person14 + - person15 + - person16 + - person17 + - person18 + - person19 + - person20 + - person21 + - person22 + - person23 + - person24 + - person25 + - person26 + - person27 + - person28 + - person29 + - person30 + - person31 + - person32 + - person33 + - person34 + - person35 + - person36 + - person37 + - person38 + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 1_200 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: + - person1 + - person2 + - person3 + - person4 + - person5 + - person6 + - person7 + - person8 + - person9 + - person10 + - person11 + - person12 + - person13 + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: + - person14 + - person15 + - person16 + - person17 + - person18 + - person19 + - person20 + - person21 + - person22 + - person23 + - person24 + - person25 + - person26 + - person27 + - person28 + - person29 + - person30 + - person31 + - person32 + - person33 + - person34 + - person35 + - person36 + - person37 + - person38 + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_income_group: [4, 4] diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_household_size.py b/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_household_size.py new file mode 100644 index 00000000000..15a764e60cf --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_household_size.py @@ -0,0 +1,14 @@ +from policyengine_us.model_api import * + + +class ca_liheap_household_size(Variable): + value_type = int + entity = SPMUnit + definition_period = YEAR + label = "California LIHEAP qualified household size" + defined_for = StateCode.CA + reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=196,202,203" + + # The SPM unit approximates the household sharing energy costs. Income of + # excluded nonqualified members remains countable. + adds = ["is_citizen_or_legal_immigrant"] diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_utility_heating.py b/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_utility_heating.py new file mode 100644 index 00000000000..fb88977bd5b --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_utility_heating.py @@ -0,0 +1,26 @@ +from policyengine_us.model_api import * + + +class ca_liheap_utility_heating(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "California LIHEAP regular gas or electric utility heating benefit" + defined_for = "ca_liheap_utility_eligible" + reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=182,183,184" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ca.csd.liheap.payment + county = spm_unit.household("county_str", period) + supported_county = np.isin(county, list(p.utility_base_amount)) + # defined_for masks results after calculation, so replace irrelevant + # county keys before vectorized lookup in mixed-state populations. + safe_county = where(supported_county, county, next(iter(p.utility_base_amount))) + group = max_(spm_unit("ca_liheap_income_group", period), 1) + base = p.utility_base_amount[safe_county][group] + size = spm_unit("ca_liheap_household_size", period) + extra_people = clip(size - 1, 0, p.maximum_payment_household_size - 1) + return where( + supported_county, base + p.additional_person_amount * extra_people, 0 + ) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_categorically_eligible.py b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_categorically_eligible.py new file mode 100644 index 00000000000..7f5e23b652f --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_categorically_eligible.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class ca_liheap_categorically_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "California LIHEAP categorically income eligible" + defined_for = StateCode.CA + reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=6,217,218" + + def formula(spm_unit, period, parameters): + return (spm_unit("snap", period) > 0) | (spm_unit("ca_tanf", period) > 0) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_eligible.py b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_eligible.py new file mode 100644 index 00000000000..407f630bfea --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_eligible.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class ca_liheap_income_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "California LIHEAP income eligible" + defined_for = StateCode.CA + reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=6,9,184" + + def formula(spm_unit, period, parameters): + return spm_unit("ca_liheap_categorically_eligible", period) | ( + spm_unit("ca_liheap_countable_income", period) + <= spm_unit("ca_liheap_income_limit", period) + ) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_limit.py b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_limit.py new file mode 100644 index 00000000000..4f26f28fb6f --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_limit.py @@ -0,0 +1,46 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.hhs_smi import smi + + +class ca_liheap_income_limit(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "California LIHEAP annualized income limit" + defined_for = StateCode.CA + reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=9,184" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ca.csd.liheap.income + p_smi = parameters(period).gov.hhs.smi + size = spm_unit("ca_liheap_household_size", period) + state = spm_unit.household("state_code_str", period) + four_person_smi = p_smi.amount[state] + rounded_base = ( + np.floor(four_person_smi * p.smi_rate / p.smi_annual_rounding_increment) + * p.smi_annual_rounding_increment + ) + capped_size = clip(size, 1, p.smi_rounding_size_limit) + adjusted_base = smi(capped_size, state, period, parameters) * ( + rounded_base / four_person_smi + ) + rounded_annual = ( + np.floor(adjusted_base / p.smi_annual_rounding_increment) + * p.smi_annual_rounding_increment + ) + extra_people = max_(size - p.smi_rounding_size_limit, 0) + annual_increment = ( + rounded_base * p_smi.household_size_adjustment.additional_person + ) + monthly = ( + rounded_annual / MONTHS_IN_YEAR + + extra_people * annual_increment / MONTHS_IN_YEAR + ) + # This inferred two-stage rounding reproduces all 25 FY2026 rows; + # the source does not prescribe the size-12 switch or an extension. + rounded_monthly = ( + np.floor(monthly / p.monthly_rounding_increment) + * p.monthly_rounding_increment + ) + return rounded_monthly * MONTHS_IN_YEAR diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.py b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.py new file mode 100644 index 00000000000..91f4414cf0d --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.py @@ -0,0 +1,34 @@ +from policyengine_us.model_api import * + + +class ca_liheap_utility_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "California LIHEAP utility heating eligibility" + defined_for = StateCode.CA + reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=9,182,183,184,193,202,203,205,219,279" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ca.csd.liheap.eligibility + person = spm_unit.members + qualified_adult = person("is_citizen_or_legal_immigrant", period) & ( + person("age", period) >= p.applicant_min_age + ) + heating_type = spm_unit("heating_type", period) + types = heating_type.possible_values + utility_heat = (heating_type == types.ELECTRICITY) | ( + heating_type == types.NATURAL_GAS + ) + expense = spm_unit("heating_expense", period) + heat_in_rent = spm_unit("heat_expense_included_in_rent", period) + subsidized = spm_unit("receives_housing_assistance", period) + # Unsubsidized heat-in-rent is an energy-responsibility proxy; a + # separately reported charge also permits subsidized households. + energy_cost = (expense > 0) | (heat_in_rent & ~subsidized) + return ( + utility_heat + & energy_cost + & (spm_unit.sum(qualified_adult) > 0) + & spm_unit("ca_liheap_income_eligible", period) + ) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.py b/policyengine_us/variables/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.py new file mode 100644 index 00000000000..a36f6d21ac4 --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.py @@ -0,0 +1,16 @@ +from policyengine_us.model_api import * + + +class ca_liheap_countable_earned_income(Variable): + value_type = float + entity = Person + definition_period = YEAR + unit = USD + label = "California LIHEAP countable earned income" + defined_for = StateCode.CA + reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=231,240,247" + + def formula(person, period, parameters): + p = parameters(period).gov.states.ca.csd.liheap.income + earnings = add(person, period, p.earned_sources) + return where(person("age", period) >= p.earned_income_min_age, earnings, 0) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.py b/policyengine_us/variables/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.py new file mode 100644 index 00000000000..31600a478b6 --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.py @@ -0,0 +1,32 @@ +from policyengine_us.model_api import * + + +class ca_liheap_countable_income(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = "California LIHEAP annualized countable income" + defined_for = StateCode.CA + reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=7,229,230,231,232,233,234,235,236,237,238,239,240,243,244,245,246,247" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ca.csd.liheap.income + gross = add( + spm_unit, + period, + ["ca_liheap_countable_earned_income"] + p.unearned_sources, + ) + support_paid = add(spm_unit, period, p.support_deductions) + person = spm_unit.members + direct_premiums = person("health_insurance_premiums", period) + premiums_without_part_b = person( + "health_insurance_premiums_without_medicare_part_b", period + ) + # Use reported allowable non-Medicare medical premiums as a proxy. + # Raw inputs do not identify vision/dental or overlap with separately + # reported LTC/Medicare premiums; do not add those or modeled Medicare. + medical_premiums = where( + direct_premiums > 0, direct_premiums, premiums_without_part_b + ) + return max_(gross - support_paid - spm_unit.sum(medical_premiums), 0) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_income_group.py b/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_income_group.py new file mode 100644 index 00000000000..5f30c45cd8c --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_income_group.py @@ -0,0 +1,33 @@ +from policyengine_us.model_api import * +from policyengine_us.variables.gov.hhs.tax_unit_fpg import fpg + + +class ca_liheap_income_group(Variable): + value_type = int + entity = SPMUnit + definition_period = YEAR + label = "California LIHEAP poverty group" + defined_for = StateCode.CA + reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ca.csd.liheap.income + size = spm_unit("ca_liheap_household_size", period) + state_group = spm_unit.household("state_group_str", period) + guideline = fpg( + max_(size, 1), state_group, period, parameters, year_lag=p.fpg_year_lag + ) + income = spm_unit("ca_liheap_countable_income", period) + # Compare integer cents to preserve published inclusive boundaries + # after annual monetary inputs have been stored as float32. + monthly_income_cents = np.rint( + income.astype(float) / MONTHS_IN_YEAR / p.monthly_rounding_increment + ) + group = 1 + for rate in p.poverty_group_rates: + threshold_cents = np.floor( + guideline * rate / MONTHS_IN_YEAR / p.monthly_rounding_increment + 0.5 + ) + group = group + (monthly_income_cents > threshold_cents) + above_smi = income > spm_unit("ca_liheap_income_limit", period) + return where(above_smi, len(p.poverty_group_rates) + 1, group) From 4663737d3568db71ba0af69cdd0fc6227ad7d64a Mon Sep 17 00:00:00 2001 From: Ziming Date: Sun, 4 Oct 2026 19:51:21 -0400 Subject: [PATCH 2/6] Add covered California LIHEAP liquid heating calculation --- changelog.d/ca-liheap-wave2c.added.md | 2 +- .../gov/states/ca/csd/liheap/README.md | 67 +- .../liheap/energy_burden/expense_sources.yaml | 18 + .../energy_burden/rounding_increment.yaml | 12 + .../liheap/local/madera/burden_points.yaml | 18 + .../csd/liheap/local/madera/child_points.yaml | 26 + .../ca/csd/liheap/local/madera/counties.yaml | 14 + .../local/madera/disability_points.yaml | 11 + .../liheap/local/madera/elderly_points.yaml | 26 + .../local/madera/energy_burden_group.yaml | 31 + .../liheap/local/madera/income_points.yaml | 18 + .../local/madera/maximum_energy_burden.yaml | 11 + .../liheap/local/madera/minimum_points.yaml | 13 + .../payment/additional_person_amount.yaml | 6 +- .../liheap/payment/liquid_base_amount.yaml | 534 +++ .../payment/liquid_burden_addition.yaml | 18 + .../ca/csd/liheap/payment/liquid_maximum.yaml | 11 + .../payment/liquid_vulnerable_amount.yaml | 11 + .../maximum_payment_household_size.yaml | 6 +- policyengine_us/programs.yaml | 2 +- .../ca_liheap_covered_liquid_heating.yaml | 4052 +++++++++++++++++ .../eligibility/ca_liheap_basic_eligible.yaml | 170 + .../ca_liheap_liquid_heating_covered.yaml | 187 + .../ca_liheap_energy_burden_group.yaml | 183 + .../ca_liheap_liquid_priority_points.yaml | 244 + .../ca_liheap_covered_liquid_heating.py | 54 + .../eligibility/ca_liheap_basic_eligible.py | 28 + .../ca_liheap_liquid_heating_covered.py | 21 + .../eligibility/ca_liheap_utility_eligible.py | 18 +- .../payment/ca_liheap_energy_burden_group.py | 39 + .../ca_liheap_liquid_priority_points.py | 28 + 31 files changed, 5846 insertions(+), 33 deletions(-) create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/energy_burden/expense_sources.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/energy_burden/rounding_increment.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/burden_points.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/child_points.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/counties.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/disability_points.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/elderly_points.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/energy_burden_group.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/income_points.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/maximum_energy_burden.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/minimum_points.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_base_amount.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_burden_addition.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_maximum.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_vulnerable_amount.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_liquid_heating_covered.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/ca_liheap_energy_burden_group.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/ca_liheap_liquid_priority_points.yaml create mode 100644 policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.py create mode 100644 policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.py create mode 100644 policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_liquid_heating_covered.py create mode 100644 policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_energy_burden_group.py create mode 100644 policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_liquid_priority_points.py diff --git a/changelog.d/ca-liheap-wave2c.added.md b/changelog.d/ca-liheap-wave2c.added.md index b34f8a76fad..f4dc27d3412 100644 --- a/changelog.d/ca-liheap-wave2c.added.md +++ b/changelog.d/ca-liheap-wave2c.added.md @@ -1 +1 @@ -Add California FY2026 regular gas and electric utility HEAP, including county schedules and shared income and household calculations; wood, propane and oil assistance remains incomplete. +Add California FY2026 regular gas and electric utility HEAP and the ordinary Madera propane/fuel-oil component, reusing household and income calculations with explicit model coverage; wood and other liquid-fuel areas remain incomplete. diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/README.md b/policyengine_us/parameters/gov/states/ca/csd/liheap/README.md index f6090b2043d..00be16cab4f 100644 --- a/policyengine_us/parameters/gov/states/ca/csd/liheap/README.md +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/README.md @@ -6,13 +6,61 @@ FY2026 is the researched season. Undated formulas and parameter backfilling produce unverified historical estimates for earlier years; they do not extend verified coverage. FY2027 evidence acquired during research was a draft. -Regular wood/propane/oil assistance remains within the requested program scope, -but is not yet calculated. Local energy-burden group thresholds are unresolved; -wood valuation also requires local cord prices and heating-degree-day treatment. -The utility output is not a total California LIHEAP award. A zero utility -component for WPO or other unsupported fuels does not establish ineligibility -for regular assistance. No generic `ca_liheap` final award is provided. Solar, -coal, OTHER and UNSPECIFIED fuels have no supported utility-table crosswalk. +`ca_liheap_covered_liquid_heating` also estimates the ordinary propane/fuel-oil +component where local burden and priority rules have been verified: currently +Madera County. The statewide liquid base table is encoded, but that alone does +not establish coverage in other counties. Wood remains unimplemented pending +approved local quantity prices and county heating-degree-day classification. +Neither output is a total California LIHEAP award; no generic `ca_liheap` final +award is provided. Solar, coal, OTHER and UNSPECIFIED fuels have no supported +utility-table crosswalk, and kerosene is not assigned a statewide liquid rule. + +## Liquid component coverage and interpretation + +Always read `ca_liheap_liquid_heating_covered` alongside +`ca_liheap_covered_liquid_heating`: + +- Coverage true: the ordinary liquid calculation is supported. A zero component + then reflects a modeled basic-eligibility or local-priority failure. +- Coverage false: this component does not supply an award determination. Its + numeric zero is the framework's out-of-coverage default, not a denial or a + finding that the household has no regular heating entitlement. + +Coverage requires propane or fuel-oil heating in Madera, positive countable +income, and an energy-cost/income ratio from zero through 100%. Zero-income and +above-100% burden assignments remain unresolved in the acquired local plan and +are expressly outside calculation coverage. Other counties and wood are also +outside this component's coverage. The component is not added to household +benefit aggregates or substituted for the existing utility registry output. + +The liquid schedule uses county/income-group base amounts, the shared $19 +household increment through six members, burden additions of $0/$35/$70/$105, +and one $105 addition for a household containing a vulnerable member, capped +at $1,000. It represents the ordinary schedule without the conditional vendor +service supplement of up to $500; that supplement is not automatic and remains +unmodeled. There is no unsupported cap at annual or monthly fuel spending. + +Madera's burden intervals are 0–10.92%, 10.93–13.46%, 13.47–16.00%, and +16.01–100%. Percentages are truncated to two decimal places, as required by the +state guide. The calculation restores monetary cents before classification to +avoid binary float storage moving exact boundaries. Existing annual electricity, +natural-gas, wood, propane and fuel-oil costs divided by annual countable income +approximate the current-month ratio; they cannot isolate arrears, climate +credits or the duration of a seasonal delivery receipt. Only the canonical +`gas_expense` is counted, never both it and the deprecated gas input. + +Madera assigns income-group points of 10/8/6/4, burden-group points of 4/6/8/10, +and household demographic points: 10 for a child under six, an additional five +for a child under three, 10 for someone age 60+, an additional five for someone +age 70+, and 10 for disability. Each category counts once. The minimum is +20 points. These local thresholds are not extrapolated to other service areas. +The local plan has board-adoption evidence; a separate state approval letter +was not recovered. + +`ca_liheap_basic_eligible` shares the existing qualified-adult, income and +energy-responsibility checks between utility and liquid calculations. It does +not itself determine local priority or fuel eligibility. The existing utility +schedule and its documented limitations are preserved. ## Supported calculations @@ -94,6 +142,9 @@ gains and in-kind assistance are omitted under the source exclusions. ## References -- [CSD final FY2026 LIHEAP State Plan](https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=6,7,9,182,183,184,185,186,187,188,193,196,202,203,205,217,218,219,229,230,231,232,233,234,235,236,237,238,239,240,243,244,245,246,247,248,249,250,257,279,363,364): utility matrix, eligibility guide and unresolved regular WPO rules. +- [CSD final FY2026 LIHEAP State Plan](https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=6,7,9,182,183,184,185,186,187,188,193,196,202,203,205,217,218,219,229,230,231,232,233,234,235,236,237,238,239,240,243,244,245,246,247,248,249,250,257,279,282,283,363,364): utility/liquid matrices, energy-burden precision, eligibility guide and remaining wood rules. - [CSD FY2026 income eligibility webpage](https://www.csd.ca.gov/Pages/LIHEAP-Income-Eligibility.aspx): larger-household rounding conflict. - [CSD publication index](https://www.csd.ca.gov/Pages/LIHEAPProgram.aspx): final FY2026 and draft FY2027 status, checked October 3, 2026. + +- [Madera FY2026 local plan, October 9, 2025 board packet](https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191,233,234): local burden bands, priority points and minimum. +- [Madera November 13, 2025 board packet](https://maderacap.org/wp-content/uploads/2025/11/Agenda-and-Board-Packet-November-13-2025.pdf#page=4,6): October 9 minutes, consent-calendar approval including item D17. diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/energy_burden/expense_sources.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/energy_burden/expense_sources.yaml new file mode 100644 index 00000000000..11a2cd77629 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/energy_burden/expense_sources.yaml @@ -0,0 +1,18 @@ +description: California includes these canonical energy costs in the energy burden numerator under the Low Income Home Energy Assistance Program. +# Annual flows approximate current monthly costs. Excludes the deprecated gas +# duplicate and non-energy bills; climate credits and seasonal timing are unobserved. +values: + 2025-10-01: + - pre_subsidy_electricity_expense + - gas_expense + - wood_expense + - bottled_gas_expense + - fuel_oil_expense + +metadata: + unit: list + period: year + label: California LIHEAP energy burden expense sources + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=257,282 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/energy_burden/rounding_increment.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/energy_burden/rounding_increment.yaml new file mode 100644 index 00000000000..b8c54a104fc --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/energy_burden/rounding_increment.yaml @@ -0,0 +1,12 @@ +description: California truncates the energy burden ratio to this increment under the Low Income Home Energy Assistance Program. +# A ratio increment of 0.0001 is 0.01 percentage point (one basis point). +values: + 2025-10-01: 0.0001 + +metadata: + unit: /1 + period: year + label: California LIHEAP energy burden ratio truncation increment + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=283 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/burden_points.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/burden_points.yaml new file mode 100644 index 00000000000..67b2fd665ac --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/burden_points.yaml @@ -0,0 +1,18 @@ +description: California assigns these Madera priority points by energy burden group under the Low Income Home Energy Assistance Program. +1: + 2025-10-01: 4 +2: + 2025-10-01: 6 +3: + 2025-10-01: 8 +4: + 2025-10-01: 10 + +metadata: + unit: /1 + period: year + label: California LIHEAP Madera energy burden priority points + breakdown: range(1, 5) + reference: + - title: CAP Madera FY2026 LIHEAP Local Plan + href: https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/child_points.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/child_points.yaml new file mode 100644 index 00000000000..9529a55330d --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/child_points.yaml @@ -0,0 +1,26 @@ +description: California assigns these Madera priority points based on the youngest household member under the Low Income Home Energy Assistance Program. +# Each category applies once: 10 points for any child under 6 plus 5 for +# any child under 3. The scale combines the two overlapping categories. +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 15 + - threshold: + 2025-10-01: 3 + amount: + 2025-10-01: 10 + - threshold: + 2025-10-01: 6 + amount: + 2025-10-01: 0 + +metadata: + unit: /1 + period: year + label: California LIHEAP Madera child priority points + type: single_amount + threshold_unit: year + reference: + - title: CAP Madera FY2026 LIHEAP Local Plan + href: https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/counties.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/counties.yaml new file mode 100644 index 00000000000..f409108019a --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/counties.yaml @@ -0,0 +1,14 @@ +description: California has verified the following county coverage for the Madera local priority plan under the Low Income Home Energy Assistance Program. +# This records researched model coverage, not a statewide eligibility restriction. +# FY2026 is verified; earlier parameter backfills are unverified historical estimates. +values: + 2025-10-01: + - MADERA_COUNTY_CA + +metadata: + unit: list + period: year + label: California LIHEAP Madera researched county coverage + reference: + - title: CAP Madera FY2026 LIHEAP Local Plan + href: https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191,194 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/disability_points.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/disability_points.yaml new file mode 100644 index 00000000000..5964e3c54d7 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/disability_points.yaml @@ -0,0 +1,11 @@ +description: California assigns this many Madera priority points for any disabled household member under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 10 + +metadata: + unit: /1 + period: year + label: California LIHEAP Madera disability priority points + reference: + - title: CAP Madera FY2026 LIHEAP Local Plan + href: https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/elderly_points.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/elderly_points.yaml new file mode 100644 index 00000000000..f47654152c4 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/elderly_points.yaml @@ -0,0 +1,26 @@ +description: California assigns these Madera priority points based on the oldest household member under the Low Income Home Energy Assistance Program. +# Each category applies once: 10 points for any member age 60 or older plus +# 5 for any member age 70 or older. The scale combines both categories. +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 + - threshold: + 2025-10-01: 60 + amount: + 2025-10-01: 10 + - threshold: + 2025-10-01: 70 + amount: + 2025-10-01: 15 + +metadata: + unit: /1 + period: year + label: California LIHEAP Madera elderly priority points + type: single_amount + threshold_unit: year + reference: + - title: CAP Madera FY2026 LIHEAP Local Plan + href: https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/energy_burden_group.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/energy_burden_group.yaml new file mode 100644 index 00000000000..84257ac834d --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/energy_burden_group.yaml @@ -0,0 +1,31 @@ +description: California assigns these Madera energy burden groups using the truncated ratio in basis points under the Low Income Home Energy Assistance Program. +# Published percentage ranges: 0–10.92, 10.93–13.46, 13.47–16.00, 16.01–100. +# Integer basis points preserve the two-decimal-percent boundaries. Values above +# the published 100% maximum are unsupported and masked by the variable. +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 1 + - threshold: + 2025-10-01: 1093 + amount: + 2025-10-01: 2 + - threshold: + 2025-10-01: 1347 + amount: + 2025-10-01: 3 + - threshold: + 2025-10-01: 1601 + amount: + 2025-10-01: 4 + +metadata: + unit: /1 + period: year + label: California LIHEAP Madera energy burden group + type: single_amount + threshold_unit: /1 + reference: + - title: CAP Madera FY2026 LIHEAP Local Plan + href: https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/income_points.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/income_points.yaml new file mode 100644 index 00000000000..a364c8f5e40 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/income_points.yaml @@ -0,0 +1,18 @@ +description: California assigns these Madera priority points by poverty group under the Low Income Home Energy Assistance Program. +1: + 2025-10-01: 10 +2: + 2025-10-01: 8 +3: + 2025-10-01: 6 +4: + 2025-10-01: 4 + +metadata: + unit: /1 + period: year + label: California LIHEAP Madera income priority points + breakdown: range(1, 5) + reference: + - title: CAP Madera FY2026 LIHEAP Local Plan + href: https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/maximum_energy_burden.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/maximum_energy_burden.yaml new file mode 100644 index 00000000000..439e3acfcd3 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/maximum_energy_burden.yaml @@ -0,0 +1,11 @@ +description: California specifies this maximum energy burden ratio in the Madera local priority table under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 1 + +metadata: + unit: /1 + period: year + label: California LIHEAP Madera maximum supported energy burden + reference: + - title: CAP Madera FY2026 LIHEAP Local Plan + href: https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/minimum_points.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/minimum_points.yaml new file mode 100644 index 00000000000..fbb7a8b1790 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/minimum_points.yaml @@ -0,0 +1,13 @@ +description: California requires at least this many Madera priority points for regular heating assistance under the Low Income Home Energy Assistance Program. +# The minimum-energy-burden answer repeats 20 points; it does not state a 20% +# burden floor. With overlapping age categories, demographics total at most 40. +values: + 2025-10-01: 20 + +metadata: + unit: /1 + period: year + label: California LIHEAP Madera minimum priority points + reference: + - title: CAP Madera FY2026 LIHEAP Local Plan + href: https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=189,191,233,234 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/additional_person_amount.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/additional_person_amount.yaml index 3438be453f2..2b7e1f82e3d 100644 --- a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/additional_person_amount.yaml +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/additional_person_amount.yaml @@ -1,11 +1,11 @@ -description: California adds this amount for each additional qualified household member under the regular utility heating schedule under the Low Income Home Energy Assistance Program. +description: California adds this amount for each additional qualified household member under the regular utility and liquid heating schedules under the Low Income Home Energy Assistance Program. values: 2025-10-01: 19 metadata: unit: currency-USD period: year - label: California LIHEAP utility additional person amount + label: California LIHEAP additional person amount reference: - title: California FY2026 LIHEAP State Plan - href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184 + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184,188 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_base_amount.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_base_amount.yaml new file mode 100644 index 00000000000..b72291954b8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_base_amount.yaml @@ -0,0 +1,534 @@ +description: California provides these county base benefits by poverty group for a one-person household under the ordinary liquid heating schedule under the Low Income Home Energy Assistance Program. +# All 58 published county schedules are retained. Local burden/priority coverage +# is separate; a base amount alone does not establish a modeled county award. +ALAMEDA_COUNTY_CA: + 1: + 2025-10-01: 381 + 2: + 2025-10-01: 346 + 3: + 2025-10-01: 311 + 4: + 2025-10-01: 263 +ALPINE_COUNTY_CA: + 1: + 2025-10-01: 875 + 2: + 2025-10-01: 796 + 3: + 2025-10-01: 716 + 4: + 2025-10-01: 605 +AMADOR_COUNTY_CA: + 1: + 2025-10-01: 517 + 2: + 2025-10-01: 470 + 3: + 2025-10-01: 423 + 4: + 2025-10-01: 357 +BUTTE_COUNTY_CA: + 1: + 2025-10-01: 492 + 2: + 2025-10-01: 447 + 3: + 2025-10-01: 402 + 4: + 2025-10-01: 340 +CALAVERAS_COUNTY_CA: + 1: + 2025-10-01: 548 + 2: + 2025-10-01: 498 + 3: + 2025-10-01: 448 + 4: + 2025-10-01: 379 +COLUSA_COUNTY_CA: + 1: + 2025-10-01: 427 + 2: + 2025-10-01: 388 + 3: + 2025-10-01: 349 + 4: + 2025-10-01: 295 +CONTRA_COSTA_COUNTY_CA: + 1: + 2025-10-01: 396 + 2: + 2025-10-01: 360 + 3: + 2025-10-01: 324 + 4: + 2025-10-01: 273 +DEL_NORTE_COUNTY_CA: + 1: + 2025-10-01: 691 + 2: + 2025-10-01: 628 + 3: + 2025-10-01: 566 + 4: + 2025-10-01: 478 +EL_DORADO_COUNTY_CA: + 1: + 2025-10-01: 819 + 2: + 2025-10-01: 745 + 3: + 2025-10-01: 670 + 4: + 2025-10-01: 566 +FRESNO_COUNTY_CA: + 1: + 2025-10-01: 384 + 2: + 2025-10-01: 349 + 3: + 2025-10-01: 314 + 4: + 2025-10-01: 265 +GLENN_COUNTY_CA: + 1: + 2025-10-01: 406 + 2: + 2025-10-01: 369 + 3: + 2025-10-01: 332 + 4: + 2025-10-01: 280 +HUMBOLDT_COUNTY_CA: + 1: + 2025-10-01: 561 + 2: + 2025-10-01: 510 + 3: + 2025-10-01: 459 + 4: + 2025-10-01: 387 +IMPERIAL_COUNTY_CA: + 1: + 2025-10-01: 136 + 2: + 2025-10-01: 124 + 3: + 2025-10-01: 111 + 4: + 2025-10-01: 94 +INYO_COUNTY_CA: + 1: + 2025-10-01: 587 + 2: + 2025-10-01: 534 + 3: + 2025-10-01: 481 + 4: + 2025-10-01: 406 +KERN_COUNTY_CA: + 1: + 2025-10-01: 385 + 2: + 2025-10-01: 350 + 3: + 2025-10-01: 315 + 4: + 2025-10-01: 266 +KINGS_COUNTY_CA: + 1: + 2025-10-01: 391 + 2: + 2025-10-01: 355 + 3: + 2025-10-01: 320 + 4: + 2025-10-01: 270 +LAKE_COUNTY_CA: + 1: + 2025-10-01: 511 + 2: + 2025-10-01: 465 + 3: + 2025-10-01: 418 + 4: + 2025-10-01: 353 +LASSEN_COUNTY_CA: + 1: + 2025-10-01: 915 + 2: + 2025-10-01: 832 + 3: + 2025-10-01: 749 + 4: + 2025-10-01: 633 +LOS_ANGELES_COUNTY_CA: + 1: + 2025-10-01: 211 + 2: + 2025-10-01: 192 + 3: + 2025-10-01: 172 + 4: + 2025-10-01: 146 +MADERA_COUNTY_CA: + 1: + 2025-10-01: 411 + 2: + 2025-10-01: 374 + 3: + 2025-10-01: 336 + 4: + 2025-10-01: 284 +MARIN_COUNTY_CA: + 1: + 2025-10-01: 418 + 2: + 2025-10-01: 380 + 3: + 2025-10-01: 342 + 4: + 2025-10-01: 289 +MARIPOSA_COUNTY_CA: + 1: + 2025-10-01: 769 + 2: + 2025-10-01: 699 + 3: + 2025-10-01: 629 + 4: + 2025-10-01: 531 +MENDOCINO_COUNTY_CA: + 1: + 2025-10-01: 566 + 2: + 2025-10-01: 515 + 3: + 2025-10-01: 463 + 4: + 2025-10-01: 391 +MERCED_COUNTY_CA: + 1: + 2025-10-01: 388 + 2: + 2025-10-01: 353 + 3: + 2025-10-01: 318 + 4: + 2025-10-01: 268 +MODOC_COUNTY_CA: + 1: + 2025-10-01: 996 + 2: + 2025-10-01: 905 + 3: + 2025-10-01: 815 + 4: + 2025-10-01: 688 +MONO_COUNTY_CA: + 1: + 2025-10-01: 1_000 + 2: + 2025-10-01: 1_000 + 3: + 2025-10-01: 928 + 4: + 2025-10-01: 783 +MONTEREY_COUNTY_CA: + 1: + 2025-10-01: 451 + 2: + 2025-10-01: 410 + 3: + 2025-10-01: 369 + 4: + 2025-10-01: 312 +NAPA_COUNTY_CA: + 1: + 2025-10-01: 384 + 2: + 2025-10-01: 349 + 3: + 2025-10-01: 314 + 4: + 2025-10-01: 266 +NEVADA_COUNTY_CA: + 1: + 2025-10-01: 753 + 2: + 2025-10-01: 685 + 3: + 2025-10-01: 616 + 4: + 2025-10-01: 520 +ORANGE_COUNTY_CA: + 1: + 2025-10-01: 182 + 2: + 2025-10-01: 166 + 3: + 2025-10-01: 149 + 4: + 2025-10-01: 126 +PLACER_COUNTY_CA: + 1: + 2025-10-01: 481 + 2: + 2025-10-01: 437 + 3: + 2025-10-01: 394 + 4: + 2025-10-01: 332 +PLUMAS_COUNTY_CA: + 1: + 2025-10-01: 935 + 2: + 2025-10-01: 850 + 3: + 2025-10-01: 765 + 4: + 2025-10-01: 646 +RIVERSIDE_COUNTY_CA: + 1: + 2025-10-01: 225 + 2: + 2025-10-01: 204 + 3: + 2025-10-01: 184 + 4: + 2025-10-01: 155 +SACRAMENTO_COUNTY_CA: + 1: + 2025-10-01: 384 + 2: + 2025-10-01: 349 + 3: + 2025-10-01: 314 + 4: + 2025-10-01: 265 +SAN_BENITO_COUNTY_CA: + 1: + 2025-10-01: 465 + 2: + 2025-10-01: 423 + 3: + 2025-10-01: 380 + 4: + 2025-10-01: 321 +SAN_BERNARDINO_COUNTY_CA: + 1: + 2025-10-01: 249 + 2: + 2025-10-01: 227 + 3: + 2025-10-01: 204 + 4: + 2025-10-01: 172 +SAN_DIEGO_COUNTY_CA: + 1: + 2025-10-01: 234 + 2: + 2025-10-01: 213 + 3: + 2025-10-01: 191 + 4: + 2025-10-01: 162 +SAN_FRANCISCO_COUNTY_CA: + 1: + 2025-10-01: 422 + 2: + 2025-10-01: 383 + 3: + 2025-10-01: 345 + 4: + 2025-10-01: 291 +SAN_JOAQUIN_COUNTY_CA: + 1: + 2025-10-01: 379 + 2: + 2025-10-01: 345 + 3: + 2025-10-01: 310 + 4: + 2025-10-01: 262 +SAN_LUIS_OBISPO_COUNTY_CA: + 1: + 2025-10-01: 409 + 2: + 2025-10-01: 372 + 3: + 2025-10-01: 335 + 4: + 2025-10-01: 283 +SAN_MATEO_COUNTY_CA: + 1: + 2025-10-01: 397 + 2: + 2025-10-01: 360 + 3: + 2025-10-01: 324 + 4: + 2025-10-01: 274 +SANTA_BARBARA_COUNTY_CA: + 1: + 2025-10-01: 365 + 2: + 2025-10-01: 332 + 3: + 2025-10-01: 299 + 4: + 2025-10-01: 252 +SANTA_CLARA_COUNTY_CA: + 1: + 2025-10-01: 356 + 2: + 2025-10-01: 323 + 3: + 2025-10-01: 291 + 4: + 2025-10-01: 246 +SANTA_CRUZ_COUNTY_CA: + 1: + 2025-10-01: 406 + 2: + 2025-10-01: 369 + 3: + 2025-10-01: 332 + 4: + 2025-10-01: 281 +SHASTA_COUNTY_CA: + 1: + 2025-10-01: 496 + 2: + 2025-10-01: 451 + 3: + 2025-10-01: 406 + 4: + 2025-10-01: 342 +SIERRA_COUNTY_CA: + 1: + 2025-10-01: 927 + 2: + 2025-10-01: 842 + 3: + 2025-10-01: 758 + 4: + 2025-10-01: 640 +SISKIYOU_COUNTY_CA: + 1: + 2025-10-01: 805 + 2: + 2025-10-01: 732 + 3: + 2025-10-01: 658 + 4: + 2025-10-01: 556 +SOLANO_COUNTY_CA: + 1: + 2025-10-01: 385 + 2: + 2025-10-01: 350 + 3: + 2025-10-01: 315 + 4: + 2025-10-01: 266 +SONOMA_COUNTY_CA: + 1: + 2025-10-01: 427 + 2: + 2025-10-01: 388 + 3: + 2025-10-01: 349 + 4: + 2025-10-01: 295 +STANISLAUS_COUNTY_CA: + 1: + 2025-10-01: 351 + 2: + 2025-10-01: 319 + 3: + 2025-10-01: 287 + 4: + 2025-10-01: 242 +SUTTER_COUNTY_CA: + 1: + 2025-10-01: 370 + 2: + 2025-10-01: 337 + 3: + 2025-10-01: 303 + 4: + 2025-10-01: 256 +TEHAMA_COUNTY_CA: + 1: + 2025-10-01: 519 + 2: + 2025-10-01: 472 + 3: + 2025-10-01: 424 + 4: + 2025-10-01: 358 +TRINITY_COUNTY_CA: + 1: + 2025-10-01: 615 + 2: + 2025-10-01: 559 + 3: + 2025-10-01: 503 + 4: + 2025-10-01: 425 +TULARE_COUNTY_CA: + 1: + 2025-10-01: 389 + 2: + 2025-10-01: 353 + 3: + 2025-10-01: 318 + 4: + 2025-10-01: 269 +TUOLUMNE_COUNTY_CA: + 1: + 2025-10-01: 595 + 2: + 2025-10-01: 541 + 3: + 2025-10-01: 487 + 4: + 2025-10-01: 411 +VENTURA_COUNTY_CA: + 1: + 2025-10-01: 285 + 2: + 2025-10-01: 259 + 3: + 2025-10-01: 233 + 4: + 2025-10-01: 197 +YOLO_COUNTY_CA: + 1: + 2025-10-01: 383 + 2: + 2025-10-01: 348 + 3: + 2025-10-01: 313 + 4: + 2025-10-01: 264 +YUBA_COUNTY_CA: + 1: + 2025-10-01: 448 + 2: + 2025-10-01: 407 + 3: + 2025-10-01: 366 + 4: + 2025-10-01: 309 + +metadata: + unit: currency-USD + period: year + label: California LIHEAP liquid base benefit + propagate_metadata_to_children: true + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=185,186 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_burden_addition.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_burden_addition.yaml new file mode 100644 index 00000000000..eba2d4b5fea --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_burden_addition.yaml @@ -0,0 +1,18 @@ +description: California adds these amounts by energy burden group to the ordinary liquid heating schedule under the Low Income Home Energy Assistance Program. +1: + 2025-10-01: 0 +2: + 2025-10-01: 35 +3: + 2025-10-01: 70 +4: + 2025-10-01: 105 + +metadata: + unit: currency-USD + period: year + label: California LIHEAP liquid energy burden addition + breakdown: range(1, 5) + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=187,188 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_maximum.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_maximum.yaml new file mode 100644 index 00000000000..95624faaf2d --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_maximum.yaml @@ -0,0 +1,11 @@ +description: California caps the ordinary liquid heating schedule at this amount before any discretionary vendor-service supplement under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 1_000 + +metadata: + unit: currency-USD + period: year + label: California LIHEAP ordinary liquid heating maximum + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=10,187,188 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_vulnerable_amount.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_vulnerable_amount.yaml new file mode 100644 index 00000000000..f3270a835ff --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_vulnerable_amount.yaml @@ -0,0 +1,11 @@ +description: California adds this amount once when a household has any vulnerable member in the ordinary liquid heating schedule under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 105 + +metadata: + unit: currency-USD + period: year + label: California LIHEAP liquid vulnerable household addition + reference: + - title: California FY2026 LIHEAP State Plan + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=187,188 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/maximum_payment_household_size.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/maximum_payment_household_size.yaml index 7c000c19ed4..f52fe14d1fc 100644 --- a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/maximum_payment_household_size.yaml +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/maximum_payment_household_size.yaml @@ -1,11 +1,11 @@ -description: California caps regular utility payment household-size increments at this many qualified members under the Low Income Home Energy Assistance Program. +description: California caps regular utility and liquid payment household-size increments at this many qualified members under the Low Income Home Energy Assistance Program. values: 2025-10-01: 6 metadata: unit: person period: year - label: California LIHEAP maximum utility payment household size + label: California LIHEAP maximum payment household size reference: - title: California FY2026 LIHEAP State Plan - href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184 + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184,188 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 6c1f253f9db..273ef9fdbb4 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -853,7 +853,7 @@ programs: variable: ca_liheap_utility_heating parameter_prefix: gov.states.ca.csd.liheap verified_years: "2026" - notes: FY2026 regular gas and electric utility heating only. Wood, propane and oil regular assistance is still incomplete. Annual inputs approximate application-month circumstances and SPM units approximate energy households; local priorities, detailed income exclusions and allowable medical-premium composition are not fully represented. Earlier backfills are unverified historical estimates. Crisis, cooling, weatherization and equipment are outside scope. + notes: FY2026 regular gas and electric utility heating, plus a separate ordinary propane/fuel-oil component for Madera using verified local burden and priority rules. Read ca_liheap_liquid_heating_covered with ca_liheap_covered_liquid_heating; an uncovered component zero is not a denial. Wood, other liquid-fuel service areas, zero-income or above-100% burden assignments and conditional vendor-service supplements remain incomplete. Annual inputs approximate application-month circumstances and SPM units approximate energy households; local priorities, detailed income exclusions and allowable medical-premium composition are not fully represented. Earlier backfills are unverified historical estimates. Crisis, cooling, weatherization and equipment are outside scope. # --- SSA programs --- - id: ssi diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.yaml new file mode 100644 index 00000000000..02d3a046ca0 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.yaml @@ -0,0 +1,4052 @@ +# https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184,185,186,187,188,193,205,229,234,257,279,282,283 +# https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191,233,234 +# FY2026 ordinary liquid component; no discretionary vendor supplement. +# Annual recurring income/costs represent the same application month. +# Conditional statewide schedule cases explicitly force only coverage, burden +# and priority; all other cases derive CA LIHEAP intermediates from raw facts. + + +# Madera BBA411/374/336/284. Row1:411+105=516 at exactly20points. +# Row2:411+70=481 scheduled but18points<20 gives no approval. +# Row3:284+70+105=459; row4:284+19+35+105=443. These are ordinary +# no-supplement awards; income and expenses are annualized raw facts. +- name: "Case 1, Madera published rules yield the four independently calculated outcomes." + period: 2026 + input: + people: + p1_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p2_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p3_1: {"age": 60, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p4_1: {"age": 60, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 36000} + p4_2: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + spm_units: + s1: + members: ["p1_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + s2: + members: ["p2_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1800 + s3: + members: ["p3_1"] + heating_type: "FUEL_OIL" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + fuel_oil_expense: 4200 + s4: + members: ["p4_1", "p4_2"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 3960 + households: + h1: + members: ["p1_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h2: + members: ["p2_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h3: + members: ["p3_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h4: + members: ["p4_1", "p4_2"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + output: + ca_liheap_liquid_heating_covered: [true, true, true, true] + ca_liheap_countable_income: [12000, 12000, 30000, 36000] + ca_liheap_income_group: [1, 1, 4, 4] + ca_liheap_energy_burden_group: [4, 3, 3, 2] + ca_liheap_liquid_priority_points: [20, 18, 22, 20] + ca_liheap_covered_liquid_heating: [516, 0, 459, 443] + +# Income group1, burden group4 and noVP:411+105+19*(4,5,5). +# Seven real members are supplied in the last household; no size override. +- name: "Case 2, family increment stops at six qualified members." + period: 2026 + input: + people: + p1_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p1_2: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p1_3: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p1_4: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p1_5: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p2_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p2_2: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p2_3: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p2_4: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p2_5: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p2_6: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p3_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p3_2: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p3_3: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p3_4: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p3_5: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p3_6: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p3_7: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + spm_units: + s1: + members: ["p1_1", "p1_2", "p1_3", "p1_4", "p1_5"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + s2: + members: ["p2_1", "p2_2", "p2_3", "p2_4", "p2_5", "p2_6"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + s3: + members: ["p3_1", "p3_2", "p3_3", "p3_4", "p3_5", "p3_6", "p3_7"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + households: + h1: + members: ["p1_1", "p1_2", "p1_3", "p1_4", "p1_5"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h2: + members: ["p2_1", "p2_2", "p2_3", "p2_4", "p2_5", "p2_6"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h3: + members: ["p3_1", "p3_2", "p3_3", "p3_4", "p3_5", "p3_6", "p3_7"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + output: + ca_liheap_household_size: [5, 6, 7] + ca_liheap_liquid_heating_covered: [true, true, true] + ca_liheap_covered_liquid_heating: [592, 611, 611] + +# Row1 counts both adults income but only one in size; elderly household +# member still triggers once-onlyVP:411+105+105=621. Row2 excludes age17 +# earnings but counts pension:411+19+105=535. Remaining rows lack a +# qualified adult applicant, despite having covered burden/fuel facts. +- name: "Case 3, nonqualified income minor unearned income and all-member vulnerability interact." + period: 2026 + input: + people: + p1_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 6000} + p1_2: {"age": 70, "is_citizen_or_legal_immigrant": false, "ssi": 0, "employment_income": 6000} + p2_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 6000} + p2_2: {"age": 17, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 10000, "pension_income": 6000} + p3_1: {"age": 17, "is_citizen_or_legal_immigrant": true, "ssi": 0, "pension_income": 12000} + p4_1: {"age": 40, "is_citizen_or_legal_immigrant": false, "ssi": 0, "employment_income": 12000} + p4_2: {"age": 5, "is_citizen_or_legal_immigrant": true, "ssi": 0} + spm_units: + s1: + members: ["p1_1", "p1_2"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + s2: + members: ["p2_1", "p2_2"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + s3: + members: ["p3_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + s4: + members: ["p4_1", "p4_2"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + households: + h1: + members: ["p1_1", "p1_2"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h2: + members: ["p2_1", "p2_2"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h3: + members: ["p3_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h4: + members: ["p4_1", "p4_2"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + output: + ca_liheap_household_size: [1, 2, 1, 1] + ca_liheap_countable_income: [12000, 12000, 12000, 12000] + ca_liheap_liquid_heating_covered: [true, true, true, true] + ca_liheap_basic_eligible: [true, true, false, false] + ca_liheap_covered_liquid_heating: [621, 535, 0, 0] + +# Every zero here is an uncovered component output, not a legal denial: +# Fresno local bands, zero-income handling, above100 percent handling, wood +# prices and Oregon lie outside this staged component. Coverage must always +# be read with the monetary result. +- name: "Case 4, unsupported rows expose their coverage flag beside component zero." + period: 2026 + input: + people: + p1_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p2_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 0} + p3_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p4_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p5_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + spm_units: + s1: + members: ["p1_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + s2: + members: ["p2_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + s3: + members: ["p3_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 12000.12 + s4: + members: ["p4_1"] + heating_type: "WOOD" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + wood_expense: 2040 + s5: + members: ["p5_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + households: + h1: + members: ["p1_1"] + state_code: "CA" + county: "FRESNO_COUNTY_CA" + h2: + members: ["p2_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h3: + members: ["p3_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h4: + members: ["p4_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h5: + members: ["p5_1"] + state_code: "OR" + county: "MULTNOMAH_COUNTY_OR" + output: + ca_liheap_liquid_heating_covered: [false, false, false, false, false] + ca_liheap_covered_liquid_heating: [0, 0, 0, 0, 0] + +# All energy costs12+2028=2040 establish17 percent burden. The source +# liquid schedule411+105=516 is not capped at the12 propane expenditure. +- name: "Case 5, a low primary-fuel bill does not cap the ordinary scheduled payment." + period: 2026 + input: + people: + p1_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + spm_units: + s1: + members: ["p1_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 12 + pre_subsidy_electricity_expense: 2028 + households: + h1: + members: ["p1_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + output: + ca_liheap_liquid_heating_covered: [true] + ca_liheap_energy_burden_group: [4] + ca_liheap_covered_liquid_heating: [516] + +# Four qualified members give411+3*19=468; group1 burden adds0; +# anyVP adds105 exactly once, yielding573 despite five priority categories. +- name: "Case 6, every vulnerable category adds the dollar supplement only once." + period: 2026 + input: + people: + p1_1: {"age": 70, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000, "is_disabled": true} + p1_2: {"age": 75, "is_citizen_or_legal_immigrant": true, "ssi": 0, "is_disabled": true} + p1_3: {"age": 2.5, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p1_4: {"age": 1, "is_citizen_or_legal_immigrant": true, "ssi": 0} + spm_units: + s1: + members: ["p1_1", "p1_2", "p1_3", "p1_4"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + households: + h1: + members: ["p1_1", "p1_2", "p1_3", "p1_4"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + output: + ca_liheap_liquid_priority_points: [54] + ca_liheap_covered_liquid_heating: [573] + +# ISOLATED CONDITIONAL SCHEDULE ONLY, not a determination of local approval. +# All58 county rows were read from original state-plan pp185–186 and checked +# against the research CSV. Coverage/group1/priority20 are supplied ONLY in +# this isolated table check; one raw qualified adult and source income band +# remain real. Group1 burden adds0 and noVP is present, so the schedule +# equals the published county BBA. Unrecovered local rules are not inferred. +- name: "Case 7, conditional statewide schedule reproduces every county base in income group 1." + period: 2026 + input: + people: + p1_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p2_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p3_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p4_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p5_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p6_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p7_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p8_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p9_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p10_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p11_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p12_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p13_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p14_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p15_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p16_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p17_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p18_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p19_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p20_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p21_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p22_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p23_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p24_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p25_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p26_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p27_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p28_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p29_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p30_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p31_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p32_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p33_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p34_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p35_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p36_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p37_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p38_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p39_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p40_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p41_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p42_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p43_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p44_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p45_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p46_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p47_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p48_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p49_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p50_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p51_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p52_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p53_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p54_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p55_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p56_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p57_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p58_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + spm_units: + s1: + members: ["p1_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s2: + members: ["p2_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s3: + members: ["p3_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s4: + members: ["p4_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s5: + members: ["p5_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s6: + members: ["p6_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s7: + members: ["p7_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s8: + members: ["p8_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s9: + members: ["p9_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s10: + members: ["p10_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s11: + members: ["p11_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s12: + members: ["p12_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s13: + members: ["p13_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s14: + members: ["p14_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s15: + members: ["p15_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s16: + members: ["p16_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s17: + members: ["p17_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s18: + members: ["p18_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s19: + members: ["p19_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s20: + members: ["p20_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s21: + members: ["p21_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s22: + members: ["p22_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s23: + members: ["p23_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s24: + members: ["p24_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s25: + members: ["p25_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s26: + members: ["p26_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s27: + members: ["p27_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s28: + members: ["p28_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s29: + members: ["p29_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s30: + members: ["p30_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s31: + members: ["p31_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s32: + members: ["p32_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s33: + members: ["p33_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s34: + members: ["p34_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s35: + members: ["p35_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s36: + members: ["p36_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s37: + members: ["p37_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s38: + members: ["p38_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s39: + members: ["p39_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s40: + members: ["p40_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s41: + members: ["p41_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s42: + members: ["p42_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s43: + members: ["p43_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s44: + members: ["p44_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s45: + members: ["p45_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s46: + members: ["p46_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s47: + members: ["p47_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s48: + members: ["p48_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s49: + members: ["p49_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s50: + members: ["p50_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s51: + members: ["p51_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s52: + members: ["p52_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s53: + members: ["p53_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s54: + members: ["p54_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s55: + members: ["p55_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s56: + members: ["p56_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s57: + members: ["p57_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s58: + members: ["p58_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + households: + h1: + members: ["p1_1"] + state_code: "CA" + county: "ALAMEDA_COUNTY_CA" + h2: + members: ["p2_1"] + state_code: "CA" + county: "ALPINE_COUNTY_CA" + h3: + members: ["p3_1"] + state_code: "CA" + county: "EL_DORADO_COUNTY_CA" + h4: + members: ["p4_1"] + state_code: "CA" + county: "AMADOR_COUNTY_CA" + h5: + members: ["p5_1"] + state_code: "CA" + county: "CALAVERAS_COUNTY_CA" + h6: + members: ["p6_1"] + state_code: "CA" + county: "TUOLUMNE_COUNTY_CA" + h7: + members: ["p7_1"] + state_code: "CA" + county: "BUTTE_COUNTY_CA" + h8: + members: ["p8_1"] + state_code: "CA" + county: "COLUSA_COUNTY_CA" + h9: + members: ["p9_1"] + state_code: "CA" + county: "GLENN_COUNTY_CA" + h10: + members: ["p10_1"] + state_code: "CA" + county: "TRINITY_COUNTY_CA" + h11: + members: ["p11_1"] + state_code: "CA" + county: "CONTRA_COSTA_COUNTY_CA" + h12: + members: ["p12_1"] + state_code: "CA" + county: "DEL_NORTE_COUNTY_CA" + h13: + members: ["p13_1"] + state_code: "CA" + county: "FRESNO_COUNTY_CA" + h14: + members: ["p14_1"] + state_code: "CA" + county: "HUMBOLDT_COUNTY_CA" + h15: + members: ["p15_1"] + state_code: "CA" + county: "IMPERIAL_COUNTY_CA" + h16: + members: ["p16_1"] + state_code: "CA" + county: "SAN_DIEGO_COUNTY_CA" + h17: + members: ["p17_1"] + state_code: "CA" + county: "INYO_COUNTY_CA" + h18: + members: ["p18_1"] + state_code: "CA" + county: "MONO_COUNTY_CA" + h19: + members: ["p19_1"] + state_code: "CA" + county: "KERN_COUNTY_CA" + h20: + members: ["p20_1"] + state_code: "CA" + county: "KINGS_COUNTY_CA" + h21: + members: ["p21_1"] + state_code: "CA" + county: "LAKE_COUNTY_CA" + h22: + members: ["p22_1"] + state_code: "CA" + county: "MENDOCINO_COUNTY_CA" + h23: + members: ["p23_1"] + state_code: "CA" + county: "NAPA_COUNTY_CA" + h24: + members: ["p24_1"] + state_code: "CA" + county: "SOLANO_COUNTY_CA" + h25: + members: ["p25_1"] + state_code: "CA" + county: "SONOMA_COUNTY_CA" + h26: + members: ["p26_1"] + state_code: "CA" + county: "YOLO_COUNTY_CA" + h27: + members: ["p27_1"] + state_code: "CA" + county: "LASSEN_COUNTY_CA" + h28: + members: ["p28_1"] + state_code: "CA" + county: "LOS_ANGELES_COUNTY_CA" + h29: + members: ["p29_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h30: + members: ["p30_1"] + state_code: "CA" + county: "MARIN_COUNTY_CA" + h31: + members: ["p31_1"] + state_code: "CA" + county: "MARIPOSA_COUNTY_CA" + h32: + members: ["p32_1"] + state_code: "CA" + county: "MERCED_COUNTY_CA" + h33: + members: ["p33_1"] + state_code: "CA" + county: "MODOC_COUNTY_CA" + h34: + members: ["p34_1"] + state_code: "CA" + county: "MONTEREY_COUNTY_CA" + h35: + members: ["p35_1"] + state_code: "CA" + county: "SAN_FRANCISCO_COUNTY_CA" + h36: + members: ["p36_1"] + state_code: "CA" + county: "SAN_MATEO_COUNTY_CA" + h37: + members: ["p37_1"] + state_code: "CA" + county: "SANTA_CRUZ_COUNTY_CA" + h38: + members: ["p38_1"] + state_code: "CA" + county: "NEVADA_COUNTY_CA" + h39: + members: ["p39_1"] + state_code: "CA" + county: "PLACER_COUNTY_CA" + h40: + members: ["p40_1"] + state_code: "CA" + county: "ORANGE_COUNTY_CA" + h41: + members: ["p41_1"] + state_code: "CA" + county: "PLUMAS_COUNTY_CA" + h42: + members: ["p42_1"] + state_code: "CA" + county: "SIERRA_COUNTY_CA" + h43: + members: ["p43_1"] + state_code: "CA" + county: "RIVERSIDE_COUNTY_CA" + h44: + members: ["p44_1"] + state_code: "CA" + county: "SACRAMENTO_COUNTY_CA" + h45: + members: ["p45_1"] + state_code: "CA" + county: "SUTTER_COUNTY_CA" + h46: + members: ["p46_1"] + state_code: "CA" + county: "YUBA_COUNTY_CA" + h47: + members: ["p47_1"] + state_code: "CA" + county: "SAN_BENITO_COUNTY_CA" + h48: + members: ["p48_1"] + state_code: "CA" + county: "SAN_BERNARDINO_COUNTY_CA" + h49: + members: ["p49_1"] + state_code: "CA" + county: "SAN_JOAQUIN_COUNTY_CA" + h50: + members: ["p50_1"] + state_code: "CA" + county: "SAN_LUIS_OBISPO_COUNTY_CA" + h51: + members: ["p51_1"] + state_code: "CA" + county: "SANTA_BARBARA_COUNTY_CA" + h52: + members: ["p52_1"] + state_code: "CA" + county: "SANTA_CLARA_COUNTY_CA" + h53: + members: ["p53_1"] + state_code: "CA" + county: "SHASTA_COUNTY_CA" + h54: + members: ["p54_1"] + state_code: "CA" + county: "TEHAMA_COUNTY_CA" + h55: + members: ["p55_1"] + state_code: "CA" + county: "SISKIYOU_COUNTY_CA" + h56: + members: ["p56_1"] + state_code: "CA" + county: "STANISLAUS_COUNTY_CA" + h57: + members: ["p57_1"] + state_code: "CA" + county: "TULARE_COUNTY_CA" + h58: + members: ["p58_1"] + state_code: "CA" + county: "VENTURA_COUNTY_CA" + output: + ca_liheap_covered_liquid_heating: [381, 875, 819, 517, 548, 595, 492, 427, 406, 615, 396, 691, 384, 561, 136, 234, 587, 1000, 385, 391, 511, 566, 384, 385, 427, 383, 915, 211, 411, 418, 769, 388, 996, 451, 422, 397, 406, 753, 481, 182, 935, 927, 225, 384, 370, 448, 465, 249, 379, 409, 365, 356, 496, 519, 805, 351, 389, 285] + +# ISOLATED CONDITIONAL SCHEDULE ONLY, not a determination of local approval. +# All58 county rows were read from original state-plan pp185–186 and checked +# against the research CSV. Coverage/group1/priority20 are supplied ONLY in +# this isolated table check; one raw qualified adult and source income band +# remain real. Group1 burden adds0 and noVP is present, so the schedule +# equals the published county BBA. Unrecovered local rules are not inferred. +- name: "Case 8, conditional statewide schedule reproduces every county base in income group 2." + period: 2026 + input: + people: + p1_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p2_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p3_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p4_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p5_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p6_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p7_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p8_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p9_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p10_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p11_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p12_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p13_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p14_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p15_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p16_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p17_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p18_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p19_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p20_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p21_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p22_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p23_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p24_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p25_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p26_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p27_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p28_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p29_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p30_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p31_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p32_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p33_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p34_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p35_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p36_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p37_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p38_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p39_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p40_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p41_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p42_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p43_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p44_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p45_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p46_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p47_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p48_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p49_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p50_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p51_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p52_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p53_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p54_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p55_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p56_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p57_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p58_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + spm_units: + s1: + members: ["p1_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s2: + members: ["p2_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s3: + members: ["p3_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s4: + members: ["p4_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s5: + members: ["p5_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s6: + members: ["p6_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s7: + members: ["p7_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s8: + members: ["p8_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s9: + members: ["p9_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s10: + members: ["p10_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s11: + members: ["p11_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s12: + members: ["p12_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s13: + members: ["p13_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s14: + members: ["p14_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s15: + members: ["p15_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s16: + members: ["p16_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s17: + members: ["p17_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s18: + members: ["p18_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s19: + members: ["p19_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s20: + members: ["p20_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s21: + members: ["p21_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s22: + members: ["p22_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s23: + members: ["p23_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s24: + members: ["p24_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s25: + members: ["p25_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s26: + members: ["p26_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s27: + members: ["p27_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s28: + members: ["p28_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s29: + members: ["p29_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s30: + members: ["p30_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s31: + members: ["p31_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s32: + members: ["p32_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s33: + members: ["p33_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s34: + members: ["p34_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s35: + members: ["p35_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s36: + members: ["p36_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s37: + members: ["p37_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s38: + members: ["p38_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s39: + members: ["p39_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s40: + members: ["p40_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s41: + members: ["p41_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s42: + members: ["p42_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s43: + members: ["p43_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s44: + members: ["p44_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s45: + members: ["p45_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s46: + members: ["p46_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s47: + members: ["p47_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s48: + members: ["p48_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s49: + members: ["p49_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s50: + members: ["p50_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s51: + members: ["p51_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s52: + members: ["p52_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s53: + members: ["p53_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s54: + members: ["p54_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s55: + members: ["p55_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s56: + members: ["p56_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s57: + members: ["p57_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s58: + members: ["p58_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + households: + h1: + members: ["p1_1"] + state_code: "CA" + county: "ALAMEDA_COUNTY_CA" + h2: + members: ["p2_1"] + state_code: "CA" + county: "ALPINE_COUNTY_CA" + h3: + members: ["p3_1"] + state_code: "CA" + county: "EL_DORADO_COUNTY_CA" + h4: + members: ["p4_1"] + state_code: "CA" + county: "AMADOR_COUNTY_CA" + h5: + members: ["p5_1"] + state_code: "CA" + county: "CALAVERAS_COUNTY_CA" + h6: + members: ["p6_1"] + state_code: "CA" + county: "TUOLUMNE_COUNTY_CA" + h7: + members: ["p7_1"] + state_code: "CA" + county: "BUTTE_COUNTY_CA" + h8: + members: ["p8_1"] + state_code: "CA" + county: "COLUSA_COUNTY_CA" + h9: + members: ["p9_1"] + state_code: "CA" + county: "GLENN_COUNTY_CA" + h10: + members: ["p10_1"] + state_code: "CA" + county: "TRINITY_COUNTY_CA" + h11: + members: ["p11_1"] + state_code: "CA" + county: "CONTRA_COSTA_COUNTY_CA" + h12: + members: ["p12_1"] + state_code: "CA" + county: "DEL_NORTE_COUNTY_CA" + h13: + members: ["p13_1"] + state_code: "CA" + county: "FRESNO_COUNTY_CA" + h14: + members: ["p14_1"] + state_code: "CA" + county: "HUMBOLDT_COUNTY_CA" + h15: + members: ["p15_1"] + state_code: "CA" + county: "IMPERIAL_COUNTY_CA" + h16: + members: ["p16_1"] + state_code: "CA" + county: "SAN_DIEGO_COUNTY_CA" + h17: + members: ["p17_1"] + state_code: "CA" + county: "INYO_COUNTY_CA" + h18: + members: ["p18_1"] + state_code: "CA" + county: "MONO_COUNTY_CA" + h19: + members: ["p19_1"] + state_code: "CA" + county: "KERN_COUNTY_CA" + h20: + members: ["p20_1"] + state_code: "CA" + county: "KINGS_COUNTY_CA" + h21: + members: ["p21_1"] + state_code: "CA" + county: "LAKE_COUNTY_CA" + h22: + members: ["p22_1"] + state_code: "CA" + county: "MENDOCINO_COUNTY_CA" + h23: + members: ["p23_1"] + state_code: "CA" + county: "NAPA_COUNTY_CA" + h24: + members: ["p24_1"] + state_code: "CA" + county: "SOLANO_COUNTY_CA" + h25: + members: ["p25_1"] + state_code: "CA" + county: "SONOMA_COUNTY_CA" + h26: + members: ["p26_1"] + state_code: "CA" + county: "YOLO_COUNTY_CA" + h27: + members: ["p27_1"] + state_code: "CA" + county: "LASSEN_COUNTY_CA" + h28: + members: ["p28_1"] + state_code: "CA" + county: "LOS_ANGELES_COUNTY_CA" + h29: + members: ["p29_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h30: + members: ["p30_1"] + state_code: "CA" + county: "MARIN_COUNTY_CA" + h31: + members: ["p31_1"] + state_code: "CA" + county: "MARIPOSA_COUNTY_CA" + h32: + members: ["p32_1"] + state_code: "CA" + county: "MERCED_COUNTY_CA" + h33: + members: ["p33_1"] + state_code: "CA" + county: "MODOC_COUNTY_CA" + h34: + members: ["p34_1"] + state_code: "CA" + county: "MONTEREY_COUNTY_CA" + h35: + members: ["p35_1"] + state_code: "CA" + county: "SAN_FRANCISCO_COUNTY_CA" + h36: + members: ["p36_1"] + state_code: "CA" + county: "SAN_MATEO_COUNTY_CA" + h37: + members: ["p37_1"] + state_code: "CA" + county: "SANTA_CRUZ_COUNTY_CA" + h38: + members: ["p38_1"] + state_code: "CA" + county: "NEVADA_COUNTY_CA" + h39: + members: ["p39_1"] + state_code: "CA" + county: "PLACER_COUNTY_CA" + h40: + members: ["p40_1"] + state_code: "CA" + county: "ORANGE_COUNTY_CA" + h41: + members: ["p41_1"] + state_code: "CA" + county: "PLUMAS_COUNTY_CA" + h42: + members: ["p42_1"] + state_code: "CA" + county: "SIERRA_COUNTY_CA" + h43: + members: ["p43_1"] + state_code: "CA" + county: "RIVERSIDE_COUNTY_CA" + h44: + members: ["p44_1"] + state_code: "CA" + county: "SACRAMENTO_COUNTY_CA" + h45: + members: ["p45_1"] + state_code: "CA" + county: "SUTTER_COUNTY_CA" + h46: + members: ["p46_1"] + state_code: "CA" + county: "YUBA_COUNTY_CA" + h47: + members: ["p47_1"] + state_code: "CA" + county: "SAN_BENITO_COUNTY_CA" + h48: + members: ["p48_1"] + state_code: "CA" + county: "SAN_BERNARDINO_COUNTY_CA" + h49: + members: ["p49_1"] + state_code: "CA" + county: "SAN_JOAQUIN_COUNTY_CA" + h50: + members: ["p50_1"] + state_code: "CA" + county: "SAN_LUIS_OBISPO_COUNTY_CA" + h51: + members: ["p51_1"] + state_code: "CA" + county: "SANTA_BARBARA_COUNTY_CA" + h52: + members: ["p52_1"] + state_code: "CA" + county: "SANTA_CLARA_COUNTY_CA" + h53: + members: ["p53_1"] + state_code: "CA" + county: "SHASTA_COUNTY_CA" + h54: + members: ["p54_1"] + state_code: "CA" + county: "TEHAMA_COUNTY_CA" + h55: + members: ["p55_1"] + state_code: "CA" + county: "SISKIYOU_COUNTY_CA" + h56: + members: ["p56_1"] + state_code: "CA" + county: "STANISLAUS_COUNTY_CA" + h57: + members: ["p57_1"] + state_code: "CA" + county: "TULARE_COUNTY_CA" + h58: + members: ["p58_1"] + state_code: "CA" + county: "VENTURA_COUNTY_CA" + output: + ca_liheap_covered_liquid_heating: [346, 796, 745, 470, 498, 541, 447, 388, 369, 559, 360, 628, 349, 510, 124, 213, 534, 1000, 350, 355, 465, 515, 349, 350, 388, 348, 832, 192, 374, 380, 699, 353, 905, 410, 383, 360, 369, 685, 437, 166, 850, 842, 204, 349, 337, 407, 423, 227, 345, 372, 332, 323, 451, 472, 732, 319, 353, 259] + +# ISOLATED CONDITIONAL SCHEDULE ONLY, not a determination of local approval. +# All58 county rows were read from original state-plan pp185–186 and checked +# against the research CSV. Coverage/group1/priority20 are supplied ONLY in +# this isolated table check; one raw qualified adult and source income band +# remain real. Group1 burden adds0 and noVP is present, so the schedule +# equals the published county BBA. Unrecovered local rules are not inferred. +- name: "Case 9, conditional statewide schedule reproduces every county base in income group 3." + period: 2026 + input: + people: + p1_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p2_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p3_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p4_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p5_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p6_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p7_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p8_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p9_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p10_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p11_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p12_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p13_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p14_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p15_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p16_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p17_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p18_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p19_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p20_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p21_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p22_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p23_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p24_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p25_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p26_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p27_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p28_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p29_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p30_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p31_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p32_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p33_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p34_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p35_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p36_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p37_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p38_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p39_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p40_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p41_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p42_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p43_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p44_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p45_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p46_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p47_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p48_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p49_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p50_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p51_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p52_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p53_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p54_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p55_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p56_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p57_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p58_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + spm_units: + s1: + members: ["p1_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s2: + members: ["p2_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s3: + members: ["p3_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s4: + members: ["p4_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s5: + members: ["p5_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s6: + members: ["p6_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s7: + members: ["p7_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s8: + members: ["p8_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s9: + members: ["p9_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s10: + members: ["p10_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s11: + members: ["p11_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s12: + members: ["p12_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s13: + members: ["p13_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s14: + members: ["p14_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s15: + members: ["p15_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s16: + members: ["p16_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s17: + members: ["p17_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s18: + members: ["p18_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s19: + members: ["p19_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s20: + members: ["p20_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s21: + members: ["p21_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s22: + members: ["p22_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s23: + members: ["p23_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s24: + members: ["p24_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s25: + members: ["p25_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s26: + members: ["p26_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s27: + members: ["p27_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s28: + members: ["p28_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s29: + members: ["p29_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s30: + members: ["p30_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s31: + members: ["p31_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s32: + members: ["p32_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s33: + members: ["p33_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s34: + members: ["p34_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s35: + members: ["p35_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s36: + members: ["p36_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s37: + members: ["p37_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s38: + members: ["p38_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s39: + members: ["p39_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s40: + members: ["p40_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s41: + members: ["p41_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s42: + members: ["p42_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s43: + members: ["p43_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s44: + members: ["p44_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s45: + members: ["p45_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s46: + members: ["p46_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s47: + members: ["p47_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s48: + members: ["p48_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s49: + members: ["p49_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s50: + members: ["p50_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s51: + members: ["p51_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s52: + members: ["p52_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s53: + members: ["p53_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s54: + members: ["p54_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s55: + members: ["p55_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s56: + members: ["p56_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s57: + members: ["p57_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s58: + members: ["p58_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + households: + h1: + members: ["p1_1"] + state_code: "CA" + county: "ALAMEDA_COUNTY_CA" + h2: + members: ["p2_1"] + state_code: "CA" + county: "ALPINE_COUNTY_CA" + h3: + members: ["p3_1"] + state_code: "CA" + county: "EL_DORADO_COUNTY_CA" + h4: + members: ["p4_1"] + state_code: "CA" + county: "AMADOR_COUNTY_CA" + h5: + members: ["p5_1"] + state_code: "CA" + county: "CALAVERAS_COUNTY_CA" + h6: + members: ["p6_1"] + state_code: "CA" + county: "TUOLUMNE_COUNTY_CA" + h7: + members: ["p7_1"] + state_code: "CA" + county: "BUTTE_COUNTY_CA" + h8: + members: ["p8_1"] + state_code: "CA" + county: "COLUSA_COUNTY_CA" + h9: + members: ["p9_1"] + state_code: "CA" + county: "GLENN_COUNTY_CA" + h10: + members: ["p10_1"] + state_code: "CA" + county: "TRINITY_COUNTY_CA" + h11: + members: ["p11_1"] + state_code: "CA" + county: "CONTRA_COSTA_COUNTY_CA" + h12: + members: ["p12_1"] + state_code: "CA" + county: "DEL_NORTE_COUNTY_CA" + h13: + members: ["p13_1"] + state_code: "CA" + county: "FRESNO_COUNTY_CA" + h14: + members: ["p14_1"] + state_code: "CA" + county: "HUMBOLDT_COUNTY_CA" + h15: + members: ["p15_1"] + state_code: "CA" + county: "IMPERIAL_COUNTY_CA" + h16: + members: ["p16_1"] + state_code: "CA" + county: "SAN_DIEGO_COUNTY_CA" + h17: + members: ["p17_1"] + state_code: "CA" + county: "INYO_COUNTY_CA" + h18: + members: ["p18_1"] + state_code: "CA" + county: "MONO_COUNTY_CA" + h19: + members: ["p19_1"] + state_code: "CA" + county: "KERN_COUNTY_CA" + h20: + members: ["p20_1"] + state_code: "CA" + county: "KINGS_COUNTY_CA" + h21: + members: ["p21_1"] + state_code: "CA" + county: "LAKE_COUNTY_CA" + h22: + members: ["p22_1"] + state_code: "CA" + county: "MENDOCINO_COUNTY_CA" + h23: + members: ["p23_1"] + state_code: "CA" + county: "NAPA_COUNTY_CA" + h24: + members: ["p24_1"] + state_code: "CA" + county: "SOLANO_COUNTY_CA" + h25: + members: ["p25_1"] + state_code: "CA" + county: "SONOMA_COUNTY_CA" + h26: + members: ["p26_1"] + state_code: "CA" + county: "YOLO_COUNTY_CA" + h27: + members: ["p27_1"] + state_code: "CA" + county: "LASSEN_COUNTY_CA" + h28: + members: ["p28_1"] + state_code: "CA" + county: "LOS_ANGELES_COUNTY_CA" + h29: + members: ["p29_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h30: + members: ["p30_1"] + state_code: "CA" + county: "MARIN_COUNTY_CA" + h31: + members: ["p31_1"] + state_code: "CA" + county: "MARIPOSA_COUNTY_CA" + h32: + members: ["p32_1"] + state_code: "CA" + county: "MERCED_COUNTY_CA" + h33: + members: ["p33_1"] + state_code: "CA" + county: "MODOC_COUNTY_CA" + h34: + members: ["p34_1"] + state_code: "CA" + county: "MONTEREY_COUNTY_CA" + h35: + members: ["p35_1"] + state_code: "CA" + county: "SAN_FRANCISCO_COUNTY_CA" + h36: + members: ["p36_1"] + state_code: "CA" + county: "SAN_MATEO_COUNTY_CA" + h37: + members: ["p37_1"] + state_code: "CA" + county: "SANTA_CRUZ_COUNTY_CA" + h38: + members: ["p38_1"] + state_code: "CA" + county: "NEVADA_COUNTY_CA" + h39: + members: ["p39_1"] + state_code: "CA" + county: "PLACER_COUNTY_CA" + h40: + members: ["p40_1"] + state_code: "CA" + county: "ORANGE_COUNTY_CA" + h41: + members: ["p41_1"] + state_code: "CA" + county: "PLUMAS_COUNTY_CA" + h42: + members: ["p42_1"] + state_code: "CA" + county: "SIERRA_COUNTY_CA" + h43: + members: ["p43_1"] + state_code: "CA" + county: "RIVERSIDE_COUNTY_CA" + h44: + members: ["p44_1"] + state_code: "CA" + county: "SACRAMENTO_COUNTY_CA" + h45: + members: ["p45_1"] + state_code: "CA" + county: "SUTTER_COUNTY_CA" + h46: + members: ["p46_1"] + state_code: "CA" + county: "YUBA_COUNTY_CA" + h47: + members: ["p47_1"] + state_code: "CA" + county: "SAN_BENITO_COUNTY_CA" + h48: + members: ["p48_1"] + state_code: "CA" + county: "SAN_BERNARDINO_COUNTY_CA" + h49: + members: ["p49_1"] + state_code: "CA" + county: "SAN_JOAQUIN_COUNTY_CA" + h50: + members: ["p50_1"] + state_code: "CA" + county: "SAN_LUIS_OBISPO_COUNTY_CA" + h51: + members: ["p51_1"] + state_code: "CA" + county: "SANTA_BARBARA_COUNTY_CA" + h52: + members: ["p52_1"] + state_code: "CA" + county: "SANTA_CLARA_COUNTY_CA" + h53: + members: ["p53_1"] + state_code: "CA" + county: "SHASTA_COUNTY_CA" + h54: + members: ["p54_1"] + state_code: "CA" + county: "TEHAMA_COUNTY_CA" + h55: + members: ["p55_1"] + state_code: "CA" + county: "SISKIYOU_COUNTY_CA" + h56: + members: ["p56_1"] + state_code: "CA" + county: "STANISLAUS_COUNTY_CA" + h57: + members: ["p57_1"] + state_code: "CA" + county: "TULARE_COUNTY_CA" + h58: + members: ["p58_1"] + state_code: "CA" + county: "VENTURA_COUNTY_CA" + output: + ca_liheap_covered_liquid_heating: [311, 716, 670, 423, 448, 487, 402, 349, 332, 503, 324, 566, 314, 459, 111, 191, 481, 928, 315, 320, 418, 463, 314, 315, 349, 313, 749, 172, 336, 342, 629, 318, 815, 369, 345, 324, 332, 616, 394, 149, 765, 758, 184, 314, 303, 366, 380, 204, 310, 335, 299, 291, 406, 424, 658, 287, 318, 233] + +# ISOLATED CONDITIONAL SCHEDULE ONLY, not a determination of local approval. +# All58 county rows were read from original state-plan pp185–186 and checked +# against the research CSV. Coverage/group1/priority20 are supplied ONLY in +# this isolated table check; one raw qualified adult and source income band +# remain real. Group1 burden adds0 and noVP is present, so the schedule +# equals the published county BBA. Unrecovered local rules are not inferred. +- name: "Case 10, conditional statewide schedule reproduces every county base in income group 4." + period: 2026 + input: + people: + p1_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p2_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p3_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p4_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p5_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p6_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p7_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p8_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p9_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p10_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p11_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p12_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p13_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p14_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p15_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p16_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p17_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p18_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p19_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p20_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p21_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p22_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p23_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p24_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p25_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p26_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p27_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p28_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p29_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p30_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p31_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p32_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p33_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p34_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p35_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p36_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p37_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p38_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p39_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p40_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p41_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p42_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p43_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p44_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p45_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p46_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p47_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p48_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p49_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p50_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p51_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p52_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p53_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p54_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p55_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p56_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p57_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + p58_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + spm_units: + s1: + members: ["p1_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s2: + members: ["p2_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s3: + members: ["p3_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s4: + members: ["p4_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s5: + members: ["p5_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s6: + members: ["p6_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s7: + members: ["p7_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s8: + members: ["p8_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s9: + members: ["p9_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s10: + members: ["p10_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s11: + members: ["p11_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s12: + members: ["p12_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s13: + members: ["p13_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s14: + members: ["p14_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s15: + members: ["p15_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s16: + members: ["p16_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s17: + members: ["p17_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s18: + members: ["p18_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s19: + members: ["p19_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s20: + members: ["p20_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s21: + members: ["p21_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s22: + members: ["p22_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s23: + members: ["p23_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s24: + members: ["p24_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s25: + members: ["p25_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s26: + members: ["p26_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s27: + members: ["p27_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s28: + members: ["p28_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s29: + members: ["p29_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s30: + members: ["p30_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s31: + members: ["p31_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s32: + members: ["p32_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s33: + members: ["p33_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s34: + members: ["p34_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s35: + members: ["p35_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s36: + members: ["p36_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s37: + members: ["p37_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s38: + members: ["p38_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s39: + members: ["p39_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s40: + members: ["p40_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s41: + members: ["p41_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s42: + members: ["p42_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s43: + members: ["p43_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s44: + members: ["p44_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s45: + members: ["p45_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s46: + members: ["p46_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s47: + members: ["p47_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s48: + members: ["p48_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s49: + members: ["p49_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s50: + members: ["p50_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s51: + members: ["p51_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s52: + members: ["p52_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s53: + members: ["p53_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s54: + members: ["p54_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s55: + members: ["p55_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s56: + members: ["p56_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s57: + members: ["p57_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s58: + members: ["p58_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + households: + h1: + members: ["p1_1"] + state_code: "CA" + county: "ALAMEDA_COUNTY_CA" + h2: + members: ["p2_1"] + state_code: "CA" + county: "ALPINE_COUNTY_CA" + h3: + members: ["p3_1"] + state_code: "CA" + county: "EL_DORADO_COUNTY_CA" + h4: + members: ["p4_1"] + state_code: "CA" + county: "AMADOR_COUNTY_CA" + h5: + members: ["p5_1"] + state_code: "CA" + county: "CALAVERAS_COUNTY_CA" + h6: + members: ["p6_1"] + state_code: "CA" + county: "TUOLUMNE_COUNTY_CA" + h7: + members: ["p7_1"] + state_code: "CA" + county: "BUTTE_COUNTY_CA" + h8: + members: ["p8_1"] + state_code: "CA" + county: "COLUSA_COUNTY_CA" + h9: + members: ["p9_1"] + state_code: "CA" + county: "GLENN_COUNTY_CA" + h10: + members: ["p10_1"] + state_code: "CA" + county: "TRINITY_COUNTY_CA" + h11: + members: ["p11_1"] + state_code: "CA" + county: "CONTRA_COSTA_COUNTY_CA" + h12: + members: ["p12_1"] + state_code: "CA" + county: "DEL_NORTE_COUNTY_CA" + h13: + members: ["p13_1"] + state_code: "CA" + county: "FRESNO_COUNTY_CA" + h14: + members: ["p14_1"] + state_code: "CA" + county: "HUMBOLDT_COUNTY_CA" + h15: + members: ["p15_1"] + state_code: "CA" + county: "IMPERIAL_COUNTY_CA" + h16: + members: ["p16_1"] + state_code: "CA" + county: "SAN_DIEGO_COUNTY_CA" + h17: + members: ["p17_1"] + state_code: "CA" + county: "INYO_COUNTY_CA" + h18: + members: ["p18_1"] + state_code: "CA" + county: "MONO_COUNTY_CA" + h19: + members: ["p19_1"] + state_code: "CA" + county: "KERN_COUNTY_CA" + h20: + members: ["p20_1"] + state_code: "CA" + county: "KINGS_COUNTY_CA" + h21: + members: ["p21_1"] + state_code: "CA" + county: "LAKE_COUNTY_CA" + h22: + members: ["p22_1"] + state_code: "CA" + county: "MENDOCINO_COUNTY_CA" + h23: + members: ["p23_1"] + state_code: "CA" + county: "NAPA_COUNTY_CA" + h24: + members: ["p24_1"] + state_code: "CA" + county: "SOLANO_COUNTY_CA" + h25: + members: ["p25_1"] + state_code: "CA" + county: "SONOMA_COUNTY_CA" + h26: + members: ["p26_1"] + state_code: "CA" + county: "YOLO_COUNTY_CA" + h27: + members: ["p27_1"] + state_code: "CA" + county: "LASSEN_COUNTY_CA" + h28: + members: ["p28_1"] + state_code: "CA" + county: "LOS_ANGELES_COUNTY_CA" + h29: + members: ["p29_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h30: + members: ["p30_1"] + state_code: "CA" + county: "MARIN_COUNTY_CA" + h31: + members: ["p31_1"] + state_code: "CA" + county: "MARIPOSA_COUNTY_CA" + h32: + members: ["p32_1"] + state_code: "CA" + county: "MERCED_COUNTY_CA" + h33: + members: ["p33_1"] + state_code: "CA" + county: "MODOC_COUNTY_CA" + h34: + members: ["p34_1"] + state_code: "CA" + county: "MONTEREY_COUNTY_CA" + h35: + members: ["p35_1"] + state_code: "CA" + county: "SAN_FRANCISCO_COUNTY_CA" + h36: + members: ["p36_1"] + state_code: "CA" + county: "SAN_MATEO_COUNTY_CA" + h37: + members: ["p37_1"] + state_code: "CA" + county: "SANTA_CRUZ_COUNTY_CA" + h38: + members: ["p38_1"] + state_code: "CA" + county: "NEVADA_COUNTY_CA" + h39: + members: ["p39_1"] + state_code: "CA" + county: "PLACER_COUNTY_CA" + h40: + members: ["p40_1"] + state_code: "CA" + county: "ORANGE_COUNTY_CA" + h41: + members: ["p41_1"] + state_code: "CA" + county: "PLUMAS_COUNTY_CA" + h42: + members: ["p42_1"] + state_code: "CA" + county: "SIERRA_COUNTY_CA" + h43: + members: ["p43_1"] + state_code: "CA" + county: "RIVERSIDE_COUNTY_CA" + h44: + members: ["p44_1"] + state_code: "CA" + county: "SACRAMENTO_COUNTY_CA" + h45: + members: ["p45_1"] + state_code: "CA" + county: "SUTTER_COUNTY_CA" + h46: + members: ["p46_1"] + state_code: "CA" + county: "YUBA_COUNTY_CA" + h47: + members: ["p47_1"] + state_code: "CA" + county: "SAN_BENITO_COUNTY_CA" + h48: + members: ["p48_1"] + state_code: "CA" + county: "SAN_BERNARDINO_COUNTY_CA" + h49: + members: ["p49_1"] + state_code: "CA" + county: "SAN_JOAQUIN_COUNTY_CA" + h50: + members: ["p50_1"] + state_code: "CA" + county: "SAN_LUIS_OBISPO_COUNTY_CA" + h51: + members: ["p51_1"] + state_code: "CA" + county: "SANTA_BARBARA_COUNTY_CA" + h52: + members: ["p52_1"] + state_code: "CA" + county: "SANTA_CLARA_COUNTY_CA" + h53: + members: ["p53_1"] + state_code: "CA" + county: "SHASTA_COUNTY_CA" + h54: + members: ["p54_1"] + state_code: "CA" + county: "TEHAMA_COUNTY_CA" + h55: + members: ["p55_1"] + state_code: "CA" + county: "SISKIYOU_COUNTY_CA" + h56: + members: ["p56_1"] + state_code: "CA" + county: "STANISLAUS_COUNTY_CA" + h57: + members: ["p57_1"] + state_code: "CA" + county: "TULARE_COUNTY_CA" + h58: + members: ["p58_1"] + state_code: "CA" + county: "VENTURA_COUNTY_CA" + output: + ca_liheap_covered_liquid_heating: [263, 605, 566, 357, 379, 411, 340, 295, 280, 425, 273, 478, 265, 387, 94, 162, 406, 783, 266, 270, 353, 391, 266, 266, 295, 264, 633, 146, 284, 289, 531, 268, 688, 312, 291, 274, 281, 520, 332, 126, 646, 640, 155, 265, 256, 309, 321, 172, 262, 283, 252, 246, 342, 358, 556, 242, 269, 197] + +# ISOLATED CONDITIONAL SCHEDULE ONLY. Original p187 directly prints +# Mono groupIII size1 noVP:928/963/998/1000. The final uncapped amount +# 928+105=1033 is limited to1000. Local Mono approval is not represented. +- name: "Case 11, conditional printed Mono examples verify burden additions and the cap." + period: 2026 + input: + people: + p1_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p2_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p3_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p4_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + spm_units: + s1: + members: ["p1_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 1 + ca_liheap_liquid_priority_points: 20 + s2: + members: ["p2_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 2 + ca_liheap_liquid_priority_points: 20 + s3: + members: ["p3_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 3 + ca_liheap_liquid_priority_points: 20 + s4: + members: ["p4_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 4 + ca_liheap_liquid_priority_points: 20 + households: + h1: + members: ["p1_1"] + state_code: "CA" + county: "MONO_COUNTY_CA" + h2: + members: ["p2_1"] + state_code: "CA" + county: "MONO_COUNTY_CA" + h3: + members: ["p3_1"] + state_code: "CA" + county: "MONO_COUNTY_CA" + h4: + members: ["p4_1"] + state_code: "CA" + county: "MONO_COUNTY_CA" + output: + ca_liheap_covered_liquid_heating: [928, 963, 998, 1000] + +# ISOLATED CONDITIONAL SCHEDULE ONLY. Source p184 puts80000 annual +# in groupIV for each real size5/6/7 and below each SMI limit. P187 prints +# size5 VP group2:783+76+35+105=999; size6 caps783+95+35+105=1018 +# at1000, and size7 retains the size6 increment. Mono approval is not inferred. +- name: "Case 12, conditional printed Mono group four distinguishes 999 from the cap." + period: 2026 + input: + people: + p1_1: {"age": 60, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 80000} + p1_2: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p1_3: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p1_4: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p1_5: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p2_1: {"age": 60, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 80000} + p2_2: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p2_3: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p2_4: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p2_5: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p2_6: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p3_1: {"age": 60, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 80000} + p3_2: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p3_3: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p3_4: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p3_5: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p3_6: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p3_7: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0} + spm_units: + s1: + members: ["p1_1", "p1_2", "p1_3", "p1_4", "p1_5"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 8000 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 2 + ca_liheap_liquid_priority_points: 20 + s2: + members: ["p2_1", "p2_2", "p2_3", "p2_4", "p2_5", "p2_6"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 8000 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 2 + ca_liheap_liquid_priority_points: 20 + s3: + members: ["p3_1", "p3_2", "p3_3", "p3_4", "p3_5", "p3_6", "p3_7"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 8000 + ca_liheap_liquid_heating_covered: true + ca_liheap_energy_burden_group: 2 + ca_liheap_liquid_priority_points: 20 + households: + h1: + members: ["p1_1", "p1_2", "p1_3", "p1_4", "p1_5"] + state_code: "CA" + county: "MONO_COUNTY_CA" + h2: + members: ["p2_1", "p2_2", "p2_3", "p2_4", "p2_5", "p2_6"] + state_code: "CA" + county: "MONO_COUNTY_CA" + h3: + members: ["p3_1", "p3_2", "p3_3", "p3_4", "p3_5", "p3_6", "p3_7"] + state_code: "CA" + county: "MONO_COUNTY_CA" + output: + ca_liheap_covered_liquid_heating: [999, 1000, 1000] + +- name: "Case 13, monthly SSI and SSP and annual CalWORKs count once in the burden denominator." + period: 2026 + # State-plan pp229/234 count CalWORKs and SSI/SSP. All benefit months + # are explicit for every member and SPM unit, avoiding annual-zero conflicts. + # Row1:500*12+100*12+4800=12000. Row2:500*12+6000=12000. + # Row3:6000 annual CalWORKs+6000 wages=12000. Row4:minor SSI + # 500*12+6000 parent wages=12000. Energy2040 gives17 percent in all. + # Elder rows:411+105+105=621; family row:411+19+105=535; + # disabled child row adds the one VP supplement to give640. + input: + people: + elder1: {"age": 65, "is_citizen_or_legal_immigrant": true, "ssi": {"2026-01": 500, "2026-02": 500, "2026-03": 500, "2026-04": 500, "2026-05": 500, "2026-06": 500, "2026-07": 500, "2026-08": 500, "2026-09": 500, "2026-10": 500, "2026-11": 500, "2026-12": 500}, "pension_income": 4800} + elder2: {"age": 65, "is_citizen_or_legal_immigrant": true, "ssi": {"2026-01": 500, "2026-02": 500, "2026-03": 500, "2026-04": 500, "2026-05": 500, "2026-06": 500, "2026-07": 500, "2026-08": 500, "2026-09": 500, "2026-10": 500, "2026-11": 500, "2026-12": 500}, "pension_income": 6000} + parent: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": {"2026-01": 0, "2026-02": 0, "2026-03": 0, "2026-04": 0, "2026-05": 0, "2026-06": 0, "2026-07": 0, "2026-08": 0, "2026-09": 0, "2026-10": 0, "2026-11": 0, "2026-12": 0}, "employment_income": 6000} + child: {"age": 6, "is_citizen_or_legal_immigrant": true, "ssi": {"2026-01": 0, "2026-02": 0, "2026-03": 0, "2026-04": 0, "2026-05": 0, "2026-06": 0, "2026-07": 0, "2026-08": 0, "2026-09": 0, "2026-10": 0, "2026-11": 0, "2026-12": 0}} + worker: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": {"2026-01": 0, "2026-02": 0, "2026-03": 0, "2026-04": 0, "2026-05": 0, "2026-06": 0, "2026-07": 0, "2026-08": 0, "2026-09": 0, "2026-10": 0, "2026-11": 0, "2026-12": 0}, "employment_income": 6000} + disabled_child: {"age": 7, "is_citizen_or_legal_immigrant": true, "ssi": {"2026-01": 500, "2026-02": 500, "2026-03": 500, "2026-04": 500, "2026-05": 500, "2026-06": 500, "2026-07": 500, "2026-08": 500, "2026-09": 500, "2026-10": 500, "2026-11": 500, "2026-12": 500}, "is_disabled": true} + spm_units: + s1: {"members": ["elder1"], "heating_type": "PROPANE", "bottled_gas_expense": 2040, "snap": 0, "ca_tanf": 0, "ca_state_supplement": {"2026-01": 100, "2026-02": 100, "2026-03": 100, "2026-04": 100, "2026-05": 100, "2026-06": 100, "2026-07": 100, "2026-08": 100, "2026-09": 100, "2026-10": 100, "2026-11": 100, "2026-12": 100}} + s2: {"members": ["elder2"], "heating_type": "PROPANE", "bottled_gas_expense": 2040, "snap": 0, "ca_tanf": 0, "ca_state_supplement": {"2026-01": 0, "2026-02": 0, "2026-03": 0, "2026-04": 0, "2026-05": 0, "2026-06": 0, "2026-07": 0, "2026-08": 0, "2026-09": 0, "2026-10": 0, "2026-11": 0, "2026-12": 0}} + s3: {"members": ["parent", "child"], "heating_type": "PROPANE", "bottled_gas_expense": 2040, "snap": 0, "ca_tanf": 6000, "ca_state_supplement": {"2026-01": 0, "2026-02": 0, "2026-03": 0, "2026-04": 0, "2026-05": 0, "2026-06": 0, "2026-07": 0, "2026-08": 0, "2026-09": 0, "2026-10": 0, "2026-11": 0, "2026-12": 0}} + s4: {"members": ["worker", "disabled_child"], "heating_type": "PROPANE", "bottled_gas_expense": 2040, "snap": 0, "ca_tanf": 0, "ca_state_supplement": {"2026-01": 0, "2026-02": 0, "2026-03": 0, "2026-04": 0, "2026-05": 0, "2026-06": 0, "2026-07": 0, "2026-08": 0, "2026-09": 0, "2026-10": 0, "2026-11": 0, "2026-12": 0}} + households: + h1: {"members": ["elder1"], "state_code": "CA", "county": "MADERA_COUNTY_CA"} + h2: {"members": ["elder2"], "state_code": "CA", "county": "MADERA_COUNTY_CA"} + h3: {"members": ["parent", "child"], "state_code": "CA", "county": "MADERA_COUNTY_CA"} + h4: {"members": ["worker", "disabled_child"], "state_code": "CA", "county": "MADERA_COUNTY_CA"} + output: + ca_liheap_countable_income: [12000, 12000, 12000, 12000] + ca_liheap_household_size: [1, 1, 2, 2] + ca_liheap_energy_burden_group: [4, 4, 4, 4] + ca_liheap_liquid_priority_points: [30, 30, 20, 30] + ca_liheap_covered_liquid_heating: [621, 621, 535, 640] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.yaml new file mode 100644 index 00000000000..813f1b81ede --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.yaml @@ -0,0 +1,170 @@ +# https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184,185,186,187,188,193,205,257,279,282,283 +# https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191,233,234 +# FY2026 ordinary liquid component; no discretionary vendor supplement. +# Annual recurring income/costs represent the same application month. + + +# State-plan pp193/205/279: qualified adult, countable-income limit and +# energy responsibility. Heat-in-rent without a separately supplied bill +# retains the existing unsubsidized-housing proxy; subsidized housing needs +# a positive reported charge. The17-year-old is assumed not emancipated. +# No fixture supplies a calculated CA LIHEAP intermediate. +- name: "Case 1, shared income adult and energy responsibility requirements preserve utility behavior." + period: 2026 + input: + people: + p1_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p2_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p3_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p4_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p5_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p6_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p7_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p8_1: {"age": 17, "is_citizen_or_legal_immigrant": true, "ssi": 0, "pension_income": 12000} + p9_1: {"age": 18, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p10_1: {"age": 40, "is_citizen_or_legal_immigrant": false, "ssi": 0, "employment_income": 12000} + p10_2: {"age": 5, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p11_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 60000} + p12_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + spm_units: + s1: + members: ["p1_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + s2: + members: ["p2_1"] + heating_type: "FUEL_OIL" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + fuel_oil_expense: 2040 + s3: + members: ["p3_1"] + heating_type: "NATURAL_GAS" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + gas_expense: 2040 + s4: + members: ["p4_1"] + heating_type: "ELECTRICITY" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + pre_subsidy_electricity_expense: 2040 + s5: + members: ["p5_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 0 + heat_expense_included_in_rent: true + s6: + members: ["p6_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 0 + heat_expense_included_in_rent: true + receives_housing_assistance: true + s7: + members: ["p7_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 120 + heat_expense_included_in_rent: true + receives_housing_assistance: true + s8: + members: ["p8_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + s9: + members: ["p9_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + s10: + members: ["p10_1", "p10_2"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + s11: + members: ["p11_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + s12: + members: ["p12_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + households: + h1: + members: ["p1_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h2: + members: ["p2_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h3: + members: ["p3_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h4: + members: ["p4_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h5: + members: ["p5_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h6: + members: ["p6_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h7: + members: ["p7_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h8: + members: ["p8_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h9: + members: ["p9_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h10: + members: ["p10_1", "p10_2"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h11: + members: ["p11_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h12: + members: ["p12_1"] + state_code: "OR" + county: "MULTNOMAH_COUNTY_OR" + output: + ca_liheap_basic_eligible: [true, true, true, true, true, false, true, false, true, false, false, false] + ca_liheap_utility_eligible: [false, false, true, true, false, false, false, false, false, false, false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_liquid_heating_covered.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_liquid_heating_covered.yaml new file mode 100644 index 00000000000..c50416fc9fd --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_liquid_heating_covered.yaml @@ -0,0 +1,187 @@ +# https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184,185,186,187,188,193,205,257,279,282,283 +# https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191,233,234 +# FY2026 ordinary liquid component; no discretionary vendor supplement. +# Annual recurring income/costs represent the same application month. + + +# Coverage includes Madera propane/oil at zero through100 percent burden. +# Zero income, raw burden above100, negative energy total, other counties, +# other states and other fuels are not supported by this liquid component. +# High income, applicant age17 and zero qualified size can still be covered +# scenarios; later eligibility determines their result. No unsupported row +# is asserted to be legally ineligible. +- name: "Case 1, coverage distinguishes policy gaps from income applicant and priority denials." + period: 2026 + input: + people: + p1_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p2_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p3_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 0} + p4_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p5_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p6_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p7_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p8_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p9_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p10_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p11_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p12_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 60000} + p13_1: {"age": 17, "is_citizen_or_legal_immigrant": true, "ssi": 0, "pension_income": 12000} + p14_1: {"age": 40, "is_citizen_or_legal_immigrant": false, "ssi": 0, "employment_income": 12000} + spm_units: + s1: + members: ["p1_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 0 + s2: + members: ["p2_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 12000 + s3: + members: ["p3_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + s4: + members: ["p4_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 12000.12 + s5: + members: ["p5_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + s6: + members: ["p6_1"] + heating_type: "WOOD" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + wood_expense: 2040 + s7: + members: ["p7_1"] + heating_type: "NATURAL_GAS" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + gas_expense: 2040 + s8: + members: ["p8_1"] + heating_type: "NONE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + s9: + members: ["p9_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + s10: + members: ["p10_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: -12 + s11: + members: ["p11_1"] + heating_type: "FUEL_OIL" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + fuel_oil_expense: 2040 + s12: + members: ["p12_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 10200 + s13: + members: ["p13_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + s14: + members: ["p14_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2040 + households: + h1: + members: ["p1_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h2: + members: ["p2_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h3: + members: ["p3_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h4: + members: ["p4_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h5: + members: ["p5_1"] + state_code: "CA" + county: "FRESNO_COUNTY_CA" + h6: + members: ["p6_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h7: + members: ["p7_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h8: + members: ["p8_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h9: + members: ["p9_1"] + state_code: "OR" + county: "MULTNOMAH_COUNTY_OR" + h10: + members: ["p10_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h11: + members: ["p11_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h12: + members: ["p12_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h13: + members: ["p13_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h14: + members: ["p14_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + output: + ca_liheap_liquid_heating_covered: [true, true, false, false, false, false, false, false, false, false, true, true, true, true] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/ca_liheap_energy_burden_group.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/ca_liheap_energy_burden_group.yaml new file mode 100644 index 00000000000..0a58336b64b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/ca_liheap_energy_burden_group.yaml @@ -0,0 +1,183 @@ +# https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184,185,186,187,188,193,205,257,279,282,283 +# https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191,233,234 +# FY2026 ordinary liquid component; no discretionary vendor supplement. +# Annual recurring income/costs represent the same application month. + + +# Annual income12000 means monthly1000. Costs/120 give percent burdens +# 0,10.929,10.930,13.469,13.470,16.009,16.010,100,100.001. +# Truncate after two percent decimals. Raw burden above100 is unsupported, +# not a legal denial. Annual1311.60 specifically guards float32 boundary storage. +- name: "Case 1, Madera truncation boundaries and the closed one hundred percent endpoint." + period: 2026 + input: + people: + p1_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p2_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p3_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p4_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p5_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p6_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p7_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p8_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p9_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + spm_units: + s1: + members: ["p1_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 0 + s2: + members: ["p2_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1311.48 + s3: + members: ["p3_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1311.6 + s4: + members: ["p4_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1616.28 + s5: + members: ["p5_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1616.4 + s6: + members: ["p6_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1921.08 + s7: + members: ["p7_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1921.2 + s8: + members: ["p8_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 12000 + s9: + members: ["p9_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 12000.12 + households: + h1: + members: ["p1_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h2: + members: ["p2_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h3: + members: ["p3_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h4: + members: ["p4_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h5: + members: ["p5_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h6: + members: ["p6_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h7: + members: ["p7_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h8: + members: ["p8_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h9: + members: ["p9_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + output: + ca_liheap_energy_burden_group: [1, 1, 2, 2, 3, 3, 4, 4, 0] + +# 120+240+360+480+720=1920;1920/12000=16.00 percent, group3. +# The deprecated metered gas value duplicates gas and is excluded. Water/sewer +# are not one of the five energy categories on state-plan p257. +- name: "Case 2, all five energy costs enter once and unrelated expenses do not." + period: 2026 + input: + people: + p1_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + spm_units: + s1: + members: ["p1_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 480 + pre_subsidy_electricity_expense: 120 + gas_expense: 240 + wood_expense: 360 + fuel_oil_expense: 720 + metered_gas_expense: 9000 + water_expense: 9000 + sewage_expense: 9000 + households: + h1: + members: ["p1_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + output: + ca_liheap_energy_burden_group: [3] + +# State-plan pp282–283:45.12+56.36=101.48 monthly, not printed101.51. +# Income1100+250=1350 monthly;101.48/1350=7.517037... percent, +# truncated7.51 in group1. All source monthly amounts are annualized once. +- name: "Case 3, published component bills use the correct sum before truncation." + period: 2026 + input: + people: + p1_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "social_security": 13200, "pension_income": 3000} + spm_units: + s1: + members: ["p1_1"] + heating_type: "NATURAL_GAS" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + gas_expense: 676.32 + pre_subsidy_electricity_expense: 541.44 + households: + h1: + members: ["p1_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + output: + ca_liheap_countable_income: [16200] + ca_liheap_energy_burden_group: [1] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/ca_liheap_liquid_priority_points.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/ca_liheap_liquid_priority_points.yaml new file mode 100644 index 00000000000..da74bd90970 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/ca_liheap_liquid_priority_points.yaml @@ -0,0 +1,244 @@ +# https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184,185,186,187,188,193,205,257,279,282,283 +# https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191,233,234 +# FY2026 ordinary liquid component; no discretionary vendor supplement. +# Annual recurring income/costs represent the same application month. + + +# One-person monthly incomes1000/1500/1800/2500 fall in original p184 +# groups1/2/3/4. Burden12 percent contributes6; income adds10/8/6/4. +- name: "Case 1, all income groups contribute their own priority points." + period: 2026 + input: + people: + p1_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p2_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 18000} + p3_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 21600} + p4_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 30000} + spm_units: + s1: + members: ["p1_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1440.0 + s2: + members: ["p2_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2160.0 + s3: + members: ["p3_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2592.0 + s4: + members: ["p4_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 3600.0 + households: + h1: + members: ["p1_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h2: + members: ["p2_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h3: + members: ["p3_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h4: + members: ["p4_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + output: + ca_liheap_income_group: [1, 2, 3, 4] + ca_liheap_energy_burden_group: [2, 2, 2, 2] + ca_liheap_liquid_priority_points: [16, 14, 12, 10] + +# All rows income group1 and burden group1 give14 base points. Under3 +# gets10+5, ages3 through under6 get10, age6 gets0. Age60 adds10, +# age70 adds10+5; fractional ages5.5 and2.5 remain in their child bands. +- name: "Case 2, child and older adult fractional ages preserve completed-year bands." + period: 2026 + input: + people: + p1_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p1_2: {"age": 2.5, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p2_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p2_2: {"age": 3, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p3_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p3_2: {"age": 5.5, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p4_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p4_2: {"age": 6, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p5_1: {"age": 59.9, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p6_1: {"age": 60, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p7_1: {"age": 69.9, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p8_1: {"age": 70, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + spm_units: + s1: + members: ["p1_1", "p1_2"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + s2: + members: ["p2_1", "p2_2"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + s3: + members: ["p3_1", "p3_2"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + s4: + members: ["p4_1", "p4_2"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + s5: + members: ["p5_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + s6: + members: ["p6_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + s7: + members: ["p7_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + s8: + members: ["p8_1"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + households: + h1: + members: ["p1_1", "p1_2"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h2: + members: ["p2_1", "p2_2"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h3: + members: ["p3_1", "p3_2"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h4: + members: ["p4_1", "p4_2"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h5: + members: ["p5_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h6: + members: ["p6_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h7: + members: ["p7_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h8: + members: ["p8_1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + output: + ca_liheap_liquid_priority_points: [29, 24, 24, 14, 14, 24, 24, 29] + +# Income10+burden4+young-child10+under3child5+elderly10+age70plus5 +# +disability10=54. Two elders, two young children and two disabled people +# do not duplicate category points; demographic addition is the maximum40. +- name: "Case 3, overlapping vulnerability categories count once each." + period: 2026 + input: + people: + p1_1: {"age": 70, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000, "is_disabled": true} + p1_2: {"age": 75, "is_citizen_or_legal_immigrant": true, "ssi": 0, "is_disabled": true} + p1_3: {"age": 2.5, "is_citizen_or_legal_immigrant": true, "ssi": 0} + p1_4: {"age": 1, "is_citizen_or_legal_immigrant": true, "ssi": 0} + spm_units: + s1: + members: ["p1_1", "p1_2", "p1_3", "p1_4"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + households: + h1: + members: ["p1_1", "p1_2", "p1_3", "p1_4"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + output: + ca_liheap_liquid_priority_points: [54] + +# Madera p191 awards disability points for a household member without an +# adult or citizenship restriction; the size rule separately excludes the +# nonqualified member. Income10+burden4+disability10=24 in each household. +- name: "Case 4, child and nonqualified household disability still identify vulnerability." + period: 2026 + input: + people: + p1_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p1_2: {"age": 10, "is_citizen_or_legal_immigrant": true, "ssi": 0, "is_disabled": true} + p2_1: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12000} + p2_2: {"age": 40, "is_citizen_or_legal_immigrant": false, "ssi": 0, "is_disabled": true} + spm_units: + s1: + members: ["p1_1", "p1_2"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + s2: + members: ["p2_1", "p2_2"] + heating_type: "PROPANE" + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 1200 + households: + h1: + members: ["p1_1", "p1_2"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + h2: + members: ["p2_1", "p2_2"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + output: + ca_liheap_household_size: [2, 1] + ca_liheap_liquid_priority_points: [24, 24] diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.py b/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.py new file mode 100644 index 00000000000..42415ef1280 --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.py @@ -0,0 +1,54 @@ +from policyengine_us.model_api import * + + +class ca_liheap_covered_liquid_heating(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = ( + "California LIHEAP covered ordinary liquid heating component (check coverage)" + ) + defined_for = "ca_liheap_liquid_heating_covered" + reference = ( + "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=10,185,186,187,188", + "https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191,233,234", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ca.csd.liheap + county = spm_unit.household("county_str", period) + supported_county = np.isin(county, list(p.payment.liquid_base_amount)) + # defined_for masks after calculation; unrelated county keys must + # still be safe to look up in mixed-state populations. + safe_county = where( + supported_county, county, next(iter(p.payment.liquid_base_amount)) + ) + income_group = max_(spm_unit("ca_liheap_income_group", period), 1) + burden_group = max_(spm_unit("ca_liheap_energy_burden_group", period), 1) + base = p.payment.liquid_base_amount[safe_county][income_group] + size = spm_unit("ca_liheap_household_size", period) + extra_people = clip(size - 1, 0, p.payment.maximum_payment_household_size - 1) + age = spm_unit.members("age", period) + vulnerable = ( + (p.local.madera.child_points.calc(spm_unit.min(age)) > 0) + | (p.local.madera.elderly_points.calc(spm_unit.max(age)) > 0) + | (add(spm_unit, period, ["is_disabled"]) > 0) + ) + amount = ( + base + + p.payment.additional_person_amount * extra_people + + p.payment.liquid_burden_addition[burden_group] + + p.payment.liquid_vulnerable_amount * vulnerable + ) + eligible = spm_unit("ca_liheap_basic_eligible", period) & ( + spm_unit("ca_liheap_liquid_priority_points", period) + >= p.local.madera.minimum_points + ) + # Ordinary schedule only: no discretionary vendor-service supplement. + # A zero with coverage=False is unsupported, not an entitlement denial. + return where( + eligible & supported_county, + min_(amount, p.payment.liquid_maximum), + 0, + ) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.py b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.py new file mode 100644 index 00000000000..c3add7f897d --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class ca_liheap_basic_eligible(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "California LIHEAP common household eligibility" + defined_for = StateCode.CA + reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=9,193,202,203,205,219,279" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ca.csd.liheap.eligibility + person = spm_unit.members + qualified_adult = person("is_citizen_or_legal_immigrant", period) & ( + person("age", period) >= p.applicant_min_age + ) + expense = spm_unit("heating_expense", period) + heat_in_rent = spm_unit("heat_expense_included_in_rent", period) + subsidized = spm_unit("receives_housing_assistance", period) + # Unsubsidized heat-in-rent is an energy-responsibility proxy; a + # separately reported charge also permits subsidized households. + energy_cost = (expense > 0) | (heat_in_rent & ~subsidized) + return ( + energy_cost + & (spm_unit.sum(qualified_adult) > 0) + & spm_unit("ca_liheap_income_eligible", period) + ) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_liquid_heating_covered.py b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_liquid_heating_covered.py new file mode 100644 index 00000000000..b07cffdd44f --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_liquid_heating_covered.py @@ -0,0 +1,21 @@ +from policyengine_us.model_api import * + + +class ca_liheap_liquid_heating_covered(Variable): + value_type = bool + entity = SPMUnit + definition_period = YEAR + label = "California LIHEAP ordinary liquid heating policy coverage, not eligibility" + defined_for = StateCode.CA + reference = ( + "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=185,186,187,188", + "https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191,233,234", + ) + + def formula(spm_unit, period, parameters): + heating_type = spm_unit("heating_type", period) + types = heating_type.possible_values + liquid_heat = (heating_type == types.PROPANE) | (heating_type == types.FUEL_OIL) + # Currently Madera only. A false result means the ordinary liquid + # component is unsupported, including zero-income and over-100% burden. + return liquid_heat & (spm_unit("ca_liheap_energy_burden_group", period) > 0) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.py b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.py index 91f4414cf0d..ef0a4c7617b 100644 --- a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.py +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.py @@ -10,25 +10,9 @@ class ca_liheap_utility_eligible(Variable): reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=9,182,183,184,193,202,203,205,219,279" def formula(spm_unit, period, parameters): - p = parameters(period).gov.states.ca.csd.liheap.eligibility - person = spm_unit.members - qualified_adult = person("is_citizen_or_legal_immigrant", period) & ( - person("age", period) >= p.applicant_min_age - ) heating_type = spm_unit("heating_type", period) types = heating_type.possible_values utility_heat = (heating_type == types.ELECTRICITY) | ( heating_type == types.NATURAL_GAS ) - expense = spm_unit("heating_expense", period) - heat_in_rent = spm_unit("heat_expense_included_in_rent", period) - subsidized = spm_unit("receives_housing_assistance", period) - # Unsubsidized heat-in-rent is an energy-responsibility proxy; a - # separately reported charge also permits subsidized households. - energy_cost = (expense > 0) | (heat_in_rent & ~subsidized) - return ( - utility_heat - & energy_cost - & (spm_unit.sum(qualified_adult) > 0) - & spm_unit("ca_liheap_income_eligible", period) - ) + return utility_heat & spm_unit("ca_liheap_basic_eligible", period) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_energy_burden_group.py b/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_energy_burden_group.py new file mode 100644 index 00000000000..0892838e2e4 --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_energy_burden_group.py @@ -0,0 +1,39 @@ +from policyengine_us.model_api import * + + +class ca_liheap_energy_burden_group(Variable): + value_type = int + entity = SPMUnit + definition_period = YEAR + label = ( + "California LIHEAP supported local energy burden group (zero is unsupported)" + ) + defined_for = StateCode.CA + reference = ( + "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=257,282,283", + "https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ca.csd.liheap + local = p.local.madera + cent = p.income.monthly_rounding_increment + # Annual flows approximate a representative month. Restore each + # monetary input's cents before truncating the percentage to basis points. + cost_cents = sum( + np.rint(spm_unit(source, period).astype(float) / cent).astype(np.int64) + for source in p.energy_burden.expense_sources + ) + income = spm_unit("ca_liheap_countable_income", period) + income_cents = np.rint(income.astype(float) / cent).astype(np.int64) + scale = int(np.rint(1 / p.energy_burden.rounding_increment)) + burden = np.floor_divide(cost_cents * scale, max_(income_cents, 1)) + county = spm_unit.household("county_str", period) + supported = ( + np.isin(county, local.counties) + & (income_cents > 0) + & (cost_cents >= 0) + & (cost_cents <= income_cents * local.maximum_energy_burden) + ) + # Zero denotes missing policy coverage, not a first group or denial. + return where(supported, local.energy_burden_group.calc(burden), 0) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_liquid_priority_points.py b/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_liquid_priority_points.py new file mode 100644 index 00000000000..f5e8d3e1ac8 --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_liquid_priority_points.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class ca_liheap_liquid_priority_points(Variable): + value_type = int + entity = SPMUnit + definition_period = YEAR + label = "California LIHEAP priority points within supported liquid heating coverage" + defined_for = "ca_liheap_liquid_heating_covered" + reference = "https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=189,191,233,234" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ca.csd.liheap.local.madera + income_group = max_(spm_unit("ca_liheap_income_group", period), 1) + burden_group = max_(spm_unit("ca_liheap_energy_burden_group", period), 1) + age = spm_unit.members("age", period) + # Categories apply once each to all members, including nonqualified + # members. The two age scales include the overlapping age bonuses. + child_points = p.child_points.calc(spm_unit.min(age)) + elderly_points = p.elderly_points.calc(spm_unit.max(age)) + disabled = add(spm_unit, period, ["is_disabled"]) > 0 + return ( + p.income_points[income_group] + + p.burden_points[burden_group] + + child_points + + elderly_points + + disabled * p.disability_points + ) From f56f8789f52c059398b3da224d9c4f0790a9ee1e Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 6 Oct 2026 15:49:12 -0400 Subject: [PATCH 3/6] Add California LIHEAP approved wood delivery benefit --- changelog.d/ca-liheap-wave2c.added.md | 2 +- .../gov/states/ca/csd/liheap/README.md | 48 +++- .../ca/csd/liheap/payment/liquid_maximum.yaml | 11 - .../ca/csd/liheap/payment/wpo_maximum.yaml | 11 + policyengine_us/programs.yaml | 2 +- .../ca/csd/liheap/ca_liheap_wood_heating.yaml | 253 ++++++++++++++++++ .../eligibility/ca_liheap_basic_eligible.yaml | 80 ++++++ .../ca_liheap_covered_liquid_heating.py | 7 +- .../ca/csd/liheap/ca_liheap_wood_heating.py | 24 ++ .../eligibility/ca_liheap_basic_eligible.py | 9 +- .../ca_liheap_approved_wood_delivery_cost.py | 22 ++ 11 files changed, 442 insertions(+), 27 deletions(-) delete mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_maximum.yaml create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/payment/wpo_maximum.yaml create mode 100644 policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_wood_heating.yaml create mode 100644 policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_wood_heating.py create mode 100644 policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_approved_wood_delivery_cost.py diff --git a/changelog.d/ca-liheap-wave2c.added.md b/changelog.d/ca-liheap-wave2c.added.md index f4dc27d3412..e999538c8f5 100644 --- a/changelog.d/ca-liheap-wave2c.added.md +++ b/changelog.d/ca-liheap-wave2c.added.md @@ -1 +1 @@ -Add California FY2026 regular gas and electric utility HEAP and the ordinary Madera propane/fuel-oil component, reusing household and income calculations with explicit model coverage; wood and other liquid-fuel areas remain incomplete. +Add California LIHEAP regular utility heating schedules, a covered Madera propane/fuel-oil calculation, and ordinary wood assistance using an approved eligible-delivery cost. diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/README.md b/policyengine_us/parameters/gov/states/ca/csd/liheap/README.md index 00be16cab4f..c216b082b44 100644 --- a/policyengine_us/parameters/gov/states/ca/csd/liheap/README.md +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/README.md @@ -9,12 +9,41 @@ verified coverage. FY2027 evidence acquired during research was a draft. `ca_liheap_covered_liquid_heating` also estimates the ordinary propane/fuel-oil component where local burden and priority rules have been verified: currently Madera County. The statewide liquid base table is encoded, but that alone does -not establish coverage in other counties. Wood remains unimplemented pending -approved local quantity prices and county heating-degree-day classification. -Neither output is a total California LIHEAP award; no generic `ca_liheap` final -award is provided. Solar, coal, OTHER and UNSPECIFIED fuels have no supported +not establish coverage in other counties. `ca_liheap_wood_heating` estimates the +ordinary wood component throughout California when an approved eligible-delivery +cost is supplied. No output is a total California LIHEAP award; no generic +`ca_liheap` final award is provided. Solar, coal, OTHER and UNSPECIFIED fuels have no supported utility-table crosswalk, and kerosene is not assigned a statewide liquid rule. +## Approved wood delivery + +`ca_liheap_approved_wood_delivery_cost` is the approved cost of the eligible +ordinary wood, wood-pellet or manufactured-log delivery for the modeled program +year, before the ordinary benefit cap. Enter one program-year delivery amount, +not annual historical wood spending or an unrestricted vendor quotation. It +excludes any separately approved discretionary vendor-service supplement. + +The approved amount already reflects the allowed quantity, fuel form, climate, +storage limits, reasonable pricing and administrative prioritization. Those +facts are supplied through the approved cost; the model does not independently +recalculate them. Company and agency identities are not distinguished. No cords, +provider, agency, heating-degree-day or storage inputs are required. + +`ca_liheap_wood_heating` applies the shared income and qualified-adult checks, +requires primary `heating_type = WOOD`, and pays the nonnegative approved cost +up to the ordinary $1,000 WPO maximum. A positive approved cost establishes +heating-cost responsibility even if no past wood expense is reported. It does +not bypass the modeled income or qualified-adult requirements, and a wood quote +does not establish responsibility for a different primary heating fuel. + +The input defaults to zero. Without a supplied approved cost the modeled wood +component is zero; this does not establish that the household is legally +ineligible. `wood_expense` alone does not produce a wood award. Neither the +quote nor the award is added to historical heating/utility expenses or the +energy-burden numerator. The wood component is not added to household benefit +aggregates. As with the other components, FY2026 is verified; earlier-year +backfills are unverified historical estimates. + ## Liquid component coverage and interpretation Always read `ca_liheap_liquid_heating_covered` alongside @@ -30,7 +59,8 @@ Coverage requires propane or fuel-oil heating in Madera, positive countable income, and an energy-cost/income ratio from zero through 100%. Zero-income and above-100% burden assignments remain unresolved in the acquired local plan and are expressly outside calculation coverage. Other counties and wood are also -outside this component's coverage. The component is not added to household +outside the liquid component's coverage; the approved-cost wood component has +its own statewide calculation. The component is not added to household benefit aggregates or substituted for the existing utility registry output. The liquid schedule uses county/income-group base amounts, the shared $19 @@ -58,7 +88,7 @@ The local plan has board-adoption evidence; a separate state approval letter was not recovered. `ca_liheap_basic_eligible` shares the existing qualified-adult, income and -energy-responsibility checks between utility and liquid calculations. It does +energy-responsibility checks across utility, liquid and approved wood calculations. It does not itself determine local priority or fuel eligibility. The existing utility schedule and its documented limitations are preserved. @@ -142,9 +172,9 @@ gains and in-kind assistance are omitted under the source exclusions. ## References -- [CSD final FY2026 LIHEAP State Plan](https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=6,7,9,182,183,184,185,186,187,188,193,196,202,203,205,217,218,219,229,230,231,232,233,234,235,236,237,238,239,240,243,244,245,246,247,248,249,250,257,279,282,283,363,364): utility/liquid matrices, energy-burden precision, eligibility guide and remaining wood rules. +- [CSD final FY2026 LIHEAP State Plan #page 6,7,9,10,182,183,184,185,186,187,188,193,196,202,203,205,217,218,219,229,230,231,232,233,234,235,236,237,238,239,240,243,244,245,246,247,248,249,250,257,279,282,283,363,364](https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=10): utility/liquid matrices, ordinary WPO cap, wood quantity/pricing, eligibility guide and approved vendor payments. - [CSD FY2026 income eligibility webpage](https://www.csd.ca.gov/Pages/LIHEAP-Income-Eligibility.aspx): larger-household rounding conflict. - [CSD publication index](https://www.csd.ca.gov/Pages/LIHEAPProgram.aspx): final FY2026 and draft FY2027 status, checked October 3, 2026. -- [Madera FY2026 local plan, October 9, 2025 board packet](https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191,233,234): local burden bands, priority points and minimum. -- [Madera November 13, 2025 board packet](https://maderacap.org/wp-content/uploads/2025/11/Agenda-and-Board-Packet-November-13-2025.pdf#page=4,6): October 9 minutes, consent-calendar approval including item D17. +- [Madera FY2026 local plan, October 9, 2025 board packet #page 191,233,234](https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191): local burden bands, priority points and minimum. +- [Madera November 13, 2025 board packet #page 4,6](https://maderacap.org/wp-content/uploads/2025/11/Agenda-and-Board-Packet-November-13-2025.pdf#page=4): October 9 minutes, consent-calendar approval including item D17. diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_maximum.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_maximum.yaml deleted file mode 100644 index 95624faaf2d..00000000000 --- a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_maximum.yaml +++ /dev/null @@ -1,11 +0,0 @@ -description: California caps the ordinary liquid heating schedule at this amount before any discretionary vendor-service supplement under the Low Income Home Energy Assistance Program. -values: - 2025-10-01: 1_000 - -metadata: - unit: currency-USD - period: year - label: California LIHEAP ordinary liquid heating maximum - reference: - - title: California FY2026 LIHEAP State Plan - href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=10,187,188 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/wpo_maximum.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/wpo_maximum.yaml new file mode 100644 index 00000000000..9bf2952086c --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/wpo_maximum.yaml @@ -0,0 +1,11 @@ +description: California caps ordinary wood, propane, and oil heating assistance at this amount before any discretionary vendor-service supplement under the Low Income Home Energy Assistance Program. +values: + 2025-10-01: 1_000 + +metadata: + unit: currency-USD + period: year + label: California LIHEAP ordinary wood, propane, and oil heating maximum + reference: + - title: "California FY2026 LIHEAP State Plan #page 10,187,188" + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=10 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 273ef9fdbb4..df84d6d9889 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -853,7 +853,7 @@ programs: variable: ca_liheap_utility_heating parameter_prefix: gov.states.ca.csd.liheap verified_years: "2026" - notes: FY2026 regular gas and electric utility heating, plus a separate ordinary propane/fuel-oil component for Madera using verified local burden and priority rules. Read ca_liheap_liquid_heating_covered with ca_liheap_covered_liquid_heating; an uncovered component zero is not a denial. Wood, other liquid-fuel service areas, zero-income or above-100% burden assignments and conditional vendor-service supplements remain incomplete. Annual inputs approximate application-month circumstances and SPM units approximate energy households; local priorities, detailed income exclusions and allowable medical-premium composition are not fully represented. Earlier backfills are unverified historical estimates. Crisis, cooling, weatherization and equipment are outside scope. + notes: FY2026 regular gas and electric utility heating, a separate ordinary propane/fuel-oil component for Madera using verified local burden and priority rules, and an ordinary wood component through ca_liheap_wood_heating using ca_liheap_approved_wood_delivery_cost statewide. Read ca_liheap_liquid_heating_covered with ca_liheap_covered_liquid_heating; an uncovered component zero is not a denial. The approved wood cost supplies allowed quantity, pricing, climate, storage and administrative approval facts; zero without that input is not an eligibility determination. No company or agency selectors are modeled. Other liquid-fuel service areas and zero-income or above-100% liquid burden assignments are outside current calculation coverage; conditional vendor-service supplements remain unmodeled. Annual inputs approximate application-month circumstances and SPM units approximate energy households; local priorities, detailed income exclusions and allowable medical-premium composition are not fully represented. Earlier backfills are unverified historical estimates. Crisis, cooling, weatherization and equipment are outside scope. # --- SSA programs --- - id: ssi diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_wood_heating.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_wood_heating.yaml new file mode 100644 index 00000000000..81e102cb9ad --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_wood_heating.yaml @@ -0,0 +1,253 @@ +# California FY2026 State Plan, physical pages 10,188,193,202,203,205,363,364. +# https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=188 +# The approved quote already reflects eligible quantity, form, climate, storage +# and prioritization. These tests supply no provider, agency or cords selector. +# One ordinary annual award is capped at $1,000; no discretionary supplement. + +# REQ-001/002/005: Fresno demonstrates that wood is not limited to Madera. +# Existing wood spending establishes responsibility for all seven households. +# Omitted and zero quotes both yield zero modeled benefit, not legal denial. +- name: Case 1, approved wood delivery is bounded by zero and the ordinary WPO maximum. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + person2: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + person3: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + person4: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + person5: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + person6: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + person7: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + spm_units: + spm_unit1: + members: [person1] + heating_type: WOOD + wood_expense: 120 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: WOOD + wood_expense: 120 + ca_liheap_approved_wood_delivery_cost: 0 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3] + heating_type: WOOD + wood_expense: 120 + ca_liheap_approved_wood_delivery_cost: -25 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person4] + heating_type: WOOD + wood_expense: 120 + ca_liheap_approved_wood_delivery_cost: 750.25 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person5] + heating_type: WOOD + wood_expense: 120 + ca_liheap_approved_wood_delivery_cost: 999.99 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit6: + members: [person6] + heating_type: WOOD + wood_expense: 120 + ca_liheap_approved_wood_delivery_cost: 1_000 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit7: + members: [person7] + heating_type: WOOD + wood_expense: 120 + ca_liheap_approved_wood_delivery_cost: 1_400 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: {members: [person1], state_code: CA, county: FRESNO_COUNTY_CA} + household2: {members: [person2], state_code: CA, county: FRESNO_COUNTY_CA} + household3: {members: [person3], state_code: CA, county: FRESNO_COUNTY_CA} + household4: {members: [person4], state_code: CA, county: FRESNO_COUNTY_CA} + household5: {members: [person5], state_code: CA, county: FRESNO_COUNTY_CA} + household6: {members: [person6], state_code: CA, county: FRESNO_COUNTY_CA} + household7: {members: [person7], state_code: CA, county: FRESNO_COUNTY_CA} + output: + ca_liheap_approved_wood_delivery_cost: [0, 0, -25, 750.25, 999.99, 1_000, 1_400] + ca_liheap_wood_heating: [0, 0, 0, 750.25, 999.99, 1_000, 1_000] + heating_expense: [120, 120, 120, 120, 120, 120, 120] + +# REQ-001/003/004: an approved delivery establishes responsibility before any +# prior wood purchase, including at zero income. Historic spending remains a +# separate input. At $12,000 income, $1,200 is burden group 1 and $2,400 group 4; +# adding the $600 quote to the second household's expense would change its band. +- name: Case 2, approved wood cost is independent of historical spending and liquid coverage. + period: 2026 + input: + people: + person1: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 0, ssi: 0} + person2: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + person3: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + spm_units: + spm_unit1: + members: [person1] + heating_type: WOOD + ca_liheap_approved_wood_delivery_cost: 600 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: WOOD + wood_expense: 1_200 + ca_liheap_approved_wood_delivery_cost: 600 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3] + heating_type: WOOD + wood_expense: 2_400 + ca_liheap_approved_wood_delivery_cost: 600 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: {members: [person1], state_code: CA, county: MADERA_COUNTY_CA} + household2: {members: [person2], state_code: CA, county: MADERA_COUNTY_CA} + household3: {members: [person3], state_code: CA, county: MADERA_COUNTY_CA} + output: + ca_liheap_basic_eligible: [true, true, true] + ca_liheap_countable_income: [0, 12_000, 12_000] + wood_expense: [0, 1_200, 2_400] + heating_expense: [0, 1_200, 2_400] + ca_liheap_energy_burden_group: [0, 1, 4] + ca_liheap_liquid_heating_covered: [false, false, false] + ca_liheap_wood_heating: [600, 600, 600] + +# REQ-003/004/005: a quote cannot cause cross-state or cross-fuel payments. +# The propane household retains the sourced Madera ordinary amount $411+$105 +# and its original $2,040 bill even when an unrelated wood quote is supplied. +- name: Case 3, mixed states and primary fuels receive only their applicable component. + period: 2026 + input: + people: + person1: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + person2: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + person3: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + person4: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + spm_units: + spm_unit1: + members: [person1] + heating_type: WOOD + ca_liheap_approved_wood_delivery_cost: 600 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: WOOD + ca_liheap_approved_wood_delivery_cost: 600 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3] + heating_type: PROPANE + bottled_gas_expense: 2_040 + ca_liheap_approved_wood_delivery_cost: 600 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person4] + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 2_040 + ca_liheap_approved_wood_delivery_cost: 600 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: {members: [person1], state_code: CA, county: FRESNO_COUNTY_CA} + household2: {members: [person2], state_code: OR, county: MULTNOMAH_COUNTY_OR} + household3: {members: [person3], state_code: CA, county: MADERA_COUNTY_CA} + household4: {members: [person4], state_code: CA, county: MADERA_COUNTY_CA} + output: + ca_liheap_basic_eligible: [true, false, true, true] + ca_liheap_utility_eligible: [false, false, false, true] + heating_expense: [0, 0, 2_040, 2_040] + ca_liheap_wood_heating: [600, 0, 0, 0] + ca_liheap_covered_liquid_heating: [0, 0, 516, 0] + +# REQ-003: approval does not override the modeled income or qualified-adult +# gates. A nonqualified adult with a qualified child still lacks an applicant; +# age 17 is not assumed emancipated, whereas age 18 meets the applicant gate. +# The final household is income eligible through actual SNAP receipt, not its +# approved quote: categorical eligibility remains the existing separate rule. +- name: Case 4, approved wood delivery preserves income adult and categorical eligibility rules. + period: 2026 + input: + people: + person1: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 60_000, ssi: 0} + person2: {age: 40, is_citizen_or_legal_immigrant: false, employment_income: 12_000, ssi: 0} + person3: {age: 5, is_citizen_or_legal_immigrant: true, ssi: 0} + person4: {age: 17, is_citizen_or_legal_immigrant: true, pension_income: 12_000, ssi: 0} + person5: {age: 18, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + person6: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 60_000, ssi: 0} + spm_units: + spm_unit1: + members: [person1] + heating_type: WOOD + ca_liheap_approved_wood_delivery_cost: 600 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2, person3] + heating_type: WOOD + ca_liheap_approved_wood_delivery_cost: 600 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person4] + heating_type: WOOD + ca_liheap_approved_wood_delivery_cost: 600 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person5] + heating_type: WOOD + ca_liheap_approved_wood_delivery_cost: 600 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person6] + heating_type: WOOD + ca_liheap_approved_wood_delivery_cost: 600 + snap: 120 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: {members: [person1], state_code: CA, county: FRESNO_COUNTY_CA} + household2: {members: [person2, person3], state_code: CA, county: FRESNO_COUNTY_CA} + household3: {members: [person4], state_code: CA, county: FRESNO_COUNTY_CA} + household4: {members: [person5], state_code: CA, county: FRESNO_COUNTY_CA} + household5: {members: [person6], state_code: CA, county: FRESNO_COUNTY_CA} + output: + ca_liheap_income_eligible: [false, true, true, true, true] + ca_liheap_basic_eligible: [false, false, false, true, true] + ca_liheap_wood_heating: [0, 0, 0, 600, 600] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.yaml index 813f1b81ede..a7c8981681d 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.yaml @@ -168,3 +168,83 @@ output: ca_liheap_basic_eligible: [true, true, true, true, true, false, true, false, true, false, false, false] ca_liheap_utility_eligible: [false, false, true, true, false, false, false, false, false, false, false, false] + +# REQ-003/004: only a positive approved WOOD delivery creates responsibility +# in the absence of existing bills or qualifying heat-in-rent. The first home +# is subsidized but has its own approved wood cost. Quotes cannot create +# responsibility for another primary fuel, including unknown or absent heat. +- name: Case 2, approved wood delivery establishes energy responsibility only for wood. + period: 2026 + input: + people: + person1: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + person2: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + person3: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + person4: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + person5: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + person6: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + person7: {age: 40, is_citizen_or_legal_immigrant: true, employment_income: 12_000, ssi: 0} + spm_units: + spm_unit1: + members: [person1] + heating_type: WOOD + receives_housing_assistance: true + ca_liheap_approved_wood_delivery_cost: 600 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: WOOD + ca_liheap_approved_wood_delivery_cost: 0 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3] + heating_type: WOOD + ca_liheap_approved_wood_delivery_cost: -25 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person4] + heating_type: ELECTRICITY + ca_liheap_approved_wood_delivery_cost: 600 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person5] + heating_type: PROPANE + ca_liheap_approved_wood_delivery_cost: 600 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit6: + members: [person6] + heating_type: UNSPECIFIED + ca_liheap_approved_wood_delivery_cost: 600 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + spm_unit7: + members: [person7] + heating_type: NONE + ca_liheap_approved_wood_delivery_cost: 600 + snap: 0 + ca_tanf: 0 + ca_state_supplement: 0 + households: + household1: {members: [person1], state_code: CA, county: FRESNO_COUNTY_CA} + household2: {members: [person2], state_code: CA, county: FRESNO_COUNTY_CA} + household3: {members: [person3], state_code: CA, county: FRESNO_COUNTY_CA} + household4: {members: [person4], state_code: CA, county: FRESNO_COUNTY_CA} + household5: {members: [person5], state_code: CA, county: FRESNO_COUNTY_CA} + household6: {members: [person6], state_code: CA, county: FRESNO_COUNTY_CA} + household7: {members: [person7], state_code: CA, county: FRESNO_COUNTY_CA} + output: + ca_liheap_basic_eligible: [true, false, false, false, false, false, false] + ca_liheap_utility_eligible: [false, false, false, false, false, false, false] + heating_expense: [0, 0, 0, 0, 0, 0, 0] + ca_liheap_wood_heating: [600, 0, 0, 0, 0, 0, 0] diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.py b/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.py index 42415ef1280..7ac9cc9e298 100644 --- a/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.py +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.py @@ -10,9 +10,10 @@ class ca_liheap_covered_liquid_heating(Variable): "California LIHEAP covered ordinary liquid heating component (check coverage)" ) defined_for = "ca_liheap_liquid_heating_covered" + # State plan pages 10 and 185-188; Madera plan pages 191 and 233-234. reference = ( - "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=10,185,186,187,188", - "https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191,233,234", + "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=185", + "https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191", ) def formula(spm_unit, period, parameters): @@ -49,6 +50,6 @@ def formula(spm_unit, period, parameters): # A zero with coverage=False is unsupported, not an entitlement denial. return where( eligible & supported_county, - min_(amount, p.payment.liquid_maximum), + min_(amount, p.payment.wpo_maximum), 0, ) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_wood_heating.py b/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_wood_heating.py new file mode 100644 index 00000000000..b326b605fe2 --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_wood_heating.py @@ -0,0 +1,24 @@ +from policyengine_us.model_api import * + + +class ca_liheap_wood_heating(Variable): + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + label = ( + "California LIHEAP ordinary wood heating component with approved delivery cost" + ) + defined_for = "ca_liheap_basic_eligible" + # The ordinary WPO cap is on page 10; wood quantities and pricing on page 188. + reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=188" + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ca.csd.liheap.payment + heating_type = spm_unit("heating_type", period) + approved_cost = spm_unit("ca_liheap_approved_wood_delivery_cost", period) + return where( + heating_type == heating_type.possible_values.WOOD, + clip(approved_cost, 0, p.wpo_maximum), + 0, + ) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.py b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.py index c3add7f897d..714f8669336 100644 --- a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.py +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.py @@ -7,7 +7,8 @@ class ca_liheap_basic_eligible(Variable): definition_period = YEAR label = "California LIHEAP common household eligibility" defined_for = StateCode.CA - reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=9,193,202,203,205,219,279" + # Eligibility details: pages 9, 193, 202-203, 205, 219, and 279. + reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=193" def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ca.csd.liheap.eligibility @@ -18,9 +19,13 @@ def formula(spm_unit, period, parameters): expense = spm_unit("heating_expense", period) heat_in_rent = spm_unit("heat_expense_included_in_rent", period) subsidized = spm_unit("receives_housing_assistance", period) + heating_type = spm_unit("heating_type", period) + approved_wood_cost = (heating_type == heating_type.possible_values.WOOD) & ( + spm_unit("ca_liheap_approved_wood_delivery_cost", period) > 0 + ) # Unsubsidized heat-in-rent is an energy-responsibility proxy; a # separately reported charge also permits subsidized households. - energy_cost = (expense > 0) | (heat_in_rent & ~subsidized) + energy_cost = (expense > 0) | (heat_in_rent & ~subsidized) | approved_wood_cost return ( energy_cost & (spm_unit.sum(qualified_adult) > 0) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_approved_wood_delivery_cost.py b/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_approved_wood_delivery_cost.py new file mode 100644 index 00000000000..0abe765fc2c --- /dev/null +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_approved_wood_delivery_cost.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class ca_liheap_approved_wood_delivery_cost(Variable): + """Approved ordinary delivery cost for the modeled program year. + + Approval incorporates eligible quantity, wood form, climate, storage, and + administrative prioritization. The amount precedes the ordinary benefit cap, + excludes discretionary supplements, and does not replace income or qualified + adult eligibility. It is not historical annual wood spending. A zero default + does not establish legal ineligibility or resolve an unknown delivery cost. + """ + + value_type = float + entity = SPMUnit + definition_period = YEAR + unit = USD + default_value = 0 + label = "California LIHEAP approved eligible wood delivery cost" + defined_for = StateCode.CA + # Quantity and pricing: page 188; approved vendor payments: pages 363-364. + reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=188" From d089e20fdfec8e4e2fff219d0a0d0486eef70540 Mon Sep 17 00:00:00 2001 From: Ziming Date: Mon, 2 Nov 2026 11:53:54 -0500 Subject: [PATCH 4/6] Apply Wave 2C sweep and review fixes Co-Authored-By: Claude Opus 5.5 --- .../gov/states/ca/csd/liheap/README.md | 195 ------------------ .../eligibility/utility_heating_fuels.yaml | 16 ++ .../income/smi_annual_rounding_increment.yaml | 12 -- .../income/smi_rounding_size_limit.yaml | 2 +- .../csd/liheap/income/unearned_sources.yaml | 7 +- .../ca/csd/liheap/payment/wpo_maximum.yaml | 2 +- policyengine_us/programs.yaml | 5 +- .../csd/liheap/ca_liheap_utility_heating.yaml | 139 +++++++++++++ .../ca/csd/liheap/ca_liheap_wood_heating.yaml | 8 +- .../eligibility/ca_liheap_basic_eligible.yaml | 47 ++++- .../ca_liheap_utility_eligible.yaml | 17 +- .../ca_liheap_countable_earned_income.yaml | 35 ++++ .../income/ca_liheap_countable_income.yaml | 27 +++ .../eligibility/ca_liheap_basic_eligible.py | 22 +- .../eligibility/ca_liheap_income_limit.py | 18 +- .../eligibility/ca_liheap_utility_eligible.py | 8 +- .../ca_liheap_countable_earned_income.py | 8 +- .../payment/ca_liheap_energy_burden_group.py | 8 +- source_conflicts/candidates.yaml | 28 +++ 19 files changed, 349 insertions(+), 255 deletions(-) delete mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/README.md create mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/eligibility/utility_heating_fuels.yaml delete mode 100644 policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_annual_rounding_increment.yaml diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/README.md b/policyengine_us/parameters/gov/states/ca/csd/liheap/README.md deleted file mode 100644 index 3d2911b2d08..00000000000 --- a/policyengine_us/parameters/gov/states/ca/csd/liheap/README.md +++ /dev/null @@ -1,195 +0,0 @@ -# California LIHEAP regular heating support - -`ca_liheap_utility_heating` estimates the regular gas/electric utility HEAP -schedule for all 58 California counties. It is an annual SPM-unit amount. -FY2026 is the researched season. Undated formulas and parameter backfilling -produce unverified historical estimates for earlier years; they do not extend -verified coverage. Tested components do not establish a complete verified policy -year, so the partial registry entry has no `verified_years`. FY2027 evidence -acquired during research was a draft. - -`ca_liheap_covered_liquid_heating` also estimates the ordinary propane/fuel-oil -component where local burden and priority rules have been verified: currently -Madera County. The statewide liquid base table is encoded, but that alone does -not establish coverage in other counties. `ca_liheap_wood_heating` estimates the -ordinary wood component throughout California when an approved eligible-delivery -cost is supplied. No output is a total California LIHEAP award; no generic -`ca_liheap` final award is provided. Solar, coal, OTHER and UNSPECIFIED fuels have no supported -utility-table crosswalk, and kerosene is not assigned a statewide liquid rule. - -## Approved wood delivery - -`ca_liheap_approved_wood_delivery_cost` is the approved cost of the eligible -ordinary wood, wood-pellet or manufactured-log delivery for the modeled program -year, before the ordinary benefit cap. Enter one program-year delivery amount, -not annual historical wood spending or an unrestricted vendor quotation. It -excludes any separately approved discretionary vendor-service supplement. - -The approved amount already reflects the allowed quantity, fuel form, climate, -storage limits, reasonable pricing and administrative prioritization. Those -facts are supplied through the approved cost; the model does not independently -recalculate them. Company and agency identities are not distinguished. No cords, -provider, agency, heating-degree-day or storage inputs are required. - -`ca_liheap_wood_heating` applies the shared income and qualified-adult checks, -requires primary `heating_type = WOOD`, and pays the nonnegative approved cost -up to the ordinary $1,000 WPO maximum. A positive approved cost establishes -heating-cost responsibility even if no past wood expense is reported. It does -not bypass the modeled income or qualified-adult requirements, and a wood quote -does not establish responsibility for a different primary heating fuel. - -The input defaults to zero. Without a supplied approved cost the modeled wood -component is zero; this does not establish that the household is legally -ineligible. `wood_expense` alone does not produce a wood award. Neither the -quote nor the award is added to historical heating/utility expenses or the -energy-burden numerator. The wood component is not added to household benefit -aggregates. The approved-cost component was researched and tested for FY2026; -earlier-year backfills are unverified historical estimates. - -## Liquid component coverage and interpretation - -Always read `ca_liheap_liquid_heating_covered` alongside -`ca_liheap_covered_liquid_heating`: - -- Coverage true: the ordinary liquid calculation is supported. A zero component - then reflects a modeled basic-eligibility or local-priority failure. -- Coverage false: this component does not supply an award determination. Its - numeric zero is the framework's out-of-coverage default, not a denial or a - finding that the household has no regular heating entitlement. - -Coverage requires propane or fuel-oil heating in Madera, positive countable -income, and an energy-cost/income ratio from zero through 100%. Zero-income and -above-100% burden assignments remain unresolved in the acquired local plan and -are expressly outside calculation coverage. Other counties and wood are also -outside the liquid component's coverage; the approved-cost wood component has -its own statewide calculation. The component is not added to household -benefit aggregates or substituted for the existing utility registry output. - -The liquid schedule uses county/income-group base amounts, the shared $19 -household increment through six members, burden additions of $0/$35/$70/$105, -and one $105 addition for a household containing a vulnerable member, capped -at $1,000. It represents the ordinary schedule without the conditional vendor -service supplement of up to $500; that supplement is not automatic and remains -unmodeled. There is no unsupported cap at annual or monthly fuel spending. - -Madera's burden intervals are 0–10.92%, 10.93–13.46%, 13.47–16.00%, and -16.01–100%. Percentages are truncated to two decimal places, as required by the -state guide. The calculation restores monetary cents before classification to -avoid binary float storage moving exact boundaries. Existing annual electricity, -natural-gas, wood, propane and fuel-oil costs divided by annual countable income -approximate the current-month ratio; they cannot isolate arrears, climate -credits or the duration of a seasonal delivery receipt. Only the canonical -`gas_expense` is counted, never both it and the deprecated gas input. - -Madera assigns income-group points of 10/8/6/4, burden-group points of 4/6/8/10, -and household demographic points: 10 for a child under six, an additional five -for a child under three, 10 for someone age 60+, an additional five for someone -age 70+, and 10 for disability. Each category counts once. The minimum is -20 points. These local thresholds are not extrapolated to other service areas. -The local plan has board-adoption evidence; a separate state approval letter -was not recovered. - -`ca_liheap_basic_eligible` shares the existing qualified-adult, income and -energy-responsibility checks across utility, liquid and approved wood calculations. It does -not itself determine local priority or fuel eligibility. The existing utility -schedule and its documented limitations are preserved. - -## Supported calculations - -- Qualified household size counts citizen/legal-immigrant SPM-unit members. - Income includes excluded nonqualified members. The SPM unit approximates the - actual group sharing home energy costs. -- Earnings of members under 18 are excluded. Existing net business inputs - include non-SSTB/SSTB, Schedule F farm operations and partnership/S-corporation - income. No additional business-expense deduction is applied. Reported rental - and farm-rental income are assumed nonnegative. -- Federal SSI and California SSP are aggregated from monthly values. CalWORKs - is included once through the take-up-gated `tanf` aggregate. Unemployment uses - `total_unemployment_compensation`, which reads reported compensation or modeled - state benefits when none is reported. Pension and retirement-account - aggregates include their components once; non-SSA survivor benefits remain - separate, as does `military_retirement_pay`. Military survivor annuities remain - part of the deferred cross-state retirement-input update. SNAP affects - categorical eligibility but is not countable income. -- Mandated support paid and reported allowable medical-insurance premiums are - deducted. Per person, positive `health_insurance_premiums` takes precedence - over the decomposed non-payroll sum of - `health_insurance_premiums_without_medicare_part_b` and - `medicare_part_b_premium`. The disjoint `pre_tax_health_insurance_premiums` - input is added in either case. This includes Medicare premiums once and - respects the source's deduction from total gross income, without an SSA cap. -- CalFresh/SNAP or take-up-gated CalWORKs receipt bypasses the SMI income ceiling. - Income strictly below 110% of the lagged federal poverty guideline also passes - the income test, with the federal floor rounded to cents. The published SMI - limit remains unchanged, and all qualified-adult and heating-cost gates remain. - At 25 people the FY2026 SMI limit is $145,314.48, below the protected $162,415 - floor; income exactly at the floor does not receive this protection. An - over-ceiling categorically eligible household always uses poverty group 4, - including large households whose ordinary group-4 interval is empty. -- The utility award is county/group base amount plus $19 for each additional - qualified member through size 6. There is no unsupported actual-bill cap, - utility vulnerability supplement or statewide priority cutoff. - -## Guideline reuse and rounding - -The federal `fpg` helper uses a relative one-year lag, reproducing the 2025 -guidelines used by the FY2026 matrix. Ordinary groups end at 100%, 125% and 150% -of FPG, rounded to monthly cents with ties upward. Boundary comparisons use -integer monthly cents to avoid float32 storage moving published boundaries. - -The federal `smi` helper and shared four-person state amounts provide SMI. The -following inferred rounding reproduces all 25 explicit FY2026 matrix rows: - -1. Truncate 60% of four-person annual SMI to a dollar: $128,144 × 60% → $76,886. -2. For sizes through 12, apply the federal size factor, truncate annual dollars, - then divide by 12 and truncate monthly cents. -3. Above size 12, extend its $9,610.75 monthly amount by $192.215 per additional - member, derived from the shared 3% factor, and truncate the result to cents. - -The source does **not** explicitly prescribe this rounding or size-12 switch. -This is a numerical modeling inference, validated against every published row, -not a legal instruction. Sizes above 25 are unverified extrapolations. The -current agency income webpage instead says to add $192.21 after size 10; that -conflicts by cents with the final matrix starting at size 11. This implementation -follows the explicit final-matrix rows. - -## Existing-input limitations - -The application-period income rules require current monthly documentation; -annual inputs divided by 12 approximate steady income. Application timing, -identity, emancipation, temporary absence, live-in attendants, shared meters, -prior awards and local funding priority are not exactly represented. The -eligibility formula requires a qualified adult; it cannot identify an -emancipated minor who may legally apply. - -Known utility heat with a positive matching expense establishes energy -responsibility. Unsubsidized heat included in rent is also allowed as a proxy -for a documented embedded charge. A subsidized household needs a reported -positive energy charge. Missing embedded-charge detail is an input limitation, -not a blanket legal prohibition on subsidized or heat-in-rent applicants. -County values use existing model geography, whose missing-county fallback can -select the first county in a state; accurate estimates need the actual county. - -The raw premium totals do not distinguish vision, dental, long-term care and -all Medicare categories. For exact calculations, direct, decomposed and payroll -premium inputs must represent allowable medical coverage only, excluding vision, -dental, long-term care, reimbursement accounts and other excluded charges. A -positive direct non-payroll total must already contain any Medicare premium; -otherwise use the non-Part-B input and the separate Part B premium. No separate -LTC amount is added. These input-composition limits keep deductions approximate. -Alimony inputs also lack separate proof of a mandate. - -Existing inputs cannot isolate income earmarked directly for housing, excluded -IHSS/live-in-aide earnings, interest retained rather than used for household -support, royalties, jury pay and some unusual insurance receipts. These are -mapping limits, not new income exclusions. General cash gifts, loans, capital -gains and in-kind assistance are omitted under the source exclusions. - -## References - -- [CSD final FY2026 LIHEAP State Plan #page 6-7,9-10,182-188,193,196,202-203,205,217-219,229-240,243-250,257,279,282-283,363-364](https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=6): utility/liquid matrices, ordinary WPO cap, wood quantity/pricing, eligibility guide and approved vendor payments. -- [CSD FY2026 income eligibility webpage](https://www.csd.ca.gov/Pages/LIHEAP-Income-Eligibility.aspx): larger-household rounding conflict. -- [CSD publication index](https://www.csd.ca.gov/Pages/LIHEAPProgram.aspx): final FY2026 and draft FY2027 status, checked October 3, 2026. - -- [Madera FY2026 local plan, October 9, 2025 board packet #page 191,233-234](https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191): local burden bands, priority points and minimum. -- [Madera November 13, 2025 board packet #page 4,6](https://maderacap.org/wp-content/uploads/2025/11/Agenda-and-Board-Packet-November-13-2025.pdf#page=4): October 9 minutes, consent-calendar approval including item D17. diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/eligibility/utility_heating_fuels.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/eligibility/utility_heating_fuels.yaml new file mode 100644 index 00000000000..e522a3f5789 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/eligibility/utility_heating_fuels.yaml @@ -0,0 +1,16 @@ +description: California pays the utility heating benefit to households heating with these fuels under the Low Income Home Energy Assistance Program. +# The guide computes a solar customer's energy cost from the electric and gas +# charges and requires an out-of-pocket cost such as a minimum delivery charge. +values: + 2025-10-01: + - ELECTRICITY + - NATURAL_GAS + - SOLAR + +metadata: + unit: list + period: year + label: California LIHEAP utility heating fuels + reference: + - title: "California FY2026 LIHEAP State Plan #page 182-184,264-265" + href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=182 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_annual_rounding_increment.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_annual_rounding_increment.yaml deleted file mode 100644 index fabd5600687..00000000000 --- a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_annual_rounding_increment.yaml +++ /dev/null @@ -1,12 +0,0 @@ -description: California publishes state median income limits reproduced by truncating annual amounts to this increment under the Low Income Home Energy Assistance Program. -# Inferred: truncate the four-person 60% SMI base, then the size-adjusted annual amount through size12 before truncating monthly cents. Validated for all25 published FY2026 rows. -values: - 2025-10-01: 1 - -metadata: - unit: currency-USD - period: year - label: California LIHEAP SMI annual rounding increment - reference: - - title: California FY2026 LIHEAP State Plan - href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=184 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_rounding_size_limit.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_rounding_size_limit.yaml index 5669b0e4257..0afe653ef4b 100644 --- a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_rounding_size_limit.yaml +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_rounding_size_limit.yaml @@ -1,5 +1,5 @@ description: California publishes state median income limits reproduced by changing the rounding method above this household size under the Low Income Home Energy Assistance Program. -# Inferred numerical method, not an express rule: above size12, add the shared federal additional-person factor times the truncated annual four-person base before monthly-cent truncation. Sizes above25 and other years are unverified. +# Inferred numerical method, not an express rule: through size 12, truncate the four-person 60% SMI base and the size-adjusted annual amount to dollars; above size 12, add the shared federal additional-person factor times the truncated four-person base. Then truncate to monthly cents. This reproduces all 25 published FY2026 rows; sizes above 25 and other years are unverified. values: 2025-10-01: 12 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/unearned_sources.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/unearned_sources.yaml index 7c9e12e31b8..a69981ce8de 100644 --- a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/unearned_sources.yaml +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/unearned_sources.yaml @@ -1,5 +1,5 @@ description: California counts these unearned income sources under the Low Income Home Energy Assistance Program. -# SSI and state SSP are monthly and are annualized once by aggregation. TANF counts actual take-up once per household; unemployment uses reported or modeled payments. Pension and retirement-distribution aggregates include their own subcomponents, but military retirement pay is separate. Interest use, housing-directed cash aid, royalties, jury pay and unusual insurance receipts need more detail than existing inputs provide. SNAP and friends/relative cash gifts are excluded. +# SSI and state SSP are monthly and are annualized once by aggregation. TANF counts actual take-up once per household; unemployment uses reported or modeled payments. Pension and retirement-distribution aggregates include their own subcomponents; military retirement includes Survivor Benefit Plan annuities. Interest use, housing-directed cash aid, royalties, jury pay and unusual insurance receipts need more detail than existing inputs provide. SNAP and friends/relative cash gifts are excluded. values: 2025-10-01: - total_unemployment_compensation @@ -8,7 +8,8 @@ values: - ssi - ca_state_supplement - pension_income - - military_retirement_pay + - military_retirement_income + - railroad_benefits - retirement_distributions - general_assistance - tanf @@ -17,7 +18,7 @@ values: - alimony_income - child_support_received - interest_income - - dividend_income + - ordinary_dividend_income - workers_compensation - disability_benefits - veterans_benefits diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/wpo_maximum.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/wpo_maximum.yaml index 9bf2952086c..bf356247023 100644 --- a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/wpo_maximum.yaml +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/wpo_maximum.yaml @@ -7,5 +7,5 @@ metadata: period: year label: California LIHEAP ordinary wood, propane, and oil heating maximum reference: - - title: "California FY2026 LIHEAP State Plan #page 10,187,188" + - title: "California FY2026 LIHEAP State Plan #page 10,187-188" href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=10 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index b3eed1ee2dd..6d83b5315ff 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -808,7 +808,7 @@ programs: category: Benefits agency: HHS status: partial - coverage: AL, DC, Riverside County, MA, FL, IL, IN, KS, KY, MD, MS, NC, NE, NJ, NY, OH, OK, OR, SD, RI, TX, CA utility heating + coverage: AL, DC, Riverside County, MA, FL, IL, IN, KS, KY, MD, MS, NC, NE, NJ, NY, OH, OK, OR, SD, RI, TX, CA state_implementations: - state: AL status: partial @@ -966,7 +966,8 @@ programs: full_name: California Home Energy Assistance Program utility heating component variable: ca_liheap_utility_heating parameter_prefix: gov.states.ca.csd.liheap - notes: FY2026 regular gas and electric utility heating, a separate ordinary propane/fuel-oil component for Madera using verified local burden and priority rules, and an ordinary wood component through ca_liheap_wood_heating using ca_liheap_approved_wood_delivery_cost statewide. Read ca_liheap_liquid_heating_covered with ca_liheap_covered_liquid_heating; an uncovered component zero is not a denial. The approved wood cost supplies allowed quantity, pricing, climate, storage and administrative approval facts; zero without that input is not an eligibility determination. No company or agency selectors are modeled. Other liquid-fuel service areas and zero-income or above-100% liquid burden assignments are outside current calculation coverage; conditional vendor-service supplements remain unmodeled. Annual inputs approximate application-month circumstances and SPM units approximate energy households; local priorities, detailed income exclusions and allowable medical-premium composition are not fully represented. Earlier backfills are unverified historical estimates. Crisis, cooling, weatherization and equipment are outside scope. + verified_years: "2026" + notes: FY2026 regular gas, electric and solar utility heating, Madera propane and fuel-oil heating, and statewide wood heating from an approved delivery cost; other liquid-fuel service areas and vendor-service supplements are not modeled. Crisis, cooling, weatherization and equipment assistance are out of scope. # --- SSA programs --- - id: ssi diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_utility_heating.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_utility_heating.yaml index c78e2ef2694..47a641e8569 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_utility_heating.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_utility_heating.yaml @@ -5103,3 +5103,142 @@ county: ALAMEDA_COUNTY_CA output: ca_liheap_utility_heating: [484, 484, 484, 0, 484, 0] + +# Guide pp. 264-265: a solar customer's energy cost is the electric and gas +# charges, and an out-of-pocket cost is required. $1,000 a month is group 1 in +# Alameda: $484. With no bill the home has no energy cost. +- name: Case 12, a solar home qualifies on a positive utility bill. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 12_000} + person2: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 12_000} + spm_units: + spm_unit1: + members: [person1] + heating_type: SOLAR + pre_subsidy_electricity_expense: 600 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: SOLAR + snap: 0 + tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_utility_eligible: [true, false] + ca_liheap_utility_heating: [484, 0] + +# Guide pp. 66, 193, 205: energy costs and electric or gas bills, with no +# primary-fuel condition. A subsidized tenant with gas heat in rent and an +# electric bill, and an electric-heated home with only a gas bill, both get the +# group 1 Alameda $484. A propane home with only an electric bill keeps its own +# fuel test: not basic eligible, so $0. +- name: Case 13, gas and electric homes qualify on either utility bill while propane keeps its own bill. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 12_000} + person2: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 12_000} + person3: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 12_000} + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 0 + pre_subsidy_electricity_expense: 1_200 + heat_expense_included_in_rent: true + receives_housing_assistance: true + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: ELECTRICITY + pre_subsidy_electricity_expense: 0 + gas_expense: 600 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3] + heating_type: PROPANE + bottled_gas_expense: 0 + pre_subsidy_electricity_expense: 1_200 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + household3: + members: [person3] + state_code: CA + county: FRESNO_COUNTY_CA + output: + ca_liheap_basic_eligible: [true, true, false] + ca_liheap_utility_heating: [484, 484, 0] + +# Guide p. 249. Wages 40,500 exceed the 39,979.92 one-person limit (p. 184); +# after 1,000 of job expenses, 39,500 is 3,291.67 a month, group 4: Alameda $308. +- name: Case 14, job-related expenses can bring a wage earner under the income limit. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 40_500 + unreimbursed_business_employee_expenses: 1_000 + person2: + age: 40 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 40_500 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_utility_heating: [308, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_wood_heating.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_wood_heating.yaml index ebde420cbae..94dcad20638 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_wood_heating.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_wood_heating.yaml @@ -5,7 +5,7 @@ # and prioritization. These tests supply no provider, agency or cords selector. # One ordinary annual award is capped at $1,000; no discretionary supplement. -# REQ-001/002/005: Fresno demonstrates that wood is not limited to Madera. +# Fresno demonstrates that wood is not limited to Madera. # Existing wood spending establishes responsibility for all seven households. # Omitted and zero quotes both yield zero modeled benefit, not legal denial. - name: Case 1, approved wood delivery is bounded by zero and the ordinary WPO maximum. @@ -89,7 +89,7 @@ ca_liheap_wood_heating: [0, 0, 0, 750.25, 999.99, 1_000, 1_000] heating_expense: [120, 120, 120, 120, 120, 120, 120] -# REQ-001/003/004: an approved delivery establishes responsibility before any +# An approved delivery establishes responsibility before any # prior wood purchase, including at zero income. Historic spending remains a # separate input. At $12,000 income, $1,200 is burden group 1 and $2,400 group 4; # adding the $600 quote to the second household's expense would change its band. @@ -137,7 +137,7 @@ ca_liheap_liquid_heating_covered: [false, false, false] ca_liheap_wood_heating: [600, 600, 600] -# REQ-003/004/005: a quote cannot cause cross-state or cross-fuel payments. +# A quote cannot cause cross-state or cross-fuel payments. # The propane household retains the sourced Madera ordinary amount $411+$105 # and its original $2,040 bill even when an unrelated wood quote is supplied. - name: Case 3, mixed states and primary fuels receive only their applicable component. @@ -191,7 +191,7 @@ ca_liheap_wood_heating: [600, 0, 0, 0] ca_liheap_covered_liquid_heating: [0, 0, 516, 0] -# REQ-003: approval does not override the modeled income or qualified-adult +# Approval does not override the modeled income or qualified-adult # gates. A nonqualified adult with a qualified child still lacks an applicant; # age 17 is not assumed emancipated, whereas age 18 meets the applicant gate. # The final household is income eligible through actual SNAP receipt, not its diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.yaml index ad225946dd8..35176d19e7a 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.yaml @@ -9,7 +9,7 @@ # State-plan pp193/205/279: qualified adult, countable-income limit and # energy responsibility. Heat-in-rent without a separately supplied bill # retains the existing unsubsidized-housing proxy; subsidized housing needs -# a positive reported charge. The17-year-old is assumed not emancipated. +# a positive reported charge. The 17-year-old is assumed not emancipated. # No fixture supplies a calculated CA LIHEAP intermediate. - name: "Case 1, shared income adult and energy responsibility requirements preserve utility behavior." period: 2026 @@ -171,7 +171,7 @@ ca_liheap_basic_eligible: [true, true, true, true, true, false, true, false, true, false, false, false] ca_liheap_utility_eligible: [false, false, true, true, false, false, false, false, false, false, false, false] -# REQ-003/004: only a positive approved WOOD delivery creates responsibility +# Only a positive approved WOOD delivery creates responsibility # in the absence of existing bills or qualifying heat-in-rent. The first home # is subsidized but has its own approved wood cost. Quotes cannot create # responsibility for another primary fuel, including unknown or absent heat. @@ -250,3 +250,46 @@ ca_liheap_utility_eligible: [false, false, false, false, false, false, false] heating_expense: [0, 0, 0, 0, 0, 0, 0] ca_liheap_wood_heating: [600, 0, 0, 0, 0, 0, 0] + +# Public housing is subsidized housing: heat in rent without a separate charge +# does not establish energy responsibility, while a positive reported propane +# charge does, as for voucher holders in Case 1 (s6 and s7). +- name: Case 3, public housing follows the subsidized heat-in-rent rule. + period: 2026 + input: + people: + person1: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 12_000} + person2: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 12_000} + spm_units: + spm_unit1: + members: [person1] + heating_type: PROPANE + snap: 0 + tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 0 + heat_expense_included_in_rent: true + receives_housing_assistance: false + spm_unit2: + members: [person2] + heating_type: PROPANE + snap: 0 + tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 120 + heat_expense_included_in_rent: true + receives_housing_assistance: false + households: + household1: + members: [person1] + state_code: CA + county: MADERA_COUNTY_CA + is_in_public_housing: true + household2: + members: [person2] + state_code: CA + county: MADERA_COUNTY_CA + is_in_public_housing: true + output: + ca_liheap_basic_eligible: [false, true] + diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.yaml index 2cb77cc61c7..0037f24d790 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.yaml @@ -1,6 +1,6 @@ # PDF pages 9,193,202-203,205,219,279 # https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=9 -# This gate covers gas/electric utility heating, not unresolved regular WPO. +# This gate covers gas, electric and solar utility heating. - name: Case 1, a qualified adult applicant is required by the represented inputs. period: 2026 @@ -75,13 +75,14 @@ output: ca_liheap_utility_eligible: [false, true, false, true, false] -- name: Case 2, utility fuel housing and actual matching energy charges determine coverage. +- name: Case 2, utility fuel housing and energy charges determine coverage. period: 2026 - # Gas/electric utility heat needs its matching charge, or the supported - # unsubsidized rent-inclusive proxy. Subsidized housing with a positive - # reported charge qualifies. Propane belongs to unresolved WPO; its false - # utility gate is not an assertion of no regular WPO entitlement. Unspecified - # fuel has no established utility crosswalk. + # Gas or electric heat needs a positive gas or electric bill, or the + # unsubsidized rent-inclusive proxy. A gas-heated home with only an electric + # bill qualifies (guide pp. 66, 193, 205). Subsidized housing with a positive + # reported charge qualifies. Propane has its own liquid-fuel component; its + # false utility gate is not a denial of that component. Unspecified fuel has + # no utility crosswalk. input: people: person1: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} @@ -203,7 +204,7 @@ ca_liheap_utility_eligible: - true - true - - false + - true - true - false - true diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.yaml index e7d17bf595d..3579528a181 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.yaml @@ -78,3 +78,38 @@ county: MULTNOMAH_COUNTY_OR output: ca_liheap_countable_earned_income: [14_000, 0, 14_000, -1_000, 0] + +# Guide p. 249 deducts a paid employee's business expenses: 40,500 - 1,000 = 39,500. +# A minor's earnings are excluded (p. 247), so the minor's 500 offsets nothing. +- name: Case 2, unreimbursed employee expenses reduce adult earnings only. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 35 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 40_500 + unreimbursed_business_employee_expenses: 1_000 + person2: + age: 17 + is_citizen_or_legal_immigrant: true + ssi: 0 + employment_income: 5_000 + unreimbursed_business_employee_expenses: 500 + spm_units: + spm_unit: + members: [person1, person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + households: + household: + members: [person1, person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_countable_earned_income: [39_500, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.yaml index 76342d87c2f..401c869f8cd 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.yaml @@ -476,3 +476,30 @@ county: MULTNOMAH_COUNTY_OR output: ca_liheap_countable_income: [2_000, 0] + +# Plan pages 229-247 list railroad retirement among pensions: 6,000 counts. +- name: Case 9, railroad retirement counts as a pension. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 60 + is_citizen_or_legal_immigrant: true + ssi: 0 + railroad_benefits: 6_000 + spm_units: + spm_unit: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + households: + household: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_countable_income: 6_000 diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.py b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.py index 981d8ba9dd5..28f888bd596 100644 --- a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.py +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.py @@ -7,7 +7,7 @@ class ca_liheap_basic_eligible(Variable): definition_period = YEAR label = "California LIHEAP common household eligibility" defined_for = StateCode.CA - # PDF pages 9,193,202-203,205,219,279 + # PDF pages 9,66,193,202-203,205,219,221,264-265,279 reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=9" def formula(spm_unit, period, parameters): @@ -18,14 +18,30 @@ def formula(spm_unit, period, parameters): ) expense = spm_unit("heating_expense", period) heat_in_rent = spm_unit("heat_expense_included_in_rent", period) - subsidized = spm_unit("receives_housing_assistance", period) + subsidized = spm_unit( + "receives_housing_assistance", period + ) | spm_unit.household("is_in_public_housing", period) heating_type = spm_unit("heating_type", period) + # The guide asks for energy costs and pays electric or gas accounts, and + # no source requires a bill for the primary fuel. A gas, electric or + # solar home therefore qualifies on either utility bill. Other fuels + # keep their own bill: no source says whether a propane home may take + # the utility benefit on its electric account. + utility_heat = np.isin(heating_type.decode_to_str(), p.utility_heating_fuels) + utility_bills = add( + spm_unit, period, ["pre_subsidy_electricity_expense", "gas_expense"] + ) approved_wood_cost = (heating_type == heating_type.possible_values.WOOD) & ( spm_unit("ca_liheap_approved_wood_delivery_cost", period) > 0 ) # Unsubsidized heat-in-rent is an energy-responsibility proxy; a # separately reported charge also permits subsidized households. - energy_cost = (expense > 0) | (heat_in_rent & ~subsidized) | approved_wood_cost + energy_cost = ( + (expense > 0) + | (utility_heat & (utility_bills > 0)) + | (heat_in_rent & ~subsidized) + | approved_wood_cost + ) return ( energy_cost & (spm_unit.sum(qualified_adult) > 0) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_limit.py b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_limit.py index 6cca77e975a..6b42fdcd74c 100644 --- a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_limit.py +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_limit.py @@ -1,5 +1,5 @@ from policyengine_us.model_api import * -from policyengine_us.variables.gov.hhs.hhs_smi import smi +from policyengine_us.variables.gov.hhs.hhs_smi import liheap_smi_limit class ca_liheap_income_limit(Variable): @@ -17,22 +17,14 @@ def formula(spm_unit, period, parameters): p_smi = parameters(period).gov.hhs.smi size = spm_unit("ca_liheap_household_size", period) state = spm_unit.household("state_code_str", period) - four_person_smi = p_smi.amount[state] - rounded_base = ( - np.floor(four_person_smi * p.smi_rate / p.smi_annual_rounding_increment) - * p.smi_annual_rounding_increment - ) capped_size = clip(size, 1, p.smi_rounding_size_limit) - adjusted_base = smi(capped_size, state, period, parameters) * ( - rounded_base / four_person_smi - ) - rounded_annual = ( - np.floor(adjusted_base / p.smi_annual_rounding_increment) - * p.smi_annual_rounding_increment + rounded_annual = liheap_smi_limit( + capped_size, state, p.smi_rate, period, parameters ) extra_people = max_(size - p.smi_rounding_size_limit, 0) annual_increment = ( - rounded_base * p_smi.household_size_adjustment.additional_person + np.floor(p_smi.amount[state] * p.smi_rate) + * p_smi.household_size_adjustment.additional_person ) monthly = ( rounded_annual / MONTHS_IN_YEAR diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.py b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.py index ede52fd5e8c..0b784a8af66 100644 --- a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.py +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.py @@ -7,13 +7,11 @@ class ca_liheap_utility_eligible(Variable): definition_period = YEAR label = "California LIHEAP utility heating eligibility" defined_for = StateCode.CA - # PDF pages 9,182-184,193,202-203,205,219,279 + # PDF pages 9,182-184,193,202-203,205,219,264-265,279 reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=9" def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ca.csd.liheap.eligibility heating_type = spm_unit("heating_type", period) - types = heating_type.possible_values - utility_heat = (heating_type == types.ELECTRICITY) | ( - heating_type == types.NATURAL_GAS - ) + utility_heat = np.isin(heating_type.decode_to_str(), p.utility_heating_fuels) return utility_heat & spm_unit("ca_liheap_basic_eligible", period) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.py b/policyengine_us/variables/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.py index 693305c274f..cc8e5429004 100644 --- a/policyengine_us/variables/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.py +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.py @@ -8,10 +8,14 @@ class ca_liheap_countable_earned_income(Variable): unit = USD label = "California LIHEAP countable earned income" defined_for = StateCode.CA - # PDF pages 231,240,247 + # PDF pages 231,240,247,249 reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=231" def formula(person, period, parameters): p = parameters(period).gov.states.ca.csd.liheap.income earnings = add(person, period, p.earned_sources) - return where(person("age", period) >= p.earned_income_min_age, earnings, 0) + # The guide deducts the business expenses of paid employees. A minor's + # earnings are excluded, so a minor's expenses offset nothing. + job_expenses = person("unreimbursed_business_employee_expenses", period) + adult = person("age", period) >= p.earned_income_min_age + return where(adult, earnings - job_expenses, 0) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_energy_burden_group.py b/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_energy_burden_group.py index 41f2a6fb3cb..5c210aadfe1 100644 --- a/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_energy_burden_group.py +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_energy_burden_group.py @@ -21,10 +21,10 @@ def formula(spm_unit, period, parameters): cent = p.income.monthly_rounding_increment # Annual flows approximate a representative month. Restore each # monetary input's cents before truncating the percentage to basis points. - cost_cents = sum( - np.rint(spm_unit(source, period).astype(float) / cent).astype(np.int64) - for source in p.energy_burden.expense_sources - ) + cost_cents = 0 + for source in p.energy_burden.expense_sources: + amount = spm_unit(source, period).astype(float) + cost_cents = cost_cents + np.rint(amount / cent).astype(np.int64) income = spm_unit("ca_liheap_countable_income", period) income_cents = np.rint(income.astype(float) / cent).astype(np.int64) scale = int(np.rint(1 / p.energy_burden.rounding_increment)) diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index 7d8c41658c6..9b52f0a3739 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -732,6 +732,34 @@ candidates: state: ruled note: 'The October 2026 statute-first ruling retains the bar; obtain the statutory URL and verify the instruction flow''s joint-return effect. Code not yet on main: ca_eitc_eligible.' +- id: us-ca:liheap-income-floor-vs-smi-limit + program: liheap + years: + from: 2026 + to: 2026 + type: federal-fiscal + question: Can California's 60% SMI heating limit exclude a household of 21 or more whose income is below the federal + 110% poverty-guideline floor? + sources: + - kind: statute + citation: 42 U.S.C. 8624(b)(2)(B) + url: https://www.law.cornell.edu/uscode/text/42/8624#b_2_B + - kind: plan + citation: California FY2026 LIHEAP State Plan, income eligibility table, pp.9, 184 + url: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=9 + readings: + statute: Income below 110% of the poverty guideline cannot by itself exclude the household. + other: The plan's 60% SMI limits fall below that floor for households of 21 to 25 members. + example: Twenty-one people with $136,088.28 a year exceed the $136,088.16 limit ($11,340.68 a month) but are below the + $138,215 floor (2025 guideline, one-year lag), so they stay income eligible. + pe_us: + follows: statute + code: + - policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_eligible.py + - policyengine_us/parameters/gov/hhs/liheap/fpg_floor.yaml + - policyengine_us/parameters/gov/states/ca/csd/liheap/income/fpg_year_lag.yaml + state: unreviewed + note: PE-US applies the floor, rounded to cents with the statute's strict "less than" (ca_liheap_income_eligible.py). - id: us-ca:renter-credit-2025-joint-income-limit program: income-tax years: From 6ad11f021e4ce61ab14801e20e80411e8d62d499 Mon Sep 17 00:00:00 2001 From: Ziming Date: Tue, 3 Nov 2026 16:43:06 -0500 Subject: [PATCH 5/6] Apply review fixes to California LIHEAP Co-Authored-By: Claude Opus 5.5 --- .../liheap/eligibility/applicant_min_age.yaml | 4 +- .../eligibility/utility_heating_fuels.yaml | 4 +- .../liheap/energy_burden/expense_sources.yaml | 2 +- .../ca/csd/liheap/income/earned_sources.yaml | 4 +- .../income/smi_rounding_size_limit.yaml | 2 +- .../ca/csd/liheap/local/madera/counties.yaml | 2 +- .../payment/additional_person_amount.yaml | 2 +- .../liheap/payment/liquid_base_amount.yaml | 2 +- policyengine_us/programs.yaml | 16 +- .../ca_liheap_covered_liquid_heating.yaml | 512 +++++++++--------- .../csd/liheap/ca_liheap_utility_heating.yaml | 208 ++++++- .../eligibility/ca_liheap_basic_eligible.yaml | 12 +- .../ca_liheap_utility_eligible.yaml | 150 ++++- .../ca_liheap_countable_earned_income.yaml | 50 ++ .../income/ca_liheap_countable_income.yaml | 51 ++ ... => ca_liheap_madera_priority_points.yaml} | 8 +- .../ca_liheap_covered_liquid_heating.py | 22 +- .../csd/liheap/ca_liheap_utility_heating.py | 4 +- .../eligibility/ca_liheap_basic_eligible.py | 21 +- .../eligibility/ca_liheap_utility_eligible.py | 43 +- .../income/ca_liheap_countable_income.py | 11 +- ...py => ca_liheap_madera_priority_points.py} | 12 +- source_conflicts/candidates.yaml | 31 ++ 23 files changed, 847 insertions(+), 326 deletions(-) rename policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/{ca_liheap_liquid_priority_points.yaml => ca_liheap_madera_priority_points.yaml} (97%) rename policyengine_us/variables/gov/states/ca/csd/liheap/payment/{ca_liheap_liquid_priority_points.py => ca_liheap_madera_priority_points.py} (73%) diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/eligibility/applicant_min_age.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/eligibility/applicant_min_age.yaml index ad28baa231d..c4d4e837e48 100644 --- a/policyengine_us/parameters/gov/states/ca/csd/liheap/eligibility/applicant_min_age.yaml +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/eligibility/applicant_min_age.yaml @@ -1,5 +1,5 @@ -description: California requires applicants to be at least this age, unless emancipated under the Low Income Home Energy Assistance Program. -# Emancipation cannot be identified from existing inputs. +description: California limits applicants to this minimum age under the Low Income Home Energy Assistance Program. +# The guide also accepts legally emancipated applicants, which existing inputs cannot identify. values: 2025-10-01: 18 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/eligibility/utility_heating_fuels.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/eligibility/utility_heating_fuels.yaml index e522a3f5789..ca74984ba36 100644 --- a/policyengine_us/parameters/gov/states/ca/csd/liheap/eligibility/utility_heating_fuels.yaml +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/eligibility/utility_heating_fuels.yaml @@ -1,4 +1,4 @@ -description: California pays the utility heating benefit to households heating with these fuels under the Low Income Home Energy Assistance Program. +description: California treats heat included in rent as a utility cost for households heating with these fuels under the Low Income Home Energy Assistance Program. # The guide computes a solar customer's energy cost from the electric and gas # charges and requires an out-of-pocket cost such as a minimum delivery charge. values: @@ -12,5 +12,5 @@ metadata: period: year label: California LIHEAP utility heating fuels reference: - - title: "California FY2026 LIHEAP State Plan #page 182-184,264-265" + - title: "California FY2026 LIHEAP State Plan #page 182-184,264-265,279" href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=182 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/energy_burden/expense_sources.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/energy_burden/expense_sources.yaml index 0228068dc4d..56e52e3caae 100644 --- a/policyengine_us/parameters/gov/states/ca/csd/liheap/energy_burden/expense_sources.yaml +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/energy_burden/expense_sources.yaml @@ -1,4 +1,4 @@ -description: California includes these canonical energy costs in the energy burden numerator under the Low Income Home Energy Assistance Program. +description: California includes these energy costs in the energy burden numerator under the Low Income Home Energy Assistance Program. # Annual flows approximate current monthly costs. Excludes the deprecated gas # duplicate and non-energy bills; climate credits and seasonal timing are unobserved. values: diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/earned_sources.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/earned_sources.yaml index 957db99d108..b309b3d9b2c 100644 --- a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/earned_sources.yaml +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/earned_sources.yaml @@ -3,6 +3,8 @@ description: California counts these earned income sources under the Low Income values: 2025-10-01: - employment_income + # Enter basic pay here or in employment_income, not both. Combat pay is excluded. + - military_basic_pay - self_employment_income - sstb_self_employment_income - farm_operations_income @@ -13,5 +15,5 @@ metadata: period: year label: California LIHEAP countable earned income sources reference: - - title: "California FY2026 LIHEAP State Plan #page 7,231,240,247" + - title: "California FY2026 LIHEAP State Plan #page 7,231,240,247,250" href: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=7 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_rounding_size_limit.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_rounding_size_limit.yaml index 0afe653ef4b..936a1c705b7 100644 --- a/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_rounding_size_limit.yaml +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/income/smi_rounding_size_limit.yaml @@ -1,4 +1,4 @@ -description: California publishes state median income limits reproduced by changing the rounding method above this household size under the Low Income Home Energy Assistance Program. +description: California truncates state median income limits to whole dollars through this household size under the Low Income Home Energy Assistance Program. # Inferred numerical method, not an express rule: through size 12, truncate the four-person 60% SMI base and the size-adjusted annual amount to dollars; above size 12, add the shared federal additional-person factor times the truncated four-person base. Then truncate to monthly cents. This reproduces all 25 published FY2026 rows; sizes above 25 and other years are unverified. values: 2025-10-01: 12 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/counties.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/counties.yaml index d993fd2a286..0e4bb7bf2fc 100644 --- a/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/counties.yaml +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/local/madera/counties.yaml @@ -1,4 +1,4 @@ -description: California has verified the following county coverage for the Madera local priority plan under the Low Income Home Energy Assistance Program. +description: California applies the Madera local priority plan in these counties under the Low Income Home Energy Assistance Program. # This records researched model coverage, not a statewide eligibility restriction. # FY2026 is verified; earlier parameter backfills are unverified historical estimates. values: diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/additional_person_amount.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/additional_person_amount.yaml index 70c7f91496b..2613261341f 100644 --- a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/additional_person_amount.yaml +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/additional_person_amount.yaml @@ -1,4 +1,4 @@ -description: California adds this amount for each additional qualified household member under the regular utility and liquid heating schedules under the Low Income Home Energy Assistance Program. +description: California adds this amount for each additional qualified household member to the regular utility and liquid heating schedules under the Low Income Home Energy Assistance Program. values: 2025-10-01: 19 diff --git a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_base_amount.yaml b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_base_amount.yaml index f2cde83aca6..47635c86429 100644 --- a/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_base_amount.yaml +++ b/policyengine_us/parameters/gov/states/ca/csd/liheap/payment/liquid_base_amount.yaml @@ -1,4 +1,4 @@ -description: California provides these county base benefits by poverty group for a one-person household under the ordinary liquid heating schedule under the Low Income Home Energy Assistance Program. +description: California provides these county base benefits by poverty group for a one-person household on the ordinary liquid heating schedule under the Low Income Home Energy Assistance Program. # All 58 published county schedules are retained. Local burden/priority coverage # is separate; a base amount alone does not establish a modeled county award. ALAMEDA_COUNTY_CA: diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 77e17f63590..6b0e251599d 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -1020,6 +1020,14 @@ programs: parameter_prefix: gov.states.az.des.liheap verified_years: "2026" notes: FY2026 Standard benefit covering heating and cooling bills from the point-based benefit matrix. Crisis assistance, water for evaporative cooling and weatherization are out of scope. + - state: CA + status: partial + name: California utility HEAP + full_name: California Home Energy Assistance Program utility heating component + variable: ca_liheap_utility_heating + parameter_prefix: gov.states.ca.csd.liheap + verified_years: "2026" + notes: FY2026 regular utility heating on gas and electric accounts, Madera propane and fuel-oil heating, and statewide wood heating from an approved delivery cost; other liquid-fuel service areas and vendor-service supplements are not modeled. Crisis, cooling, weatherization and equipment assistance are out of scope. - state: GA status: partial name: Georgia LIHEAP @@ -1314,14 +1322,6 @@ programs: parameter_prefix: gov.states.wy.dfs.lieap verified_years: "2026" notes: FY2026 regular heating from the published fuel cost standards. Crisis, cooling, weatherization and equipment assistance are out of scope. - - state: CA - status: partial - name: California utility HEAP - full_name: California Home Energy Assistance Program utility heating component - variable: ca_liheap_utility_heating - parameter_prefix: gov.states.ca.csd.liheap - verified_years: "2026" - notes: FY2026 regular gas, electric and solar utility heating, Madera propane and fuel-oil heating, and statewide wood heating from an approved delivery cost; other liquid-fuel service areas and vendor-service supplements are not modeled. Crisis, cooling, weatherization and equipment assistance are out of scope. # --- SSA programs --- - id: ssi diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.yaml index fb34cdc5dbd..1308a69b1fa 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.yaml @@ -72,7 +72,7 @@ ca_liheap_countable_income: [12000, 12000, 30000, 36000] ca_liheap_income_group: [1, 1, 4, 4] ca_liheap_energy_burden_group: [4, 3, 3, 2] - ca_liheap_liquid_priority_points: [20, 18, 22, 20] + ca_liheap_madera_priority_points: [20, 18, 22, 20] ca_liheap_covered_liquid_heating: [516, 0, 459, 443] # Income group1, burden group4 and noVP:411+105+19*(4,5,5). @@ -331,7 +331,7 @@ state_code: "CA" county: "MADERA_COUNTY_CA" output: - ca_liheap_liquid_priority_points: [54] + ca_liheap_madera_priority_points: [54] ca_liheap_covered_liquid_heating: [573] # ISOLATED CONDITIONAL SCHEDULE ONLY, not a determination of local approval. @@ -412,7 +412,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s2: members: ["p2_1"] heating_type: "PROPANE" @@ -422,7 +422,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s3: members: ["p3_1"] heating_type: "PROPANE" @@ -432,7 +432,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s4: members: ["p4_1"] heating_type: "PROPANE" @@ -442,7 +442,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s5: members: ["p5_1"] heating_type: "PROPANE" @@ -452,7 +452,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s6: members: ["p6_1"] heating_type: "PROPANE" @@ -462,7 +462,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s7: members: ["p7_1"] heating_type: "PROPANE" @@ -472,7 +472,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s8: members: ["p8_1"] heating_type: "PROPANE" @@ -482,7 +482,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s9: members: ["p9_1"] heating_type: "PROPANE" @@ -492,7 +492,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s10: members: ["p10_1"] heating_type: "PROPANE" @@ -502,7 +502,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s11: members: ["p11_1"] heating_type: "PROPANE" @@ -512,7 +512,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s12: members: ["p12_1"] heating_type: "PROPANE" @@ -522,7 +522,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s13: members: ["p13_1"] heating_type: "PROPANE" @@ -532,7 +532,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s14: members: ["p14_1"] heating_type: "PROPANE" @@ -542,7 +542,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s15: members: ["p15_1"] heating_type: "PROPANE" @@ -552,7 +552,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s16: members: ["p16_1"] heating_type: "PROPANE" @@ -562,7 +562,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s17: members: ["p17_1"] heating_type: "PROPANE" @@ -572,7 +572,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s18: members: ["p18_1"] heating_type: "PROPANE" @@ -582,7 +582,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s19: members: ["p19_1"] heating_type: "PROPANE" @@ -592,7 +592,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s20: members: ["p20_1"] heating_type: "PROPANE" @@ -602,7 +602,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s21: members: ["p21_1"] heating_type: "PROPANE" @@ -612,7 +612,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s22: members: ["p22_1"] heating_type: "PROPANE" @@ -622,7 +622,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s23: members: ["p23_1"] heating_type: "PROPANE" @@ -632,7 +632,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s24: members: ["p24_1"] heating_type: "PROPANE" @@ -642,7 +642,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s25: members: ["p25_1"] heating_type: "PROPANE" @@ -652,7 +652,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s26: members: ["p26_1"] heating_type: "PROPANE" @@ -662,7 +662,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s27: members: ["p27_1"] heating_type: "PROPANE" @@ -672,7 +672,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s28: members: ["p28_1"] heating_type: "PROPANE" @@ -682,7 +682,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s29: members: ["p29_1"] heating_type: "PROPANE" @@ -692,7 +692,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s30: members: ["p30_1"] heating_type: "PROPANE" @@ -702,7 +702,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s31: members: ["p31_1"] heating_type: "PROPANE" @@ -712,7 +712,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s32: members: ["p32_1"] heating_type: "PROPANE" @@ -722,7 +722,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s33: members: ["p33_1"] heating_type: "PROPANE" @@ -732,7 +732,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s34: members: ["p34_1"] heating_type: "PROPANE" @@ -742,7 +742,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s35: members: ["p35_1"] heating_type: "PROPANE" @@ -752,7 +752,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s36: members: ["p36_1"] heating_type: "PROPANE" @@ -762,7 +762,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s37: members: ["p37_1"] heating_type: "PROPANE" @@ -772,7 +772,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s38: members: ["p38_1"] heating_type: "PROPANE" @@ -782,7 +782,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s39: members: ["p39_1"] heating_type: "PROPANE" @@ -792,7 +792,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s40: members: ["p40_1"] heating_type: "PROPANE" @@ -802,7 +802,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s41: members: ["p41_1"] heating_type: "PROPANE" @@ -812,7 +812,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s42: members: ["p42_1"] heating_type: "PROPANE" @@ -822,7 +822,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s43: members: ["p43_1"] heating_type: "PROPANE" @@ -832,7 +832,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s44: members: ["p44_1"] heating_type: "PROPANE" @@ -842,7 +842,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s45: members: ["p45_1"] heating_type: "PROPANE" @@ -852,7 +852,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s46: members: ["p46_1"] heating_type: "PROPANE" @@ -862,7 +862,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s47: members: ["p47_1"] heating_type: "PROPANE" @@ -872,7 +872,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s48: members: ["p48_1"] heating_type: "PROPANE" @@ -882,7 +882,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s49: members: ["p49_1"] heating_type: "PROPANE" @@ -892,7 +892,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s50: members: ["p50_1"] heating_type: "PROPANE" @@ -902,7 +902,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s51: members: ["p51_1"] heating_type: "PROPANE" @@ -912,7 +912,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s52: members: ["p52_1"] heating_type: "PROPANE" @@ -922,7 +922,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s53: members: ["p53_1"] heating_type: "PROPANE" @@ -932,7 +932,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s54: members: ["p54_1"] heating_type: "PROPANE" @@ -942,7 +942,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s55: members: ["p55_1"] heating_type: "PROPANE" @@ -952,7 +952,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s56: members: ["p56_1"] heating_type: "PROPANE" @@ -962,7 +962,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s57: members: ["p57_1"] heating_type: "PROPANE" @@ -972,7 +972,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s58: members: ["p58_1"] heating_type: "PROPANE" @@ -982,7 +982,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 households: h1: members: ["p1_1"] @@ -1297,7 +1297,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s2: members: ["p2_1"] heating_type: "PROPANE" @@ -1307,7 +1307,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s3: members: ["p3_1"] heating_type: "PROPANE" @@ -1317,7 +1317,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s4: members: ["p4_1"] heating_type: "PROPANE" @@ -1327,7 +1327,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s5: members: ["p5_1"] heating_type: "PROPANE" @@ -1337,7 +1337,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s6: members: ["p6_1"] heating_type: "PROPANE" @@ -1347,7 +1347,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s7: members: ["p7_1"] heating_type: "PROPANE" @@ -1357,7 +1357,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s8: members: ["p8_1"] heating_type: "PROPANE" @@ -1367,7 +1367,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s9: members: ["p9_1"] heating_type: "PROPANE" @@ -1377,7 +1377,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s10: members: ["p10_1"] heating_type: "PROPANE" @@ -1387,7 +1387,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s11: members: ["p11_1"] heating_type: "PROPANE" @@ -1397,7 +1397,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s12: members: ["p12_1"] heating_type: "PROPANE" @@ -1407,7 +1407,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s13: members: ["p13_1"] heating_type: "PROPANE" @@ -1417,7 +1417,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s14: members: ["p14_1"] heating_type: "PROPANE" @@ -1427,7 +1427,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s15: members: ["p15_1"] heating_type: "PROPANE" @@ -1437,7 +1437,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s16: members: ["p16_1"] heating_type: "PROPANE" @@ -1447,7 +1447,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s17: members: ["p17_1"] heating_type: "PROPANE" @@ -1457,7 +1457,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s18: members: ["p18_1"] heating_type: "PROPANE" @@ -1467,7 +1467,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s19: members: ["p19_1"] heating_type: "PROPANE" @@ -1477,7 +1477,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s20: members: ["p20_1"] heating_type: "PROPANE" @@ -1487,7 +1487,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s21: members: ["p21_1"] heating_type: "PROPANE" @@ -1497,7 +1497,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s22: members: ["p22_1"] heating_type: "PROPANE" @@ -1507,7 +1507,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s23: members: ["p23_1"] heating_type: "PROPANE" @@ -1517,7 +1517,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s24: members: ["p24_1"] heating_type: "PROPANE" @@ -1527,7 +1527,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s25: members: ["p25_1"] heating_type: "PROPANE" @@ -1537,7 +1537,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s26: members: ["p26_1"] heating_type: "PROPANE" @@ -1547,7 +1547,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s27: members: ["p27_1"] heating_type: "PROPANE" @@ -1557,7 +1557,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s28: members: ["p28_1"] heating_type: "PROPANE" @@ -1567,7 +1567,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s29: members: ["p29_1"] heating_type: "PROPANE" @@ -1577,7 +1577,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s30: members: ["p30_1"] heating_type: "PROPANE" @@ -1587,7 +1587,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s31: members: ["p31_1"] heating_type: "PROPANE" @@ -1597,7 +1597,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s32: members: ["p32_1"] heating_type: "PROPANE" @@ -1607,7 +1607,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s33: members: ["p33_1"] heating_type: "PROPANE" @@ -1617,7 +1617,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s34: members: ["p34_1"] heating_type: "PROPANE" @@ -1627,7 +1627,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s35: members: ["p35_1"] heating_type: "PROPANE" @@ -1637,7 +1637,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s36: members: ["p36_1"] heating_type: "PROPANE" @@ -1647,7 +1647,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s37: members: ["p37_1"] heating_type: "PROPANE" @@ -1657,7 +1657,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s38: members: ["p38_1"] heating_type: "PROPANE" @@ -1667,7 +1667,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s39: members: ["p39_1"] heating_type: "PROPANE" @@ -1677,7 +1677,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s40: members: ["p40_1"] heating_type: "PROPANE" @@ -1687,7 +1687,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s41: members: ["p41_1"] heating_type: "PROPANE" @@ -1697,7 +1697,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s42: members: ["p42_1"] heating_type: "PROPANE" @@ -1707,7 +1707,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s43: members: ["p43_1"] heating_type: "PROPANE" @@ -1717,7 +1717,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s44: members: ["p44_1"] heating_type: "PROPANE" @@ -1727,7 +1727,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s45: members: ["p45_1"] heating_type: "PROPANE" @@ -1737,7 +1737,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s46: members: ["p46_1"] heating_type: "PROPANE" @@ -1747,7 +1747,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s47: members: ["p47_1"] heating_type: "PROPANE" @@ -1757,7 +1757,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s48: members: ["p48_1"] heating_type: "PROPANE" @@ -1767,7 +1767,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s49: members: ["p49_1"] heating_type: "PROPANE" @@ -1777,7 +1777,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s50: members: ["p50_1"] heating_type: "PROPANE" @@ -1787,7 +1787,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s51: members: ["p51_1"] heating_type: "PROPANE" @@ -1797,7 +1797,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s52: members: ["p52_1"] heating_type: "PROPANE" @@ -1807,7 +1807,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s53: members: ["p53_1"] heating_type: "PROPANE" @@ -1817,7 +1817,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s54: members: ["p54_1"] heating_type: "PROPANE" @@ -1827,7 +1827,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s55: members: ["p55_1"] heating_type: "PROPANE" @@ -1837,7 +1837,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s56: members: ["p56_1"] heating_type: "PROPANE" @@ -1847,7 +1847,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s57: members: ["p57_1"] heating_type: "PROPANE" @@ -1857,7 +1857,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s58: members: ["p58_1"] heating_type: "PROPANE" @@ -1867,7 +1867,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 households: h1: members: ["p1_1"] @@ -2182,7 +2182,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s2: members: ["p2_1"] heating_type: "PROPANE" @@ -2192,7 +2192,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s3: members: ["p3_1"] heating_type: "PROPANE" @@ -2202,7 +2202,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s4: members: ["p4_1"] heating_type: "PROPANE" @@ -2212,7 +2212,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s5: members: ["p5_1"] heating_type: "PROPANE" @@ -2222,7 +2222,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s6: members: ["p6_1"] heating_type: "PROPANE" @@ -2232,7 +2232,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s7: members: ["p7_1"] heating_type: "PROPANE" @@ -2242,7 +2242,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s8: members: ["p8_1"] heating_type: "PROPANE" @@ -2252,7 +2252,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s9: members: ["p9_1"] heating_type: "PROPANE" @@ -2262,7 +2262,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s10: members: ["p10_1"] heating_type: "PROPANE" @@ -2272,7 +2272,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s11: members: ["p11_1"] heating_type: "PROPANE" @@ -2282,7 +2282,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s12: members: ["p12_1"] heating_type: "PROPANE" @@ -2292,7 +2292,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s13: members: ["p13_1"] heating_type: "PROPANE" @@ -2302,7 +2302,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s14: members: ["p14_1"] heating_type: "PROPANE" @@ -2312,7 +2312,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s15: members: ["p15_1"] heating_type: "PROPANE" @@ -2322,7 +2322,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s16: members: ["p16_1"] heating_type: "PROPANE" @@ -2332,7 +2332,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s17: members: ["p17_1"] heating_type: "PROPANE" @@ -2342,7 +2342,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s18: members: ["p18_1"] heating_type: "PROPANE" @@ -2352,7 +2352,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s19: members: ["p19_1"] heating_type: "PROPANE" @@ -2362,7 +2362,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s20: members: ["p20_1"] heating_type: "PROPANE" @@ -2372,7 +2372,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s21: members: ["p21_1"] heating_type: "PROPANE" @@ -2382,7 +2382,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s22: members: ["p22_1"] heating_type: "PROPANE" @@ -2392,7 +2392,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s23: members: ["p23_1"] heating_type: "PROPANE" @@ -2402,7 +2402,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s24: members: ["p24_1"] heating_type: "PROPANE" @@ -2412,7 +2412,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s25: members: ["p25_1"] heating_type: "PROPANE" @@ -2422,7 +2422,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s26: members: ["p26_1"] heating_type: "PROPANE" @@ -2432,7 +2432,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s27: members: ["p27_1"] heating_type: "PROPANE" @@ -2442,7 +2442,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s28: members: ["p28_1"] heating_type: "PROPANE" @@ -2452,7 +2452,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s29: members: ["p29_1"] heating_type: "PROPANE" @@ -2462,7 +2462,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s30: members: ["p30_1"] heating_type: "PROPANE" @@ -2472,7 +2472,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s31: members: ["p31_1"] heating_type: "PROPANE" @@ -2482,7 +2482,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s32: members: ["p32_1"] heating_type: "PROPANE" @@ -2492,7 +2492,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s33: members: ["p33_1"] heating_type: "PROPANE" @@ -2502,7 +2502,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s34: members: ["p34_1"] heating_type: "PROPANE" @@ -2512,7 +2512,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s35: members: ["p35_1"] heating_type: "PROPANE" @@ -2522,7 +2522,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s36: members: ["p36_1"] heating_type: "PROPANE" @@ -2532,7 +2532,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s37: members: ["p37_1"] heating_type: "PROPANE" @@ -2542,7 +2542,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s38: members: ["p38_1"] heating_type: "PROPANE" @@ -2552,7 +2552,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s39: members: ["p39_1"] heating_type: "PROPANE" @@ -2562,7 +2562,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s40: members: ["p40_1"] heating_type: "PROPANE" @@ -2572,7 +2572,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s41: members: ["p41_1"] heating_type: "PROPANE" @@ -2582,7 +2582,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s42: members: ["p42_1"] heating_type: "PROPANE" @@ -2592,7 +2592,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s43: members: ["p43_1"] heating_type: "PROPANE" @@ -2602,7 +2602,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s44: members: ["p44_1"] heating_type: "PROPANE" @@ -2612,7 +2612,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s45: members: ["p45_1"] heating_type: "PROPANE" @@ -2622,7 +2622,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s46: members: ["p46_1"] heating_type: "PROPANE" @@ -2632,7 +2632,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s47: members: ["p47_1"] heating_type: "PROPANE" @@ -2642,7 +2642,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s48: members: ["p48_1"] heating_type: "PROPANE" @@ -2652,7 +2652,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s49: members: ["p49_1"] heating_type: "PROPANE" @@ -2662,7 +2662,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s50: members: ["p50_1"] heating_type: "PROPANE" @@ -2672,7 +2672,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s51: members: ["p51_1"] heating_type: "PROPANE" @@ -2682,7 +2682,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s52: members: ["p52_1"] heating_type: "PROPANE" @@ -2692,7 +2692,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s53: members: ["p53_1"] heating_type: "PROPANE" @@ -2702,7 +2702,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s54: members: ["p54_1"] heating_type: "PROPANE" @@ -2712,7 +2712,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s55: members: ["p55_1"] heating_type: "PROPANE" @@ -2722,7 +2722,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s56: members: ["p56_1"] heating_type: "PROPANE" @@ -2732,7 +2732,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s57: members: ["p57_1"] heating_type: "PROPANE" @@ -2742,7 +2742,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s58: members: ["p58_1"] heating_type: "PROPANE" @@ -2752,7 +2752,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 households: h1: members: ["p1_1"] @@ -3067,7 +3067,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s2: members: ["p2_1"] heating_type: "PROPANE" @@ -3077,7 +3077,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s3: members: ["p3_1"] heating_type: "PROPANE" @@ -3087,7 +3087,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s4: members: ["p4_1"] heating_type: "PROPANE" @@ -3097,7 +3097,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s5: members: ["p5_1"] heating_type: "PROPANE" @@ -3107,7 +3107,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s6: members: ["p6_1"] heating_type: "PROPANE" @@ -3117,7 +3117,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s7: members: ["p7_1"] heating_type: "PROPANE" @@ -3127,7 +3127,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s8: members: ["p8_1"] heating_type: "PROPANE" @@ -3137,7 +3137,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s9: members: ["p9_1"] heating_type: "PROPANE" @@ -3147,7 +3147,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s10: members: ["p10_1"] heating_type: "PROPANE" @@ -3157,7 +3157,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s11: members: ["p11_1"] heating_type: "PROPANE" @@ -3167,7 +3167,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s12: members: ["p12_1"] heating_type: "PROPANE" @@ -3177,7 +3177,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s13: members: ["p13_1"] heating_type: "PROPANE" @@ -3187,7 +3187,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s14: members: ["p14_1"] heating_type: "PROPANE" @@ -3197,7 +3197,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s15: members: ["p15_1"] heating_type: "PROPANE" @@ -3207,7 +3207,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s16: members: ["p16_1"] heating_type: "PROPANE" @@ -3217,7 +3217,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s17: members: ["p17_1"] heating_type: "PROPANE" @@ -3227,7 +3227,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s18: members: ["p18_1"] heating_type: "PROPANE" @@ -3237,7 +3237,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s19: members: ["p19_1"] heating_type: "PROPANE" @@ -3247,7 +3247,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s20: members: ["p20_1"] heating_type: "PROPANE" @@ -3257,7 +3257,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s21: members: ["p21_1"] heating_type: "PROPANE" @@ -3267,7 +3267,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s22: members: ["p22_1"] heating_type: "PROPANE" @@ -3277,7 +3277,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s23: members: ["p23_1"] heating_type: "PROPANE" @@ -3287,7 +3287,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s24: members: ["p24_1"] heating_type: "PROPANE" @@ -3297,7 +3297,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s25: members: ["p25_1"] heating_type: "PROPANE" @@ -3307,7 +3307,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s26: members: ["p26_1"] heating_type: "PROPANE" @@ -3317,7 +3317,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s27: members: ["p27_1"] heating_type: "PROPANE" @@ -3327,7 +3327,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s28: members: ["p28_1"] heating_type: "PROPANE" @@ -3337,7 +3337,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s29: members: ["p29_1"] heating_type: "PROPANE" @@ -3347,7 +3347,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s30: members: ["p30_1"] heating_type: "PROPANE" @@ -3357,7 +3357,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s31: members: ["p31_1"] heating_type: "PROPANE" @@ -3367,7 +3367,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s32: members: ["p32_1"] heating_type: "PROPANE" @@ -3377,7 +3377,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s33: members: ["p33_1"] heating_type: "PROPANE" @@ -3387,7 +3387,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s34: members: ["p34_1"] heating_type: "PROPANE" @@ -3397,7 +3397,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s35: members: ["p35_1"] heating_type: "PROPANE" @@ -3407,7 +3407,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s36: members: ["p36_1"] heating_type: "PROPANE" @@ -3417,7 +3417,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s37: members: ["p37_1"] heating_type: "PROPANE" @@ -3427,7 +3427,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s38: members: ["p38_1"] heating_type: "PROPANE" @@ -3437,7 +3437,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s39: members: ["p39_1"] heating_type: "PROPANE" @@ -3447,7 +3447,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s40: members: ["p40_1"] heating_type: "PROPANE" @@ -3457,7 +3457,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s41: members: ["p41_1"] heating_type: "PROPANE" @@ -3467,7 +3467,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s42: members: ["p42_1"] heating_type: "PROPANE" @@ -3477,7 +3477,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s43: members: ["p43_1"] heating_type: "PROPANE" @@ -3487,7 +3487,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s44: members: ["p44_1"] heating_type: "PROPANE" @@ -3497,7 +3497,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s45: members: ["p45_1"] heating_type: "PROPANE" @@ -3507,7 +3507,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s46: members: ["p46_1"] heating_type: "PROPANE" @@ -3517,7 +3517,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s47: members: ["p47_1"] heating_type: "PROPANE" @@ -3527,7 +3527,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s48: members: ["p48_1"] heating_type: "PROPANE" @@ -3537,7 +3537,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s49: members: ["p49_1"] heating_type: "PROPANE" @@ -3547,7 +3547,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s50: members: ["p50_1"] heating_type: "PROPANE" @@ -3557,7 +3557,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s51: members: ["p51_1"] heating_type: "PROPANE" @@ -3567,7 +3567,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s52: members: ["p52_1"] heating_type: "PROPANE" @@ -3577,7 +3577,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s53: members: ["p53_1"] heating_type: "PROPANE" @@ -3587,7 +3587,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s54: members: ["p54_1"] heating_type: "PROPANE" @@ -3597,7 +3597,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s55: members: ["p55_1"] heating_type: "PROPANE" @@ -3607,7 +3607,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s56: members: ["p56_1"] heating_type: "PROPANE" @@ -3617,7 +3617,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s57: members: ["p57_1"] heating_type: "PROPANE" @@ -3627,7 +3627,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s58: members: ["p58_1"] heating_type: "PROPANE" @@ -3637,7 +3637,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 households: h1: members: ["p1_1"] @@ -3895,7 +3895,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 1 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s2: members: ["p2_1"] heating_type: "PROPANE" @@ -3905,7 +3905,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 2 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s3: members: ["p3_1"] heating_type: "PROPANE" @@ -3915,7 +3915,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 3 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s4: members: ["p4_1"] heating_type: "PROPANE" @@ -3925,7 +3925,7 @@ bottled_gas_expense: 1200 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 4 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 households: h1: members: ["p1_1"] @@ -3982,7 +3982,7 @@ bottled_gas_expense: 8000 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 2 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s2: members: ["p2_1", "p2_2", "p2_3", "p2_4", "p2_5", "p2_6"] heating_type: "PROPANE" @@ -3992,7 +3992,7 @@ bottled_gas_expense: 8000 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 2 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 s3: members: ["p3_1", "p3_2", "p3_3", "p3_4", "p3_5", "p3_6", "p3_7"] heating_type: "PROPANE" @@ -4002,7 +4002,7 @@ bottled_gas_expense: 8000 ca_liheap_liquid_heating_covered: true ca_liheap_energy_burden_group: 2 - ca_liheap_liquid_priority_points: 20 + ca_liheap_madera_priority_points: 20 households: h1: members: ["p1_1", "p1_2", "p1_3", "p1_4", "p1_5"] @@ -4050,5 +4050,33 @@ ca_liheap_countable_income: [12000, 12000, 12000, 12000] ca_liheap_household_size: [1, 1, 2, 2] ca_liheap_energy_burden_group: [4, 4, 4, 4] - ca_liheap_liquid_priority_points: [30, 30, 20, 30] + ca_liheap_madera_priority_points: [30, 30, 20, 30] ca_liheap_covered_liquid_heating: [621, 621, 535, 640] + +# Size 2 at $1,000 a month is group 1 (10 points); burden 2,040 / 12,000 = 17.00% +# is group 4 (10 points); a child aged 2 adds 10 + 5, for 35 points. +# Award: 411 + 19 + 105 + 105 = 640. The second 105 needs the under-6 trigger. +- name: "Case 14, a child under six alone triggers the vulnerable-member addition." + period: 2026 + input: + people: + person1: {"age": 30, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12_000} + person2: {"age": 2, "is_citizen_or_legal_immigrant": true, "ssi": 0} + spm_units: + spm_unit: + members: ["person1", "person2"] + heating_type: "PROPANE" + snap: 0 + tanf: 0 + ca_state_supplement: 0 + bottled_gas_expense: 2_040 + households: + household: + members: ["person1", "person2"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + output: + ca_liheap_income_group: 1 + ca_liheap_energy_burden_group: 4 + ca_liheap_madera_priority_points: 35 + ca_liheap_covered_liquid_heating: 640 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_utility_heating.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_utility_heating.yaml index 47a641e8569..8d54dbb9977 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_utility_heating.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_utility_heating.yaml @@ -1,7 +1,8 @@ # PDF pages 182-184,202-203,217-219,246-247,279 # https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=182 # Utility component only; unresolved regular WPO awards are not tested or denied. -# Every integrated award is calculated from raw facts, with no forced intermediates. +# Integrated awards are calculated from raw facts. The county-table cases supply +# Madera's priority points; Case 16 calculates them. - name: Case 1, every county utility table amount in poverty group 1. period: 2026 @@ -437,6 +438,7 @@ spm_unit20: members: [person20] heating_type: NATURAL_GAS + ca_liheap_madera_priority_points: 20 gas_expense: 100 snap: 0 tanf: 0 @@ -1494,6 +1496,7 @@ spm_unit20: members: [person20] heating_type: NATURAL_GAS + ca_liheap_madera_priority_points: 20 gas_expense: 100 snap: 0 tanf: 0 @@ -2551,6 +2554,7 @@ spm_unit20: members: [person20] heating_type: NATURAL_GAS + ca_liheap_madera_priority_points: 20 gas_expense: 100 snap: 0 tanf: 0 @@ -3608,6 +3612,7 @@ spm_unit20: members: [person20] heating_type: NATURAL_GAS + ca_liheap_madera_priority_points: 20 gas_expense: 100 snap: 0 tanf: 0 @@ -5014,8 +5019,8 @@ - name: Case 11, housing small bills and vulnerability do not add unsupported limits. period: 2026 # Alameda base 484 can exceed a 100 bill. Utility matrix has no separate - # vulnerability addition. Unsubsidized heat-in-rent is supported by proxy; - # subsidized rent needs a reported positive energy charge. NONE has no heat. + # vulnerability addition. Heat-in-rent is supported by proxy, subsidized or + # not (plan 2.3, guide 3.3). NONE has no heat. input: people: person1: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} @@ -5102,7 +5107,7 @@ state_code: CA county: ALAMEDA_COUNTY_CA output: - ca_liheap_utility_heating: [484, 484, 484, 0, 484, 0] + ca_liheap_utility_heating: [484, 484, 484, 484, 484, 0] # Guide pp. 264-265: a solar customer's energy cost is the electric and gas # charges, and an out-of-pocket cost is required. $1,000 a month is group 1 in @@ -5141,12 +5146,12 @@ ca_liheap_utility_eligible: [true, false] ca_liheap_utility_heating: [484, 0] -# Guide pp. 66, 193, 205: energy costs and electric or gas bills, with no +# Guide pp. 66, 193, 205, 221: energy costs and electric or gas bills, with no # primary-fuel condition. A subsidized tenant with gas heat in rent and an # electric bill, and an electric-heated home with only a gas bill, both get the -# group 1 Alameda $484. A propane home with only an electric bill keeps its own -# fuel test: not basic eligible, so $0. -- name: Case 13, gas and electric homes qualify on either utility bill while propane keeps its own bill. +# group 1 Alameda $484. A propane home with only an electric bill gets the +# group 1 Fresno $716 on that account. +- name: Case 13, every known fuel qualifies on either utility bill. period: 2026 absolute_error_margin: 0.01 input: @@ -5195,8 +5200,8 @@ state_code: CA county: FRESNO_COUNTY_CA output: - ca_liheap_basic_eligible: [true, true, false] - ca_liheap_utility_heating: [484, 484, 0] + ca_liheap_basic_eligible: [true, true, true] + ca_liheap_utility_heating: [484, 484, 716] # Guide p. 249. Wages 40,500 exceed the 39,979.92 one-person limit (p. 184); # after 1,000 of job expenses, 39,500 is 3,291.67 a month, group 4: Alameda $308. @@ -5242,3 +5247,186 @@ county: ALAMEDA_COUNTY_CA output: ca_liheap_utility_heating: [308, 0] + +# Contract 8.1.2 (p. 363) allows one HEAP or WPO payment, so HEAP pays only where +# the liquid and wood components are $0. Wages of $12,000 are group 1 throughout. +# Fresno has no liquid coverage, so the propane home takes HEAP on its electric +# bill. A wood home with an approved delivery takes that instead. Madera burden is +# 2,040 / 12,000 = 17%, for 10 + 10 = 20 points: with a $12 propane bill WPO pays +# 411 + 105 = 516; with no propane bill WPO pays nothing (contract 8.1.5.2, p. 364) +# and HEAP pays 702. NONE and UNSPECIFIED get $0 even with a utility bill. +- name: Case 15, another fuel takes the utility benefit only where no other component pays. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 12_000} + person2: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 12_000} + person3: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 12_000} + person4: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 12_000} + person5: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 12_000} + person6: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 12_000} + person7: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 12_000} + spm_units: + spm_unit1: + members: [person1] + heating_type: PROPANE + bottled_gas_expense: 600 + pre_subsidy_electricity_expense: 1_200 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: WOOD + pre_subsidy_electricity_expense: 1_200 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3] + heating_type: WOOD + pre_subsidy_electricity_expense: 1_200 + ca_liheap_approved_wood_delivery_cost: 600 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person4] + heating_type: PROPANE + bottled_gas_expense: 12 + pre_subsidy_electricity_expense: 2_028 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person5] + heating_type: PROPANE + pre_subsidy_electricity_expense: 2_040 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit6: + members: [person6] + heating_type: NONE + pre_subsidy_electricity_expense: 1_200 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit7: + members: [person7] + heating_type: UNSPECIFIED + pre_subsidy_electricity_expense: 1_200 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: FRESNO_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: FRESNO_COUNTY_CA + household3: + members: [person3] + state_code: CA + county: FRESNO_COUNTY_CA + household4: + members: [person4] + state_code: CA + county: MADERA_COUNTY_CA + household5: + members: [person5] + state_code: CA + county: MADERA_COUNTY_CA + household6: + members: [person6] + state_code: CA + county: ALAMEDA_COUNTY_CA + household7: + members: [person7] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_utility_heating: [716, 716, 0, 0, 702, 0, 0] + ca_liheap_wood_heating: [0, 0, 600, 0, 0, 0, 0] + ca_liheap_covered_liquid_heating: [0, 0, 0, 516, 0, 0, 0] + +# Madera packet pp. 189, 233-234 apply the 20-point minimum to HEAP. $2,500 a month +# is group 4 (4 points) and a 2% burden adds 4, so 8 points pay $0. At $1,000 a +# month, group 1 (10 points): a 17% burden adds 10, so 20 points pay 702; a 15% +# burden adds 8, so 18 points pay $0. A zero-income home has no burden group or +# points and stays at 702. Fresno has no recovered minimum: group 4, 434. +- name: Case 16, Madera's priority minimum applies to the utility benefit. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 30_000} + person2: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 12_000} + person3: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 12_000} + person4: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 0} + person5: {age: 40, is_citizen_or_legal_immigrant: true, ssi: 0, employment_income: 30_000} + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 600 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 2_040 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3] + heating_type: NATURAL_GAS + gas_expense: 1_800 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person4] + heating_type: NATURAL_GAS + gas_expense: 600 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person5] + heating_type: NATURAL_GAS + gas_expense: 600 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: MADERA_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: MADERA_COUNTY_CA + household3: + members: [person3] + state_code: CA + county: MADERA_COUNTY_CA + household4: + members: [person4] + state_code: CA + county: MADERA_COUNTY_CA + household5: + members: [person5] + state_code: CA + county: FRESNO_COUNTY_CA + output: + ca_liheap_energy_burden_group: [1, 4, 3, 0, 0] + ca_liheap_madera_priority_points: [8, 20, 18, 0, 0] + ca_liheap_utility_heating: [0, 702, 0, 702, 434] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.yaml index 35176d19e7a..169b572a91c 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.yaml @@ -8,8 +8,8 @@ # State-plan pp193/205/279: qualified adult, countable-income limit and # energy responsibility. Heat-in-rent without a separately supplied bill -# retains the existing unsubsidized-housing proxy; subsidized housing needs -# a positive reported charge. The 17-year-old is assumed not emancipated. +# qualifies, for subsidized tenants too (plan 2.3, guide 3.3). The 17-year-old +# is assumed not emancipated. # No fixture supplies a calculated CA LIHEAP intermediate. - name: "Case 1, shared income adult and energy responsibility requirements preserve utility behavior." period: 2026 @@ -168,7 +168,7 @@ state_code: "OR" county: "MULTNOMAH_COUNTY_OR" output: - ca_liheap_basic_eligible: [true, true, true, true, true, false, true, false, true, false, false, false] + ca_liheap_basic_eligible: [true, true, true, true, true, true, true, false, true, false, false, false] ca_liheap_utility_eligible: [false, false, true, true, false, false, false, false, false, false, false, false] # Only a positive approved WOOD delivery creates responsibility @@ -252,8 +252,8 @@ ca_liheap_wood_heating: [600, 0, 0, 0, 0, 0, 0] # Public housing is subsidized housing: heat in rent without a separate charge -# does not establish energy responsibility, while a positive reported propane -# charge does, as for voucher holders in Case 1 (s6 and s7). +# establishes energy responsibility, and so does a positive reported propane +# charge, as for voucher holders in Case 1 (s6 and s7). - name: Case 3, public housing follows the subsidized heat-in-rent rule. period: 2026 input: @@ -291,5 +291,5 @@ county: MADERA_COUNTY_CA is_in_public_housing: true output: - ca_liheap_basic_eligible: [false, true] + ca_liheap_basic_eligible: [true, true] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.yaml index 0037f24d790..782cce03ab4 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.yaml @@ -1,6 +1,6 @@ -# PDF pages 9,193,202-203,205,219,279 +# PDF pages 9,193,202-203,205,219,221,279 # https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=9 -# This gate covers gas, electric and solar utility heating. +# This gate covers the gas and electric accounts that take the utility benefit. - name: Case 1, a qualified adult applicant is required by the represented inputs. period: 2026 @@ -78,11 +78,11 @@ - name: Case 2, utility fuel housing and energy charges determine coverage. period: 2026 # Gas or electric heat needs a positive gas or electric bill, or the - # unsubsidized rent-inclusive proxy. A gas-heated home with only an electric - # bill qualifies (guide pp. 66, 193, 205). Subsidized housing with a positive - # reported charge qualifies. Propane has its own liquid-fuel component; its - # false utility gate is not a denial of that component. Unspecified fuel has - # no utility crosswalk. + # rent-inclusive proxy, subsidized or not (plan 2.3, guide 3.3). A gas-heated + # home with only an electric bill qualifies (guide pp. 66, 193, 205). A propane + # home with only its propane bill has no utility account to credit; its false + # utility gate is not a denial of the liquid component. Unspecified fuel has no + # utility crosswalk. input: people: person1: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} @@ -206,8 +206,142 @@ - true - true - true - - false + - true - true - false - false - false + +# Guide p. 221: the applicant names the utility account that takes the benefit, so +# any known fuel qualifies on a gas or electric bill. NONE and UNSPECIFIED do not. +# A wood home with an approved delivery takes that payment instead (contract +# 8.1.2, p. 363). Heat in rent gives a propane home no utility account. +- name: Case 3, a gas or electric bill opens the utility benefit to every known fuel. + period: 2026 + input: + people: + person1: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person2: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person3: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person4: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person5: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person6: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person7: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person8: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person9: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + person10: {age: 35, is_citizen_or_legal_immigrant: true, ssi: 0} + spm_units: + spm_unit1: + members: [person1] + heating_type: PROPANE + pre_subsidy_electricity_expense: 1_200 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: FUEL_OIL + gas_expense: 600 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit3: + members: [person3] + heating_type: KEROSENE + pre_subsidy_electricity_expense: 1_200 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit4: + members: [person4] + heating_type: COAL + gas_expense: 600 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit5: + members: [person5] + heating_type: WOOD + pre_subsidy_electricity_expense: 1_200 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit6: + members: [person6] + heating_type: OTHER + gas_expense: 600 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit7: + members: [person7] + heating_type: NONE + pre_subsidy_electricity_expense: 1_200 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit8: + members: [person8] + heating_type: UNSPECIFIED + pre_subsidy_electricity_expense: 1_200 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit9: + members: [person9] + heating_type: WOOD + pre_subsidy_electricity_expense: 1_200 + ca_liheap_approved_wood_delivery_cost: 600 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit10: + members: [person10] + heating_type: PROPANE + heat_expense_included_in_rent: true + snap: 0 + tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: ALAMEDA_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: ALAMEDA_COUNTY_CA + household3: + members: [person3] + state_code: CA + county: ALAMEDA_COUNTY_CA + household4: + members: [person4] + state_code: CA + county: ALAMEDA_COUNTY_CA + household5: + members: [person5] + state_code: CA + county: ALAMEDA_COUNTY_CA + household6: + members: [person6] + state_code: CA + county: ALAMEDA_COUNTY_CA + household7: + members: [person7] + state_code: CA + county: ALAMEDA_COUNTY_CA + household8: + members: [person8] + state_code: CA + county: ALAMEDA_COUNTY_CA + household9: + members: [person9] + state_code: CA + county: ALAMEDA_COUNTY_CA + household10: + members: [person10] + state_code: CA + county: ALAMEDA_COUNTY_CA + output: + ca_liheap_utility_eligible: [true, true, true, true, true, true, false, false, false, false] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.yaml index 3579528a181..309ca38eee7 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_earned_income.yaml @@ -113,3 +113,53 @@ county: ALAMEDA_COUNTY_CA output: ca_liheap_countable_earned_income: [39_500, 0] + +# Guide p. 231 counts all gross wages and p. 250 excludes only combat pay. $45,000 +# is above the $39,979.92 one-person limit, so San Diego pays $0. For two people, +# $30,000 is $2,500 a month, group 3: 362 + 19 = 381. +- name: Case 3, military basic pay counts as earned income. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 25 + is_citizen_or_legal_immigrant: true + ssi: 0 + military_basic_pay: 45_000 + person2: + age: 22 + is_citizen_or_legal_immigrant: true + ssi: 0 + military_basic_pay: 30_000 + person3: + age: 22 + is_citizen_or_legal_immigrant: true + ssi: 0 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2, person3] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: SAN_DIEGO_COUNTY_CA + household2: + members: [person2, person3] + state_code: CA + county: SAN_DIEGO_COUNTY_CA + output: + ca_liheap_countable_earned_income: [45_000, 30_000, 0] + ca_liheap_utility_heating: [0, 381] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.yaml index 401c869f8cd..4560789147f 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.yaml @@ -503,3 +503,54 @@ county: ALAMEDA_COUNTY_CA output: ca_liheap_countable_income: 6_000 + +# Guide pp. 233, 235 deduct Medicare premiums generally. With 20 quarters the 2026 +# Part A premium is 565 x 12 = 6,780 and Part B is 202.90 x 12 = 2,434.80, so +# 44,000 - 2,434.80 - 6,780 = 34,785.20, group 4, Fresno $434. Without the Part A +# deduction, 41,565.20 is above the $39,979.92 limit. A supplied direct total +# already includes Medicare: 44,000 - 1,200 = 42,800. +- name: Case 10, Part A premiums are deducted unless a direct total includes them. + period: 2026 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 70 + is_citizen_or_legal_immigrant: true + ssi: 0 + social_security_retirement: 44_000 + medicare_quarters_of_coverage: 20 + person2: + age: 70 + is_citizen_or_legal_immigrant: true + ssi: 0 + social_security_retirement: 44_000 + medicare_quarters_of_coverage: 20 + health_insurance_premiums: 1_200 + spm_units: + spm_unit1: + members: [person1] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + spm_unit2: + members: [person2] + heating_type: NATURAL_GAS + gas_expense: 1_200 + snap: 0 + tanf: 0 + ca_state_supplement: 0 + households: + household1: + members: [person1] + state_code: CA + county: FRESNO_COUNTY_CA + household2: + members: [person2] + state_code: CA + county: FRESNO_COUNTY_CA + output: + ca_liheap_countable_income: [34_785.20, 42_800] + ca_liheap_utility_heating: [434, 0] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/ca_liheap_liquid_priority_points.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/ca_liheap_madera_priority_points.yaml similarity index 97% rename from policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/ca_liheap_liquid_priority_points.yaml rename to policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/ca_liheap_madera_priority_points.yaml index 125126d8816..927f5f95b3e 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/ca_liheap_liquid_priority_points.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/payment/ca_liheap_madera_priority_points.yaml @@ -67,7 +67,7 @@ output: ca_liheap_income_group: [1, 2, 3, 4] ca_liheap_energy_burden_group: [2, 2, 2, 2] - ca_liheap_liquid_priority_points: [16, 14, 12, 10] + ca_liheap_madera_priority_points: [16, 14, 12, 10] # Income group 1 gives 10 points. The first six households have 10% burden # (1_200 / 12_000), group 1, adding 4. Under 3 adds 15, under 6 adds 10; @@ -188,7 +188,7 @@ ca_liheap_countable_income: [12_000, 12_000, 12_000, 12_000, 12_000, 12_000, 9_565.20, 9_565.20] ca_liheap_income_group: [1, 1, 1, 1, 1, 1, 1, 1] ca_liheap_energy_burden_group: [1, 1, 1, 1, 1, 1, 2, 2] - ca_liheap_liquid_priority_points: [29, 24, 24, 14, 14, 24, 26, 31] + ca_liheap_madera_priority_points: [29, 24, 24, 14, 14, 24, 26, 31] # Income10+burden4+young-child10+under3child5+elderly10+age70plus5 # +disability10=54. Two elders, two young children and two disabled people @@ -215,7 +215,7 @@ state_code: "CA" county: "MADERA_COUNTY_CA" output: - ca_liheap_liquid_priority_points: [54] + ca_liheap_madera_priority_points: [54] # Madera p191 awards disability points for a household member without an # adult or citizenship restriction; the size rule separately excludes the @@ -254,4 +254,4 @@ county: "MADERA_COUNTY_CA" output: ca_liheap_household_size: [2, 1] - ca_liheap_liquid_priority_points: [24, 24] + ca_liheap_madera_priority_points: [24, 24] diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.py b/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.py index f1f792d55f1..97c0784ddfe 100644 --- a/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.py +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.py @@ -11,7 +11,7 @@ class ca_liheap_covered_liquid_heating(Variable): ) defined_for = "ca_liheap_liquid_heating_covered" reference = ( - # PDF pages 10,185-188 + # PDF pages 10,185-188,364 "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=10", # PDF pages 191,233-234 "https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=191", @@ -43,14 +43,18 @@ def formula(spm_unit, period, parameters): + p.payment.liquid_burden_addition[burden_group] + p.payment.liquid_vulnerable_amount * vulnerable ) - eligible = spm_unit("ca_liheap_basic_eligible", period) & ( - spm_unit("ca_liheap_liquid_priority_points", period) - >= p.local.madera.minimum_points + # WPO pays the fuel vendor, so a utility bill alone does not qualify. + own_fuel_cost = (spm_unit("heating_expense", period) > 0) | spm_unit( + "heat_expense_included_in_rent", period + ) + eligible = ( + spm_unit("ca_liheap_basic_eligible", period) + & own_fuel_cost + & ( + spm_unit("ca_liheap_madera_priority_points", period) + >= p.local.madera.minimum_points + ) ) # Ordinary schedule only: no discretionary vendor-service supplement. # A zero with coverage=False is unsupported, not an entitlement denial. - return where( - eligible & supported_county, - min_(amount, p.payment.wpo_maximum), - 0, - ) + return where(eligible, min_(amount, p.payment.wpo_maximum), 0) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_utility_heating.py b/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_utility_heating.py index c1ef5e4da35..b996436f671 100644 --- a/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_utility_heating.py +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/ca_liheap_utility_heating.py @@ -22,6 +22,4 @@ def formula(spm_unit, period, parameters): base = p.utility_base_amount[safe_county][group] size = spm_unit("ca_liheap_household_size", period) extra_people = clip(size - 1, 0, p.maximum_payment_household_size - 1) - return where( - supported_county, base + p.additional_person_amount * extra_people, 0 - ) + return base + p.additional_person_amount * extra_people diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.py b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.py index 28f888bd596..adc83087201 100644 --- a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.py +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.py @@ -18,29 +18,20 @@ def formula(spm_unit, period, parameters): ) expense = spm_unit("heating_expense", period) heat_in_rent = spm_unit("heat_expense_included_in_rent", period) - subsidized = spm_unit( - "receives_housing_assistance", period - ) | spm_unit.household("is_in_public_housing", period) heating_type = spm_unit("heating_type", period) - # The guide asks for energy costs and pays electric or gas accounts, and - # no source requires a bill for the primary fuel. A gas, electric or - # solar home therefore qualifies on either utility bill. Other fuels - # keep their own bill: no source says whether a propane home may take - # the utility benefit on its electric account. - utility_heat = np.isin(heating_type.decode_to_str(), p.utility_heating_fuels) + # The guide asks for energy costs and pays electric or gas accounts, so + # a bill on either account is an energy cost whatever the heating fuel. utility_bills = add( spm_unit, period, ["pre_subsidy_electricity_expense", "gas_expense"] ) approved_wood_cost = (heating_type == heating_type.possible_values.WOOD) & ( spm_unit("ca_liheap_approved_wood_delivery_cost", period) > 0 ) - # Unsubsidized heat-in-rent is an energy-responsibility proxy; a - # separately reported charge also permits subsidized households. + # Heat in rent stands in for the documented charge of guide 3.3, for + # subsidized tenants too. A subsidized household with neither a bill nor + # heat in rent has no energy cost (guide 1.6). energy_cost = ( - (expense > 0) - | (utility_heat & (utility_bills > 0)) - | (heat_in_rent & ~subsidized) - | approved_wood_cost + (expense > 0) | (utility_bills > 0) | heat_in_rent | approved_wood_cost ) return ( energy_cost diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.py b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.py index 0b784a8af66..7b044a7b560 100644 --- a/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.py +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_utility_eligible.py @@ -7,11 +7,44 @@ class ca_liheap_utility_eligible(Variable): definition_period = YEAR label = "California LIHEAP utility heating eligibility" defined_for = StateCode.CA - # PDF pages 9,182-184,193,202-203,205,219,264-265,279 - reference = "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=9" + reference = ( + # PDF pages 9,182-184,193,202-203,205,219,221,264-265,279,363 + "https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=9", + # PDF pages 189,233-234 + "https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=189", + ) def formula(spm_unit, period, parameters): - p = parameters(period).gov.states.ca.csd.liheap.eligibility + p = parameters(period).gov.states.ca.csd.liheap heating_type = spm_unit("heating_type", period) - utility_heat = np.isin(heating_type.decode_to_str(), p.utility_heating_fuels) - return utility_heat & spm_unit("ca_liheap_basic_eligible", period) + types = heating_type.possible_values + utility_heat = np.isin( + heating_type.decode_to_str(), p.eligibility.utility_heating_fuels + ) + known_fuel = (heating_type != types.NONE) & (heating_type != types.UNSPECIFIED) + utility_bills = add( + spm_unit, period, ["pre_subsidy_electricity_expense", "gas_expense"] + ) + # The applicant names the utility account that takes the benefit, so a + # home heated with another fuel qualifies on a gas or electric bill. + utility_account = utility_heat | (known_fuel & (utility_bills > 0)) + # A household receives one HEAP or WPO payment per program year. + other_component = ( + add( + spm_unit, + period, + ["ca_liheap_covered_liquid_heating", "ca_liheap_wood_heating"], + ) + > 0 + ) + # Madera denies applicants below its minimum. Only its priority plan was + # recovered, and a home with no burden group has no points to test. + burden_group = spm_unit("ca_liheap_energy_burden_group", period) + points = spm_unit("ca_liheap_madera_priority_points", period) + meets_priority = (burden_group == 0) | (points >= p.local.madera.minimum_points) + return ( + spm_unit("ca_liheap_basic_eligible", period) + & utility_account + & ~other_component + & meets_priority + ) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.py b/policyengine_us/variables/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.py index 76952899253..0786305c04e 100644 --- a/policyengine_us/variables/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.py +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/income/ca_liheap_countable_income.py @@ -30,4 +30,13 @@ def formula(spm_unit, period, parameters): "pre_tax_health_insurance_premiums", ], ) - return max_(gross - support_paid - medical_premiums, 0) + # The guide deducts Medicare premiums generally. That aggregate omits + # Part A, and a supplied direct total already includes Medicare. + person = spm_unit.members + part_a_premium = where( + person("health_insurance_premiums", period) != 0, + 0, + person("medicare_part_a_premium", period), + ) + deductions = support_paid + medical_premiums + spm_unit.sum(part_a_premium) + return max_(gross - deductions, 0) diff --git a/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_liquid_priority_points.py b/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_madera_priority_points.py similarity index 73% rename from policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_liquid_priority_points.py rename to policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_madera_priority_points.py index cfe91c40403..ed327acb53f 100644 --- a/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_liquid_priority_points.py +++ b/policyengine_us/variables/gov/states/ca/csd/liheap/payment/ca_liheap_madera_priority_points.py @@ -1,29 +1,31 @@ from policyengine_us.model_api import * -class ca_liheap_liquid_priority_points(Variable): +class ca_liheap_madera_priority_points(Variable): value_type = int entity = SPMUnit definition_period = YEAR - label = "California LIHEAP priority points within supported liquid heating coverage" - defined_for = "ca_liheap_liquid_heating_covered" + label = "California LIHEAP Madera priority points (zero without a burden group)" + defined_for = StateCode.CA # PDF pages 189,191,233-234 reference = "https://maderacap.org/wp-content/uploads/2025/10/Agenda-and-Packet-for-October-9-2025-Updated.pdf#page=189" def formula(spm_unit, period, parameters): p = parameters(period).gov.states.ca.csd.liheap.local.madera income_group = max_(spm_unit("ca_liheap_income_group", period), 1) - burden_group = max_(spm_unit("ca_liheap_energy_burden_group", period), 1) + supported_burden_group = spm_unit("ca_liheap_energy_burden_group", period) + burden_group = max_(supported_burden_group, 1) age = spm_unit.members("age", period) # Categories apply once each to all members, including nonqualified # members. The two age scales include the overlapping age bonuses. child_points = p.child_points.calc(spm_unit.min(age)) elderly_points = p.elderly_points.calc(spm_unit.max(age)) disabled = add(spm_unit, period, ["is_disabled"]) > 0 - return ( + points = ( p.income_points[income_group] + p.burden_points[burden_group] + child_points + elderly_points + disabled * p.disability_points ) + return where(supported_burden_group > 0, points, 0) diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index df3c87cdddd..f9966fb87dc 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -1111,6 +1111,37 @@ candidates: - policyengine_us/parameters/gov/states/ca/csd/liheap/income/fpg_year_lag.yaml state: unreviewed note: PE-US applies the floor, rounded to cents with the statute's strict "less than" (ca_liheap_income_eligible.py). + No source prices a household the floor admits above the limit. It gets the group 4 amount, as guide p.218 pays a + categorical household above the limit, even where its income is below the poverty guideline. +- id: us-ca:liheap-subsidized-heat-in-rent + program: liheap + years: + from: 2026 + to: 2026 + type: federal-fiscal + question: Can a subsidized California tenant whose heat is included in rent, with no separate bill, receive LIHEAP? + sources: + - kind: plan + citation: California FY2026 LIHEAP State Plan, item 2.3, p.9 + url: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=9 + - kind: manual + citation: LIHEAP Eligibility and Verification Guide 1.6 and 3.3, plan pp.205, 279 + url: https://www.csd.ca.gov/Shared%20Documents/2026-Final-LIHEAP-State-Plan.pdf#page=205 + readings: + statute: No statute is supplied; guide 1.6 makes ineligible "Subsidized households that do not pay any out of pocket + energy costs". + other: Plan item 2.3 answers No to differing policies for renters in subsidized housing and renters with utilities in + rent. Guide 3.3 says "Applicants that pay their utility costs as a portion of their rent are eligible" and accepts + a "HUD or USDA statement showing zero utility allowance". + example: One Alameda adult with a Section 8 voucher, gas heat included in rent, no separate bill and wages of $12,000 + receives $484 under plan 2.3 and guide 3.3 and $0 if guide 1.6 reaches heat in rent. + pe_us: + follows: gap-fill + code: + - policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.py + state: ruled + note: 'Ruled 2026-11-03: follow plan 2.3 and guide 3.3. PE-US applies guide 1.6 only to a subsidized household with + neither a bill nor heat in rent.' - id: us-ca:premium-subsidy-150-fpl-boundary program: california-premium-subsidy years: From bc7d6b1942f6fc5237f02396464196b2ac93bb54 Mon Sep 17 00:00:00 2001 From: Ziming Date: Thu, 5 Nov 2026 13:20:12 -0500 Subject: [PATCH 6/6] Apply round 2 review fixes to California LIHEAP Co-Authored-By: Claude Opus 5.5 --- .../ca_liheap_covered_liquid_heating.yaml | 41 +++++++++++++++++++ source_conflicts/candidates.yaml | 4 ++ 2 files changed, 45 insertions(+) diff --git a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.yaml b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.yaml index 1308a69b1fa..8f82023accf 100644 --- a/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.yaml +++ b/policyengine_us/tests/policy/baseline/gov/states/ca/csd/liheap/ca_liheap_covered_liquid_heating.yaml @@ -4080,3 +4080,44 @@ ca_liheap_energy_burden_group: 4 ca_liheap_madera_priority_points: 35 ca_liheap_covered_liquid_heating: 640 + +# Heat in rent is the second half of WPO's own-fuel test. With no bills the burden +# is 0.00%, group 1 (4 points). $1,000 a month is group 1 (10 points) and age 60 +# adds 10, for 24 points: 411 + 0 + 105 = 516. A propane home has no utility +# account, so HEAP is 0. With electricity of $2,040 the burden is 17.00%, group 4: +# 10 + 10 = 20 points and 411 + 105 = 516, so WPO pays and HEAP stays at 0. +- name: "Case 15, heat in rent establishes the own-fuel cost for liquid heating." + period: 2026 + input: + people: + person1: {"age": 60, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12_000} + person2: {"age": 40, "is_citizen_or_legal_immigrant": true, "ssi": 0, "employment_income": 12_000} + spm_units: + spm_unit1: + members: ["person1"] + heating_type: "PROPANE" + snap: 0 + tanf: 0 + ca_state_supplement: 0 + heat_expense_included_in_rent: true + spm_unit2: + members: ["person2"] + heating_type: "PROPANE" + snap: 0 + tanf: 0 + ca_state_supplement: 0 + heat_expense_included_in_rent: true + pre_subsidy_electricity_expense: 2_040 + households: + household1: + members: ["person1"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + household2: + members: ["person2"] + state_code: "CA" + county: "MADERA_COUNTY_CA" + output: + ca_liheap_madera_priority_points: [24, 20] + ca_liheap_covered_liquid_heating: [516, 516] + ca_liheap_utility_heating: [0, 0] diff --git a/source_conflicts/candidates.yaml b/source_conflicts/candidates.yaml index b9a09d635ab..3ea506b75a5 100644 --- a/source_conflicts/candidates.yaml +++ b/source_conflicts/candidates.yaml @@ -1165,6 +1165,8 @@ candidates: - policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_income_eligible.py - policyengine_us/parameters/gov/hhs/liheap/fpg_floor.yaml - policyengine_us/parameters/gov/states/ca/csd/liheap/income/fpg_year_lag.yaml + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10607 state: unreviewed note: PE-US applies the floor, rounded to cents with the statute's strict "less than" (ca_liheap_income_eligible.py). No source prices a household the floor admits above the limit. It gets the group 4 amount, as guide p.218 pays a @@ -1195,6 +1197,8 @@ candidates: follows: gap-fill code: - policyengine_us/variables/gov/states/ca/csd/liheap/eligibility/ca_liheap_basic_eligible.py + prs: + - https://github.com/PolicyEngine/policyengine-us/pull/10607 state: ruled note: 'Ruled 2026-11-03: follow plan 2.3 and guide 3.3. PE-US applies guide 1.6 only to a subsidized household with neither a bill nor heat in rent.'