Skip to content

Apply Florida TCA $200 and 1/2 disregard to current participants - #10248

Open
PavelMakarchuk wants to merge 3 commits into
mainfrom
fix-9982-fl-tca-recipient-disregard
Open

PavelMakarchuk wants to merge 3 commits into
mainfrom
fix-9982-fl-tca-recipient-disregard

Conversation

@PavelMakarchuk

@PavelMakarchuk PavelMakarchuk commented Oct 16, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

fl_tca_200_and_half_disregard_eligible only checked whether income after the $90 standard disregard is below the payment standard. Fla. Stat. 414.095(11)(a) also grants the disregard to "a current participant in the program". DCF ESS Program Policy Manual 2420.0315 (PDF page 28, printed page 23) states this as having "been eligible for and received TCA in one of the past four months". So an enrolled unit whose income after $90 was at or above the payment standard lost the disregard and got $0.

This PR makes two changes:

  • Eligibility: the variable now returns is_tanf_enrolled | (income after $90 < payment standard). is_tanf_enrolled defaults to reported TANF receipt and stands for receipt in the past four months, as in MI, CT, NH and TX.
  • Amount: 2420.0315 says "The $90 standard earned income disregard is included in the first $200 earned income disregard". If the member is eligible, the manual says to "subtract $110 for a total of $200". fl_tca_countable_earned_income subtracted the whole $200 after the $90, a $290 disregard. It now subtracts first_amount - standard_disregard ($110) after the $90, then counts half of the rest.

Issue example (3 people, $500/month earnings, shelter over $50, enrolled): the payment standard is $303. Countable earnings are ($500 - $200) / 2 = $150, so fl_tca is $153. On main they are $410 and $0.

Tests

  • New fl_tca_200_and_half_disregard_eligible.yaml has four cases. A current participant above the payment standard is eligible; this case fails on main. The controls are an applicant with the same income (not eligible), an applicant below the standard (eligible), and an applicant at exactly the standard (not eligible).
  • integration.yaml:
    • Case 20 (enrolled, $500) gives $150 countable and a $153 benefit; it fails on main.
    • Case 21 (the same unit, not enrolled) is the control: $410 countable and $0.
    • Case 22 (enrolled, $100 earnings, $400 unearned) keeps the disregard but fails the net test: 0 + 400 > 303, so $0.
  • Updated expectations for the $110 remainder:
    • fl_tca_countable_earned_income.yaml Cases 2-6: $290 earnings now count $45 instead of $0.
    • integration.yaml Cases 9 and 18.
    • Stale formula comments in fl_tca_eligible.yaml.
  • policyengine_us/tests/policy/baseline/gov/states/fl/dcf/tanf: 82 passed. gov/hhs/tanf: 106 passed.

Not in this PR: ESS manual 2420.0304 and 2420.0314 apply the $90 and the $200 and 1/2 disregards to each earner. fl_tca_countable_earned_income applies them once to the unit's total earnings. The results are the same for one earner, which is every case here. This was so before this PR.

axiom: us-fl:policies/dcf/ess-program-policy-manual/2400-budgeting-income/page-28 encoded-correct

Fixes #9982

🤖 Generated with Claude Code

Fla. Stat. 414.095(11)(a) and ESS manual 2420.0315 grant the disregard to a
current participant (TCA received in one of the past four months) or to a
member whose income after the $90 disregard is below the payment standard.
The eligibility variable only checked the income condition; it now also
accepts is_tanf_enrolled. 2420.0315 also says the $90 standard disregard is
included in the first $200, so the eligible member now has $110 more
subtracted after the $90, not $200.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@PavelMakarchuk
PavelMakarchuk marked this pull request as ready for review October 23, 2026 17:03
@codecov

codecov Bot commented Oct 23, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 100.00%. Comparing base (909176a) to head (abd9fbd).
⚠️ Report is 665 commits behind head on main.

Additional details and impacted files
@@            Coverage Diff            @@
##              main    #10248   +/-   ##
=========================================
  Coverage   100.00%   100.00%           
