Skip to content

Describe the income shift and the state revenue measure accurately - #51

Draft
MaxGhenis wants to merge 11 commits into
mainfrom
fix-method-copy-d2640
Draft

MaxGhenis wants to merge 11 commits into
mainfrom
fix-method-copy-d2640

Conversation

@MaxGhenis

@MaxGhenis MaxGhenis commented Nov 9, 2026 •

Copy link
Copy Markdown
Contributor

What this changes

We change copy only. After we drop their description strings, the four data files match main, so no number on the site changes.

  • The shift. On main, we describe the shift as moving the freed labor income to capital "in proportion to existing holdings". labor_capital_shift._apply_shift scales every positive amount of the capital income flows in constants.CAPITAL_INCOME_VARS (long- and short-term capital gains, taxable interest, qualified and non-qualified dividends, rental income) by one common factor. uk_shift_sweep._apply_shift does the same for the UK's flows: savings interest, ISA interest, dividends, property income and capital gains. Each person then gains in proportion to the capital income they already receive, and losses stay as they are. We rewrote the US and UK sweep descriptions, the labor-shift description, their data files, two chart captions and the "The experiment" cards on the income-shift and policy-analysis pages to say that. Both pages serve the US and the UK, so on their cards we describe the common factor without listing one country's flows.

  • The state measure. On main, we call the subtracted benefits "state-funded benefits", and a reader would take that to mean everything a state pays for. We subtract only household_state_benefits, the programs PolicyEngine counts as state-paid. At policyengine-us 1.764.6, the version behind the published state figures, PolicyEngine counts state SSI supplements, child care subsidies and other programs, such as New Jersey's property tax relief, as state-paid. It leaves Medicaid, CHIP and TANF off that list, apart from Massachusetts's TAFDC.

    New York's and Maryland's figures include New York City's income tax and refundable credits, Maryland's county income taxes and Montgomery County's earned income credit (md_montgomery_eitc). California's include San Francisco's Working Families Tax Credit (ca_sf_wftc, one of California's refundable credits) and three Los Angeles County programs in household_state_benefits: ca_la_ez_save, ca_la_infant_supplement and ca_la_expectant_parent_payment. We checked every refundable credit list and the household benefit lists against the variables under gov/local and found no others. We rewrote the state exposure scope note and the state ranking caption to say all this, and dropped "state-funded benefits" from the scenarios page's revenue note. We also cut the caption's claim that the chart shows only states with an income tax: in dollars, it ranks every state in state_deltas.

  • The revenue label. On main, we label the sweep's revenue option "Net federal revenue change", but the chart plots revenue_change_b, an alias of total_rev_change_b, which nets federal, state and local taxes against transfers. We relabeled it "Net government revenue change", the UK sweep's label. We also rewrote its description and the scenarios page's revenue note to say we count local taxes in the total and leave out health coverage. At 1.764.6, household_health_benefits returns zero unless a run switches on gov.simulation.include_health_benefits_in_net_income, and we leave that parameter at its default, off.

  • The federal chart. buildFederalRow adds up its own bands rather than taking the total less the states. At 1.764.6, employer_payroll_tax includes employers' state unemployment insurance and other state and local payroll taxes, so the federal payroll band holds them, and the benefits band includes TANF. We count three groups of taxes only in the total: workers' state payroll taxes such as California's SDI, the Additional Medicare Tax, and local taxes on income and occupations. PolicyEngine adds up those local taxes in local_income_tax_before_refundable_credits and local_occupational_tax. It counts New York City's and Maryland's local income taxes in state_income_tax_before_refundable_credits, so they land in those states' charts. On the published sweep at a 10% shift, the total less the states comes to -$138.2B, against the federal chart's -$131.3B. We added a note under the US federal chart to say so.

  • Analysis notes. On main, in california_shift.py and california_summary.py we call "all governments less the states" the published site's federal line. We now call it the split california_summary applies to the published sweep, and in the module docstring we explain how the site's federal chart differs. We replaced "state-funded benefits" with household_state_benefits in compute_transfer_detail.py and compute_state_exposure.py.

  • Voice. We gave the method copy and the data descriptions actors and shorter sentences. In them, we now move the income, run the current-law simulation and name what we leave out, and we write the stat card's and the state ranking's measures as equations. We split the federal chart note's 47-word sentence in two and the 41-word list of local items by state, and named the three Los Angeles County programs. We also cut "Reconciles to the household net-income identity" from the revenue description.

Some of the strings we fixed don't render on the site today: ShiftSweep doesn't read the sweep's metadata.description, no page renders LaborShift.jsx, and no page imports stateExposureData.json. We fixed them too, since the published JSON carries them and every future run rewrites them.

