Skip to content

Store marginal National Insurance schedules as scales - #2490

Merged
MaxGhenis merged 3 commits into
mainfrom
refactor-222-ni-scale-parameters
Oct 22, 2026
Merged

MaxGhenis merged 3 commits into
mainfrom
refactor-222-ni-scale-parameters

Conversation

@juaristi22

@juaristi22 juaristi22 commented Oct 17, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #222.

Move the ten existing marginal NI rate and threshold histories into three canonical scale parameters: Class 1 employee, Class 1 employer and Class 4. Preserve their values, dates, units, references and policy qualifications, the existing contribution components and input overrides, and the five threshold-indexation writers. Flat Class 2 amounts and liability rules retain their existing structure.

Legacy scalar paths remain serialized compatibility views and support ordinary leaf updates through the existing reform routes. Each view resolves the canonical leaf in its own policy tree. Readers use immutable at-instant bracket components to retain the original arithmetic and dtype, including independently reformed equal or reversed thresholds. The tests cover clone/baseline isolation, cache updates, tracing, generated thresholds, final NI/household paths and targeted errors for conflicting structures.

Bracket zero is the fixed zero-threshold, zero-rate sentinel. The six sentinel histories reject nonzero, missing or null leaves, including future entries; explicit-zero updates remain no-ops. The docs describe this boundary, the module comment states the legacy-view retirement condition, and the changelog warns direct-YAML readers about the ten removed files.

The API compatibility tests execute source-extracted methods and the exact JSON helper from API commit 71dba65b3780f0bb4699d4dcbfe179e5f1506c78. All ten original default scalar IDs, histories, units and non-visibility fields are preserved. Discovery hides the ten legacy aliases and six fixed-zero leaves with household/economy flags; the ten canonical contribution leaves remain visible. Direct legacy lookup still shares canonical metadata and values. Synthetic reserialization after a root update retains an inherited baseline-name overwrite, independently reproduced on the original model commit; live root/alias/canonical values and metadata are checked separately. These are source-extracted contract checks, not a deployed or fully installed API test.

Reproducer: policyengine_uk/tests/test_ni_parameter_scales.py::test_ni_zero_band_reforms_are_rejected[dict-class_1.employee_scale-rate]; policyengine_uk/tests/test_threshold_indexation.py::test_canonical_threshold_registration_keeps_incoming_savings_writer; policyengine_uk/tests/test_ni_metadata_compat.py::test_fixed_zero_and_legacy_discovery_controls_are_hidden

Historical validation at published 28dbe681:

  • Independent policy/source and code/test reviews completed with no findings. The code reviewer executed 323 tests against the committed snapshot, all passing; these counts overlap the author validation and are not additive.
  • 222 tests passed at the final frozen pre-format source: all 49 new tests, 164 previously failed or unfinished regression cases, and 9 unfinished routing cases.
  • Another 573 distinct migrated-branch cases have complete passing outcomes and qualified reuse for the unchanged default numeric path after tracing/error-handling corrections. The reconciled union is 795 cases, not 795 fresh executions of the committed head. The 125 pre-migration baseline passes and independent original-model serializer control are excluded from this count. Interrupted sessions and all failure/correction evidence are retained.
  • One pinned Ruff 0.17.0 formatter round and the repository format, lint, F811/F821, diff, changelog and working-note checks passed. Formatting preserved every Python AST and all non-Python bytes; 2,948 unrelated base files are unchanged.
  • The non-executing documentation build passed, including the new page, index link and 13 repaired immutable-source links. It did not install dependencies or execute notebooks/private data.

Historical local model tests used Python 3.13.14, Core 3.32.27, microdf 1.2.1 and Hypothesis 6.168.2; the lock selects Core 3.33.2, microdf 1.5.11 and Hypothesis 6.169.0. Hosted CI must verify the locked environment. That historical validation did not include a full/private-data suite or population-impact claim. The authored base is e1601dbe4feb15e71d0d59b7a57f9d860741c068. A separate local integration with main 62a0117f9a40232d12ecb2c7a20af7441dfed1f1 passed all 190 cases: 49 NI cases and 141 incoming pension regressions. The first bounded run completed 102 cases before its time limit; the remaining-only run passed 88 with no repeated passing cases. Two existing pension fixtures also produced identical NI, pension, income-tax and final-cash arrays on actual main and the combined tree.

Historical published-fix validation at e889563e8ad30466a1b040bbb54e2501f835f3ff, based on main 7ad002f549680a9ca024c896532697d532a3a92a: the full Python confirmation returned actual command and pytest exit 0 using Core 3.33.2 / microdf 1.5.11, with recorded skips and one expected failure. The original auditor returned 1 for the glibc-only skip on macOS; the separate guarded Darwin assessment returned 0. Earlier failed/interrupted setup records and the earlier run's unavailable OS exit status remain retained. Focused Core 3.32.27 / microdf 1.2.1 compatibility checks passed separately; the whole suite was not run on that minimum environment. These results do not certify private-data, current-main, combined-stack or hosted aggregate validation.

Current integration and consumer checks

The local candidate ordinarily integrates captured main 4ed5990ca5485cb40e42737312a9837700b537a9, which already includes #2493 and #2452, and retains the incoming #2464/#2462 NIC-only excess and actual-return contracts. The six mechanical resolutions preserve the constrained 2022–23 director path, CA liability mask, public Core cache lifecycle and eighth savings writer. A separate Pension Credit reader uses the same canonical Class 4 leaves with its existing arithmetic and liability condition.