=========================================
  Files            4         2    -2     
  Lines           76        35   -41     
  Branches         2         0    -2     
=========================================
- Hits            76        35   -41     
Flag Coverage Δ
unittests 100.00% <100.00%> (ø)

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@DTrim99

DTrim99 commented Oct 23, 2026

Copy link
Copy Markdown
Collaborator

PR Review: Apply Florida TCA $200 and 1/2 disregard to current participants

Summary

The PR makes two changes to Florida Temporary Cash Assistance.

  • Who gets the disregard. fl_tca_200_and_half_disregard_eligible now returns is_tanf_enrolled | (earned − $90 + unearned < payment standard). Before, only the applicant test applied, so an enrolled family whose income after $90 had risen to the payment standard lost the disregard and got $0.
  • How much it is. fl_tca_countable_earned_income now subtracts the $90 standard disregard and then only the remaining $110 of the "first $200", not a further $200. The total disregard is $200 plus half the rest, where it was $290 plus half.

Both changes match the law:

  • Fla. Stat. 414.095(11)(a) grants the disregard to "A current participant in the program" or to someone "Eligible for participation in the program without the earnings disregard".
  • ESS Manual 2420.0315 says "The $90 standard earned income disregard is included in the first $200 earned income disregard … subtract $110 for a total of $200."
  • 2620.0111.01 gives the order: $90, then the remainder "if eligible", then add unearned income.

