Skip to content

Correct the indirect tax effects docs page (#1114) - #1719

Merged
vahid-ahmadi merged 6 commits into
mainfrom
vahid-ahmadi/issue-1114-indirect-tax-effects-plan
Oct 24, 2026
Merged

vahid-ahmadi merged 6 commits into
mainfrom
vahid-ahmadi/issue-1114-indirect-tax-effects-plan

Conversation

@vahid-ahmadi

@vahid-ahmadi vahid-ahmadi commented May 27, 2026 •

Copy link
Copy Markdown
Collaborator

Corrects the indirect tax effects of reforms planning page (docs/book/policy/indirect-tax-effects-plan.md), written for #1114.

The page itself is already on main: it shipped in #2386 (merged 21 October 2026), and its original .added changelog entry was released in 2.143.0. This branch has merged main, dropped the released fragment and now carries only corrections to main's copy of the page.

What this PR corrects (from its changelog fragment):

Corrected the indirect tax effects planning page (docs/book/policy/indirect-tax-effects-plan.md): UKMOD's TCO technical note does not give the 0.8 consumption elasticity reported in #1114, labour supply responses run through two separate routes, fuel duty also reads LPG and natural gas inputs, and a formula on a consumption input would not change values supplied by a dataset.

The claim-by-claim review behind these corrections, with sources, is in the "Ready for hub review" comment on this PR.

  • Changelog fragment: changelog.d/1114-indirect-tax-page-corrections.changed.md (changed).
  • Docs and changelog only; no code changes.

🤖 Generated with Claude Code

@vahid-ahmadi
vahid-ahmadi force-pushed the vahid-ahmadi/issue-1114-indirect-tax-effects-plan branch from 0b0bfba to ff65045 Compare October 8, 2026 14:54
vahid-ahmadi and others added 3 commits October 12, 2026 11:02
#1114 asks for an automatic pass-through from direct-tax reforms
(income tax, NI) to indirect-tax revenue (VAT, excise) via household
consumption response, citing UKMOD's TCO module elasticity of 0.8.

Persist the plan in-repo. The current model has the destination
infrastructure (consumer_incident_tax_revenue_change distributes an
aggregate change across households by consumption share) but the
upstream link is missing: today the user has to manually set the
aggregate via gov.contrib.policyengine.budget.consumer_incident_tax_change.

The page covers:

- the current state (manual lever only) and what TCO does differently,
- Phase 1: a single household-level consumption_response_factor driven
  by net income change and a single elasticity parameter (UKMOD's 0.8),
- Phase 2: per-category elasticities calibrated to ONS Living Costs and
  Food Survey,
- Phase 3: automatic linkage to consumer_incident_tax_revenue_change so
  the user no longer needs to set a separate budget lever,
- the recommended hook pattern (split *_consumption -> *_consumption_baseline
  data input + *_consumption derived formula applying the factor) to
  avoid breaking non-indirect-tax users,
- open questions on decile-varying elasticities, saving residual, and
  interaction with the existing labour-supply response.
…elog fragment

Checked every variable, parameter, path and link against main in October
2026, updated the data pipeline references to Microcosm UK, and renamed the
changelog fragment to a Towncrier type.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fuel duty reads litres derived from petrol_spending and diesel_spending, so
the response factor belongs on those inputs; tobacco duty inputs are now
named; the labour-supply parameter tree is labour_supply_responses; the
existing relative_income_change variable is cited for the income change.
Code links now point to GitHub, since the docs site does not serve files
outside docs/. Removed em dashes and dropped the extra bullet from the
changelog fragment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@vahid-ahmadi
vahid-ahmadi force-pushed the vahid-ahmadi/issue-1114-indirect-tax-effects-plan branch from ff65045 to 5664e01 Compare October 12, 2026 09:10
MaxGhenis and others added 3 commits October 23, 2026 02:05
Main already carries this page (added by #2386); the merge brings the
branch up to date before the page is corrected.

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

- UKMOD's TCO technical note (revised October 2025) offers three
  expenditure assumptions and gives no 0.8 consumption elasticity; #1114's
  figure came from a ChatGPT conversation. The page and reference now say so.
- Labour supply responses: employment_income_behavioral_response reads
  gov.simulation.labour_supply_responses (0 by default), while
  dynamics/labour_supply.py applies the OBR elasticities through
  Simulation.apply_dynamics when gov.dynamic.obr_labour_supply_assumptions
  is true.
- Fuel duty also reads lpg_kg and natural_gas_kg (fuel_duty.py).
- policyengine-core has no default_formula, and a dataset value is
  returned before any formula runs.
- ONS publishes no LCF income elasticities; the reference is the Family
  spending bulletin. Cut the uncited claim about low-income MPCs, fixed the
  saving share implied by the Phase 1 formula, and made the Phase 3 test
  conditional on Phase 3.
- Replaced the released .added fragment with a .changed fragment.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From the independent review of the corrections:
- consumer_incident_tax_revenue_change's weighted aggregate equals the
  lever's amount (in £bn, times 1e9) only with positive weighted
  consumption; it falls back to consumption / £846bn without a dataset.
- The OBR route runs only when apply_dynamics is called on a simulation
  with a baseline, and gov.dynamic.obr_labour_supply_assumptions is true by
  default.
- The saving share uses baseline consumption and baseline net income; the
  ONS reference is the LCF's headline publication, with elasticities to be
  estimated from microdata.

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

Copy link
Copy Markdown
Collaborator

UK hub (Claude build session, for Max)
Ready for hub review

Head: 08cd556dfd56196e805c0fd06fe0b0fcb2a5a954

Context. This page already reached main, byte for byte, through #2386 (merged 21 October 2026; batch commit d50ee85), and its 1114.added.md entry is already in CHANGELOG.md under 2.143.0. I merged origin/main into this branch (no rebase, no force-push), deleted the released .added fragment, and corrected the page. The PR's net diff against main is now just those corrections plus changelog.d/1114-indirect-tax-page-corrections.changed.md. Suggested title: "Correct the indirect tax effects planning page".

Review. I had a verifier extract and check every claim, checked each correction myself, and then ran independent adversarial reviews. Round 1 asked for changes, and round 2 approved this head.

Corrected (12)

  1. The 0.8 elasticity. Model indirect tax effects of individual tax reforms #1114's figure cites only a ChatGPT conversation. UKMOD's own TCO technical note (revised October 2025, https://www.microsimulation.ac.uk/wp-content/uploads/2026/01/TCO-extension-v3.pdf) gives no 0.8. It offers three alternative assumptions: constant income shares (+1 elasticity), constant expenditure shares, and constant quantities (0). The page and its reference now say this.
  2. Removed "such as UKMOD's" from the proposed default.
  3. Labour supply runs through two separate routes:
    • employment_income_behavioral_response reads gov.simulation.labour_supply_responses, which is 0 by default (variables/gov/simulation/labour_supply_response/employment_income_behavioral_response.py:16-21).
    • Simulation.apply_dynamics (simulation.py:1413-1424) runs apply_labour_supply_responses, which applies the OBR's elasticities when gov.dynamic.obr_labour_supply_assumptions is true (the default) and there is a baseline (dynamics/labour_supply.py:126-132).
  4. Fuel duty also reads lpg_kg and natural_gas_kg (variables/gov/hmrc/fuel_duty/fuel_duty.py:19-22).
  5. policyengine-core has no default_formula, and a dataset value is returned before any formula runs (core simulations/simulation.py:1628-1631). Option 1 of the hook design now says so.
  6. "Nearly income-inelastic" became "less income-elastic", because that claim is unsourced.
  7. ONS publishes no LCF income elasticities; they would be estimated from LCF microdata.
  8. The reference is the Family spending bulletin, the LCF's headline publication.
  9. Cut the uncited claim about low-income households' marginal propensity to consume; it is now an open question.
  10. The saving share implied by the Phase 1 factor is 1 − elasticity × baseline consumption / baseline net income.
  11. The Phase 3 test is now conditional on Phase 3. Today consumer_incident_tax_revenue_change spreads the lever's £bn amount by consumption share, so its weighted aggregate equals that amount (variables/contrib/policyengine/consumer_incident_tax_revenue_change.py:12-22).
  12. Replaced the released .added fragment with a .changed fragment.

Checked and correct (unchanged)

  • gov.contrib.policyengine.budget.consumer_incident_tax_change exists, with a value of 0.
  • No automatic pass-through from direct to indirect taxes. Grep confirms it, and a household run left consumption, VAT and the duties unchanged under an income tax cut.
  • consumption adds exactly twelve COICOP categories (variables/input/consumption/consumption.py:12-25), and VAT reads it through the two VAT bases.
  • Alcohol duty reads the *_litres inputs and tobacco duty reads cigarettes_per_week and *_grams_per_week, at the paths given.
  • relative_income_change is per person and clipped.
  • Model indirect tax effects of individual tax reforms #1114 is open, the proposed names don't exist on main, and all links return 200.

Left for the hub (plan design, not page facts)

  • Phase 3 as written would be circular: household_net_income subtracts household_tax, which includes the lever. It would also double count VAT in gov_tax (gov_tax.py:27,30).
  • household_tax counts vat_change, so a consumption response alone would not move household_tax.

@vahid-ahmadi vahid-ahmadi changed the title Add indirect tax effects of reforms planning doc (#1114) Correct the indirect tax effects docs page (#1114) Oct 23, 2026
@vahid-ahmadi
vahid-ahmadi added this pull request to the merge queue Oct 23, 2026
Merged via the queue into main with commit 47daf1f Oct 24, 2026
10 checks passed
@vahid-ahmadi
vahid-ahmadi deleted the vahid-ahmadi/issue-1114-indirect-tax-effects-plan branch October 24, 2026 08:47
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.

2 participants