Actual local validation comprises 327 unique Python tests and 107 YAML programme checks across the affected NI, indexation, director, cache, Pension Credit, Carer's Allowance, ESA and salary-sacrifice contracts. Counts reconcile overlapping commands. The first 180-second NI batch remains an incomplete timed-out invocation; its 120 completed cases plus the sole missing case have exact catalogue coverage. A new discovery-identity test initially selected the baseline copy; independently approved current-gov identity scoping corrected that test only, retaining all API-root record, flag and direct metadata/values assertions. Setup failures and all original outcomes remain retained. Formatting preserved all Python ASTs and non-Python bytes.

Independent code and policy/source review of commit 1ea81b8af65eff995a3195770b57ce4fe61295e5 found no new local issues. The code reviewer ran 36 independent tests; a later clean integration projection with main 7cbdc2b98f3dcfc5f5c24ef4beaab13d0f407b05 passed the 13 cases in its newly changed Carer's Allowance property-test file. That main delta changes tests and release metadata, with production code and dependencies unchanged. These counts are separate from the author counts.

The genuine local API (policyengine-api 5.6.1, commit cd4039353dcf79171a6bf39241e4c47576d35242) and app (d1df5d1360d916e36740ba22c8b8bcfbc6854b84, Next dev mode) were exercised with this candidate and Core 3.33.2. Dependency checks passed and all loaded UK modules resolved to the candidate. The API retains twenty distinct legacy/canonical IDs, equal full histories and units for all ten pairs, and the intended visibility flags. In the expanded app picker, each of the ten canonical controls rendered once with its baseline value; the ten legacy alias controls and six zero-sentinel leaves were hidden. The standalone route did not expose search, so actual search remains untested. This is local preview evidence with an explicit override of the API lock's Core 3.33.0; it is not a deployed-consumer or production-build certificate.

Both local technical review roles completed; the consolidated PR review retains the external F2/F4 conditions below. Current-head hosted CI, deployed consumer-owner acceptance and aggregate/data validation remain required before landing. No full/private-data or population-impact validation is claimed.

Landing coordination

The previously preferred #2493 → #2452 ordering has occurred in captured main; this PR's updated branch has not yet landed. F2 remains open until API/app owners accept the candidate preview. F4 remains open until the owner-accepted shared-component migrations land and fresh combined checks are accepted. #2363's owner must migrate excess measurement to salary_sacrifice_pension_ni_excess, preserve actual-return semantics and retain liability-difference curves whichever change lands first. #2386 documentation, #2190 labour-supply ownership and other private-data/consumer conditions remain open. This PR is not merge-ready. No encoding or parity completion is claimed.

axiom: n/a — structural parameter refactor preserving the existing rules, histories and calculation behavior; no new policy encoding or encoder run.

@vahid-ahmadi vahid-ahmadi 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.

Fine once item 1 is fixed and the merge order with #2493 and #2452 is settled.

@juaristi22, the migration keeps every value. I compared the 10 legacy paths on main and on this branch: weekly from 2010 to 2035, plus every annual period from 2015 to 2035. That is 1,378 instants per path, and none differs. Reform dicts on the legacy and canonical spellings give identical Class 1 and Class 4 results. A Reform class that calls .update() on a legacy path still works. Baseline NI for a test household matches main.

  1. must: the bracket-zero leaves are reformable but have no effect. The formulas read only components[1] and components[2] (for example ni_class_1_employee_primary.py:18-33 and ni_class_4_main.py:14-27), and nothing reads bracket 0. Yet employee_scale[0].rate, employee_scale[0].threshold, employer_scale[0].rate and the Class 4 equivalents are ordinary parameters that metadata serialisers will expose. I set each of the three Class 1 ones in a 2026 reform on a £60,000 earner. Employee NI stayed at £3,210.60 and employer NI at £8,250.00, and there was no error. Please either reject reforms to bracket 0 in validate_ni_scale_compatibility (or in the reform readers), or make the formulas evaluate the whole scale. national-insurance-scales.md should also say what bracket 0 is and that it cannot be changed.
  2. should: metadata now lists each NI rate and threshold twice: the 10 legacy views plus 16 scale leaves (27 Class 1 and Class 4 rate or threshold parameters in all, against 11 on main). The page says this is intended. Before merge, someone should check how policyengine-api and the app will show the duplicates, so that users do not see two "NI secondary threshold" controls. The source-extracted API contract tests do not cover the app's parameter tree.
  3. should: utils/ni_parameter_scales.py reassigns __class__ on core nodes, swaps node.children for a filtering dict during processing, and patches uprating metadata in place. Each of these depends on policyengine-core internals that core can change without notice. Because the formulas still read individual components rather than calling the scale, the gain is mostly in layout, and the shim is the cost of that. Please add a short comment at the top of the module saying when the legacy views can be removed, so that this does not become permanent.
  4. should: this conflicts with two of your other open PRs. git merge-tree shows conflicts with #2493 (ni_class_1_employee_primary.py, ni_class_1_employee_additional.py) and #2452 (create_threshold_indexation.py). Please settle the merge order. Whichever lands second will need its NI parameter reads moved to the scale paths.
  5. nit: the changelog fragment is changed, which fits. Downstream code that reads the YAML files directly, rather than the parameter tree, will lose the 10 deleted files. A sentence in the fragment would warn those users.

