diff --git a/changelog.d/ar-ccap.added.md b/changelog.d/ar-ccap.added.md new file mode 100644 index 00000000000..fc1f53f1bc8 --- /dev/null +++ b/changelog.d/ar-ccap.added.md @@ -0,0 +1 @@ +Add Arkansas School Readiness Assistance (SRA) child care subsidy program. diff --git a/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml b/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml index 89dc3c0bef2..3cd1637b75f 100644 --- a/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml +++ b/policyengine_us/parameters/gov/hhs/ccdf/child_care_subsidy_programs.yaml @@ -1,6 +1,7 @@ description: The federal government counts these state programs as child care subsidies. values: 2021-01-01: + - ar_child_care_subsidies # Arkansas School Readiness Assistance - ca_child_care_subsidies # California Child Care - co_child_care_subsidies # Colorado Child Care Assistance Program - ct_child_care_subsidies # Connecticut Care 4 Kids diff --git a/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/activity_hours_ess_year_1.yaml b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/activity_hours_ess_year_1.yaml new file mode 100644 index 00000000000..8c8ab1cca07 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/activity_hours_ess_year_1.yaml @@ -0,0 +1,13 @@ +description: Arkansas requires at least one adult in an ESS Year 1 School Readiness Assistance household to engage in at least this many hours per week of work, education, or training. +values: + 2025-10-01: 20 + +metadata: + unit: hour + period: year + label: Arkansas SRA ESS Year 1 weekly activity hours + reference: + - title: FSU Procedural Manual (June 2023), Section 4.1.5.1 Employment + href: https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=16 + - title: OEC Rights & Responsibilities (Nov 2025) + href: https://dese.ade.arkansas.gov/Files/R_&_R__Nov_2025_(English)_(1)_OEC.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/activity_hours_ess_year_2.yaml b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/activity_hours_ess_year_2.yaml new file mode 100644 index 00000000000..ba700c3048c --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/activity_hours_ess_year_2.yaml @@ -0,0 +1,13 @@ +description: Arkansas requires at least one adult in an ESS Year 2 School Readiness Assistance household to engage in at least this many hours per week of work, education, or training. +values: + 2025-10-01: 25 + +metadata: + unit: hour + period: year + label: Arkansas SRA ESS Year 2 weekly activity hours + reference: + - title: FSU Procedural Manual (June 2023), Section 4.1.5.1 Employment + href: https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=16 + - title: OEC Rights & Responsibilities (Nov 2025) + href: https://dese.ade.arkansas.gov/Files/R_&_R__Nov_2025_(English)_(1)_OEC.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/activity_hours_li.yaml b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/activity_hours_li.yaml new file mode 100644 index 00000000000..112f427df19 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/activity_hours_li.yaml @@ -0,0 +1,13 @@ +description: Arkansas requires each adult in a Low-Income School Readiness Assistance household to engage in at least this many hours per week of work, education, or training. +values: + 2025-10-01: 30 + +metadata: + unit: hour + period: year + label: Arkansas SRA Low-Income weekly activity hours + reference: + - title: FSU Procedural Manual (June 2023), Section 4.1.5.1 Employment + href: https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=16 + - title: OEC Rights & Responsibilities (Nov 2025) + href: https://dese.ade.arkansas.gov/Files/R_&_R__Nov_2025_(English)_(1)_OEC.pdf#page=1 diff --git a/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/child_age_limit.yaml b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/child_age_limit.yaml new file mode 100644 index 00000000000..1ce2537e4f1 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/child_age_limit.yaml @@ -0,0 +1,13 @@ +description: Arkansas limits the School Readiness Assistance program to children younger than this age. +values: + 2025-10-01: 13 + +metadata: + unit: year + period: year + label: Arkansas SRA child age limit + reference: + - title: AR ADC 016.22.8 Section 3.1.4 Eligible Child / Date of Birth + href: https://www.publichealthlawcenter.org/sites/default/files/Arkansas%20Title%20016%20Division%2022%20Rule%208.pdf#page=11 + - title: FSU Procedural Manual (June 2023), Section 4.1 + href: https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=13 diff --git a/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/ess_window_months.yaml b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/ess_window_months.yaml new file mode 100644 index 00000000000..3c687043b14 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/ess_window_months.yaml @@ -0,0 +1,11 @@ +description: Arkansas restricts the ESS School Readiness Assistance track to families within this many months of exiting Transitional Employment Assistance. +values: + 2025-10-01: 24 + +metadata: + unit: month + period: year + label: Arkansas SRA ESS post-TEA window months + reference: + - title: FSU Procedural Manual (June 2023), Section 5.4.1 + href: https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=26 diff --git a/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/ess_year_1_window_months.yaml b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/ess_year_1_window_months.yaml new file mode 100644 index 00000000000..0e15b712cbd --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/ess_year_1_window_months.yaml @@ -0,0 +1,11 @@ +description: Arkansas defines the Employment-Sponsored Subsidy Year 1 window as this many months after Transitional Employment Assistance exit under the School Readiness Assistance program. +values: + 2025-10-01: 12 + +metadata: + unit: month + period: year + label: Arkansas SRA ESS Year 1 window months + reference: + - title: FSU Procedural Manual (June 2023), Section 4.1.5.1 Employment + href: https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=16 diff --git a/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/income_smi_rate.yaml b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/income_smi_rate.yaml new file mode 100644 index 00000000000..7717509723d --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/eligibility/income_smi_rate.yaml @@ -0,0 +1,13 @@ +description: Arkansas limits gross income to this share of the state median income under the School Readiness Assistance program. +values: + 2025-10-01: 0.85 + +metadata: + unit: /1 + period: year + label: Arkansas SRA income limit SMI rate + reference: + - title: Arkansas CCDF Plan 2025-2027, Section 2.2.4 + href: https://dese.ade.arkansas.gov/Files/2025-2027_CCDF_State_Plan_Final_4.26.24.1REV_OEC.pdf#page=22 + - title: ACF CCDF Family Income Eligibility Levels by State (Jan 2025) + href: https://acf.gov/sites/default/files/documents/occ/CCDF-Family-Income-Eligibility-Levels-by-State.pdf diff --git a/policyengine_us/parameters/gov/states/ar/ade/oec/sra/in_effect.yaml b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/in_effect.yaml new file mode 100644 index 00000000000..1dade55acd8 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/in_effect.yaml @@ -0,0 +1,19 @@ +description: Arkansas operates the School Readiness Assistance child care subsidy program if this is true. +# The SRA program legally launched 2025-10-01, but the Oct 2025 rate schedule +# (higher rates plus a one-month Quality Enhancement Payment) was replaced on +# 2025-11-01 by the rate sheet currently encoded. We gate the program to the +# Nov 1, 2025 rate-aligned period; the Oct 2025 transitional month is not +# modeled because its rates and QEP supplement are not in the parameter tree. +values: + 1900-01-01: false + 2025-11-01: true + +metadata: + unit: bool + period: year + label: Arkansas SRA in effect + reference: + - title: OEC Rights & Responsibilities (Nov 2025) + href: https://dese.ade.arkansas.gov/Files/R_&_R__Nov_2025_(English)_(1)_OEC.pdf#page=1 + - title: OEC SRA Announcement Regarding Rates and Copays Effective November 1 + href: https://dese.ade.arkansas.gov/Files/OEC_SRA_Announcement_Regarding_Rates_and_Copays_Effective_November_1_OEC.pdf diff --git a/policyengine_us/parameters/gov/states/ar/ade/oec/sra/income/excluded_sources.yaml b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/income/excluded_sources.yaml new file mode 100644 index 00000000000..5c83865c175 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/income/excluded_sources.yaml @@ -0,0 +1,32 @@ +description: Arkansas excludes these income sources from countable income under the School Readiness Assistance program. +values: + 2025-10-01: + # - tanf # Transitional Employment Assistance (TEA) payments + - child_support_received + - eitc # Tax refunds including EITC + # Children's SSI and Social Security are excluded; handled by the + # countable-income formula via age filter rather than by listing them. + # The following are also excluded per FSU Manual Section 4.3.3 + # but have no matching variables or do not need explicit listing: + # - Work Pays payments + # - Irregular non-recurring lump sums (Christmas bonuses, insurance, + # capital gains) + # - Earned/unearned income of children under 18 + # - Loans, grants, scholarships, work-study earnings + # - Graduate / doctoral education earnings + # - Montgomery GI Bill / VEAP educational income + # - Reimbursement of work-related expenses + # - Foster Care board payments + # - Adoption subsidy + # - HUD rental assistance value + # - Utility assistance value + # - Disaster assistance + # - Tribal income + +metadata: + unit: list + period: year + label: Arkansas SRA excluded income sources + reference: + - title: FSU Procedural Manual (June 2023), Section 4.3.3 Excluded Income + href: https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=20 diff --git a/policyengine_us/parameters/gov/states/ar/ade/oec/sra/income/sources.yaml b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/income/sources.yaml new file mode 100644 index 00000000000..3caf431eefd --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/income/sources.yaml @@ -0,0 +1,40 @@ +description: Arkansas counts these income sources for adults under the School Readiness Assistance program. +values: + 2025-10-01: + - employment_income + - self_employment_income + - tip_income + - social_security_retirement + - social_security_disability + - social_security_survivors + - ssi + - unemployment_compensation + - workers_compensation + - alimony_income + - pension_income + - interest_income + - dividend_income + - rental_income + - military_retirement_pay + - veterans_benefits + # The following are counted per FSU Procedural Manual Section 4.3.1-4.3.2 + # but have no matching variables: + # - PTO and stipends (VISTA, AmeriCorps, Job Corps, OJT) + # - regular bonuses, commissions + # - armed forces pay (other than retirement) + # - piece-rate, in-kind, contractual income + # - annuities, regular contributions + # Children's SSI and Social Security are excluded; the formula filters + # contributions by age before summing. + +metadata: + unit: list + period: year + label: Arkansas SRA countable income sources + reference: + - title: FSU Procedural Manual (June 2023), Section 4.3.1 Countable Earned Income + href: https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=19 + - title: FSU Procedural Manual (June 2023), Section 4.3.2 Countable Unearned Income + href: https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=20 + - title: Arkansas CCDF Plan 2025-2027, Section 2.2.4(c) Income Definition + href: https://dese.ade.arkansas.gov/Files/2025-2027_CCDF_State_Plan_Final_4.26.24.1REV_OEC.pdf#page=24 diff --git a/policyengine_us/parameters/gov/states/ar/ade/oec/sra/rates/age_category_months.yaml b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/rates/age_category_months.yaml new file mode 100644 index 00000000000..e4478691570 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/rates/age_category_months.yaml @@ -0,0 +1,32 @@ +description: Arkansas classifies children into these age categories by age in months for School Readiness Assistance rate lookup. Returned values match the integer index of the ar_sra_age_category enum (0=INFANT, 1=TODDLER, 2=PRESCHOOL, 3=SCHOOL_AGED). +# Age-category month boundaries are undocumented in Arkansas sources; +# these peer-state defaults (Infant <=17 mo, Toddler 18-35 mo, Preschool +# 36-71 mo, School-Aged 72+ mo) are flagged for future verification. + +brackets: + - threshold: + 2025-10-01: 0 + amount: + 2025-10-01: 0 # INFANT (0-17 months) + - threshold: + 2025-10-01: 18 + amount: + 2025-10-01: 1 # TODDLER (18-35 months) + - threshold: + 2025-10-01: 36 + amount: + 2025-10-01: 2 # PRESCHOOL (36-71 months) + - threshold: + 2025-10-01: 72 + amount: + 2025-10-01: 3 # SCHOOL_AGED (72+ months) + +metadata: + type: single_amount + threshold_unit: month + amount_unit: /1 + period: year + label: Arkansas SRA age category month thresholds + reference: + - title: FSU Procedural Manual (June 2023), Section 4.1 + href: https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=13 diff --git a/policyengine_us/parameters/gov/states/ar/ade/oec/sra/rates/base_rate.yaml b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/rates/base_rate.yaml new file mode 100644 index 00000000000..d522bdd701f --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/rates/base_rate.yaml @@ -0,0 +1,232 @@ +description: Arkansas provides these daily base reimbursement rates by zone, age category, care type, and time category under the School Readiness Assistance program. +metadata: + period: day + unit: currency-USD + label: Arkansas SRA daily base rates + breakdown: + - ar_sra_zone + - ar_sra_age_category + - ar_sra_care_type + - ar_sra_time_category + reference: + - title: SRA Sliding Fee Scale with Rates and Copays - Statewide Full Time (Nov 1, 2025) + href: https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Full_Time_20251101_OEC.pdf + - title: SRA Sliding Fee Scale with Rates and Copays - Statewide Part Time (Nov 1, 2025) + href: https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Part_Time_20251101_OEC.pdf + - title: SRA Sliding Fee Scale with Rates and Copays - Benton/Washington Full Time (Nov 1, 2025) + href: https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Benton-Washington_Co_Full_Time_20251101_OEC.pdf + - title: SRA Sliding Fee Scale with Rates and Copays - Benton/Washington Part Time (Nov 1, 2025) + href: https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Benton-Washington_Co_Part_Time_20251101_OEC.pdf + +BENTON_WASHINGTON: + INFANT: + REGULAR: + FULL_TIME: + 2025-11-01: 38.00 + PART_TIME: + 2025-11-01: 19.00 + NIGHT_WEEKEND: + FULL_TIME: + 2025-11-01: 41.80 + # Part-Time has no Night/Weekend row; uses regular Part-Time rate + PART_TIME: + 2025-11-01: 19.00 + SN1: + FULL_TIME: + 2025-11-01: 38.00 + PART_TIME: + 2025-11-01: 19.00 + SN2: + FULL_TIME: + 2025-11-01: 53.20 + PART_TIME: + 2025-11-01: 26.60 + SN3: + FULL_TIME: + 2025-11-01: 53.20 + PART_TIME: + 2025-11-01: 26.60 + TODDLER: + REGULAR: + FULL_TIME: + 2025-11-01: 37.00 + PART_TIME: + 2025-11-01: 18.50 + NIGHT_WEEKEND: + FULL_TIME: + 2025-11-01: 40.70 + PART_TIME: + 2025-11-01: 18.50 + SN1: + FULL_TIME: + 2025-11-01: 37.00 + PART_TIME: + 2025-11-01: 18.50 + SN2: + FULL_TIME: + 2025-11-01: 51.80 + PART_TIME: + 2025-11-01: 25.90 + SN3: + FULL_TIME: + 2025-11-01: 51.80 + PART_TIME: + 2025-11-01: 25.90 + PRESCHOOL: + REGULAR: + FULL_TIME: + 2025-11-01: 33.00 + PART_TIME: + 2025-11-01: 16.50 + NIGHT_WEEKEND: + FULL_TIME: + 2025-11-01: 36.30 + PART_TIME: + 2025-11-01: 16.50 + SN1: + FULL_TIME: + 2025-11-01: 33.00 + PART_TIME: + 2025-11-01: 16.50 + SN2: + FULL_TIME: + 2025-11-01: 46.20 + PART_TIME: + 2025-11-01: 23.10 + SN3: + FULL_TIME: + 2025-11-01: 46.20 + PART_TIME: + 2025-11-01: 23.10 + SCHOOL_AGED: + REGULAR: + FULL_TIME: + 2025-11-01: 28.00 + PART_TIME: + 2025-11-01: 14.00 + NIGHT_WEEKEND: + FULL_TIME: + 2025-11-01: 30.80 + PART_TIME: + 2025-11-01: 14.00 + SN1: + FULL_TIME: + 2025-11-01: 28.00 + PART_TIME: + 2025-11-01: 14.00 + SN2: + FULL_TIME: + 2025-11-01: 39.20 + PART_TIME: + 2025-11-01: 19.60 + SN3: + FULL_TIME: + 2025-11-01: 39.20 + PART_TIME: + 2025-11-01: 19.60 + +STATEWIDE: + INFANT: + REGULAR: + FULL_TIME: + 2025-11-01: 36.00 + PART_TIME: + 2025-11-01: 18.00 + NIGHT_WEEKEND: + FULL_TIME: + 2025-11-01: 39.60 + PART_TIME: + 2025-11-01: 18.00 + SN1: + FULL_TIME: + 2025-11-01: 36.00 + PART_TIME: + 2025-11-01: 18.00 + SN2: + FULL_TIME: + 2025-11-01: 50.40 + PART_TIME: + 2025-11-01: 25.20 + SN3: + FULL_TIME: + 2025-11-01: 50.40 + PART_TIME: + 2025-11-01: 25.20 + TODDLER: + REGULAR: + FULL_TIME: + 2025-11-01: 35.00 + PART_TIME: + 2025-11-01: 17.50 + NIGHT_WEEKEND: + FULL_TIME: + 2025-11-01: 38.50 + PART_TIME: + 2025-11-01: 17.50 + SN1: + FULL_TIME: + 2025-11-01: 35.00 + PART_TIME: + 2025-11-01: 17.50 + SN2: + FULL_TIME: + 2025-11-01: 49.00 + PART_TIME: + 2025-11-01: 24.50 + SN3: + FULL_TIME: + 2025-11-01: 49.00 + PART_TIME: + 2025-11-01: 24.50 + PRESCHOOL: + REGULAR: + FULL_TIME: + 2025-11-01: 33.00 + PART_TIME: + 2025-11-01: 16.50 + NIGHT_WEEKEND: + FULL_TIME: + 2025-11-01: 36.30 + PART_TIME: + 2025-11-01: 16.50 + SN1: + FULL_TIME: + 2025-11-01: 33.00 + PART_TIME: + 2025-11-01: 16.50 + SN2: + FULL_TIME: + 2025-11-01: 46.20 + PART_TIME: + 2025-11-01: 23.10 + SN3: + FULL_TIME: + 2025-11-01: 46.20 + PART_TIME: + 2025-11-01: 23.10 + SCHOOL_AGED: + REGULAR: + FULL_TIME: + 2025-11-01: 28.00 + PART_TIME: + 2025-11-01: 14.00 + NIGHT_WEEKEND: + FULL_TIME: + 2025-11-01: 30.80 + PART_TIME: + 2025-11-01: 14.00 + SN1: + FULL_TIME: + 2025-11-01: 28.00 + PART_TIME: + 2025-11-01: 14.00 + SN2: + FULL_TIME: + 2025-11-01: 39.20 + PART_TIME: + 2025-11-01: 19.60 + SN3: + FULL_TIME: + 2025-11-01: 39.20 + PART_TIME: + 2025-11-01: 19.60 diff --git a/policyengine_us/parameters/gov/states/ar/ade/oec/sra/rates/full_time_hours_threshold.yaml b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/rates/full_time_hours_threshold.yaml new file mode 100644 index 00000000000..0876dbc530b --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/rates/full_time_hours_threshold.yaml @@ -0,0 +1,16 @@ +description: Arkansas classifies child care attendance as full-time under the School Readiness Assistance program when weekly hours meet or exceed this threshold. +# The full-time vs part-time hour cut-point is undocumented in Arkansas +# sources; this 30-hour default mirrors peer-state conventions (NH uses +# 31+ hours for FT; RI uses 30/45) and is flagged for future verification. +values: + 2025-10-01: 30 + +metadata: + unit: hour + period: year + label: Arkansas SRA full-time weekly hours threshold + reference: + - title: SRA Sliding Fee Scale with Rates and Copays - Statewide Full Time (Nov 1, 2025) + href: https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Full_Time_20251101_OEC.pdf + - title: SRA Sliding Fee Scale with Rates and Copays - Statewide Part Time (Nov 1, 2025) + href: https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Part_Time_20251101_OEC.pdf diff --git a/policyengine_us/parameters/gov/states/ar/ade/oec/sra/rates/no_copay_smi_threshold.yaml b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/rates/no_copay_smi_threshold.yaml new file mode 100644 index 00000000000..3404231688b --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/rates/no_copay_smi_threshold.yaml @@ -0,0 +1,13 @@ +description: Arkansas waives the family copay under the School Readiness Assistance program for non-school-aged children whose family income is at or below this share of the state median income. +values: + 2025-11-01: 0.40 + +metadata: + unit: /1 + period: year + label: Arkansas SRA no-copay SMI threshold + reference: + - title: SRA Sliding Fee Scale with Rates and Copays - Statewide Full Time (Nov 1, 2025) + href: https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Full_Time_20251101_OEC.pdf + - title: SRA Sliding Fee Scale with Rates and Copays - Statewide Part Time (Nov 1, 2025) + href: https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Part_Time_20251101_OEC.pdf diff --git a/policyengine_us/parameters/gov/states/ar/ade/oec/sra/rates/partial_subsidy_smi_threshold.yaml b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/rates/partial_subsidy_smi_threshold.yaml new file mode 100644 index 00000000000..0514291e5e2 --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/rates/partial_subsidy_smi_threshold.yaml @@ -0,0 +1,13 @@ +description: Arkansas classifies families in the partial-subsidy income tier under the School Readiness Assistance program when their income is above the no-copay threshold and at or below this share of the state median income; above this share families fall in the highest-copay tier. +values: + 2025-11-01: 0.60 + +metadata: + unit: /1 + period: year + label: Arkansas SRA partial-subsidy SMI threshold + reference: + - title: SRA Sliding Fee Scale with Rates and Copays - Statewide Full Time (Nov 1, 2025) + href: https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Full_Time_20251101_OEC.pdf + - title: SRA Sliding Fee Scale with Rates and Copays - Statewide Part Time (Nov 1, 2025) + href: https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Part_Time_20251101_OEC.pdf diff --git a/policyengine_us/parameters/gov/states/ar/ade/oec/sra/rates/state_share_by_tier.yaml b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/rates/state_share_by_tier.yaml new file mode 100644 index 00000000000..dac09797fae --- /dev/null +++ b/policyengine_us/parameters/gov/states/ar/ade/oec/sra/rates/state_share_by_tier.yaml @@ -0,0 +1,79 @@ +description: Arkansas pays this share of the daily base rate by age category, time category, and family income tier (% SMI) under the School Readiness Assistance program. +metadata: + period: day + unit: /1 + label: Arkansas SRA state-share rate by income tier + breakdown: + - ar_sra_age_category + - ar_sra_time_category + - ar_sra_income_tier + reference: + - title: SRA Sliding Fee Scale with Rates and Copays - Statewide Full Time (Nov 1, 2025) + href: https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Full_Time_20251101_OEC.pdf + - title: SRA Sliding Fee Scale with Rates and Copays - Statewide Part Time (Nov 1, 2025) + href: https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Part_Time_20251101_OEC.pdf + - title: SRA Sliding Fee Scale with Rates and Copays - Benton/Washington Full Time (Nov 1, 2025) + href: https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Benton-Washington_Co_Full_Time_20251101_OEC.pdf + - title: SRA Sliding Fee Scale with Rates and Copays - Benton/Washington Part Time (Nov 1, 2025) + href: https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Benton-Washington_Co_Part_Time_20251101_OEC.pdf + +INFANT: + FULL_TIME: + LE_40: + 2025-11-01: 1.00 + GT_40_LE_60: + 2025-11-01: 0.80 + GT_60: + 2025-11-01: 0.70 + PART_TIME: + LE_40: + 2025-11-01: 1.00 + GT_40_LE_60: + 2025-11-01: 0.70 + GT_60: + 2025-11-01: 0.60 +TODDLER: + FULL_TIME: + LE_40: + 2025-11-01: 1.00 + GT_40_LE_60: + 2025-11-01: 0.80 + GT_60: + 2025-11-01: 0.70 + PART_TIME: + LE_40: + 2025-11-01: 1.00 + GT_40_LE_60: + 2025-11-01: 0.60 + GT_60: + 2025-11-01: 0.50 +PRESCHOOL: + FULL_TIME: + LE_40: + 2025-11-01: 1.00 + GT_40_LE_60: + 2025-11-01: 0.70 + GT_60: + 2025-11-01: 0.60 + PART_TIME: + LE_40: + 2025-11-01: 1.00 + GT_40_LE_60: + 2025-11-01: 0.60 + GT_60: + 2025-11-01: 0.50 +SCHOOL_AGED: + FULL_TIME: + LE_40: + 2025-11-01: 0.80 + GT_40_LE_60: + 2025-11-01: 0.50 + GT_60: + 2025-11-01: 0.30 + PART_TIME: + LE_40: + 2025-11-01: 0.70 + GT_40_LE_60: + 2025-11-01: 0.50 + GT_60: + 2025-11-01: 0.30 diff --git a/policyengine_us/programs.yaml b/policyengine_us/programs.yaml index 76b5377b5f3..bd546befdf1 100644 --- a/policyengine_us/programs.yaml +++ b/policyengine_us/programs.yaml @@ -460,8 +460,14 @@ programs: category: Benefits agency: HHS status: partial - coverage: CA, CO, CT, DE, DC, IL, MA, MD, ME, NC, NH, NJ, PA, RI, SC, TX, VA, VT, WV + coverage: AR, CA, CO, CT, DE, DC, IL, MA, MD, ME, NC, NH, NJ, PA, RI, SC, TX, VA, VT, WV state_implementations: + - state: AR + status: complete + name: Arkansas SRA + full_name: Arkansas School Readiness Assistance + variable: ar_sra + parameter_prefix: gov.states.ar.ade.oec.sra - state: CA status: complete name: CalWORKs childcare diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_age_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_age_eligible.yaml new file mode 100644 index 00000000000..b719675538f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_age_eligible.yaml @@ -0,0 +1,67 @@ +- name: Case 1, child age 5 is under 13 and age-eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_age_eligible: [false, true] + +- name: Case 2, child age 12 at boundary is age-eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 35 + person2: + age: 12 + is_tax_unit_dependent: true + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_age_eligible: [false, true] + +- name: Case 3, child age 13 is not age-eligible (strict less than). + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 40 + person2: + age: 13 + is_tax_unit_dependent: true + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_age_eligible: [false, false] + +- name: Case 4, infant age 0 is age-eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 28 + person2: + age: 0 + is_tax_unit_dependent: true + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_age_eligible: [false, true] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_child_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_child_eligible.yaml new file mode 100644 index 00000000000..1c8fdda467c --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_child_eligible.yaml @@ -0,0 +1,85 @@ +# Eligible-child test: age < 13 AND tax-unit dependent AND immigration-eligible. + +- name: Case 1, citizen child age 5 who is a dependent is eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_child_eligible: [false, true] + +- name: Case 2, child age 13 is not age-eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 35 + person2: + age: 13 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_child_eligible: [false, false] + +- name: Case 3, undocumented child is not immigration-eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 5 + is_tax_unit_dependent: true + immigration_status: UNDOCUMENTED + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_child_eligible: [false, false] + +- name: Case 4, refugee child age 4 is eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 28 + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: REFUGEE + tax_units: + tax_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_child_eligible: [false, true] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_eligible.yaml new file mode 100644 index 00000000000..7b8161e41fd --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_eligible.yaml @@ -0,0 +1,144 @@ +# Overall SRA eligibility = in_effect AND has_eligible_child AND income-eligible +# AND asset-eligible AND (LI activity OR ESS) AND state_code == AR. + +- name: Case 1, all eligibility components met under the LI track. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + weekly_hours_worked: 35 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + is_ar_sra_eligible: true + +- name: Case 2, household income above 85 percent SMI fails eligibility. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + weekly_hours_worked: 35 + # Well above the 85% SMI annual cap of ~$52,182 for a family of 2 + employment_income: 100_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + is_ar_sra_eligible: false + +- name: Case 3, no eligible child fails eligibility. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + weekly_hours_worked: 35 + employment_income: 20_000 + immigration_status: CITIZEN + spm_units: + spm_unit: + members: [person1] + households: + household: + members: [person1] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + is_ar_sra_eligible: false + +- name: Case 4, parent activity below LI threshold and no ESS track fails eligibility. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + weekly_hours_worked: 20 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + was_tea_recipient: false + households: + household: + members: [person1, person2] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + is_ar_sra_eligible: false + +- name: Case 5, ESS track 20 hours per week makes household eligible even below LI threshold. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 28 + weekly_hours_worked: 20 + employment_income: 15_000 + immigration_status: CITIZEN + person2: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + was_tea_recipient: true + months_since_tea_exit: 6 + ar_tea: 0 + households: + household: + members: [person1, person2] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + is_ar_sra_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_ess_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_ess_eligible.yaml new file mode 100644 index 00000000000..7b9f419a475 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_ess_eligible.yaml @@ -0,0 +1,122 @@ +# ESS eligibility: family must have exited TEA within the 24-month window +# AND not currently receiving TEA AND meet the year-specific activity hour +# threshold (20 hr/wk Yr1, 25 hr/wk Yr2). + +- name: Case 1, post-TEA family 6 months out with 20 hours per week is ESS-eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 28 + weekly_hours_worked: 20 + person2: + age: 2 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + was_tea_recipient: true + months_since_tea_exit: 6 + ar_tea: 0 + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_ess_eligible: true + +- name: Case 2, family currently receiving TEA is not ESS-eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 28 + weekly_hours_worked: 25 + # Force ar_tea > 0 by setting a recipient flag below + person2: + age: 2 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + was_tea_recipient: true + months_since_tea_exit: 6 + ar_tea: 200 + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_ess_eligible: false + +- name: Case 3, post-TEA family 30 months out is past the 24-month window and not ESS-eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 28 + weekly_hours_worked: 25 + person2: + age: 2 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + was_tea_recipient: true + months_since_tea_exit: 30 + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_ess_eligible: false + +- name: Case 4, family that never received TEA is not ESS-eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 28 + weekly_hours_worked: 25 + person2: + age: 2 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + was_tea_recipient: false + months_since_tea_exit: 0 + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_ess_eligible: false + +- name: Case 5, ESS Year 2 family with 25 hours per week is ESS-eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 28 + weekly_hours_worked: 25 + person2: + age: 2 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + was_tea_recipient: true + months_since_tea_exit: 18 + ar_tea: 0 + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_ess_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_in_effect.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_in_effect.yaml new file mode 100644 index 00000000000..7096e74cf53 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_in_effect.yaml @@ -0,0 +1,91 @@ +# SRA program is in effect from 2025-10-01 forward. +# The in_effect parameter gates ar_sra_eligible at the top level. +# This test verifies the gate by constructing an otherwise-eligible +# household in different periods. + +- name: Case 1, period 2025-01 is before SRA effective date so household is not eligible. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + weekly_hours_worked: 35 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + is_ar_sra_eligible: false + +- name: Case 2, period 2026-01 is the SRA effective date and household is eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + weekly_hours_worked: 35 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + is_ar_sra_eligible: true + +- name: Case 3, period 2026-01 is well within the SRA era and household is eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + weekly_hours_worked: 35 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + is_ar_sra_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_income_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_income_eligible.yaml new file mode 100644 index 00000000000..f13396bfaf7 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_income_eligible.yaml @@ -0,0 +1,112 @@ +# Arkansas SMI for FFY 2026 is uprated automatically in PolicyEngine. +# AR base amount at 2026-01-01 (after uprating): $95,201.95 +# Household-size adjustment for 2 persons: 0.52 + 0.16 = 0.68 +# SMI(2) annual = 95,201.95 * 0.68 = $64,737.33 +# 85% income limit annual = $64,737.33 * 0.85 = $55,026.73 + +- name: Case 1, family income at 84.9 percent SMI is income-eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + # 64,737.33 * 0.849 = $54,961.99 (below 85% SMI) + employment_income: 54_961 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_income_eligible: true + +- name: Case 2, family income just at 85 percent SMI is income-eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + # 64,737.33 * 0.85 = $55,026.73; use 55,026.72 to avoid float32 + # round-trip precision loss during MONTH/YEAR conversion. + employment_income: 55_026.72 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_income_eligible: true + +- name: Case 3, family income at 85.1 percent SMI is not income-eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + # 64,737.33 * 0.851 = $55,091.46 (above 85% SMI) + employment_income: 55_092 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_income_eligible: false + +- name: Case 4, family with zero income is income-eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_income_eligible: true diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_li_activity_eligible.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_li_activity_eligible.yaml new file mode 100644 index 00000000000..a915089fe93 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/eligibility/ar_sra_li_activity_eligible.yaml @@ -0,0 +1,113 @@ +# LI activity requirement: each adult head/spouse must engage in +# >=30 hr/wk of work, education, or full-time study. + +- name: Case 1, single parent works 30 hours per week exactly is activity-eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + weekly_hours_worked: 30 + person2: + age: 4 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_li_activity_eligible: true + +- name: Case 2, single parent works 29 hours per week is not activity-eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + weekly_hours_worked: 29 + person2: + age: 4 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_li_activity_eligible: false + +- name: Case 3, single parent works 31 hours per week is activity-eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + weekly_hours_worked: 31 + person2: + age: 4 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + is_ar_sra_li_activity_eligible: true + +- name: Case 4, two parents both at or above 30 hours per week are activity-eligible. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 32 + weekly_hours_worked: 30 + person2: + age: 30 + weekly_hours_worked: 35 + person3: + age: 4 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: AR + output: + is_ar_sra_li_activity_eligible: true + +- name: Case 5, two-parent household with one parent below threshold fails activity test. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 32 + weekly_hours_worked: 35 + person2: + age: 30 + weekly_hours_worked: 20 + person3: + age: 4 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: AR + output: + is_ar_sra_li_activity_eligible: false diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/income/ar_sra_countable_income.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/income/ar_sra_countable_income.yaml new file mode 100644 index 00000000000..9734368474f --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/income/ar_sra_countable_income.yaml @@ -0,0 +1,93 @@ +# Arkansas SRA countable income sums the parameterized list of income +# sources across adults only; income of children (<18) is excluded. +# The variable is MONTH-defined; YEAR-period income sources (e.g., +# employment_income) are auto-divided by 12 when accessed monthly. + +- name: Case 1, parent employment income is fully counted (annual $30,000 = $2,500/month). + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 30_000 + person2: + age: 4 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_sra_countable_income: 2_500 + +- name: Case 2, child SSI is excluded (annual $25,000 parent earnings = $2,083.33/month). + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + employment_income: 25_000 + person2: + age: 8 + is_tax_unit_dependent: true + ssi: 9_000 + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + # Only parent's $25,000 annual counts; child's SSI is excluded. + # Monthly: 25,000 / 12 = $2,083.33 + ar_sra_countable_income: 2_083.33 + +- name: Case 3, two adults combine earnings (annual $40,000 = $3,333.33/month). + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 32 + employment_income: 22_000 + person2: + age: 30 + employment_income: 18_000 + person3: + age: 3 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2, person3] + households: + household: + members: [person1, person2, person3] + state_code: AR + output: + ar_sra_countable_income: 3_333.33 + +- name: Case 4, zero-income family produces zero countable income. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + person2: + age: 4 + is_tax_unit_dependent: true + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_sra_countable_income: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/integration.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/integration.yaml new file mode 100644 index 00000000000..15eb8354583 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/integration.yaml @@ -0,0 +1,304 @@ +# Arkansas SRA integration tests +# +# Reference parameters (Nov 1, 2025 rate sheet): +# AR SMI (FFY 2026, 4-person, 2025-10-01): $90,280/year +# SMI(2)=90,280*0.68=$61,390.40; SMI(3)=90,280*0.84=$75,835.20 +# 85% income limit: SMI*0.85 +# +# Income tier brackets (% SMI): LE_40 (<=40), GT_40_LE_60 (4060) +# Daily base rates (Statewide REGULAR): Infant FT $36, Toddler FT $35, +# Preschool FT $33, School-Aged FT $28; PT half (Infant $18, Toddler $17.50, +# Preschool $16.50, School-Aged $14). +# Daily base rates (Benton/Washington REGULAR): Infant FT $38, Toddler FT $37, +# Preschool FT $33, School-Aged FT $28; PT (Infant $19, Toddler $18.50, etc.). +# State share % by (age_category, time, tier): +# Toddler/Preschool/Infant FT: 1.00 / 0.80 / 0.70 (Preschool FT mid-tier 0.70) +# School-Aged FT: 0.80 / 0.50 / 0.30 (always copay) +# +# All scenarios use childcare_attending_days_per_month = 22 (typical weekday count). +# Pre-subsidy expenses are set high enough that the state-payment cap binds. + +- name: Case 1, LI single mother, 1 toddler, full-time, Statewide. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 28 + weekly_hours_worked: 35 + # 90,280 * 0.68 * 0.50 = $30,695 (50% SMI -> GT_40_LE_60 tier) + employment_income: 30_695 + immigration_status: CITIZEN + person2: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 22 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + is_ar_sra_eligible: true + # Toddler, Statewide, FT, GT_40_LE_60: + # base = $35, share = 0.80, daily state payment = $28.00 + # monthly state payment = 28 * 22 = $616 + ar_sra: 616 + +- name: Case 2, LI two-parent, 1 infant, full-time, Benton/Washington zone. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 32 + weekly_hours_worked: 30 + # 90,280 * 0.84 * 0.80 = $60,668 (80% SMI of 3-person SMI -> GT_60 tier) + employment_income: 60_668 + immigration_status: CITIZEN + person2: + age: 30 + weekly_hours_worked: 30 + immigration_status: CITIZEN + person3: + age: 0 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 22 + tax_units: + tax_unit: + members: [person1, person2, person3] + spm_units: + spm_unit: + members: [person1, person2, person3] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2, person3] + state_code: AR + county_str: BENTON_COUNTY_AR + output: + is_ar_sra_eligible: true + # Infant, Benton/Washington, FT, GT_60: + # base = $38, share = 0.70, daily state payment = $26.60 + # monthly state payment = 26.60 * 22 = $585.20 + ar_sra: 585.20 + +- name: Case 3, LI single parent, 1 preschooler, FT, Statewide, no-copay floor at LE_40. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 28 + weekly_hours_worked: 35 + # 90,280 * 0.68 * 0.35 = $21,486.66 (35% SMI -> LE_40 tier) + employment_income: 21_487 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 22 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + is_ar_sra_eligible: true + # Preschool, Statewide, FT, LE_40 (no-copay tier): + # base = $33, share = 1.00, daily state payment = $33.00 + # monthly state payment = 33 * 22 = $726 + ar_sra: 726 + +- name: Case 4, ESS Year 1 (post-TEA 6 months, 22 hr/wk), 1 toddler, FT, Statewide. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 26 + weekly_hours_worked: 22 + # 90,280 * 0.68 * 0.30 = $18,417 (30% SMI -> LE_40 tier) + employment_income: 18_417 + immigration_status: CITIZEN + person2: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 22 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + was_tea_recipient: true + months_since_tea_exit: 6 + ar_tea: 0 + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + is_ar_sra_eligible: true + # Toddler, Statewide, FT, LE_40 (no-copay tier): + # base = $35, share = 1.00, daily state payment = $35.00 + # monthly state payment = 35 * 22 = $770 + ar_sra: 770 + +- name: Case 5, ESS Year 2 (post-TEA 18 months, 26 hr/wk), 1 toddler, FT, Statewide. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 27 + weekly_hours_worked: 26 + # 90,280 * 0.68 * 0.45 = $27,625.69 (45% SMI -> GT_40_LE_60 tier) + employment_income: 27_626 + immigration_status: CITIZEN + person2: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 22 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + was_tea_recipient: true + months_since_tea_exit: 18 + ar_tea: 0 + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + is_ar_sra_eligible: true + # Toddler, Statewide, FT, GT_40_LE_60: + # base = $35, share = 0.80, daily state payment = $28.00 + # monthly state payment = 28 * 22 = $616 + ar_sra: 616 + +- name: Case 6, family income above 85 percent SMI gets zero benefit. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + weekly_hours_worked: 35 + # Well above 85% SMI annual cap + employment_income: 100_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 22 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + is_ar_sra_eligible: false + ar_sra: 0 + +- name: Case 7, AR resident in pre-SRA period gets zero benefit. + period: 2025-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + weekly_hours_worked: 35 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 22 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + is_ar_sra_eligible: false + ar_sra: 0 + +- name: Case 8, non-AR household (state_code CA) gets zero benefit despite otherwise meeting criteria. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + weekly_hours_worked: 35 + employment_income: 20_000 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + childcare_attending_days_per_month: 22 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + spm_unit_pre_subsidy_childcare_expenses: 20_000 + households: + household: + members: [person1, person2] + state_code: CA + output: + ar_sra: 0 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_age_category.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_age_category.yaml new file mode 100644 index 00000000000..333cabb6382 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_age_category.yaml @@ -0,0 +1,60 @@ +# Age category bracket thresholds (months): +# <=17 months -> INFANT +# 18-35 months -> TODDLER +# 36-71 months -> PRESCHOOL +# 72+ months -> SCHOOL_AGED +# +# Test inputs use age in years. The formula multiplies by MONTHS_IN_YEAR +# to compare against month-based bracket thresholds. + +- name: Case 1, eight-month-old child (0.667 years) is in the INFANT category. + period: 2026-01 + input: + people: + person1: + age: 0.667 + households: + household: + members: [person1] + state_code: AR + output: + ar_sra_age_category: INFANT + +- name: Case 2, two-year-old child (24 months) is in the TODDLER category. + period: 2026-01 + input: + people: + person1: + age: 2 + households: + household: + members: [person1] + state_code: AR + output: + ar_sra_age_category: TODDLER + +- name: Case 3, four-year-old child (48 months) is in the PRESCHOOL category. + period: 2026-01 + input: + people: + person1: + age: 4 + households: + household: + members: [person1] + state_code: AR + output: + ar_sra_age_category: PRESCHOOL + +- name: Case 4, seven-year-old child (84 months) is in the SCHOOL_AGED category. + period: 2026-01 + input: + people: + person1: + age: 7 + households: + household: + members: [person1] + state_code: AR + output: + ar_sra_age_category: SCHOOL_AGED diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_daily_base_rate.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_daily_base_rate.yaml new file mode 100644 index 00000000000..838183778ff --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_daily_base_rate.yaml @@ -0,0 +1,226 @@ +# Daily base rates from rates/base_rate.yaml lookup +# Keyed by (zone, age_category, care_type, time_category). +# Care type defaults to REGULAR; verified by parameter breakdown. +# +# Selected verified values for testing (Nov 1, 2025 rate sheet): +# STATEWIDE / INFANT / REGULAR / FT = $36.00 +# STATEWIDE / TODDLER / REGULAR / FT = $35.00 +# STATEWIDE / PRESCHOOL / REGULAR / FT = $33.00 +# STATEWIDE / SCHOOL_AGED / REGULAR / FT = $28.00 +# BENTON_WASHINGTON / INFANT / REGULAR / FT = $38.00 +# BENTON_WASHINGTON / TODDLER / REGULAR / FT = $37.00 +# STATEWIDE / INFANT / REGULAR / PT = $18.00 +# BENTON_WASHINGTON / INFANT / REGULAR / PT = $19.00 + +- name: Case 1, Statewide infant full time base rate is 36.00. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 0 + childcare_hours_per_week: 40 + households: + household: + members: [person1] + county_str: PULASKI_COUNTY_AR + state_code: AR + output: + ar_sra_daily_base_rate: 36.00 + +- name: Case 2, Statewide toddler full time base rate is 35.00. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 2 + childcare_hours_per_week: 40 + households: + household: + members: [person1] + county_str: PULASKI_COUNTY_AR + state_code: AR + output: + ar_sra_daily_base_rate: 35.00 + +- name: Case 3, Statewide preschool full time base rate is 33.00. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 4 + childcare_hours_per_week: 40 + households: + household: + members: [person1] + county_str: PULASKI_COUNTY_AR + state_code: AR + output: + ar_sra_daily_base_rate: 33.00 + +- name: Case 4, Statewide school-aged full time base rate is 28.00. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 7 + childcare_hours_per_week: 40 + households: + household: + members: [person1] + county_str: PULASKI_COUNTY_AR + state_code: AR + output: + ar_sra_daily_base_rate: 28.00 + +- name: Case 5, Benton/Washington infant full time base rate is 38.00. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 0 + childcare_hours_per_week: 40 + households: + household: + members: [person1] + county_str: BENTON_COUNTY_AR + state_code: AR + output: + ar_sra_daily_base_rate: 38.00 + +- name: Case 6, Benton/Washington toddler full time base rate is 37.00. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 2 + childcare_hours_per_week: 40 + households: + household: + members: [person1] + county_str: WASHINGTON_COUNTY_AR + state_code: AR + output: + ar_sra_daily_base_rate: 37.00 + +- name: Case 7, Statewide infant part time base rate is 18.00. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 0 + childcare_hours_per_week: 20 + households: + household: + members: [person1] + county_str: PULASKI_COUNTY_AR + state_code: AR + output: + ar_sra_daily_base_rate: 18.00 + +- name: Case 8, Benton/Washington infant part time base rate is 19.00. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 0 + childcare_hours_per_week: 20 + households: + household: + members: [person1] + county_str: BENTON_COUNTY_AR + state_code: AR + output: + ar_sra_daily_base_rate: 19.00 + +- name: Case 9, Statewide infant Night/Weekend full time base rate is 39.60. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 0 + childcare_hours_per_week: 40 + ar_sra_care_type: NIGHT_WEEKEND + households: + household: + members: [person1] + county_str: PULASKI_COUNTY_AR + state_code: AR + output: + ar_sra_daily_base_rate: 39.60 + +- name: Case 10, Statewide infant SN1 full time base rate is 36.00. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 0 + childcare_hours_per_week: 40 + ar_sra_care_type: SN1 + households: + household: + members: [person1] + county_str: PULASKI_COUNTY_AR + state_code: AR + output: + ar_sra_daily_base_rate: 36.00 + +- name: Case 11, Statewide infant SN2 full time base rate is 50.40. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 0 + childcare_hours_per_week: 40 + ar_sra_care_type: SN2 + households: + household: + members: [person1] + county_str: PULASKI_COUNTY_AR + state_code: AR + output: + ar_sra_daily_base_rate: 50.40 + +- name: Case 12, Statewide infant SN3 full time base rate is 50.40. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 0 + childcare_hours_per_week: 40 + ar_sra_care_type: SN3 + households: + household: + members: [person1] + county_str: PULASKI_COUNTY_AR + state_code: AR + output: + ar_sra_daily_base_rate: 50.40 + +- name: Case 13, Statewide preschool Night/Weekend full time base rate is 36.30. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 4 + childcare_hours_per_week: 40 + ar_sra_care_type: NIGHT_WEEKEND + households: + household: + members: [person1] + county_str: PULASKI_COUNTY_AR + state_code: AR + output: + ar_sra_daily_base_rate: 36.30 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_daily_copay.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_daily_copay.yaml new file mode 100644 index 00000000000..dcccc4062ce --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_daily_copay.yaml @@ -0,0 +1,94 @@ +# Daily family copay per child = daily_base_rate * (1 - state_share). + +- name: Case 1, Toddler Statewide FT at LE_40 SMI has zero copay (share 1.00). + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 28 + # 30% SMI -> LE_40 tier + employment_income: 18_417 + immigration_status: CITIZEN + person2: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + # Statewide / Toddler / REGULAR / FT base = $35.00, share = 1.00 + # daily copay = $35 * (1 - 1.00) = $0.00 + ar_sra_daily_copay: [0, 0.00] + +- name: Case 2, School-Aged Statewide FT at LE_40 SMI has positive copay (20 percent of base). + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 28 + # 30% SMI -> LE_40 tier + employment_income: 18_417 + immigration_status: CITIZEN + person2: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + # Statewide / School-Aged / REGULAR / FT base = $28.00, share = 0.80 + # daily copay = $28 * (1 - 0.80) = $5.60 + ar_sra_daily_copay: [0, 5.60] + +- name: Case 3, Preschool Statewide FT at GT_60 SMI has copay 40 percent of base. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 28 + # 75% SMI -> GT_60 tier + employment_income: 46_043 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + # Statewide / Preschool / REGULAR / FT base = $33.00, share = 0.60 + # daily copay = $33 * (1 - 0.60) = $13.20 + ar_sra_daily_copay: [0, 13.20] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_daily_state_payment.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_daily_state_payment.yaml new file mode 100644 index 00000000000..6d3cf791a4b --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_daily_state_payment.yaml @@ -0,0 +1,97 @@ +# Daily state payment per child = daily_base_rate * state_share. +# +# Arkansas SMI (2025-10-01, FFY 2026, 4-person): $90,280/year +# 2-person SPM: SMI = $61,390.40 annual + +- name: Case 1, Toddler Statewide FT at LE_40 SMI pays full base rate (no-copay). + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 28 + # 30% SMI -> LE_40 tier + employment_income: 18_417 + immigration_status: CITIZEN + person2: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + # Statewide / Toddler / REGULAR / FT base = $35.00; share = 1.00 + # daily state payment = $35.00 * 1.00 = $35.00 + ar_sra_daily_state_payment: [0, 35.00] + +- name: Case 2, School-Aged Statewide FT at LE_40 SMI has positive copay (share 0.80). + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 28 + # 30% SMI -> LE_40 tier + employment_income: 18_417 + immigration_status: CITIZEN + person2: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + county_str: PULASKI_COUNTY_AR + output: + # Statewide / School-Aged / REGULAR / FT base = $28.00; share = 0.80 + # daily state payment = $28.00 * 0.80 = $22.40 + ar_sra_daily_state_payment: [0, 22.40] + +- name: Case 3, Infant Benton/Washington FT at GT_60 SMI gets reduced share. + period: 2026-01 + absolute_error_margin: 0.01 + input: + people: + person1: + age: 28 + # 75% SMI -> GT_60 tier + employment_income: 46_043 + immigration_status: CITIZEN + person2: + age: 0 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + county_str: BENTON_COUNTY_AR + output: + # Benton/Washington / Infant / REGULAR / FT base = $38.00; share = 0.70 + # daily state payment = $38.00 * 0.70 = $26.60 + ar_sra_daily_state_payment: [0, 26.60] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_income_tier.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_income_tier.yaml new file mode 100644 index 00000000000..73b0f7c7542 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_income_tier.yaml @@ -0,0 +1,88 @@ +# Income tiers (% SMI): +# LE_40: <= 40% SMI +# GT_40_LE_60: > 40%, <= 60% SMI +# GT_60: > 60% SMI +# +# Arkansas SMI (uprated at 2026-01-01): $95,201.95 +# 2-person SPM (parent + child): SMI = 95,201.95 * 0.68 = $64,737.33 annual + +- name: Case 1, family at 30 percent SMI is in the LE_40 tier. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + # 64,737.33 * 0.30 = $19,421.20 + employment_income: 19_421 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_sra_income_tier: LE_40 + +- name: Case 2, family at 50 percent SMI is in the GT_40_LE_60 tier. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + # 64,737.33 * 0.50 = $32,368.67 + employment_income: 32_369 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_sra_income_tier: GT_40_LE_60 + +- name: Case 3, family at 75 percent SMI is in the GT_60 tier. + period: 2026-01 + absolute_error_margin: 0.1 + input: + people: + person1: + age: 30 + # 64,737.33 * 0.75 = $48,553.00 + employment_income: 48_553 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_sra_income_tier: GT_60 diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_state_share.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_state_share.yaml new file mode 100644 index 00000000000..fa2a5967c25 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_state_share.yaml @@ -0,0 +1,129 @@ +# State payment share from rates/state_share_by_tier.yaml lookup +# Keyed by (age_category, time_category, income_tier). +# +# Examples (from parameter): +# Toddler FT LE_40 = 1.00 (no copay floor) +# Toddler FT GT_40_LE_60 = 0.80 +# Toddler FT GT_60 = 0.70 +# Preschool FT LE_40 = 1.00 +# Preschool FT GT_40_LE_60 = 0.70 +# School-Aged FT LE_40 = 0.80 (always copay) +# School-Aged FT GT_60 = 0.30 +# +# Arkansas SMI (2025-10-01, FFY 2026, 4-person): $90,280/year +# 2-person SPM: SMI = 90,280 * 0.68 = $61,390.40 annual + +- name: Case 1, toddler at 30 percent SMI gets state share 1.00 (no-copay floor). + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 30 + # 90,280 * 0.68 * 0.30 = $18,417.12 + employment_income: 18_417 + immigration_status: CITIZEN + person2: + age: 2 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + ar_sra_state_share: [0, 1.00] + +- name: Case 2, preschooler at 50 percent SMI (FT) gets state share 0.70. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 30 + # 90,280 * 0.68 * 0.50 = $30,695.20 + employment_income: 30_695 + immigration_status: CITIZEN + person2: + age: 4 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + # Preschool FT GT_40_LE_60 = 0.70 + ar_sra_state_share: [0, 0.70] + +- name: Case 3, school-aged child at 80 percent SMI (FT) gets state share 0.30. + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 30 + # 90,280 * 0.68 * 0.80 = $49,112.32 (above 60% SMI -> GT_60 tier) + employment_income: 49_112 + immigration_status: CITIZEN + person2: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + # School-Aged FT GT_60 = 0.30 + ar_sra_state_share: [0, 0.30] + +- name: Case 4, school-aged child at 30 percent SMI (FT) still has copay (share 0.80). + period: 2026-01 + absolute_error_margin: 0.001 + input: + people: + person1: + age: 30 + # 90,280 * 0.68 * 0.30 = $18,417.12 + employment_income: 18_417 + immigration_status: CITIZEN + person2: + age: 7 + is_tax_unit_dependent: true + immigration_status: CITIZEN + childcare_hours_per_week: 40 + tax_units: + tax_unit: + members: [person1, person2] + spm_units: + spm_unit: + members: [person1, person2] + households: + household: + members: [person1, person2] + state_code: AR + output: + # School-Aged FT LE_40 = 0.80 (school-aged always has copay) + ar_sra_state_share: [0, 0.80] diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_time_category.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_time_category.yaml new file mode 100644 index 00000000000..92fe0e68285 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_time_category.yaml @@ -0,0 +1,67 @@ +# Time category: >=30 hr/wk -> FULL_TIME, otherwise PART_TIME. +# Threshold parameter: gov.states.ar.ade.oec.sra.rates.full_time_hours_threshold = 30 + +- name: Case 1, 30 hours per week is FULL_TIME at the threshold. + period: 2026-01 + input: + people: + person1: + childcare_hours_per_week: 30 + households: + household: + members: [person1] + state_code: AR + output: + ar_sra_time_category: FULL_TIME + +- name: Case 2, 35 hours per week is FULL_TIME. + period: 2026-01 + input: + people: + person1: + childcare_hours_per_week: 35 + households: + household: + members: [person1] + state_code: AR + output: + ar_sra_time_category: FULL_TIME + +- name: Case 3, 25 hours per week is PART_TIME. + period: 2026-01 + input: + people: + person1: + childcare_hours_per_week: 25 + households: + household: + members: [person1] + state_code: AR + output: + ar_sra_time_category: PART_TIME + +- name: Case 4, 29 hours per week is PART_TIME just below the threshold. + period: 2026-01 + input: + people: + person1: + childcare_hours_per_week: 29 + households: + household: + members: [person1] + state_code: AR + output: + ar_sra_time_category: PART_TIME + +- name: Case 5, 0 hours per week is PART_TIME. + period: 2026-01 + input: + people: + person1: + childcare_hours_per_week: 0 + households: + household: + members: [person1] + state_code: AR + output: + ar_sra_time_category: PART_TIME diff --git a/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_zone.yaml b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_zone.yaml new file mode 100644 index 00000000000..f8525bd7956 --- /dev/null +++ b/policyengine_us/tests/policy/baseline/gov/states/ar/ade/oec/sra/rates/ar_sra_zone.yaml @@ -0,0 +1,26 @@ +# SRA rate zones: Benton and Washington Counties (Northwest Arkansas) +# vs. STATEWIDE for every other AR county. + +- name: Case 1, Benton County is in the BENTON_WASHINGTON zone. + period: 2026-01 + input: + county_str: BENTON_COUNTY_AR + state_code: AR + output: + ar_sra_zone: BENTON_WASHINGTON + +- name: Case 2, Washington County is in the BENTON_WASHINGTON zone. + period: 2026-01 + input: + county_str: WASHINGTON_COUNTY_AR + state_code: AR + output: + ar_sra_zone: BENTON_WASHINGTON + +- name: Case 3, Pulaski County (Little Rock) is in the STATEWIDE zone. + period: 2026-01 + input: + county_str: PULASKI_COUNTY_AR + state_code: AR + output: + ar_sra_zone: STATEWIDE diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_child_care_subsidies.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_child_care_subsidies.py new file mode 100644 index 00000000000..f0aeb2b7fe8 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_child_care_subsidies.py @@ -0,0 +1,11 @@ +from policyengine_us.model_api import * + + +class ar_child_care_subsidies(Variable): + value_type = float + entity = SPMUnit + label = "Arkansas child care subsidies" + unit = USD + definition_period = YEAR + defined_for = StateCode.AR + adds = ["ar_sra"] diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_sra.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_sra.py new file mode 100644 index 00000000000..01a2ca5c698 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_sra.py @@ -0,0 +1,30 @@ +from policyengine_us.model_api import * + + +class ar_sra(Variable): + value_type = float + entity = SPMUnit + unit = USD + label = "Arkansas School Readiness Assistance benefit amount" + definition_period = MONTH + defined_for = "is_ar_sra_eligible" + reference = ( + "https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Full_Time_20251101_OEC.pdf", + "https://dese.ade.arkansas.gov/Files/R_&_R__Nov_2025_(English)_(1)_OEC.pdf#page=1", + ) + + def formula(spm_unit, period, parameters): + person = spm_unit.members + is_eligible_child = person("is_ar_sra_child_eligible", period) + daily_state_payment = person("ar_sra_daily_state_payment", period) + daily_copay = person("ar_sra_daily_copay", period) + attending_days = person("childcare_attending_days_per_month", period.this_year) + monthly_max_state_payment = daily_state_payment * attending_days + monthly_copay = daily_copay * attending_days + annual_expense = person("pre_subsidy_childcare_expenses", period.this_year) + monthly_expense = annual_expense / MONTHS_IN_YEAR + subsidy = min_( + max_(monthly_expense - monthly_copay, 0), + monthly_max_state_payment, + ) + return spm_unit.sum(subsidy * is_eligible_child) diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_sra_age_category.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_sra_age_category.py new file mode 100644 index 00000000000..4d9331f0120 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_sra_age_category.py @@ -0,0 +1,30 @@ +from policyengine_us.model_api import * + + +class ArSraAgeCategory(Enum): + INFANT = "Infant" + TODDLER = "Toddler" + PRESCHOOL = "Preschool" + SCHOOL_AGED = "School-Aged" + + +class ar_sra_age_category(Variable): + value_type = Enum + entity = Person + possible_values = ArSraAgeCategory + default_value = ArSraAgeCategory.INFANT + definition_period = MONTH + defined_for = StateCode.AR + label = "Arkansas SRA child age category" + reference = ( + "https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Full_Time_20251101_OEC.pdf", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.ar.ade.oec.sra.rates.age_category_months + # `age` is YEAR-defined; `period.this_year` returns age in years (float). + # Multiply by 12 to compare against month-based thresholds. + age_months = person("age", period.this_year) * MONTHS_IN_YEAR + # The bracket returns the integer enum index (0=INFANT, 1=TODDLER, + # 2=PRESCHOOL, 3=SCHOOL_AGED); PolicyEngine maps it to the enum. + return p.calc(age_months) diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_sra_care_type.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_sra_care_type.py new file mode 100644 index 00000000000..b415a9fb944 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_sra_care_type.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class ArSraCareType(Enum): + REGULAR = "Regular" + NIGHT_WEEKEND = "Night/Weekend" + SN1 = "Special Needs Level 1" + SN2 = "Special Needs Level 2" + SN3 = "Special Needs Level 3" + + +class ar_sra_care_type(Variable): + value_type = Enum + entity = Person + possible_values = ArSraCareType + default_value = ArSraCareType.REGULAR + definition_period = MONTH + defined_for = StateCode.AR + label = "Arkansas SRA care type" + reference = ( + "https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Full_Time_20251101_OEC.pdf", + ) diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_sra_income_tier.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_sra_income_tier.py new file mode 100644 index 00000000000..e8ab3292ec0 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_sra_income_tier.py @@ -0,0 +1,34 @@ +from policyengine_us.model_api import * + + +class ArSraIncomeTier(Enum): + LE_40 = "At or below 40% SMI" + GT_40_LE_60 = "Above 40% and at or below 60% SMI" + GT_60 = "Above 60% SMI" + + +class ar_sra_income_tier(Variable): + value_type = Enum + entity = SPMUnit + possible_values = ArSraIncomeTier + default_value = ArSraIncomeTier.GT_60 + definition_period = MONTH + defined_for = StateCode.AR + label = "Arkansas SRA family income tier (% SMI)" + reference = ( + "https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Full_Time_20251101_OEC.pdf", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ar.ade.oec.sra + annual_income = spm_unit("ar_sra_countable_income", period) * MONTHS_IN_YEAR + smi = spm_unit("hhs_smi", period.this_year) + ratio = where(smi > 0, annual_income / smi, np.inf) + return select( + [ + ratio <= p.rates.no_copay_smi_threshold, + ratio <= p.rates.partial_subsidy_smi_threshold, + ], + [ArSraIncomeTier.LE_40, ArSraIncomeTier.GT_40_LE_60], + default=ArSraIncomeTier.GT_60, + ) diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_sra_time_category.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_sra_time_category.py new file mode 100644 index 00000000000..f643f6b35e1 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_sra_time_category.py @@ -0,0 +1,29 @@ +from policyengine_us.model_api import * + + +class ArSraTimeCategory(Enum): + FULL_TIME = "Full-Time" + PART_TIME = "Part-Time" + + +class ar_sra_time_category(Variable): + value_type = Enum + entity = Person + possible_values = ArSraTimeCategory + default_value = ArSraTimeCategory.FULL_TIME + definition_period = MONTH + defined_for = StateCode.AR + label = "Arkansas SRA time category" + reference = ( + "https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Full_Time_20251101_OEC.pdf", + "https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Part_Time_20251101_OEC.pdf", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.ar.ade.oec.sra.rates + hours = person("childcare_hours_per_week", period.this_year) + return where( + hours >= p.full_time_hours_threshold, + ArSraTimeCategory.FULL_TIME, + ArSraTimeCategory.PART_TIME, + ) diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_sra_zone.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_sra_zone.py new file mode 100644 index 00000000000..153147b73f9 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/ar_sra_zone.py @@ -0,0 +1,35 @@ +from policyengine_us.model_api import * + + +class ArSraZone(Enum): + BENTON_WASHINGTON = "Benton/Washington" + STATEWIDE = "Statewide" + + +class ar_sra_zone(Variable): + value_type = Enum + entity = Household + possible_values = ArSraZone + default_value = ArSraZone.STATEWIDE + definition_period = MONTH + defined_for = StateCode.AR + label = "Arkansas SRA rate zone" + reference = ( + "https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Benton-Washington_Co_Full_Time_20251101_OEC.pdf", + "https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Full_Time_20251101_OEC.pdf", + ) + + def formula(household, period, parameters): + # `defined_for = StateCode.AR` filters output but does NOT short-circuit + # vectorized execution, so non-AR county strings would still flow into + # this lookup. Guard by checking state first. + state = household("state_code_str", period.this_year) + county = household("county_str", period.this_year) + in_benton_washington = (state == "AR") & ( + (county == "BENTON_COUNTY_AR") | (county == "WASHINGTON_COUNTY_AR") + ) + return where( + in_benton_washington, + ArSraZone.BENTON_WASHINGTON, + ArSraZone.STATEWIDE, + ) diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/eligibility/is_ar_sra_age_eligible.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/eligibility/is_ar_sra_age_eligible.py new file mode 100644 index 00000000000..97bb547dd98 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/eligibility/is_ar_sra_age_eligible.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class is_ar_sra_age_eligible(Variable): + value_type = bool + entity = Person + label = "Age-eligible for Arkansas SRA" + definition_period = MONTH + defined_for = StateCode.AR + reference = ( + "https://www.publichealthlawcenter.org/sites/default/files/Arkansas%20Title%20016%20Division%2022%20Rule%208.pdf#page=11", + "https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=13", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.ar.ade.oec.sra.eligibility + age = person("age", period.this_year) + return age < p.child_age_limit diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/eligibility/is_ar_sra_child_eligible.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/eligibility/is_ar_sra_child_eligible.py new file mode 100644 index 00000000000..663ecf59569 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/eligibility/is_ar_sra_child_eligible.py @@ -0,0 +1,20 @@ +from policyengine_us.model_api import * + + +class is_ar_sra_child_eligible(Variable): + value_type = bool + entity = Person + label = "Eligible child for Arkansas SRA" + definition_period = MONTH + defined_for = StateCode.AR + reference = ( + "https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=14", + "https://www.publichealthlawcenter.org/sites/default/files/Arkansas%20Title%20016%20Division%2022%20Rule%208.pdf#page=11", + ) + + def formula(person, period, parameters): + age_eligible = person("is_ar_sra_age_eligible", period) + immigration_eligible = person( + "is_ccdf_immigration_eligible_child", period.this_year + ) + return age_eligible & immigration_eligible diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/eligibility/is_ar_sra_eligible.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/eligibility/is_ar_sra_eligible.py new file mode 100644 index 00000000000..4dc8cee34f1 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/eligibility/is_ar_sra_eligible.py @@ -0,0 +1,25 @@ +from policyengine_us.model_api import * + + +class is_ar_sra_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for Arkansas School Readiness Assistance" + definition_period = MONTH + defined_for = StateCode.AR + reference = ( + "https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=13", + "https://dese.ade.arkansas.gov/Files/R_&_R__Nov_2025_(English)_(1)_OEC.pdf#page=1", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ar.ade.oec.sra + if not p.in_effect: + return False + has_eligible_child = add(spm_unit, period, ["is_ar_sra_child_eligible"]) > 0 + income_ok = spm_unit("is_ar_sra_income_eligible", period) + asset_ok = spm_unit("is_ccdf_asset_eligible", period.this_year) + li_active = spm_unit("is_ar_sra_li_activity_eligible", period) + ess_active = spm_unit("is_ar_sra_ess_eligible", period) + activity_ok = li_active | ess_active + return has_eligible_child & income_ok & asset_ok & activity_ok diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/eligibility/is_ar_sra_ess_eligible.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/eligibility/is_ar_sra_ess_eligible.py new file mode 100644 index 00000000000..80b8fe170b2 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/eligibility/is_ar_sra_ess_eligible.py @@ -0,0 +1,28 @@ +from policyengine_us.model_api import * + + +class is_ar_sra_ess_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Eligible for Arkansas SRA Extended Support Services (ESS) track" + definition_period = MONTH + defined_for = StateCode.AR + reference = ( + "https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=16", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ar.ade.oec.sra.eligibility + was_tea = spm_unit("was_tea_recipient", period.this_year) + months_since = spm_unit("months_since_tea_exit", period) + ar_tea = spm_unit("ar_tea", period) + within_window = (months_since > 0) & (months_since <= p.ess_window_months) + in_track = was_tea & (ar_tea == 0) & within_window + in_year_1 = months_since <= p.ess_year_1_window_months + person = spm_unit.members + hours = person("weekly_hours_worked", period.this_year) + max_hours = spm_unit.max(hours) + year_1_active = max_hours >= p.activity_hours_ess_year_1 + year_2_active = max_hours >= p.activity_hours_ess_year_2 + activity_ok = where(in_year_1, year_1_active, year_2_active) + return in_track & activity_ok diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/eligibility/is_ar_sra_income_eligible.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/eligibility/is_ar_sra_income_eligible.py new file mode 100644 index 00000000000..d04712ea794 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/eligibility/is_ar_sra_income_eligible.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class is_ar_sra_income_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Income-eligible for Arkansas SRA" + definition_period = MONTH + defined_for = StateCode.AR + reference = ( + "https://dese.ade.arkansas.gov/Files/2025-2027_CCDF_State_Plan_Final_4.26.24.1REV_OEC.pdf#page=22", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ar.ade.oec.sra.eligibility + # `ar_sra_countable_income` is monthly; `hhs_smi` is annual. + annual_income = spm_unit("ar_sra_countable_income", period) * MONTHS_IN_YEAR + smi = spm_unit("hhs_smi", period.this_year) + return annual_income <= smi * p.income_smi_rate diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/eligibility/is_ar_sra_li_activity_eligible.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/eligibility/is_ar_sra_li_activity_eligible.py new file mode 100644 index 00000000000..9f05194134d --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/eligibility/is_ar_sra_li_activity_eligible.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class is_ar_sra_li_activity_eligible(Variable): + value_type = bool + entity = SPMUnit + label = "Activity-eligible for Arkansas SRA Low-Income track" + definition_period = MONTH + defined_for = StateCode.AR + reference = ( + "https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=16", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ar.ade.oec.sra.eligibility + person = spm_unit.members + is_head_or_spouse = person("is_tax_unit_head_or_spouse", period.this_year) + hours = person("weekly_hours_worked", period.this_year) + is_student = person("is_full_time_student", period.this_year) + meets_threshold = (hours >= p.activity_hours_li) | is_student + # All adults (heads/spouses) must meet the threshold. + return spm_unit.sum(is_head_or_spouse & ~meets_threshold) == 0 diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/income/ar_sra_countable_income.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/income/ar_sra_countable_income.py new file mode 100644 index 00000000000..3ba404387d6 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/income/ar_sra_countable_income.py @@ -0,0 +1,27 @@ +from policyengine_us.model_api import * + + +class ar_sra_countable_income(Variable): + value_type = float + entity = SPMUnit + label = "Arkansas SRA countable income" + unit = USD + definition_period = MONTH + defined_for = StateCode.AR + reference = ( + "https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=19", + "https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=20", + ) + + def formula(spm_unit, period, parameters): + p = parameters(period).gov.states.ar.ade.oec.sra.income + # FSU Manual Section 4.3.2: SSI and Social Security of children under + # 18 are excluded from countable income. Sum each listed source per + # person and mask out child contributions before aggregating to the + # SPM unit. + person = spm_unit.members + # `age` is YEAR-defined; period.this_year reverses auto-division so + # this returns age in years for monthly periods. + is_adult = person("age", period.this_year) >= 18 + per_person_income = sum(person(source, period) for source in p.sources) + return spm_unit.sum(per_person_income * is_adult) diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/months_since_tea_exit.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/months_since_tea_exit.py new file mode 100644 index 00000000000..c39f2d02e3c --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/months_since_tea_exit.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class months_since_tea_exit(Variable): + value_type = int + entity = SPMUnit + label = "Months since Arkansas TEA cash aid ended" + definition_period = MONTH + defined_for = StateCode.AR + default_value = 0 + reference = ( + "https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=16", + ) diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/rates/ar_sra_daily_base_rate.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/rates/ar_sra_daily_base_rate.py new file mode 100644 index 00000000000..85a761b72d3 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/rates/ar_sra_daily_base_rate.py @@ -0,0 +1,22 @@ +from policyengine_us.model_api import * + + +class ar_sra_daily_base_rate(Variable): + value_type = float + entity = Person + unit = USD + label = "Arkansas SRA daily base provider rate" + definition_period = MONTH + defined_for = "is_ar_sra_child_eligible" + reference = ( + "https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Full_Time_20251101_OEC.pdf", + "https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Benton-Washington_Co_Full_Time_20251101_OEC.pdf", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.ar.ade.oec.sra.rates + zone = person.household("ar_sra_zone", period) + age_category = person("ar_sra_age_category", period) + care_type = person("ar_sra_care_type", period) + time_category = person("ar_sra_time_category", period) + return p.base_rate[zone][age_category][care_type][time_category] diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/rates/ar_sra_daily_copay.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/rates/ar_sra_daily_copay.py new file mode 100644 index 00000000000..3ee8f330b04 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/rates/ar_sra_daily_copay.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class ar_sra_daily_copay(Variable): + value_type = float + entity = Person + unit = USD + label = "Arkansas SRA daily family copay" + definition_period = MONTH + defined_for = "is_ar_sra_child_eligible" + reference = ( + "https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Full_Time_20251101_OEC.pdf", + ) + + def formula(person, period, parameters): + base = person("ar_sra_daily_base_rate", period) + state_share = person("ar_sra_state_share", period) + return base * (1 - state_share) diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/rates/ar_sra_daily_state_payment.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/rates/ar_sra_daily_state_payment.py new file mode 100644 index 00000000000..d64462f51ac --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/rates/ar_sra_daily_state_payment.py @@ -0,0 +1,18 @@ +from policyengine_us.model_api import * + + +class ar_sra_daily_state_payment(Variable): + value_type = float + entity = Person + unit = USD + label = "Arkansas SRA daily state payment per child" + definition_period = MONTH + defined_for = "is_ar_sra_child_eligible" + reference = ( + "https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Full_Time_20251101_OEC.pdf", + ) + + def formula(person, period, parameters): + base = person("ar_sra_daily_base_rate", period) + state_share = person("ar_sra_state_share", period) + return base * state_share diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/rates/ar_sra_state_share.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/rates/ar_sra_state_share.py new file mode 100644 index 00000000000..4dc1bba98aa --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/rates/ar_sra_state_share.py @@ -0,0 +1,19 @@ +from policyengine_us.model_api import * + + +class ar_sra_state_share(Variable): + value_type = float + entity = Person + label = "Arkansas SRA state share of daily base rate" + definition_period = MONTH + defined_for = "is_ar_sra_child_eligible" + reference = ( + "https://dese.ade.arkansas.gov/Files/SRA_Sliding_Fee_Scale_with_Rates_&_Copays--Statewide_Full_Time_20251101_OEC.pdf", + ) + + def formula(person, period, parameters): + p = parameters(period).gov.states.ar.ade.oec.sra.rates + age_category = person("ar_sra_age_category", period) + time_category = person("ar_sra_time_category", period) + income_tier = person.spm_unit("ar_sra_income_tier", period) + return p.state_share_by_tier[age_category][time_category][income_tier] diff --git a/policyengine_us/variables/gov/states/ar/ade/oec/sra/was_tea_recipient.py b/policyengine_us/variables/gov/states/ar/ade/oec/sra/was_tea_recipient.py new file mode 100644 index 00000000000..a52588900f1 --- /dev/null +++ b/policyengine_us/variables/gov/states/ar/ade/oec/sra/was_tea_recipient.py @@ -0,0 +1,13 @@ +from policyengine_us.model_api import * + + +class was_tea_recipient(Variable): + value_type = bool + entity = SPMUnit + label = "Was an Arkansas Transitional Employment Assistance recipient" + definition_period = YEAR + defined_for = StateCode.AR + default_value = False + reference = ( + "https://dese.ade.arkansas.gov/Files/FSU-Procedural-Manual-June-2023_UPDATED_20230629075344.pdf#page=16", + )