What this leaves alone

Checks

We stacked #53 on this branch, and we'll keep this PR in draft until #50 merges.

🤖 Generated with Claude Code

The site said the shift moves labor income to capital income in
proportion to existing holdings, and that the state measure nets out
state-funded benefits. The shift scales every positive amount of six
capital income flows by one common factor, and the state measure
subtracts only the programs in household_state_benefits, so it leaves
out Medicaid, CHIP and TANF (apart from Massachusetts's TAFDC). The
sweep's revenue option also read "Net federal revenue change" for the
all-government total, and the federal chart gave no sign that its
payroll band holds employers' state and local payroll taxes.

Copy only: the four data files change only in their description strings.

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

vercel Bot commented Nov 9, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
ai-inequality Ready Ready Preview Nov 10, 2026 7:42pm UTC

Request Review

The income-shift and policy-analysis pages' experiment cards also said
the shift redistributes labor income "in proportion to existing
holdings". The phrase spans two source lines there, so the first pass
missed it. Both pages serve the US and the UK, so the cards describe
the common scaling factor without listing one country's income flows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review of a8c921d and 9d91554 found the federal chart note wrong about
local income taxes. At policyengine-us 1.764.6, New York's and Maryland's
state income tax lists include New York City's and the Maryland counties'
income taxes, so they count in those states' charts. The taxes no chart
shows are workers' state payroll taxes, the Additional Medicare Tax, and
the city and county income and occupational taxes in
local_income_tax_before_refundable_credits and local_occupational_tax.

The state measure text now says New York's and Maryland's lines carry those
local taxes and names New Jersey's property tax relief among the other
state-paid programs; the scenarios page says the total counts local taxes
too; and the state-exposure module docstring drops "state-funded benefits".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The federal chart note named Philadelphia's wage tax as an example of the
city and county taxes that sit in no chart. At policyengine-us 1.764.6 that
tax reads pa_philadelphia_wage_tax_taxable_wages, an input that defaults to
0, and neither cached dataset build from June or September 2026 has such a
column, so it adds nothing to the published figures. Louisville's
occupational license tax reads county_fips and earnings, so the note names
it instead.

The state ranking caption, SCOPE_NOTE and the state exposure docstring now
give New York's and Maryland's local taxes their own sentence, which also
says New York's figures net New York City's refundable credits. Prettier
passes again on ShiftSweep.jsx, IncomeShift.jsx and PolicyAnalysis.jsx, and
the AIScenarios paragraph this PR rewrote now follows Prettier's wrapping.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
At policyengine-us 1.764.6 the state measure carries more local items than
New York City's and Maryland's taxes. Maryland's refundable credits add
md_montgomery_eitc, Montgomery County's match of the state EITC.
California's add ca_sf_wftc, San Francisco's Working Families Tax Credit,
and household_state_benefits lists three Los Angeles programs (EZ Save, the
infant supplement and the expectant parent payment). Each reads county_str,
and the dataset builds carry a county for every household, so each can
move a state's figure. A search of every refundable credit list against
the variables under gov/local finds no other local item.

The state ranking caption, SCOPE_NOTE (and the JSON it writes) and the
state exposure docstring now list them all, and ShiftSweep.test.jsx checks
the caption's list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Three of the listed items are tax credits (New York City's, Montgomery
County's and San Francisco's), so the caption, SCOPE_NOTE (and its JSON)
and the state exposure docstring now open the list with "A few local
taxes, credits and programs".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The stat card and the state ranking write their measures as equations, and
  "we" leaves out health coverage, Medicaid, CHIP and TANF, so no measure acts.
- The federal chart note says we count three groups of taxes only in the net
  government revenue total, in two sentences where one ran to 47 words.
- The state ranking and the state exposure scope note name Los Angeles
  County's EZ Save program, infant supplement and expectant parent payment,
  and split the 41-word list of local items by state.
- The method text and the data descriptions give the scaling and the
  current-law simulation to "we", replace "This is" and "The exercise is"
  with what happens, cut "Reconciles to the household net-income identity",
  and drop the italic "and".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Nov 10, 2026
The copy for a run that counts health coverage and TANF now names who
acts: Congress sets each state's TANF block grant at a fixed amount, and
the federal government still matches emergency care for enrollees whose
immigration status bars federal matching. It carries #51's wording for
the taxes outside the charts and for the local items in the state
figures, and no sentence runs past 32 words.