What I checked

  • Read the full diff, the PR body and #222.
  • Value equivalence: my own script compared the 10 legacy paths on main and on this branch, as above.
  • Reform probes on a 2026 household with £60,000 employment income and £30,000 profit: legacy and canonical paths for the main employee rate, the secondary threshold and the upper profits limit, a legacy Reform.update(), and the bracket-0 probes in item 1. Baseline employee NI of £3,210.60 equals 8% × (£50,270 − £12,570) + 2% × (£60,000 − £50,270). Employer NI of £8,250 equals 15% × (£60,000 − £5,000).
  • pytest on the 6 NI and threshold-indexation test files: 204 passed. policyengine-core test on tests/policy/baseline/gov/hmrc/national_insurance: 142 passed.
  • ruff check and ruff format --check on the 27 changed Python files: clean.
  • Hosted CI: all 15 checks pass at 28dbe68.
  • The Reproducer line is present, and axiom: n/a fits a refactor. I found no overlap with other open PRs beyond #2493 and #2452.
  • I did not check the law, because no value changes. I did not run the full suite, the API, the app or any microdata.

🤖 Generated with Claude Code

@juaristi22
juaristi22 force-pushed the refactor-222-ni-scale-parameters branch from 28dbe68 to e889563 Compare October 19, 2026 09:04
@juaristi22

Copy link
Copy Markdown
Collaborator Author

Addressed items 1, 3 and 5 in e889563e. All six bracket-zero rate/threshold histories now reject nonzero, missing or null leaves, including future entries; explicit-zero updates remain no-ops. The docs explain the fixed sentinel, the module comment states the legacy-view retirement condition, and the changelog warns direct-YAML readers about the ten removed files.

The exact-commit full Python confirmation returned actual command and pytest exit 0 using Core 3.33.2 / microdf 1.5.11. Focused minimum-version checks remain separate. The original auditor returned 1 for the glibc-only skip on macOS; a separate guarded Darwin assessment returned 0. The earlier run's unavailable OS exit status remains recorded.

Items 2 and 4 remain open before merge: deployed API/app parameter-tree, search and duplicate-control acceptance, plus owner-accepted migrations and actual landing across #2464 → #2462 → #2490 and #2493 / #2452. The #2363 measurement migration and liability-curve preservation, #2386 documentation and #2190 ownership conditions also remain open. Combined-stack, current-main and hosted aggregate/data validation remain pending. This PR is not merge-ready; the existing Axiom disposition is unchanged.

@github-actions

github-actions Bot commented Oct 19, 2026 •

Copy link
Copy Markdown
Contributor

Aggregate impact on certified data: pass

Base 7cbdc2b98f against head 3962dc8dd1, both on enhanced_frs_2024_25.h5 (policyengine-uk-data 1.58.1, sha256 056e80fd8e91), fiscal years 2025-26 to 2031-32. Each year is a full microsimulation run on each side.

Checks: 0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 0 (thresholds in report_spec.yaml; a flag does not fail the job).

Workflow run and full report

Notes

  • In the years a figure from fewer than 10 records is suppressed (spending.disabled_students_allowance), every total containing it, and the decile incomes, are rebuilt from their other components, so no published total includes it. Those totals are marked †. A change is withheld where the two sides leave out different figures and can't be lined up.

Moves flagged for review

None.

Spending by benefit and service

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Caseloads

Measure 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed

Household net income by decile

No household's net income changes in any year.

No change in any year: receipts by tax head; government balance, each component counted once; model totals; components the model counts twice; household income totals; population; poverty rates; people in poverty; inequality; mean household net income in each side's own deciles; standard reform costings (change in gov_balance); standard reforms: change in each reform's target.

Checks failing on both base and head (1)
  • VAT is never negative (sign:vat): 2025-26: 76 units below zero, a weighted £-54,797,972 in total; 2026-27: 76 units below zero, a weighted £-56,271,349 in total; 2027-28: 76 units below zero, a weighted £-57,609,146 in total
Counted-once check

Each of 84 components was raised by £1 per unit in 2026-27, and every head of its totals was read household by household: its own head must rise by exactly £1, no other tax head may move, no other benefit may rise, and the model's own total must move by what its heads moved. A head that breaks a rule is measured again twice: with every other head held at its baseline value, and with every other head held at its value after the first £1 while the component rises again. It fails where either still shows the response. 0 failed; 0 were skipped.

Provenance
Side Commit Runtime Environment hash Partition hash Time
base main 7cbdc2b98f uk 2.141.12 (files 0a1c4c25c070), core 3.33.2, py 3.13.16 aarch64 9f78dda6a271 f210f83d5be4 1090.1s
head #2490 merged into main 3962dc8dd1 uk 2.141.12 (files f2c12dd110f2), core 3.33.2, py 3.13.16 aarch64 9f78dda6a271 f210f83d5be4 1078.91s

Dataset: hf://policyengine/policyengine-uk-data-private/enhanced_frs_2024_25.h5@2526edbbb687a3b54dbb11272e5389e4b62d2ac2, sha256 056e80fd8e9151d78f432a25cde863340baee81304c6216a37fb575ce8563784 (verified on both sides), policyengine-uk-data 1.58.1.

