Summary
PolicyEngine's Georgia retirement income exclusion uses the unlimited per-person capital_gains variable rather than the federally-limited net capital gains ($3,000 loss cap per IRC §1211(b)). For filers with large capital losses, the raw capital_gains value makes per-person "retirement income" go deeply negative, which zeros out the exclusion entirely — even when the filer would otherwise be eligible for a $45,000+ exclusion.
Root cause
policyengine_us/variables/gov/states/ga/tax/income/subtractions/retirement/ga_retirement_income_exclusion_retirement_income.py:
adds = "gov.states.ga.tax.income.agi.exclusions.retirement.sources"
parameters/gov/states/ga/tax/income/agi/exclusions/retirement/sources.yaml lists capital_gains as one of the summed sources. At the person level, capital_gains returns the unlimited sum of short_term_capital_gains + long_term_capital_gains, not the federally-limited net (which for joint filers would be max(net_cap_gains, -$3,000) split across spouses).
When the retirement income sum goes negative, ga_retirement_exclusion_person returns a negative value via min_(retirement_income, cap), and ga_subtractions ends up as 0 after the upstream max_(0, ...) clamp, so no exclusion is applied at all.
Legal reference
- O.C.G.A. § 48-7-27(a)(5)(B) — defines retirement income eligible for exclusion
- 2024 GA IT-511 Individual Income Tax Booklet, Schedule 1 Retirement Income Exclusion Worksheet — Line 9 "Capital Gains (Losses)" uses the amount from federal Form 1040 (post-Schedule D loss limitation): https://dor.georgia.gov/document/document/2024-it-511-individual-income-tax-booklet/download
- Georgia Form 500 Schedule 1, Page 2, Line 9 on the TaxAct-generated form shows −$1,500 per spouse (= −$3,000 joint federal cap loss, halved)
Worked example
Input (from policyengine-taxsim #757):
- Joint filer, primary age 69, spouse age 63
- Wages: $123,105 (primary only)
- Interest: $16,312
- Short-term capital gains: −$496,221 (large loss)
- Long-term capital gains: $105,817
- Taxable pensions: $26,881
- Net federal capital gains (Schedule D, post-limit): −$3,000
TaxAct result (from http://taxsim.nber.org/out2psl/757):
GA Schedule 1 Retirement Income Exclusion Worksheet:
| Line |
Description |
Primary (69) |
Spouse (63) |
| 1 |
Salary and wages |
123,105 |
0 |
| 5 |
Earned income (capped at $5,000) |
5,000 |
0 |
| 6 |
Interest |
8,156 |
8,156 |
| 9 |
Capital gains/(losses) — federally limited |
−1,500 |
−1,500 |
| 12 |
Taxable pensions |
26,881 |
0 |
| 14 |
Total of lines 6–13 |
33,537 |
6,656 |
| 15 |
Line 5 + Line 14 |
38,537 |
6,656 |
| 16 |
Max allowable ($65k / $35k) |
65,000 |
35,000 |
| 17 |
Exclusion |
38,537 |
6,656 |
Total retirement income exclusion: $45,193 (Schedule 1 Line 13)
PE current result:
ga_retirement_exclusion_person (p1): −$168,605
ga_retirement_exclusion_person (s1): −$173,605
ga_subtractions: $0 (clamped)
ga_agi: $163,297 (= federal AGI, no exclusion applied)
Suggested fix
Introduce a new person-level variable ga_retirement_exclusion_countable_capital_gains (mirroring the existing ga_retirement_exclusion_countable_earned_income pattern) that returns each person's share of the federally-limited net capital gains. Replace capital_gains with this variable in sources.yaml.
Integration test
- name: GA retirement income exclusion with large capital loss (policyengine-taxsim #757)
absolute_error_margin: 10
period: 2024
input:
people:
primary:
age: 69
employment_income: 123_105
taxable_interest_income: 8_156
long_term_capital_gains: 52_909
short_term_capital_gains: -248_110
taxable_private_pension_income: 13_440
spouse:
age: 63
taxable_interest_income: 8_156
long_term_capital_gains: 52_909
short_term_capital_gains: -248_110
taxable_private_pension_income: 13_440
tax_units:
tax_unit:
members: [primary, spouse]
marital_units:
marital_unit:
members: [primary, spouse]
families:
family:
members: [primary, spouse]
spm_units:
spm_unit:
members: [primary, spouse]
households:
household:
members: [primary, spouse]
state_code_str: GA
output:
# Per 2024 GA IT-511 Schedule 1 Worksheet, each spouse's retirement income:
# Primary: 8,156 (interest) − 1,500 (limited cap loss) + 13,440 (pension half) + 5,000 (earned income cap) = 25,096
# Spouse: 8,156 (interest) − 1,500 (limited cap loss) + 13,440 (pension half) = 20,096
# Total exclusion (both under their respective $65k/$35k caps): 45,192
# (Matches TaxAct's $45,193 within rounding; TaxAct allocates all pension to primary but total matches.)
ga_retirement_exclusion: 45_192
# Federal AGI: 163,297; with exclusion subtracted → 118,105
ga_agi: 118_105
Related
Summary
PolicyEngine's Georgia retirement income exclusion uses the unlimited per-person
capital_gainsvariable rather than the federally-limited net capital gains ($3,000 loss cap per IRC §1211(b)). For filers with large capital losses, the rawcapital_gainsvalue makes per-person "retirement income" go deeply negative, which zeros out the exclusion entirely — even when the filer would otherwise be eligible for a $45,000+ exclusion.Root cause
policyengine_us/variables/gov/states/ga/tax/income/subtractions/retirement/ga_retirement_income_exclusion_retirement_income.py:parameters/gov/states/ga/tax/income/agi/exclusions/retirement/sources.yamllistscapital_gainsas one of the summed sources. At the person level,capital_gainsreturns the unlimited sum ofshort_term_capital_gains + long_term_capital_gains, not the federally-limited net (which for joint filers would bemax(net_cap_gains, -$3,000)split across spouses).When the retirement income sum goes negative,
ga_retirement_exclusion_personreturns a negative value viamin_(retirement_income, cap), andga_subtractionsends up as 0 after the upstreammax_(0, ...)clamp, so no exclusion is applied at all.Legal reference
Worked example
Input (from policyengine-taxsim #757):
TaxAct result (from http://taxsim.nber.org/out2psl/757):
GA Schedule 1 Retirement Income Exclusion Worksheet:
Total retirement income exclusion: $45,193 (Schedule 1 Line 13)
PE current result:
ga_retirement_exclusion_person(p1): −$168,605ga_retirement_exclusion_person(s1): −$173,605ga_subtractions: $0 (clamped)ga_agi: $163,297 (= federal AGI, no exclusion applied)Suggested fix
Introduce a new person-level variable
ga_retirement_exclusion_countable_capital_gains(mirroring the existingga_retirement_exclusion_countable_earned_incomepattern) that returns each person's share of the federally-limited net capital gains. Replacecapital_gainswith this variable insources.yaml.Integration test
Related