analysis/tests/fixtures/state_health_programs.json lists every program
in health_tanf.STATE_HEALTH with the state that runs it.
test_health_tanf.py checks the list against STATE_HEALTH, and
ShiftSweep.test.jsx reads it in place of a hand copy (review r3's F10).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The method-copy rewrite left three lines of the summary paragraph wider
than Prettier wraps them. Same words, new line breaks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Nov 10, 2026
Same code and words; Prettier rewraps seven spots in ShiftSweep.jsx, its
test and the metadata test. One of them matches the rewrap on #51.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The state ranking, the state exposure scope note and its module docstring
now credit EZ Save to the Los Angeles Department of Water and Power, a City
of Los Angeles department. They keep Los Angeles County for the infant
supplement and the expectant parent payment, which its Department of
Children and Family Services pays.

The AI scenario note named the proportional variant whichever variant the
reader picked. It now names the selected one, gives the figure "we
estimate", and names the use tax the figure includes. A test pins the
wording for three of the variants.

We now count the state-paid programs and put New York City's and
Maryland's local income taxes in those states' charts, and the market Gini
summary says that we move the income. The scope note says we count no
sales, property, corporate or severance taxes, since policyengine-us
computes state_sales_tax; the docstring says the same.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Nov 10, 2026
Brings in #51's credit of EZ Save to the Los Angeles Department of Water
and Power, the AI scenario note that names the selected wage variant, the
reworded federal-line and ranking sentences, and the state exposure
script's docstring and scope note.

ShiftSweep.jsx conflicted in two places. This branch keeps its
OUTSIDE_CHART_TAXES_NOTE and the health and TANF notes around it, with
#51's last sentence ("We put New York City's and Maryland's local income
taxes in those states' charts instead."). The state ranking description
keeps this branch's two forms, with and without health coverage and TANF,
in #51's words ("We count state SSI supplements...", and California's
LADWP and Los Angeles County programs) in each.

At this commit, eslint, vitest (12 files, 51 tests) and the CI-like
pytest run (280 passed, 66 skipped) all pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The state ranking, the state exposure scope note and its docstring credited
the infant supplement and the expectant parent payment to Los Angeles
County. policyengine-us 1.764.6 computes them only there, but its own
parameters credit both foster care payments to the California Department of
Social Services. Build p carries no electricity bills and no foster care
placements, so these two and EZ Save pay nothing. The copy now names only
San Francisco's Working Families Tax Credit, and the docstring says why.

The UK revenue note read as a fragment and left out Capital Gains Tax and
employers' National Insurance, which the UK total counts. The UK revenue
description and note now name both, in uk_shift_sweep.py and the UK data
file.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Nov 10, 2026
One conflict, in the state ranking description: this branch keeps its two
forms of the measure, with and without health coverage and TANF, and takes
#51's closing sentence, which names only San Francisco's Working Families
Tax Credit among California's local items. eslint, vitest (13 files, 55
tests) and the CI-like pytest run (280 passed, 66 skipped) pass at this
commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Nov 10, 2026
The UK sweep's callout now ends with #51's full sentence on what the UK
total counts. A test renders the UK data file and pins the whole callout.

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

The decile chart priced the UK sweep in dollars. Its description, axis
ticks, axis label and tooltip now take the sweep's currency symbol, so the
UK view reads in pounds.

In share mode, the description said the chart leaves out D1 because its
baseline mean is negative. No decile in either sweep has a baseline mean
net income of zero or less, so the chart drops none. The description now
names each decile the chart leaves out, read from the data, and adds
nothing when it leaves out none. Its first sentence now names who sorts the
households: "We sort households into deciles by weighted baseline market
income and keep each household in its baseline decile in every scenario."

The UK revenue summary listed the same taxes as the revenue description
above the chart. It now says what moves the total, as the US summary does.
We estimate Income Tax and Capital Gains Tax receipts, taken together,
climb from -£3.2B at a 10% shift to +£156.9B at 100%. Over that range,
National Insurance receipts fall from -£24.7B to -£210.0B, and household
benefits rise from +£2.0B to +£25.9B.

The state exposure docstring spells the Los Angeles Department of Water
and Power's program EZ-SAVE, as LADWP does, and splits the sentence that
lists the three Los Angeles programs. Its scope paragraphs now say that
this script counts none of the sales taxes Texas and Florida collect, and
that policyengine-us 1.764.6 counts Washington's capital gains excise as
state income tax.

Two new tests pin the UK view's pounds and summary, and the sentence that
names each decile the chart leaves out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MaxGhenis added a commit that referenced this pull request Nov 10, 2026
…-health-tanf-d2671

The decile chart now takes #53's unit and #51's currency symbol, and the
test file keeps #53's imports. The UK summary pin now expects #51's new
note on what moves the UK total.

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

This branch was successfully deployed

1 active deployment
Preview — e41b2349 Deployed Nov 10, 2026 by vercel[bot]
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.

1 participant