Applicants are still tested on income after $90 against the payment standard; recipients skip that test, which is the applicant/recipient split the statute draws.

  • Code. The changes are small and vectorized. is_tanf_enrolled is the same stand-in for "received TCA in one of the past four months" that AR, DE, IA, IN and other states use. No state-gated key is involved (NH Add New Hampshire state supplementation for 2026 #10156 doesn't apply), and the only readers are the FL TCA net test and benefit.
  • Tests. I hand-checked all 18 new or changed expectations; all are correct.
  • Axiom. rulespec-us already encodes 2420.0314–.0315 this way, so the missing axiom: line can simply be encoded-correct. Adding it is the only required change.

Critical (must fix)

None.

Should address

1. Add the axiom: line to the PR body.

The body has no axiom line in any form, and Pavel is staff. rulespec-us already encodes both changes in us-fl/policies/dcf/ess-program-policy-manual/2400-budgeting-income/page-28.yaml:

  • tca_individual_eligible_for_full_earned_income_disregard is "received TCA countable months in past lookback >= 1 or income after the standard disregard < applicable payment standard", with a 4-month lookback parameter.
  • tca_remainder_of_first_earned_income_disregard_after_standard = 200 − 90 (excerpt "subtract $110 for a total of $200"), and tca_additional_earned_income_disregard_after_standard adds half of the rest.
  • 2600-calculation-of-benefits/page-21.yaml encodes the 2620.0111.01 step order.

Recommended line: axiom: us-fl:policies/dcf/ess-program-policy-manual/2400-budgeting-income/page-28 encoded-correct. That module is per person; see Suggestion 1 for how PolicyEngine differs for two-earner units.

Suggestions

  1. The disregards apply per earner (pre-existing). 2420.0304 says "The first $90 of each individual's gross earned income is deducted", and 2420.0314 says "Each individual (who has earnings and is otherwise eligible) … may be eligible". rulespec encodes both on Person. fl_tca_countable_earned_income sums the unit's earnings and subtracts one $90 and one $110. For a single earner, which is every case in this PR, the results are the same. But take an enrolled family of four (payment standard $364) in which each parent earns $300:

    • per earner: (300 − 200) / 2 × 2 = 100 countable, a benefit of $264;
    • the head of this PR: (600 − 200) / 2 = 200 countable, a benefit of $164.

    This PR makes more two-earner recipients eligible, so the gap now matters more often. Worth a follow-up issue, or a person-level formula like ak_atap_countable_earned_income_person.

  2. The statute is silent on the $90. The new documentation says 414.095(11)(a) "states the same two conditions" as 2420.0315. The statute's second condition is being eligible "without the earnings disregard". The $90-first test comes from the manual alone, as does the $90 itself, which 414.095 never mentions. Consider saying that the manual supplies the $90 test, so the documentation doesn't present the two sources as identical.

  3. Page anchor. The variable's manual reference has no anchor. 2420.0314–.0315 are on PDF page 28 (2400.pdf#page=28); the body's "p. 23" is the printed page.

  4. Optional test. An enrolled unit with unearned income above the payment standard (for example $400 of child support and $100 of earnings, size 3) would pin that a current participant keeps the disregard but still fails the net test: 400 + max(100 − 200, 0) = 400 > 303.

Verified correct

  • Statute. Fla. Stat. 414.095(11)(a) (2026 text, last amended by ch. 2019-167): "As an incentive to employment, the first $200 plus one-half of the remainder of earned income shall be disregarded. In order to be eligible for earned income to be disregarded, the individual must be: 1. A current participant in the program; or 2. Eligible for participation in the program without the earnings disregard." (12)(a) computes benefits from "average monthly gross family income, earned and unearned, less any applicable disregards". The body's "(11)(a)" is the current numbering. (10) gives $303 (size 3), $364 (4), $241 (2) and $610 (8) for a shelter obligation over $50.
  • Rule. Fla. Admin. Code 65A-4.209(2) (eff. 4/29/2024): "the total average gross monthly income less any applicable disregards of the standard filing unit cannot exceed the applicable payment standard". That matches the <= net test. The rule doesn't set the disregard amounts.
  • Manual. ESS Manual 2420.0314–.0315: "1. have been eligible for and received TCA in one of the past four months; or 2. have gross countable income (including earned and unearned income), less the $90 standard earned income disregard, which is less than the applicable payment standard." Also: "Once an individual is found eligible for the $200 and 1/2 disregard, there is no time limit for receipt of the disregard."
  • Order of operations. 2620.0111.01: "Step 2 - Subtract the standard disregard of $90. Step 3 - Subtract the remainder of $200 and 1/2 earned income disregard, if eligible. Step 4 - Add unearned income". The code follows those steps, and fl_tca_countable_income adds unearned income afterwards.
  • Applicants and recipients. is_tanf_enrolled defaults to the receives_tanf input, so it isn't circular. Applicants (not enrolled) still face condition 2 with a strict <, as the manual's "less than" requires.
  • Hand-checked expectations (18).
    • New eligibility file (size 3, rent over $50, so $303): enrolled, $500 → true. Not enrolled, $500: 410 ≥ 303 → false. $300: 210 < 303 → true. $393 (4,716 / 12): 303, which is not < 303 → false.
    • fl_tca_countable_earned_income.yaml (size 8, $610): $290 → (290 − 200) / 2 = 45; $291 → 45.50; $300 → 50; $400 → 100; $500 → 150; $91 → max(1 − 110, 0) → 0.
    • integration.yaml: Case 9 (size 4, $300) → 50 countable, 364 − 50 = 314. Case 12 (size 2, $200) → 0, 241. Case 18 (size 2, $300) → 50, 241 − 50 = 191. Case 20 (enrolled, size 3, $500) → 150 countable ≤ 303, benefit 153 (above the $10 minimum). Case 21 (not enrolled) → 410 > 303, net test fails, 0.
    • fl_tca_eligible.yaml comment updates: Case 2, 910 ≥ 241, so no disregard and 910 > 241, ineligible (output unchanged); Case 6, (300 − 90 − 110) × 0.5 = 50 < 610.
  • Callers. Only fl_tca_net_income_eligible and fl_tca read fl_tca_countable_income, and nothing else reads the two changed variables.
  • Changelog. changelog.d/fix-9982-fl-tca-recipient-disregard.fixed.md is a top-level fragment with the fixed type.
  • Source-conflict ratchet (Tie source-conflict markers to the register shared with Axiom #10287). The changed comments in both variables match neither CONFLICT_COMMENT_RE nor ATTEMPT_RE, and the run started after Tie source-conflict markers to the register shared with Axiom #10287 and Count the FL and SD LIHEAP comments in the source-conflict ratchet baseline #10334. The PR validation job is green.
  • Partner tests. No files under tests/policy/baseline/partners/** are touched.

Axiom line assessment

There is no axiom: line (checked in every format), which is a SHOULD (Should 1). rulespec-us encodes 2420.0314–.0315 (the four-month lookback or the $90 income test, then the $110 remainder and half) in us-fl:policies/dcf/ess-program-policy-manual/2400-budgeting-income/page-28. That matches this PR's behavior for single earners, so encoded-correct with that module is the right line.

CI status

All 29 checks pass at c8197cbf8b (gh pr checks 10248). None is pending or failing.

Branch status

The branch is 2 commits ahead of main (one change and a merge of main on 2026-10-23) and 7 behind. git merge-tree --write-tree PolicyEngine/main c8197cbf8b merges cleanly, and main hasn't changed any FL TCA file or is_tanf_enrolled since the merge base.

Verdict: REQUEST_CHANGES

@DTrim99 DTrim99 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both changes and the applicant/participant split are correct under Fla. Stat. 414.095(11)(a), 65A-4.209(2) and ESS 2420.0315 (the $90 counted inside the $200), and all 18 new or changed expectations hand-check. One should-address item: there's no axiom line, and rulespec already encodes this, so add 'axiom: us-fl:policies/dcf/ess-program-policy-manual/2400-budgeting-income/page-28 encoded-correct'. Four suggestions, including that the disregards apply per earner while PE nets one per unit (pre-existing). Full report in the comment above.

…dd a page anchor

- State that 414.095(11)(a) does not mention the $90; ESS manual 2420.0315
  supplies the $90 and the test of income after it.
- Anchor the manual references at 2400.pdf#page=28 (2420.0314-.0315) and
  add 2600.pdf#page=21 (2620.0111.01 step order).
- Test a current participant whose unearned income exceeds the payment
  standard: the disregard applies, but the net test fails (400 > 303).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@PavelMakarchuk

Copy link
Copy Markdown
Collaborator Author

Thanks, David. Commit abd9fbd addresses the review. The FL TCA tests give 82 passed, and the source-conflict guard gives 103 passed.

Should 1, the axiom: line. Added: axiom: us-fl:policies/dcf/ess-program-policy-manual/2400-budgeting-income/page-28 encoded-correct. I checked the module at rulespec-us 58e4eb7ec: tca_individual_eligible_for_full_earned_income_disregard uses the lookback or the strict < test after $90, tca_remainder_of_first_earned_income_disregard_after_standard is 200 − 90, and tca_additional_earned_income_disregard_after_standard adds half of the rest.

Suggestion 1, per earner. Not changed here. It is a separate modeling change, and I noted it in the PR body as a follow-up.

Suggestion 2, the statute and the $90. The documentation of fl_tca_200_and_half_disregard_eligible now says that 414.095(11)(a) does not mention the $90, and that the manual supplies the $90 and the test of income after it. Fla. Stat. 414.095(11)(a):

In order to be eligible for earned income to be disregarded, the individual must be: 1. A current participant in the program; or 2. Eligible for participation in the program without the earnings disregard.

Suggestion 3, page anchor. Both variables now cite 2400.pdf#page=28 (2420.0314–.0315). fl_tca_countable_earned_income also cites 2600.pdf#page=21 (2620.0111.01, steps 2–4). The PR body now says PDF page 28, printed page 23.

Suggestion 4, test. integration.yaml Case 22: enrolled, size 3, $100 earnings and $400 unearned. The disregard applies, countable earned income is max(100 − 90, 0) less 110, floored at 0 = 0, countable income is 400 > 303, so fl_tca = 0.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Florida TCA: fl_tca_200_and_half_disregard_eligible ignores current receipt, so enrolled units lose the $200 and 1/2 disregard

2 participants