Receipts by tax head: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Income tax £299.38bn £319.14bn £336.66bn £351.81bn £367.35bn £385.48bn £403.81bn
National Insurance (employee and self-employed) £52.58bn £54.94bn £56.75bn £58.48bn £60.62bn £62.57bn £65.03bn
National Insurance (employer) £152.64bn £159.18bn £164.14bn £168.73bn £176.11bn £181.72bn £188.90bn
Employer NI change borne by capital £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Employer NI change borne by consumers £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Capital gains tax £12.62bn £13.06bn £13.55bn £14.04bn £14.54bn £15.09bn £15.65bn
Student loan repayments £7.83bn £8.12bn £8.35bn £8.56bn £8.79bn £9.04bn £9.38bn
VAT £253.71bn £260.53bn £266.72bn £273.14bn £279.83bn £286.71bn £293.71bn
Change in VAT from its baseline £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
VAT on private school fees £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Fuel duties £24.53bn £24.64bn £26.64bn £26.69bn £26.42bn £25.76bn £26.35bn
Alcohol duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Tobacco duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Vehicle excise duties £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
TV licence fee £4.28bn £4.43bn £4.44bn £4.46bn £4.49bn £4.51bn £4.53bn
Council tax £49.56bn £52.45bn £55.78bn £59.39bn £62.98bn £66.74bn £70.70bn
High value council tax surcharge £0.00bn £0.00bn £0.00bn £0.48bn £0.49bn £0.51bn £0.52bn
Northern Ireland domestic rates £0.55bn £0.58bn £0.61bn £0.63bn £0.67bn £0.70bn £0.73bn
Business rates £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn £31.73bn
Stamp duty land tax (own purchases, and corporate until the £10.06bn £10.56bn £10.98bn £11.40bn £11.81bn £12.23bn £12.64bn
Land transaction tax (Wales) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Land and buildings transaction tax (Scotland) £0.01bn £0.01bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Unspecified tax change borne by capital £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Unspecified tax change borne by consumers £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Wealth tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Wealth tax excluding the main residence £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Land value tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Carbon tax £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Spending by benefit and service: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
State Pension £122.50bn £127.12bn £128.28bn £130.21bn £134.05bn £138.02bn £142.08bn
Pension Credit £6.66bn £7.04bn £7.02bn £7.09bn £7.21bn £7.34bn £7.44bn
Winter Fuel Payment £1.70bn £1.68bn £1.59bn £1.57bn £1.57bn £1.55bn £1.52bn
Pension Age Winter Heating Payment (Scotland) £0.19bn £0.20bn £0.20bn £0.21bn £0.21bn £0.22bn £0.22bn
Universal Credit £78.78bn £83.09bn £84.89bn £86.65bn £87.58bn £89.00bn £90.33bn
Housing Benefit £8.59bn £8.92bn £9.19bn £9.33bn £9.61bn £9.87bn £10.15bn
Council Tax Reduction £1.99bn £2.03bn £2.08bn £2.13bn £2.18bn £2.23bn £2.28bn
Employment and Support Allowance (income-related) £2.12bn £2.18bn £2.23bn £2.28bn £2.33bn £2.39bn £2.45bn
Employment and Support Allowance (contribution-based) £5.22bn £5.36bn £5.49bn £5.62bn £5.76bn £5.90bn £6.04bn
Jobseeker's Allowance (income-based) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Jobseeker's Allowance (contribution-based) £0.29bn £0.30bn £0.30bn £0.31bn £0.32bn £0.33bn £0.33bn
Income Support £0.12bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Working Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Tax Credit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Incapacity Benefit £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Personal Independence Payment £27.05bn £28.19bn £28.94bn £29.64bn £30.37bn £31.11bn £31.87bn
Disability Living Allowance £7.52bn £7.83bn £8.04bn £8.24bn £8.44bn £8.65bn £8.86bn
Attendance Allowance £8.71bn £9.08bn £9.32bn £9.55bn £9.78bn £10.02bn £10.26bn
Carer's Allowance £4.50bn £4.69bn £4.81bn £4.93bn £5.05bn £5.17bn £5.29bn
Carer Support Payment (Scotland) £0.35bn £0.37bn £0.38bn £0.39bn £0.40bn £0.41bn £0.41bn
Carer's Allowance Supplement (Scotland) £0.00bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn
Severe Disablement Allowance £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn £0.03bn
Industrial Injuries Disablement Benefit £0.51bn £0.52bn £0.53bn £0.54bn £0.56bn £0.57bn £0.59bn
Armed Forces Compensation Scheme £0.61bn £0.62bn £0.64bn £0.65bn £0.67bn £0.69bn £0.70bn
War Widow's or Widower's Pension £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Child Benefit £16.23bn £16.91bn £17.32bn £17.73bn £18.16bn £18.60bn £19.04bn
Scottish Child Payment £0.50bn £0.52bn £0.53bn £0.55bn £0.56bn £0.57bn £0.58bn
Two Child Limit Payment (Scotland, counterfactual) £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Healthy Start vouchers £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn £0.05bn
Maternity Allowance £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Maternity Pay £3.32bn £3.41bn £3.49bn £3.57bn £3.66bn £3.75bn £3.84bn
Statutory Paternity Pay £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Statutory Sick Pay £1.13bn £1.16bn £1.19bn £1.22bn £1.25bn £1.28bn £1.31bn
Sure Start Maternity Grant £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn £0.01bn
Bereavement Support Payment £0.67bn £0.69bn £0.70bn £0.72bn £0.74bn £0.76bn £0.78bn
Tax-Free Childcare £0.55bn £0.56bn £0.57bn £0.58bn £0.60bn £0.61bn £0.59bn
Extended childcare entitlement £2.66bn £3.14bn £3.23bn £3.30bn £3.38bn £3.47bn £3.55bn
Universal childcare entitlement £3.32bn £3.59bn £3.69bn £3.78bn £3.88bn £3.99bn £4.08bn
Targeted childcare entitlement £0.57bn £0.60bn £0.62bn £0.63bn £0.65bn £0.66bn £0.67bn
Care to Learn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Childcare Grant £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Parents' Learning Allowance £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn £0.20bn
Adult Dependants' Grant £0.06bn £0.06bn £0.04bn £0.04bn £0.04bn £0.04bn £0.04bn
Travel Grant £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
NHS spending £204.68bn £205.46bn £206.22bn £207.04bn £207.96bn £208.89bn £209.79bn
State education spending £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn £0.02bn
Transport subsidy spending £25.15bn £25.25bn £25.34bn £25.44bn £25.55bn £25.67bn £25.78bn
Cost-of-living support payment £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Energy Bills Rebate £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Energy Price Guarantee subsidy £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Basic income £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Disability basic income £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Other public spending budget change £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Caseloads: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
State Pension 11,308k 11,208k 10,906k 10,812k 10,860k 10,908k 10,955k
Pension Credit 1,490k 1,489k 1,477k 1,455k 1,457k 1,454k 1,450k
Winter Fuel Payment 7,091k 7,008k 6,593k 6,509k 6,491k 6,377k 6,242k
Pension Age Winter Heating Payment (Scotland) 806k 807k 807k 805k 809k 812k 816k
Universal Credit 6,371k 6,379k 6,409k 6,419k 6,395k 6,387k 6,371k
Housing Benefit 1,254k 1,252k 1,254k 1,240k 1,244k 1,247k 1,249k
Council Tax Reduction 3,184k 3,210k 3,223k 3,244k 3,261k 3,279k 3,292k
Employment and Support Allowance (income-related) 187k 188k 188k 189k 190k 190k 191k
Employment and Support Allowance (contribution-based) 722k 724k 727k 730k 733k 737k 740k
Jobseeker's Allowance (income-based) 0k 0k 0k 0k 0k 0k 0k
Jobseeker's Allowance (contribution-based) 67k 67k 68k 68k 68k 69k 69k
Income Support 25k 0k 0k 0k 0k 0k 0k
Working Tax Credit 0k 0k 0k 0k 0k 0k 0k
Child Tax Credit 0k 0k 0k 0k 0k 0k 0k
Incapacity Benefit 0k 0k 0k 0k 0k 0k 0k
Personal Independence Payment 3,581k 3,595k 3,608k 3,623k 3,639k 3,655k 3,671k
Disability Living Allowance 1,296k 1,301k 1,306k 1,311k 1,317k 1,323k 1,329k
Attendance Allowance 1,701k 1,708k 1,714k 1,721k 1,729k 1,736k 1,744k
Carer's Allowance 1,038k 1,042k 1,046k 1,050k 1,055k 1,059k 1,064k
Carer Support Payment (Scotland) 81k 82k 82k 82k 83k 83k 83k
Carer's Allowance Supplement (Scotland) 0k 82k 82k 82k 83k 83k 83k
Severe Disablement Allowance 4k 4k 4k 4k 4k 4k 4k
Industrial Injuries Disablement Benefit 137k 138k 139k 139k 140k 140k 141k
Armed Forces Compensation Scheme 94k 94k 94k 95k 95k 95k 96k
War Widow's or Widower's Pension 0k 0k 0k 0k 0k 0k 0k
Child Benefit 8,136k 8,165k 8,185k 8,215k 8,249k 8,282k 8,314k
Scottish Child Payment 352k 354k 355k 356k 357k 358k 357k
Two Child Limit Payment (Scotland, counterfactual) 0k 0k 0k 0k 0k 0k 0k
Healthy Start vouchers 200k 201k 202k 203k 204k 204k 205k
Maternity Allowance 0k 0k 0k 0k 0k 0k 0k
Statutory Maternity Pay 334k 335k 336k 338k 339k 341k 342k
Statutory Paternity Pay 0k 0k 0k 0k 0k 0k 0k
Statutory Sick Pay 182k 183k 183k 184k 185k 186k 186k
Sure Start Maternity Grant 26k 26k 26k 27k 27k 27k 27k
Bereavement Support Payment 98k 98k 99k 99k 100k 100k 101k
Tax-Free Childcare 1,017k 1,028k 1,028k 1,033k 1,034k 1,038k 1,023k
Extended childcare entitlement 665k 671k 675k 677k 682k 686k 687k
Universal childcare entitlement 986k 989k 992k 997k 1,002k 1,013k 1,015k
Targeted childcare entitlement 119k 120k 120k 121k 121k 122k 121k
Care to Learn 0k 0k 0k 0k 0k 0k 0k
Childcare Grant 0k 0k 0k 0k 0k 0k 0k
Parents' Learning Allowance 98k 99k 99k 100k 100k 100k 101k
Adult Dependants' Grant 18k 18k 12k 13k 13k 13k 13k
Travel Grant 0k 0k 0k 0k 0k 0k 0k
Disabled Students' Allowance suppressed suppressed suppressed suppressed suppressed suppressed suppressed
16 to 19 Bursary Fund 0k 0k 0k 0k 0k 0k 0k
Cost-of-living support payment 0k 0k 0k 0k 0k 0k 0k
Energy Bills Rebate 0k 0k 0k 0k 0k 0k 0k
Energy Price Guarantee subsidy 0k 0k 0k 0k 0k 0k 0k
Basic income 0k 0k 0k 0k 0k 0k 0k
Disability basic income 0k 0k 0k 0k 0k 0k 0k
Government balance, each component counted once: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Government receipts, each component once £899.48bn £939.37bn £976.38bn £1,009.57bn £1,045.85bn £1,082.80bn £1,123.70bn
Government spending £536.58bn † £550.92bn † £557.25bn † £564.32bn † £572.87bn † £582.12bn † £591.28bn †
Government balance, each receipt once £362.90bn † £388.45bn † £419.13bn † £445.25bn † £472.97bn † £500.68bn † £532.42bn †
Benefits in household_benefits but not in gov_spending £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn £0.00bn
Model totals: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
gov_tax £902.61bn £942.50bn £979.51bn £1,012.70bn £1,048.98bn £1,085.93bn £1,126.83bn
household_tax £496.26bn £522.79bn £548.64bn £570.82bn £593.03bn £617.49bn £644.23bn
pre_budget_change_household_tax £488.43bn £514.67bn £540.29bn £561.78bn £583.75bn £607.95bn £634.33bn
gov_spending £536.58bn † £550.92bn † £557.25bn † £564.32bn † £572.87bn † £582.12bn † £591.28bn †
household_benefits £536.58bn † £550.92bn † £557.25bn † £564.32bn † £572.87bn † £582.12bn † £591.28bn †
gov_balance £366.03bn † £391.58bn † £422.26bn † £448.38bn † £476.10bn † £503.81bn † £535.55bn †
Components the model counts twice: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
corporate_sdlt, counted again inside expected_sdlt £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn £3.13bn
Household income totals: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Household market income £1,657.06bn £1,719.25bn £1,771.68bn £1,821.99bn £1,872.88bn £1,930.99bn £2,001.98bn
Household net income £1,658.11bn † £1,706.62bn † £1,738.40bn † £1,772.54bn † £1,808.64bn † £1,850.28bn † £1,901.99bn †
Household net income (HBAI definition) £1,466.67bn £1,513.40bn £1,545.60bn £1,578.60bn £1,612.63bn £1,651.67bn £1,702.09bn
Population: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
People 69,514k 69,778k 70,036k 70,316k 70,626k 70,944k 71,249k
Benefit units 35,247k 35,381k 35,512k 35,654k 35,811k 35,972k 36,127k
Households 31,167k 31,285k 31,401k 31,526k 31,665k 31,808k 31,944k
Poverty rates: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 15.9% 14.9% 15.5% 15.6% 15.7% 15.8% 15.7%
Absolute poverty, before housing costs: children 23.7% 20.9% 21.6% 21.4% 21.6% 21.8% 21.7%
Absolute poverty, before housing costs: working-age adults 13.8% 13.4% 14.0% 14.1% 14.2% 14.3% 14.3%
Absolute poverty, before housing costs: pensioners 13.7% 13.1% 13.2% 13.4% 13.5% 13.6% 13.6%
Absolute poverty, after housing costs: everyone 21.1% 20.6% 21.3% 21.5% 21.9% 22.2% 22.3%
Absolute poverty, after housing costs: children 32.1% 30.3% 30.9% 31.1% 31.7% 32.3% 32.5%
Absolute poverty, after housing costs: working-age adults 19.6% 19.4% 20.2% 20.4% 20.8% 21.0% 21.0%
Absolute poverty, after housing costs: pensioners 12.7% 12.5% 12.6% 12.9% 13.0% 13.1% 13.4%
Relative poverty, before housing costs: everyone 16.9% 16.4% 16.4% 16.5% 16.6% 16.7% 16.7%
Relative poverty, before housing costs: children 25.6% 23.5% 23.2% 23.2% 23.3% 23.4% 23.4%
Relative poverty, before housing costs: working-age adults 14.4% 14.4% 14.7% 14.8% 14.9% 15.1% 15.0%
Relative poverty, before housing costs: pensioners 14.8% 14.9% 14.1% 14.3% 14.2% 14.2% 14.4%
Relative poverty, after housing costs: everyone 21.7% 21.3% 21.4% 21.5% 21.7% 21.8% 22.0%
Relative poverty, after housing costs: children 33.0% 31.6% 31.2% 31.1% 31.5% 31.6% 32.0%
Relative poverty, after housing costs: working-age adults 20.0% 20.0% 20.3% 20.4% 20.6% 20.8% 20.9%
Relative poverty, after housing costs: pensioners 13.5% 13.1% 12.7% 12.8% 12.7% 12.7% 12.8%
People in poverty: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Absolute poverty, before housing costs: everyone 11,051k 10,427k 10,848k 10,947k 11,079k 11,209k 11,218k
Absolute poverty, before housing costs: children 3,560k 3,141k 3,261k 3,253k 3,298k 3,334k 3,334k
Absolute poverty, before housing costs: working-age adults 5,864k 5,737k 6,070k 6,165k 6,237k 6,315k 6,319k
Absolute poverty, before housing costs: pensioners 1,627k 1,549k 1,517k 1,529k 1,544k 1,561k 1,565k
Absolute poverty, after housing costs: everyone 14,660k 14,362k 14,899k 15,116k 15,439k 15,724k 15,870k
Absolute poverty, after housing costs: children 4,809k 4,556k 4,676k 4,719k 4,832k 4,939k 4,994k
Absolute poverty, after housing costs: working-age adults 8,333k 8,326k 8,775k 8,931k 9,120k 9,275k 9,329k
Absolute poverty, after housing costs: pensioners 1,518k 1,480k 1,449k 1,466k 1,487k 1,509k 1,547k
Relative poverty, before housing costs: everyone 11,760k 11,456k 11,504k 11,625k 11,706k 11,868k 11,914k
Relative poverty, before housing costs: children 3,840k 3,538k 3,514k 3,525k 3,546k 3,582k 3,602k
Relative poverty, before housing costs: working-age adults 6,154k 6,160k 6,365k 6,465k 6,537k 6,651k 6,651k
Relative poverty, before housing costs: pensioners 1,766k 1,758k 1,625k 1,634k 1,623k 1,634k 1,661k
Relative poverty, after housing costs: everyone 15,065k 14,863k 14,993k 15,090k 15,314k 15,490k 15,653k
Relative poverty, after housing costs: children 4,948k 4,756k 4,711k 4,715k 4,795k 4,840k 4,919k
Relative poverty, after housing costs: working-age adults 8,511k 8,559k 8,822k 8,917k 9,068k 9,192k 9,260k
Relative poverty, after housing costs: pensioners 1,605k 1,548k 1,460k 1,458k 1,452k 1,457k 1,475k
Inequality: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Gini coefficient, equivalised HBAI income before housing costs 0.3074 0.3051 0.3065 0.3071 0.3077 0.3083 0.3093
Mean household net income in each side's own deciles: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Decile 1: mean household_net_income per household £17,707 † £17,997 † £17,941 † £17,992 † £18,326 † £18,523 † £18,686 †
Decile 2: mean household_net_income per household £28,362 † £29,040 † £28,672 † £29,013 † £29,373 † £29,779 † £30,330 †
Decile 3: mean household_net_income per household £34,607 † £35,902 † £36,508 † £37,008 † £37,263 † £37,825 † £38,514 †
Decile 4: mean household_net_income per household £39,329 † £40,908 † £41,807 † £42,695 † £43,186 † £43,984 † £45,129 †
Decile 5: mean household_net_income per household £44,871 † £46,147 † £47,077 † £47,609 † £48,379 † £49,251 † £50,073 †
Decile 6: mean household_net_income per household £47,930 † £49,324 † £50,272 † £51,070 † £52,170 † £52,939 † £54,222 †
Decile 7: mean household_net_income per household £56,320 † £57,578 † £58,469 † £59,414 † £60,124 † £61,607 † £63,192 †
Decile 8: mean household_net_income per household £69,250 † £70,361 † £71,635 † £72,869 † £74,327 † £75,790 † £77,563 †
Decile 9: mean household_net_income per household £79,671 † £82,008 † £83,242 † £84,444 † £86,085 † £87,570 † £90,640 †
Decile 10: mean household_net_income per household £117,648 † £120,458 † £122,406 † £124,560 † £126,772 † £129,080 † £131,874 †
Standard reform costings (change in gov_balance): head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp £6.22bn £6.50bn £6.71bn £6.90bn £7.11bn £7.35bn £7.62bn
Raise higher rate by 1pp £3.54bn £3.82bn £4.05bn £4.27bn £4.49bn £4.76bn £4.96bn
Raise personal allowance by ~800GBP/year £-3.83bn £-3.96bn £-4.03bn £-4.10bn £-4.20bn £-4.30bn £-2.02bn
Raise child benefit by 25GBP/week per additional child £-2.00bn £-1.76bn £-1.64bn £-1.54bn £-1.44bn £-1.34bn £-1.24bn
Reduce Universal Credit taper rate to 20% £-20.54bn £-21.10bn £-21.45bn £-21.88bn £-21.96bn £-22.33bn £-22.81bn
Raise Class 1 main employee NICs rate to 10% £11.06bn £11.51bn £11.83bn £12.14bn £12.47bn £12.81bn £13.29bn
Raise VAT standard rate by 2pp £25.01bn £25.68bn £26.29bn £26.92bn £27.58bn £28.26bn £28.95bn
Raise additional rate by 3pp £2.83bn £3.07bn £3.27bn £3.47bn £3.67bn £3.91bn £4.23bn
Raise the Universal Credit standard allowance by 10% £-3.04bn £-3.17bn £-3.24bn £-3.32bn £-3.37bn £-3.43bn £-3.47bn
Raise the State Pension by 10% £-8.92bn £-9.13bn £-9.03bn £-9.06bn £-9.26bn £-9.51bn £-9.78bn
Standard reforms: change in each reform's target: head levels
Measure (head) 2025-26 2026-27 2027-28 2028-29 2029-30 2030-31 2031-32
Raise basic rate by 1pp: change in income_tax £6.36bn £6.65bn £6.87bn £7.07bn £7.29bn £7.53bn £7.81bn
Raise higher rate by 1pp: change in income_tax £3.55bn £3.83bn £4.06bn £4.28bn £4.50bn £4.78bn £4.97bn
Raise personal allowance by ~800GBP/year: change in income_tax £-3.96bn £-4.11bn £-4.19bn £-4.27bn £-4.36bn £-4.47bn £-1.77bn
Raise child benefit by 25GBP/week per additional child: change in child_benefit £2.34bn £2.15bn £2.03bn £1.92bn £1.82bn £1.71bn £1.59bn
Reduce Universal Credit taper rate to 20%: change in universal_credit £20.53bn £21.09bn £21.44bn £21.87bn £21.95bn £22.32bn £22.80bn
Raise Class 1 main employee NICs rate to 10%: change in national_insurance £11.33bn £11.79bn £12.13bn £12.44bn £12.78bn £13.13bn £13.62bn
Raise VAT standard rate by 2pp: change in vat £25.01bn £25.68bn £26.29bn £26.92bn £27.58bn £28.26bn £28.95bn
Raise additional rate by 3pp: change in income_tax £2.83bn £3.07bn £3.27bn £3.47bn £3.67bn £3.91bn £4.23bn
Raise the Universal Credit standard allowance by 10%: change in universal_credit £3.04bn £3.17bn £3.25bn £3.32bn £3.38bn £3.43bn £3.48bn
Raise the State Pension by 10%: change in state_pension £12.25bn £12.71bn £12.83bn £13.02bn £13.41bn £13.80bn £14.21bn

@vahid-ahmadi vahid-ahmadi 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.

@juaristi22 round 2, at e889563e8. The branch was rebased, so I reviewed the new commit e889563e8 against round 1. The rebased first commit carries no other changes.

Verdict: items 1, 3 and 5 are fixed. Items 2 and 4 are still open, as your reply says, so this isn't ready to approve yet.

Round-1 points

  1. must: bracket-zero leaves: fixed. _validate_ni_zero_bracket runs in NIParameterScale._get_at_instant and in validate_ni_scale_compatibility. It rejects any nonzero, missing or null threshold or rate in bracket 0, at any date. I re-ran my round-1 probes on a £60,000 earner in 2026. class_1.employee_scale[0].rate = 0.5 and employer_scale[0].threshold = 1,000 now raise a ValueError that names the leaf. Setting employee_scale[0].rate to 0 is a no-op (£3,210.60 employee and £8,250.00 employer NI, as in the baseline). employee_scale[1].rate and the legacy rates.employee.main at 10% both give £3,964.60, which is 10% × £37,700 + 2% × £9,730. The docs now describe bracket 0 as a fixed sentinel.
  2. should: duplicate controls in the API and app: not fixed. national-insurance-scales.md now tells metadata consumers to map each legacy name to its canonical leaf and show one control. Nobody has yet checked what policyengine-api and the app actually do. Someone needs to look at the app's parameter tree and search on a preview before this merges.
  3. should: module comment on retiring the shim: fixed. The docstring now says when the core-internal adaptations and the legacy views can go.
  4. should: merge order with #2493 and #2452: not fixed. git merge-tree against current heads still conflicts with #2493 (f686e04c1: ni_class_1_employee_primary.py, ni_class_1_employee_additional.py) and #2452 (eeaf911cc: create_threshold_indexation.py). All three PRs are yours, so please pick an order and put it in the bodies. I'd land #2493 and #2452 first. They are smaller, and this PR's legacy views keep their scalar reads working, so the rebase here is mechanical.
  5. nit: changelog warning for direct YAML readers: fixed.

New findings

  1. nit: overlap with Max's draft #2363. This branch now also conflicts with #2363 in both salary_sacrifice_pension_ni_*.py files. #2363 is a draft, so this doesn't block, but whichever lands second will need to move its NI reads onto the scale paths. This PR now merges cleanly with #2462 and #2464.

What I checked

  • Read the fix commit, your reply and the updated docs.
  • Fresh worktree and uv venv at the head. pytest tests/test_ni_parameter_scales.py: 106 passed. policyengine-core test tests/policy/baseline/gov/hmrc/national_insurance: 142 passed.
  • Ran the reform probes in item 1 myself. The household is synthetic.
  • git merge-tree against current main (clean), #2462, #2464 and #2469 (clean), and #2493, #2452 and #2363 (conflicts, as above).
  • CI at the head: all 16 checks pass, and the aggregate-impact report shows no change.
  • Not checked: the deployed API or app.

🤖 Generated with Claude Code

@juaristi22

Copy link
Copy Markdown
Collaborator Author

Documented #2493 → #2452 → #2490 in all three PR bodies, preserving #2464/#2462 and the other recorded dependency conditions. #2452 shares the threshold-indexation helper and tests with this PR. F2 still needs API/app owner-accepted preview evidence for the tree, search and duplicate controls. F4's actual migrations, landing and fresh combined-tree checks remain open; the written order does not complete those gates. The #2363 overlap remains a separate second-landing migration.

@juaristi22

Copy link
Copy Markdown
Collaborator Author

Integrated main 4ed5990 in 1ea81b8a, preserving the incoming director, liability, cache and savings-indexation behavior. The ten legacy aliases and six fixed-zero leaves are now hidden from the parameter picker while their API IDs, histories and accepted updates remain available.

The genuine local API/app preview on this commit showed all ten canonical controls once and no alias or zero-sentinel controls. Independent code and policy review found no new local issues; validation includes 327 reconciled Python tests, 107 YAML checks and separately reported independent checks. The newer 7cbdc2b main projection also passed its changed CA property tests.

Deployed API/app owner acceptance, actual landing and the existing #2363/#2386/#2190/private-data coordination conditions remain open. The standalone route did not expose search. This PR remains outside the merge queue pending those conditions and current-head human review.

@MaxGhenis
MaxGhenis added this pull request to the merge queue Oct 21, 2026
Merged via the queue into main with commit d8d873c Oct 22, 2026
17 of 18 checks passed
@MaxGhenis
MaxGhenis deleted the refactor-222-ni-scale-parameters branch October 22, 2026 02:29
@MaxGhenis

Copy link
Copy Markdown
Collaborator

Merged by the UK hub (session local_8e19f9d5, Opus 5.5) on Max's explicit instruction to merge the team's ready PRs before the Budget (21 October, about 23:00Z: "go ahead and merge them. none of us has time to wait on each other"). One merge-queue enqueue, pinned to head 1ea81b8af65eff995a3195770b57ce4fe61295e5.

  • Gates at this head: every check passes; GitHub reports MERGEABLE; not a draft; juaristi22, review decision . The merge queue re-tests against current main.
  • Review: no independent agent review was run at this head before merging, on Max's instruction. Any finding after merge goes to a follow-up PR.
  • Budget: the Budget runs on a locked pe-uk release (microcosm#1333). This change reaches Budget-day numbers only if the lock moves to a release that contains it.

🤖 Generated with Claude Code

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.

Use scale parameters for NI parameters

3 participants