Repository navigation
Lock policyengine-uk 2.162.3 and take the actionable #1095 items - #1400
Conversation
|
@juaristi22 round 1, at Each #1095 item does what the body says, and the lock is consistent. One must: a stale reference count that the body doesn't mention, which turns engine-free CI red and can be fixed without the regeneration. Engine-uk is red too, for a reason I couldn't pin down. The rest are shoulds and nits. Findings
Checked and fine
What I ran
VerdictThe code is in good shape for a draft. Fix item 1 now; items 2 to 4 before ready; the nits as you like. Nothing here needs a ruling from Vahid. 🤖 Generated with Claude Code |
The spine maps GVTREGNO, PTENTYP2 and TYPEACC through their data-dictionary tables and now stops on a code outside them, naming the FRS variable. Blank values keep their defaults. The 2023-24 and 2024-25 household tabs carry no such code, so the spine does not change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rors uc_receives_new_claimant_health_element, the three regulation 77 company stocks, the two intermediaries inputs and benunit_reported_capital join UK_ENGINE_DEFAULT_INPUTS, each with the error it can make (microcosm#1095). The texts await María's signature. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
tools/compare_uk_council_tax_liability.py reads simulated_council_tax, simulated_council_tax_less_discounts and the stored council_tax on a dense release, and writes totals and ratios by nation and region, and means and ratios by local authority and band where ten or more distinct source households carry the cell (microcosm#1095, #953, #736). Cells give no totals or weighted counts, so no published difference gives a withheld cell back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The incumbent evaluation measures each local age row against the mid-year estimate and against that estimate less the area's census communal share for the band (María's ruling of 2026-10-25, microcosm#1095). The census residence-type computation moves into uk_runtime.communal_residents, which the target-surface receipt now reads too; its output is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
OBR's table 4.1 Northern Ireland domestic rates row is stamped K02000001, so the substring rule's Northern Ireland pin compiled no fact. The row now pins to the UK, as obr.council_tax does; domestic_rates is zero outside Northern Ireland. The row looks like the district rate only, and domestic_rates is the whole bill, so a measure exclusion holds it as a diagnostic (María's ruling of 2026-10-25, microcosm#1095, uk-data#520). The references and membership regenerate with the bump's shared regeneration. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
María's rulings of 2026-10-25 (microcosm#1095): mortgage_debt stays all secured debt, and an engine test now fails if a policyengine-uk formula reads it beside a property's secured debt, which would count the nested debt twice; statutory paternity pay stays annualised at 52 weeks, with the error noted where the spine sets it, for her signature. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
María's basis ruling of 2026-10-25 (microcosm#890 G, microcosm#1095): the row reads table 7271's net operational support from all sources, not table 7270's broad total, which adds investment no household's rail use carries. It stays held as a measured diagnostic, since bound on 7271 it failed the weight-ratio gate on #1383's arm 2c; its expiry does not move. The national references and membership regenerate with the bump's shared regeneration. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The UK lock moves from 2.151.0 to 2.160.0 (policyengine-core stays at 3.33.3). The uprating pins, their dataset projection and the bonus sacrifice anchor follow 2.155.0's OBR population vintage; the concept coverage, the cited versions and APPROVED_UV_LOCK_SHA256 re-derive. The Childcare Offer for Wales take-up flag stays at its default, recorded with its error, until Chronicle carries the Offer's take-up (María's ruling of 2026-10-25, microcosm#1095), and the three new Housing Benefit inputs are recorded at their defaults. The coverage manifest and the H2 fixture regenerate with the bump's shared regeneration. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
policyengine-uk 2.157.0 adds the charge to income_tax. The OBR income tax row, the HMRC income tax rows and the HMRC taxpayer filters now read income_tax_before_winter_fuel_payment_charge_annual, a new annual measure (María's ruling of 2026-10-25, microcosm#1095): HMRC's statistics predate the charge, and the OBR window's receipts hold almost none of 2025's recovery. The Winter Fuel row's notes record that its column is now gross. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From policyengine-uk 2.157.1 the engine charges VAT on private school fees as private_school_vat beside its general vat (pe-uk#2319), and OBR's receipts include it, so the row's value_expression is vat + private_school_vat, as obr.esa and obr.pip sum their parts. The row stays held (María's ruling of 2026-10-24), its notes no longer quote model figures, and the consumption-tax diagnostic sums both parts (microcosm#1095). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The engine's England-outside-London yield now takes off only BUS01c's older and disabled concessionary journeys, so both stages' fare pricing declare that category (dft_bus_journeys.json vendors it) and the engine parity test holds again (microcosm#1095). The support pricing's concessionary denominator is unchanged. The spine moves; the head arm measures it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Since policyengine-uk 2.156.1 the engine starts the universal hours in the term after the third birthday, so its eligibility for a child still before school in the spring term is the spring-term eligibility DfE counts. The universal measure reads it instead of its own DfE-age gate, the engine test follows the engine's new payment to a child born after 6 October, and the resolver's stub supplies the new input list (microcosm#1095). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2.161.0 changes only the two-child limit: it models the limit's exceptions as five person-level inputs that default to false, which the build leaves at their defaults, recorded with their errors (microcosm#1095). The uprating pins and the bonus anchor keep their values; their stamps, the concept coverage, the cited versions and APPROVED_UV_LOCK_SHA256 re-derive. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A local-authority row on MHCLG's Council Taxbase line 8, all bands (the line_08 spec's total), England only (microcosm#1095). Its measurement is the national row's, so the England row controls the cells by exact signature with no region tier, and the cross-grain declarations add the cells' subset relation to England's households. The metric council_tax/single_adult_discount is appended after the energy metrics, under the append-only rule. The census lists the metric; its regenerated JSON also carries the HMRC filter text of the Winter Fuel commit. The cells take the support-floor deferral on the Isles of Scilly and the City of London, as the band rows do. The local references, the membership and the cells' in-year hold land with the regenerated surfaces; the hold needs María's signature first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1299 left the profit after losses brought forward, and total income with it, as two measures the UK resolver computed by name (its deviation L3), with the grammar change as a follow-up (microcosm#1095). The value-expression grammar gains one function, max(<sum>, 0), and the shared module evaluates named terms: measures declared once as expressions, with nested terms expanded. hmrc_income declares the two terms, and the stage helper evaluates the same declaration. The resolver's four loss-relief branches give way to one named-term route. A term reads all its leaves from one source: the frame's columns at the frame's own period when the frame stores every leaf, the engine otherwise. Its _annual form evaluates on the annual income simulation. The bindings keep their names, so a term still costs one resolution round. New tests hold the floats bit for bit against the former formulas, at the frame's period and at another one, on the current and the annual simulation. One value moves: at the frame's own period, on a frame without a loss_relief column, the profit after the relief now reads the engine's float32 copy of the stored profit instead of the column. Production reads both terms at the calibration year, never at the frame's period. The measurement-period receipt reads a value expression with the interpreter's parser; its split on "+" read a subtraction as one name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
uk-data#600 checks each build's single years of age against ONS, which nothing here measured (microcosm#1095). A new vendored resource holds ONS's mid-2025 UK persons by sex and single year of age (MYE2, the 182 rows of the edition of 1 October 2026, from the pinned feed); the SPI stage's mid-2023 resource is untouched. uk_runtime.single_year_ages and tools/report_uk_single_year_ages.py report a built file against it, by single year and in the bands the age_tail stage draws, report-only. Cells under 10 source households read "<10", and so do the bands that hold one, so no difference gives a withheld age back. The resource comes from a cut of the pinned feed to its mid-year estimate rows, because the vendor tool loads a whole artifact into memory; the cut reproduces the committed mid-2023 resource byte for byte. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The national half of the regeneration (microcosm#1095), on the abf0921 pin. obr.domestic_rates now compiles, pinned to the UK, so 1,337 references are active and four have no fact at or before the period; the ORR row reads table 7271's support from all sources. The compile-parity receipt also takes policyengine-uk 2.160.0's per-capita indices, which move the uprated SPI savings interest and dividend band rows. The release-input coverage manifest, the H2 spine fixture and five mirrored gate digests follow the branch. The local references, membership and parity regenerate with the final rebase. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Five national rows from HMRC's Child Benefit Statistics of August 2025 (Table 2, United Kingdom): families in payment with one, two, three, four, and five or more children, the last HMRC's five-to-nine and ten-or-more columns together (microcosm#1095). Only Child Benefit spending bound before, so nothing held the claiming families' size. Each row counts the benefit units whose child_benefit is above zero by their children on policyengine-uk's own definition: the new resolver measure child_benefit_child_count sums is_child_or_qualifying_young_person_for_child_benefit over each unit. The rows carry an in-year snapshot hold, which María signed on 2026-10-25, and compile to HMRC's published counts. The references, membership and compile-parity receipt are regenerated: 1,342 active references. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From 2.155.0 the engine takes population growth from the OBR's March 2026 determinants, so the OBR per-capita GDP path that the uk_cgt_projection_entrants gate pins moves: 2025 from 4.38 to 4.74 percent, and 2023, 2024, 2028 and 2029 beyond the gate's 0.0005 drift (microcosm#1095). The head arm's calibration refused on the old pins, as the gate intends. The pins, the gate's note, the two tests that state the path and five mirrored gate digests follow the locked engine; the exempt amounts are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
María's ruling of 2026-10-26 (microcosm#1095): obr.winter_fuel_allowance takes OBR's FY2025-26 fact instead of the calendar-2025 window of FY2024-25 and FY2025-26, an exception to her window rule of 2026-09-22. The payment falls in November and December, so calendar 2025 holds the 2025-26 winter, when every eligible pensioner is paid and the charge recovers the payment above GBP 35,000, as policyengine-uk models it from 2.157.0. The window mixed in a quarter of FY2024-25, when only pensioners on Pension Credit or another means-tested benefit were paid, and left the row outside 10 percent on the head arm. The references, membership and compile-parity receipt are regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The newest release on PyPI. From 2.162.2 the engine's savings_interest_income is the interest outside tax-free accounts: a file with no ISA income contract is read as gross, and the engine takes tax_free_savings_income out of it when it loads the file. The frame still writes gross interest, so the HMRC SPI interest amounts by income band now measure the interest outside ISAs, as SPI Table 3.7 counts it, and the ONS interest diagnostic adds the ISA part back. individual_savings_account_ interest_income has a formula from 2.162.2, so the concept mapping no longer binds it. The 13 new inputs stay at their defaults, recorded with their errors for María's signature: Northern Ireland's Energy Price Guarantee inputs (2.161.1), and the ISA dividend and non-cash ISA interest inputs, the Lifetime ISA's flows and the two purchase flags (2.162.2). The uprating pins, the bonus sacrifice anchor and the CGT projection gate's growth path do not move from 2.161.0. Two engine tests pinned the factors from before 2.155.0's population vintage (per-capita mixed income and the savings interest target path) and now pin the engine's. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Vahid's review of microcosm#1400 (7): the age report withheld a band that holds a withheld year, but not the sex's other years, so a withheld year could come back as the sex's persons, which other reports give, less its shown years. When any single year of a sex rests on fewer source households than the floor, every cell of that sex now reads "<10", its bands too (microcosm#1095). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…'s mapping Vahid's review of microcosm#1400 (3, 5). The five Child Benefit family rows' notes record that HMRC's August 2025 counts (6.87m families, about 11.73m children in payment) imply about £13.61bn at the calendar-2025 window, about 1.8 percent more than obr.child_benefit's £13.37bn; both rows bind, so the solve splits the gap. The changelog of the FRS code refusals says the council tax band keeps its mapping: a code outside bands A to I still takes band D. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…162.2 The re-lock removed the binding of individual_savings_account_interest_income, which 2.162.2 computes with a formula, so it is no engine input to bind; the release frame writes its own tax_free_savings_income. The engine-free test still expected the ISA share; it now checks that the mapping writes all interest to savings_interest_income and binds no ISA part (microcosm#1095). No caller supplies the uk.isa_interest_fraction share, so no build changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…count cells' signed hold The rebase onto main brings #1381's feed pin (272c987). The national and local references and membership, the local census, both compile-parity receipts, the release-input coverage manifest, the H2 fixture and the gate digests are regenerated on that pin, from #1381's national and local-levels cuts; ons_mid2025_single_year_age_by_sex.json is vendored again from it (rows unchanged, provenance moved). The single adult discount cells by billing authority (microcosm#1095) now compile, with María's local in-year hold (signed 2026-10-25). Their one operand, line 8's total, makes each cell take the latest return across its authority's codes, as the band cells do: Barnsley and Sheffield carry their earlier returns under their former codes, which a plain selector reads as two facts. The reference counts move to 1,347 active (+ 1 obr.domestic_rates, + 5 Child Benefit family rows on #1381's 1,341), in test_country_spec.py (Vahid's review of microcosm#1400, 1) and test_uk_national_calibration.py. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
46e4070 to
005ae0a
Compare
|
@vahid-ahmadi thanks. Round 1 is addressed at
New since round 1 (please review):
Final arm: a spine and a calibration at What I ran: every engine-free test file (431, in chunks of 30). Each failure is fixed and its file re-run, except six that fail only on this machine: four need the Orrery Node package, one needs policyengine-us, and one fails because the uk extra is installed. 🤖 Generated with Claude Code |
|
@juaristi22 round 2, at All seven round 1 items are dealt with, and the count and factor checks hold. Engine-uk is still red, now for a new reason the 2.162.3 re-lock brings in: one must, and the fix is a single line. The ISA change is read correctly, but it leaves the SPI interest count on a different basis from its amount rows. Round 1 status
Our miss in round 1: through 2.161.0 the SPI Table 3.7 amount rows bound gross interest, ISA included, against a target that excludes ISA interest. That was already on main, and I didn't notice it. The re-lock fixes it. New findings
Checked and fine
What I ran
VerdictClose. Fix item 1 so engine-uk goes green. Items 2 and 3 should be done before ready, or filed on #1095 if you'd rather keep this PR to the lock. The nits are up to you. Keep it as a draft until CI is green and the final arm's Child Benefit residuals are posted. Nothing here needs a ruling from Vahid. 🤖 Generated with Claude Code |
Vahid's review of #1400, round 2 (1). policyengine-uk 2.162.2 adds isa_cash_interest_flat_rate_charge, the final charge on the cash interest in non-cash ISAs, to HBAI_HOUSEHOLD_NET_INCOME_SUBTRACTS, so the engine-tier test that holds UK_HBAI_GROSS_INCOME_DEDUCTIONS to the engine's list failed. The charge is a tax, like income tax, so the survey-concept gross income adds it back; the three stages that materialize the deductions (LCFS consumption, NTS bus travel, ETB VAT) declare it too. It is zero before 2027-28, so no build-year figure moves. source_stages.json and the release-input coverage manifest are regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Vahid's review of #1400, round 2 (3, 5). The frame stores savings_interest_income gross, ISA interest included, with the ISA part in tax_free_savings_income. policyengine-uk 2.162.2 reads a dataset that declares no ISA income contract as legacy_gross and takes the ISA part off when it loads it, but that is a default, not a promise. The build now declares the contract: UK_ISA_INCOME_CONTRACT goes into both UKSingleYearDatasets it makes (the UK adapter and the HMRC materialization), and every H5 it writes carries it in the root attribute policyengine_uk.isa_income_contract, beside energy_price_basis, so the measure resolver's loads declare it too. A new engine test reads gross interest of 1,000 with 300 in an ISA as 700 at the frame's year, through the adapter and through a written H5. The note on non_cash_isa_cash_interest now says that, held at zero, it leaves projections from 2027-28 without the final charge on that interest. The H2 spine fixture is regenerated: the adapter is part of several stages' implementation hashes, and three stages declare a new predictor. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Vahid's review of #1400, round 2 (2, 4). SPI Table 3.7 counts the recipients of taxable interest, and from the 2.162.3 lock its amount rows measure interest outside ISAs, but the count rows' filter read the frame's stored gross savings_interest_income, so a person whose only interest is ISA interest was counted. The filter now reads savings_interest_income_outside_isas, a resolver measure of the stored gross interest less its tax_free_savings_income, read at the frame as a filter's stored columns are; a persisted column of that name is refused. The amount row's notes record that, under the legacy-gross contract, the engine grows the gross interest and takes off the stored ISA part unchanged, so the measure overstates interest outside ISAs a little; the additive contract would remove that (microcosm#1095). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
María's ruling of 2026-10-26 (microcosm#1095). The gambling participation gate (uk_stage_lcfs_consumption_gambling_participation, microcosm#1359) bounds the scale that brings the added regular players' drawn stakes to the seen players' mean, so that a broken stake draw the anchoring would hide still fails. #1381 set the bound at [0.5, 2.0] on stage-only runs over an older spine, where the National Lottery's scale was 1.82 to 1.86. Full spine builds put it at about 2.03, on main after #1381 and on this branch alike, so every full UK spine stopped at the gate. The upper bound is now 2.5: a draw more than 2.5 times off the seen players' mean still fails. The battery's mirrored digests are re-pinned. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@vahid-ahmadi thanks. Round 2 is addressed at
The final arm is still to come. Its spine stopped at #1381's gambling gate ( What I ran: the engine tests for the touched surfaces (the new contract test, the HBAI test, the UK adapter and the concept mapping: 18 tests), and the engine-free files that read the changed modules, contract rows, stage declarations or fixtures (158 files, in chunks, 6,698 tests): all pass except two that fail only on this machine, one because the uk extra is installed and one because the Orrery Node package is missing. 🤖 Generated with Claude Code |
CI's engine-uk failed on test_the_engine_relabels_course_dated_plans_by_age_at_2025, which pinned policyengine-uk's old projection: it relabelled every holder by a course started at 18 and wrote some loans off, where the stage dates a course from the age its borrower left full-time education. The test was written to fail once the engine kept the stage's dating, so that the SLC rows are re-measured. policyengine-uk 2.162.2 does that (PolicyEngine/policyengine-uk#2636): each holder keeps the recorded plan and repayment. The test now pins that, and an engine that starts to relabel again fails it. The final arm on this lock measures the SLC rows (microcosm#1095). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@juaristi22 round 3, at All five round 2 items are done, and done well. There is one new must: the ISA contract writer is an HDF write site the serializer registry doesn't know, so engine-free goes red. It is a one-entry fix. The gambling bound change is reasonable, but it needs one more number to be justified rather than just passing. Round 2 status
Our miss in round 2: I wrote that the HBAI test was "the only red" on engine-uk. It wasn't proven. That job runs with New findings
Checked and fine
What I ran
VerdictClose. Add the registry entry (item 1) so engine-free stays green, and give the scale's two means (item 2) before this is marked ready. Item 3 is up to you. Keep it as a draft until CI is green (engine-uk was still running, so I can't yet say the student loan fix is its last red) and the final arm's Child Benefit residuals are posted. Nothing here needs a ruling from Vahid. The bound itself was María's call, and I agree with the direction. 🤖 Generated with Claude Code |
Vahid's review of #1400, round 3 (1). national_frame's _write_isa_income_contract adds a root attribute to every H5 the build writes, and the serializer registry classifies every writable production HDF site, so test_registry_classifies_every_writable_production_hdf_site failed. It joins the exclusions beside the energy price basis writer: it adds the ISA income contract root attribute only. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Vahid's review of #1400, round 3 (2). The receipt gave only the scale that brings the added regular players' drawn stakes to the seen households' mean, so a moved scale could not show which side moved. It now also gives the anchor's mean stake, the added regular players' drawn mean and the stake model's drawn mean for the households the diary saw; the last separates a level gap between the two draws from the walk's selection of households. They are means over the same households as the key's shipped entry, which rests on ten or more source households in every cell. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Vahid's review of #1400, round 3 (3). The build's frame is FRS 2024-25 and is read at 2025. Under the legacy-gross contract the engine grows the gross interest and takes off the stored ISA part unchanged, so a saver with 1,000 gross and 300 in an ISA reads 747.4, and an ISA-only saver keeps 14.22 as interest outside ISAs. The test pins both, so the #1095 move to the additive contract shows up as a test change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Final arm for #1400: one spine and one calibration at
The control predates #1381, so the differences mix this PR's changes with #1381's. A control on main after #1381 stopped at the gambling gate, which this PR raises. 🤖 Generated with Claude Code |
|
@vahid-ahmadi thanks. Round 3 is addressed at
🤖 Generated with Claude Code |
|
@vahid-ahmadi the gambling scale's terms, as promised (round 3, item 2). I ran The scale barely moved between the two spines. Run alone, the National Lottery's scale is 1.86 on #1333's spine and 1.83 on the final-arm spine. From one spine to the other, the anchor (the seen households' mean stake) moves by -1.0 percent, the added regular players' drawn mean by +0.3 percent, and the stake model's drawn mean for the seen households by -4.3 percent. Betting and gaming moves from 0.64 to 0.61. What makes the lottery's scale about 2: a level gap between the two draws, not the walk's selection. On both spines, the stake model draws nearly the same mean for the households the diary saw as for the added regular players (the ratio is 1.06, then 1.01). The diary-based stakes of those same seen households average 1.75 to 1.81 times the model's draws for them. So the walk is not picking light players; the stake model draws below the diary-based stake level throughout. That is most likely the forest smoothing the right tail of the stakes, which the diary's heavier players carry. For betting and gaming, the model draws above the diary-based level for the seen households, and higher again for the added players, as the code comment at Why 2.0 failed: the stage run alone on a finished spine reads the scale about a tenth lower than the same stage inside the full build that made that spine: 1.83 alone against 2.02 in the final arm's own build, with no change to the stage between the two. #1381 set the bound on stage-only runs, where 1.82 to 1.86 left room under 2.0; full builds sit at 2.02 to 2.03, on main and here alike. The 2.5 bound leaves room for that difference, and a draw more than 2.5 times off the anchor still fails. From this PR on, every build's receipt carries the three terms, so the next build shows them for the in-build run too. 🤖 Generated with Claude Code |
|
@juaristi22 round 4, at All three round 3 items are addressed. No new musts or shoulds, two small nits. The only thing still owed is the two-run comparison of the scale's terms, and I no longer think it should hold this PR back (item 2). Round 3 status
The final arm
New findings
Checked and fine
What I ran
VerdictReady to come out of draft once engine-free (3.13) finishes green. Item 2's comparison can follow as a comment, and both nits are up to you. Nothing here needs a ruling from Vahid. 🤖 Generated with Claude Code |
The rebase onto main after the policyengine-uk bump (microcosm#1400) took main's generated files where they conflicted. These are regenerated from a cut of the 272c987 artifact with the rebased contract, the local-level rows a local contract selector matches (306,418 rows). On main with the band-H commit the same cut reproduces main's local references, membership and parity receipt byte for byte. The local references and the data-target parity register regenerate unchanged. Counts: 25,192 compiled cells, 29,325 references, 4,133 signed exclusions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Summary
The next policyengine-uk bump (plan of 2026-10-25, part of #1095). It locks policyengine-uk 2.162.3, writes or records the inputs the releases from 2.152.0 add, and takes the #1095 items that need no new data source, no A/B of their own and no open ruling. It is rebased on main after #1381, so it reads the feed at 272c987, and every derived file is regenerated on that pin. Draft: see "Before ready".
The #1095 items
obr.domestic_ratescompiles, pinned to the UK, and is held as a measured diagnostic: OBR's line looks like the district rate only, anddomestic_ratesis the whole bill.obr.child_benefitallows; both rows bind, so the solve splits the gap.max(<sum>, 0).The lock and what it moves
APPROVED_UV_LOCK_SHA256re-derive. Two engine tests pinned uprating factors from before that vintage and now pin the engine's.obr.winter_fuel_allowancebinds FY2025-26 alone: the payment falls in November and December, so calendar 2025 holds the 2025-26 winter, which the engine models from 2.157.0.obr.vatmeasures VAT on private school fees too (2.157.1); it stays held.savings_interest_incomeis the interest outside tax-free accounts: it reads gross interest under alegacy_grossISA income contract and takestax_free_savings_incomeout when it loads the file. The frame still writes gross interest, and now declares that contract itself, in every H5 it writes and in the datasets it hands the engine. So the HMRC SPI interest amounts by income band now measure the interest outside ISAs, as SPI Table 3.7 counts it, and their counts now count the recipients of interest outside ISAs. The ONS interest diagnostic adds the ISA part back.isa_cash_interest_flat_rate_charge(2.162.2), a tax on the cash interest in non-cash ISAs from 2027-28, joins the HBAI deductions that the survey-concept gross income adds back.Moved out on María's ruling: the household-property split among FRS householders goes to the A/B PR, since it moves the UC take-up gate and needs its own measurement.
Measurement
Local, licensed runs; their outputs stay with the spines.
uk_stage_lcfs_consumption_gambling_participation): the National Lotteryamount_scaleis about 2.03 against the bound [0.5, 2.0]. A control on main after Write policyengine-uk's alcohol, tobacco and gambling duty inputs from the LCFS stage #1381 stopped at the same gate. With the bound raised to 2.5, the arm reruns at b7f089d; its results follow in a comment, with the Child Benefit rows' andobr.child_benefit's fit as classes.Before ready
Disclosure
No figure in this PR, its commits or its changelog rests on fewer than ten source households or names a record. No row's model figure is given where the row is of the SPI channel. The surface-wide fit and weight statistics are given as in #1308. Publisher figures appear as published.
Signatures
🤖 Generated with Claude Code