Repository navigation
UK: port the remaining uk-data fixes tracked in #1095, engine items included - #1121
Conversation
Automated review pass (Claude Code, high effort) — round 1 at
|
a0f292a to
a8dc66f
Compare
…h no annual-coded award (#1095) From the review of #1121: the repair's threshold is twice the tab's largest annual-coded award, so it moves with each survey year, and a tab with calendar-month awards but no annual-coded award used to repair nothing without saying so. access_fund_annual now refuses that tab, and records the paid awards by period code, the threshold and the repaired count; the root stage carries the record in its checkpoint evidence beside the capital sentinel count. The docstring and changelog describe the 2024-25 repair in aggregate terms. The spec scope names the refusal, and the stage's surfaces are regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The commits, where the plan changed during implementation (C5 reads the child tab too; C6 puts one identity-keyed draw on the root stage; B1 mirrors the engine's formula rather than handing the flag to it; B2 leaves the UC take-up population to Max's branch; B4 is rebased on #1081, which merged first), and the measurement: arm E (value-identical LCFS, 7/7 gates), arm B0 (the engine bump empties two sparse UC payment bands; #1107's rollout checks), arm B2 and the head arm, which also takes the West Midlands 12,570 to 15,000 income-tax cell past the 25% bound. Both diagnoses are recorded: the regional bands leave out other investment income, and policyengine-uk 2.122.2's corrections move every award that supported the two UC bands. X defers the cell and Y excludes the bands; replaying the target-fit gate on the head arm's evidence then passes. Review round 1 on #1121: the rebase onto #1081, the battery clock CI tripped on, and R1's access-fund evidence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, Vahid. Round 1 is addressed on the rebased head; details by item below. Rebase. The branch is rebased onto main after #1081, and CI's
1. X and the band variable. Agreed, it's a measurement bug, and wider than the regional cells. 47 HMRC targets band on policyengine-uk's
I measured the fix through the calibration's own measure path on the head spine, adding The fix belongs upstream:
I'm drafting a policyengine-uk issue, and X's register entry will link it once it's filed. X keeps the cell bound in calibration and expires on 2026-11-03. 2. Y and the growing class. Kept for this PR. Agreed the class needs a rule rather than one signed entry per sparse band. The options are:
3. B4 and #1081. #1081 merged first, and B4 is rebased on it, so the CVPAY line is now #1081's own The householder's receipt stays uncredited, as #1081's docstring records. policyengine-uk 2.122.2 has no householder-side input for lodger or boarder receipts. It has only the payer's two columns and 4. The bump. Thanks for the list. B0's changelog fragment now carries the forward-year note:
5. The opt-out shortfall. It's expected under #1107's contract (
So the 27.4k shortfall is recorded, not filled, and 6. C2's threshold. Done in
7. C6. Thanks; no change. Still open before merge:
|
The review of #1121 agreed the West Midlands 12,570-15,000 cell fails because policyengine-uk's total_income leaves out other investment income, which its own income_tax charges, and María ruled the fix belongs upstream. pe-uk#2174 now tracks it, and X's register entry names it as what the four-week deferral waits on. The entry's approval, adjudication and dates are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
a8dc66f to
980ffef
Compare
The commits, where the plan changed during implementation (C5 reads the child tab too; C6 puts one identity-keyed draw on the root stage; B1 mirrors the engine's formula rather than handing the flag to it; B2 leaves the UC take-up population to Max's branch; B4 is rebased on #1081, which merged first), and the measurement: arm E (value-identical LCFS, 7/7 gates), arm B0 (the engine bump empties two sparse UC payment bands; #1107's rollout checks), arm B2 and the head arm, which also takes the West Midlands 12,570 to 15,000 income-tax cell past the 25% bound. Both diagnoses are recorded: the regional bands leave out other investment income, and policyengine-uk 2.122.2's corrections move every award that supported the two UC bands. X defers the cell and Y excludes the bands; replaying the target-fit gate on the head arm's evidence then passes. Review round 1 on #1121: the rebase onto #1081, the battery clock CI tripped on, and R1's access-fund evidence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Automated review pass (Claude Code, high effort) — round 2 at
|
| Round-1 item | Status | Evidence |
|---|---|---|
| 1. West Midlands deferral is a band-variable defect | Agreed; link the issue | Confirmed upstream at policyengine-uk 2.122.2. total_income (variables/gov/hmrc/income_tax/total_income.py, cites ITA 2007 s. 23) adds savings_interest_income but not other_investment_income, while taxable_savings_interest_income charges both. It's now filed as policyengine-uk#2174. The X entry in uk/target_fit_reviewed_exclusions.json explains the defect but cites only microcosm#1095. Please add #2174 so the deferral points at the fix that retires it before 2026-11-03. Your 6.15× → 0.92 measurement on the head spine, with the other 119 regional cells moving at most 8%, is a convincing case that the band, not the data, is wrong. |
| 2. Single-household UC band exclusions (Y) | Fine as stated | Kept for this PR. A pooling or minimum-support rule is the right follow-up; worth a tracking item on #1095 so it doesn't stay one signed entry per release. |
| 3. B4 overlap with #1081 | Closed | The branch contains the #1081 merge (a50b9cc0). CVPAY handling is only #1081's frs_property_income; B4 keeps the payer's rent_paid_as_boarder/rent_paid_as_lodger and the shared-rent liability. The uncredited householder receipt is documented in #1081's docstring, and the engine has no householder-side input yet. |
| 4. Engine bump and the 2029 salary-sacrifice note | Closed; one link | The B0 changelog fragment's forward-year note is accurate. It would help to cite policyengine-uk#2173, filed today for exactly this: the fix routes the excess to NI-able earnings only. |
| 5. Child Benefit opt-out shortfall (27.4k) | Closed | Recorded rather than filled, as #1107's contract sets out (pool_shortfall_families, pool_exhausted, default opt_out_charge_share = 1), and obr.child_benefit still fits. |
| 6. Access-fund repair threshold | Closed | d083f8ff5: access_fund_annual (frs_spine.py:1390) refuses a tab that has calendar-month awards but no annual-coded award. Its evidence records paid awards by period code, the threshold and the repaired count, and the root stage carries that in its checkpoint evidence. The tests cover repair, refusal and the evidence record (test_uk_frs_spine.py:1062, :2954-3013), and they pass locally. |
| 7. C6 linked-claim share hand-weighted | Still open (nit) | The reply says "no change", but the round-1 nit was about the weighting, not the rule. frs_spine.py:1353-1362 still computes the linked share from a hand-built gross4 array (weight[linked].sum()). Under the microdf-throughout convention, a MicroSeries over the person rows with household weights would do it. Not blocking. |
Rebase and CI
- The engine-free fix is legitimate. In
test_uk_battery_bindings.py::test_fully_armed_battery_evaluates_gate_for_gate, the fixed register clock predated X's approval, so X read as not yet in force. Moving the clock forward is what the test's note asks. It passes locally. - New: conflicts with main. Main has moved by Add Axiom graph adapter surfaces and simulate.rules_by_ref@1 (NZ v0, G1) #1118 and Add the liquid financial assets concept, schema version 2 (NZ v0, G3a) #1120 (the NZ hub: Axiom adapter and the liquid financial assets concept).
git merge-treeshows two conflicts, both in generated files:docs/concept-coverage/policyengine-uk.mdandpackages/microcosm-frame/tests/golden/concept-coverage/policyengine-uk.json. Regenerate them after merging main; nothing hand-written conflicts. - CI at this head:
wheelspassed.engine-free(3.13, 3.14),lintandselect-countrieswere still pending when I checked.
980ffef to
c098fdc
Compare
…h no annual-coded award (#1095) From the review of #1121: the repair's threshold is twice the tab's largest annual-coded award, so it moves with each survey year, and a tab with calendar-month awards but no annual-coded award used to repair nothing without saying so. access_fund_annual now refuses that tab, and records the paid awards by period code, the threshold and the repaired count; the root stage carries the record in its checkpoint evidence beside the capital sentinel count. The docstring and changelog describe the 2024-25 repair in aggregate terms. The spec scope names the refusal, and the stage's surfaces are regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The review of #1121 agreed the West Midlands 12,570-15,000 cell fails because policyengine-uk's total_income leaves out other investment income, which its own income_tax charges, and María ruled the fix belongs upstream. pe-uk#2174 now tracks it, and X's register entry names it as what the four-week deferral waits on. The entry's approval, adjudication and dates are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The commits, where the plan changed during implementation (C5 reads the child tab too; C6 puts one identity-keyed draw on the root stage; B1 mirrors the engine's formula rather than handing the flag to it; B2 leaves the UC take-up population to Max's branch; B4 is rebased on #1081, which merged first), and the measurement: arm E (value-identical LCFS, 7/7 gates), arm B0 (the engine bump empties two sparse UC payment bands; #1107's rollout checks), arm B2 and the head arm, which also takes the West Midlands 12,570 to 15,000 income-tax cell past the 25% bound. Both diagnoses are recorded: the regional bands leave out other investment income, and policyengine-uk 2.122.2's corrections move every award that supported the two UC bands. X defers the cell and Y excludes the bands; replaying the target-fit gate on the head arm's evidence then passes. Review round 1 on #1121: the rebase onto #1081, the battery clock CI tripped on, and R1's access-fund evidence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
c098fdc to
bdffbe2
Compare
…h no annual-coded award (#1095) From the review of #1121: the repair's threshold is twice the tab's largest annual-coded award, so it moves with each survey year, and a tab with calendar-month awards but no annual-coded award used to repair nothing without saying so. access_fund_annual now refuses that tab, and records the paid awards by period code, the threshold and the repaired count; the root stage carries the record in its checkpoint evidence beside the capital sentinel count. The docstring and changelog describe the 2024-25 repair in aggregate terms. The spec scope names the refusal, and the stage's surfaces are regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The review of #1121 agreed the West Midlands 12,570-15,000 cell fails because policyengine-uk's total_income leaves out other investment income, which its own income_tax charges, and María ruled the fix belongs upstream. pe-uk#2174 now tracks it, and X's register entry names it as what the four-week deferral waits on. The entry's approval, adjudication and dates are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The commits, where the plan changed during implementation (C5 reads the child tab too; C6 puts one identity-keyed draw on the root stage; B1 mirrors the engine's formula rather than handing the flag to it; B2 leaves the UC take-up population to Max's branch; B4 is rebased on #1081, which merged first), and the measurement: arm E (value-identical LCFS, 7/7 gates), arm B0 (the engine bump empties two sparse UC payment bands; #1107's rollout checks), arm B2 and the head arm, which also takes the West Midlands 12,570 to 15,000 income-tax cell past the 25% bound. Both diagnoses are recorded: the regional bands leave out other investment income, and policyengine-uk 2.122.2's corrections move every award that supported the two UC bands. X defers the cell and Y excludes the bands; replaying the target-fit gate on the head arm's evidence then passes. Review round 1 on #1121: the rebase onto #1081, the battery clock CI tripped on, and R1's access-fund evidence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
bdffbe2 to
692e8b7
Compare
…h no annual-coded award (#1095) From the review of #1121: the repair's threshold is twice the tab's largest annual-coded award, so it moves with each survey year, and a tab with calendar-month awards but no annual-coded award used to repair nothing without saying so. access_fund_annual now refuses that tab, and records the paid awards by period code, the threshold and the repaired count; the root stage carries the record in its checkpoint evidence beside the capital sentinel count. The docstring and changelog describe the 2024-25 repair in aggregate terms. The spec scope names the refusal, and the stage's surfaces are regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The review of #1121 agreed the West Midlands 12,570-15,000 cell fails because policyengine-uk's total_income leaves out other investment income, which its own income_tax charges, and María ruled the fix belongs upstream. pe-uk#2174 now tracks it, and X's register entry names it as what the four-week deferral waits on. The entry's approval, adjudication and dates are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The commits, where the plan changed during implementation (C5 reads the child tab too; C6 puts one identity-keyed draw on the root stage; B1 mirrors the engine's formula rather than handing the flag to it; B2 leaves the UC take-up population to Max's branch; B4 is rebased on #1081, which merged first), and the measurement: arm E (value-identical LCFS, 7/7 gates), arm B0 (the engine bump empties two sparse UC payment bands; #1107's rollout checks), arm B2 and the head arm, which also takes the West Midlands 12,570 to 15,000 income-tax cell past the 25% bound. Both diagnoses are recorded: the regional bands leave out other investment income, and policyengine-uk 2.122.2's corrections move every award that supported the two UC bands. X defers the cell and Y excludes the bands; replaying the target-fit gate on the head arm's evidence then passes. Review round 1 on #1121: the rebase onto #1081, the battery clock CI tripped on, and R1's access-fund evidence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Automated review pass (Claude Code, high effort) — round 3 at
|
| Item | Status |
|---|---|
| Link pe-uk#2174 from X | Done. The register reason, the receipts and test_uk_battery_bindings.py (assert "pe-uk#2174" in deferral.reason) all cite it. X expires 2026-11-03. |
| Regenerate concept coverage against main | Done. Regenerated on the new concept schema (d824f5e97d58), with 285 inputs and 40 covered. The branch merges cleanly into main. |
| Cite pe-uk#2173 in B0's note | Open (nit 2). |
| Y's sparse-band class needs a rule | No tracking item on #1095 yet. Worth one line so it doesn't stay one signed entry per release. |
| C6 hand-weighted share | Open (nit 3). |
#1086 / P checked
[tool.uv] conflictspairs every US-installing extra with every UK-installing extra. The US-installing extras aremicrocosm-build[us],microcosm-data[us]andmicrocosm-frame[policyengine]; the UK-installing ones are each package's[uk].- No other
pyproject.tomlin the workspace installs an engine. - CI installs one extra per lane (
--extra us,--extra uk), which the conflicts allow. APPROVED_UV_LOCK_SHA256is re-pinned at P and again at B0.
Tests run locally at 692e8b7b (fresh worktree, uv sync --all-packages --locked, the engine-free environment)
test_engine_core_pins.py: 14 passed.- All 18 engine-free test files this PR touches: about 1,220 passed, 7 skipped, 0 failed.
ruff check .: clean.ruff format --check: none of the PR's files would be reformatted.- CI at this head is green: lint, wheels, select-countries, engine-free, engine-us and engine-uk (each on 3.13 and 3.14), and integration-uk.
Still before merge (from the description, and unchanged)
- The signed-difference entries for the net-new columns (C5, C6, B2–B5) and for B1's mechanism change. The drafts are still outside the repo.
- A calibration of this head, the national build and the certifier. The receipts' head arm was built as
65a08ddb6with both UC bands bound; the Y replay reuses those weights.
…1095) #1089 (2fe7d8b) moved the SPI Table 3.6 employment, self-employment and private-pension amounts by total-income band to HMRC's band growth (hmrc.itl_2026.total_income_growth_by_total_income_band) by editing the generated uk/target_references.json, which it also re-serialised with literal pound signs. The population contract still declared the flat OBR average-earnings, per-capita mixed-income and private-pension indices for the three targets, so regenerating from feed 825406f gave e8f829... against the committed bf7549..., and the feed-gated test_committed_surfaces_regenerate_from_pinned_feed[national] failed on main (CI skips it without the licensed feed). The contract now declares the band-growth index, with notes saying so, for the three targets, and both generated resources are regenerated: the references equal the committed ones as parsed JSON (only the encoding returns to the generator's), and the membership report, which still recorded the flat-index uprating for the 39 references, now records the band factors (-2.3% for 15,000-20,000, +0.3% for 20,000-30,000). Compiled values are unchanged: the three lowest employment bands stay at GBP 17.7bn, 47.5bn and 172.5bn, and the national compile parity regenerates and passes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Vahid's should-fix on #1100: retiring the access_fund input-mass exclusion left the period-code defect it recorded with no active record. The FRS weeklyises ACCSSAMT from the reported amount and its period code ACCSSPD, and an access-fund award is paid per academic year or term. On the 2024-25 tab the 16 awards' calendar-month amounts run up to the size of a whole annual award, so an award read as monthly can annualise to more than ten times every annual-coded award; #1089 had to sign an exclusion when calibration took such a household to the weight bound. access_fund_annual reads ACCSSPD: a calendar-month award (code 5) that annualises to more than twice the largest annual-coded award (code 52) on the tab is read as its per-period amount, ACCSSAMT x 52/12. On the 2024-25 tab that repairs fewer than 10 awards and leaves large but plausible monthly amounts as reported, as it does the awards with no period code. A tab without the ACCSSPD column refuses. The spec names the rule, the test and H2 fixtures carry ACCSSPD, and the coverage manifest and H2 fixture are regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…es (#1095) The rest of uk-data#486 on microcosm. The LCFS donor's G018 and G019, household counts of adults and children by the survey's age-18 split, were renamed to the engine's person flags is_adult and is_child, and the recipient materialised those engine flags and summed them per household. policyengine-uk#1896 deprecates both flags. The predictors are now household_adult_count and household_child_count, in the same positions of the predictor list, and the recipient counts its members from age (18 and over, under 18), which is exactly the engine's 2.100.0 rule, so the values and the seeded forest are unchanged; the stage no longer asks the engine for the two flags. The lcfs_consumption notes were a plain YAML scalar containing " #890", which YAML reads as a comment, so 642 characters were dropped at load and from source_stages.json; the notes are now single-quoted and gain a sentence on the counts. Coverage manifest and H2 fixture regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ar-2025 window (#1095) DWP's benefit expenditure and caseload tables give each fiscal year its own measure (expenditure_2024, expenditure_2025), so calendar_year_window read the two years as two one-year series and refused the window; #1100 dropped the row for that reason. A window selector can now declare source_measure_id_by_opening_year, mapping each overlapping year to its measure: a fact matches only its own year's measure, and the declared measures form the window's one series. The map's form is checked when the reference is built; its years are checked when the window resolves, so a compile that restamps the reference to another period (the 2023 parity receipt) defers it like any reference without facts. dwp.hb.amount_pension_age binds the line "Housing Benefit over Pension Credit qualifying age" at 3/12 of the FY2024-25 outturn (6,851.0m) plus 9/12 of the FY2025-26 forecast (7,114.7m), 7,048.8m, on housing_benefit over benefit units whose eldest adult is 66 or over in Great Britain households. It has its own dwp_benefit_expenditure family, which allows source projections. The national references, the membership report and the 2025 parity receipt gain the row and nothing else. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The commits, where the plan changed during implementation (C5 reads the child tab too; C6 puts one identity-keyed draw on the root stage; B1 mirrors the engine's formula rather than handing the flag to it; B2 leaves the UC take-up population to Max's branch; B4 is rebased on #1081, which merged first), and the measurement: arm E (value-identical LCFS, 7/7 gates), arm B0 (the engine bump empties two sparse UC payment bands; #1107's rollout checks), arm B2 and the head arm, which also takes the West Midlands 12,570 to 15,000 income-tax cell past the 25% bound. Both diagnoses are recorded: the regional bands leave out other investment income, and policyengine-uk 2.122.2's corrections move every award that supported the two UC bands. X defers the cell and Y excludes the bands; replaying the target-fit gate on the head arm's evidence then passes. Review round 1 on #1121: the rebase onto #1081, the battery clock CI tripped on, and R1's access-fund evidence. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
692e8b7 to
05b8f07
Compare
|
Thanks, Vahid. Rounds 2 and 3 are addressed: #1143 has merged, and this PR is rebased onto it with the fixes ( Round 3
Round 2
Before merge
|
|
Calibration of this head (arm head-r3). Built locally from
The receipts in |
HMRC's Property Rental Income Statistics are receipts before allowable expenses; SPI Table 3.7 net income from property is landlords' profit after allowable expenses and before residential finance costs, the concept property_income holds (policyengine-uk#2172 now documents it so). The incumbent's x1.9 scaling (uk-data#311) set the first against the second, so the 13 amount rows were signed out pending a ruling. María ruled on 2026-10-05 to bind each concept on its own variable. - The signed exclusion property_income_undercount_adjustment_missing is retired, the hmrc_spi family outcome becomes active_strict_band_pins with a rationale for the net concept, and the contract note replaces the x1.9 sentence. The uprating index stays obr.per_capita.gdp. - Regenerated from feed 825406f: 1,244 active references on #1121's base (13 added, none changed), 15 signed out; membership candidates 1,253 -> 1,265. - Both national compile-parity receipts gain the 13 rows. A property- specific reason precedes the generic SPI drift reason, which blamed the fixture's one-year projection: the 2025 values are £31.78bn against the fixture's £55.78bn (1.9 x £29.36bn). - Tests: the reference counts, the inverted property test (13 rows on the per-capita GDP hold, no value operation), the membership outcome and signed-rationale lists; the income-anchors note. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2.123.0 carries PolicyEngine/policyengine-uk#2172: property_rental_income, property_finance_costs and property_finance_costs_brought_forward, the s. 274A finance-cost reduction, and a property allowance that no longer stacks on expenses already netted from profit. The lock's UK side moves exactly to 2.123.0 (uv lock --upgrade-package policyengine-uk==2.123.0) and nothing else moves: policyengine-core stays 3.32.19 on the UK side, which 2.123.0 accepts, and 3.32.5 on the US side (#1086's per-country pins). The UK extras of microcosm-build, microcosm-data and microcosm-frame require >=2.123.0. The step from #1121's 2.122.2 also brings #2160, #2096, #2097 and #2144. Re-derived with no data change: the uprating pin stamp (values unchanged), the concept coverage (288 inputs, the three property inputs uncovered) and the mapping reviewed against 2.123.0 (the property_income note quotes its new documentation, alignment still approximate; the liquid-asset reason holds unchanged), the spec's declared dependency and the H2 fixture's, the coverage manifest's source digests, and APPROVED_UV_LOCK_SHA256. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Arm c6x on 7b20ef7: the share-filled walk with PRIS a diagnostic, spine and calibration built afresh. All 7 calibrated-seam gates and all 33 spine gates pass with #1121's stale West Midlands deferral dropped at gate time; receipts at the calibrated weights against PRIS; the engine's landlord quantities at 2025. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
HMRC's Property Rental Income Statistics are receipts before allowable expenses; SPI Table 3.7 net income from property is landlords' profit after allowable expenses and before residential finance costs, the concept property_income holds (policyengine-uk#2172 now documents it so). The incumbent's x1.9 scaling (uk-data#311) set the first against the second, so the 13 amount rows were signed out pending a ruling. María ruled on 2026-10-05 to bind each concept on its own variable. - The signed exclusion property_income_undercount_adjustment_missing is retired, the hmrc_spi family outcome becomes active_strict_band_pins with a rationale for the net concept, and the contract note replaces the x1.9 sentence. The uprating index stays obr.per_capita.gdp. - Regenerated from feed 825406f: 1,244 active references on #1121's base (13 added, none changed), 15 signed out; membership candidates 1,253 -> 1,265. - Both national compile-parity receipts gain the 13 rows. A property- specific reason precedes the generic SPI drift reason, which blamed the fixture's one-year projection: the 2025 values are £31.78bn against the fixture's £55.78bn (1.9 x £29.36bn). - Tests: the reference counts, the inverted property test (13 rows on the per-capita GDP hold, no value operation), the membership outcome and signed-rationale lists; the income-anchors note. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2.123.0 carries PolicyEngine/policyengine-uk#2172: property_rental_income, property_finance_costs and property_finance_costs_brought_forward, the s. 274A finance-cost reduction, and a property allowance that no longer stacks on expenses already netted from profit. The lock's UK side moves exactly to 2.123.0 (uv lock --upgrade-package policyengine-uk==2.123.0) and nothing else moves: policyengine-core stays 3.32.19 on the UK side, which 2.123.0 accepts, and 3.32.5 on the US side (#1086's per-country pins). The UK extras of microcosm-build, microcosm-data and microcosm-frame require >=2.123.0. The step from #1121's 2.122.2 also brings #2160, #2096, #2097 and #2144. Re-derived with no data change: the uprating pin stamp (values unchanged), the concept coverage (288 inputs, the three property inputs uncovered) and the mapping reviewed against 2.123.0 (the property_income note quotes its new documentation, alignment still approximate; the liquid-asset reason holds unchanged), the spec's declared dependency and the H2 fixture's, the coverage manifest's source digests, and APPROVED_UV_LOCK_SHA256. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Arm c6x on 7b20ef7: the share-filled walk with PRIS a diagnostic, spine and calibration built afresh. All 7 calibrated-seam gates and all 33 spine gates pass with #1121's stale West Midlands deferral dropped at gate time; receipts at the calibrated weights against PRIS; the engine's landlord quantities at 2025. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
HMRC's Property Rental Income Statistics are receipts before allowable expenses; SPI Table 3.7 net income from property is landlords' profit after allowable expenses and before residential finance costs, the concept property_income holds (policyengine-uk#2172 now documents it so). The incumbent's x1.9 scaling (uk-data#311) set the first against the second, so the 13 amount rows were signed out pending a ruling. María ruled on 2026-10-05 to bind each concept on its own variable. - The signed exclusion property_income_undercount_adjustment_missing is retired, the hmrc_spi family outcome becomes active_strict_band_pins with a rationale for the net concept, and the contract note replaces the x1.9 sentence. The uprating index stays obr.per_capita.gdp. - Regenerated from feed 825406f: 1,244 active references on #1121's base (13 added, none changed), 15 signed out; membership candidates 1,253 -> 1,265. - Both national compile-parity receipts gain the 13 rows. A property- specific reason precedes the generic SPI drift reason, which blamed the fixture's one-year projection: the 2025 values are £31.78bn against the fixture's £55.78bn (1.9 x £29.36bn). - Tests: the reference counts, the inverted property test (13 rows on the per-capita GDP hold, no value operation), the membership outcome and signed-rationale lists; the income-anchors note. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2.123.0 carries PolicyEngine/policyengine-uk#2172: property_rental_income, property_finance_costs and property_finance_costs_brought_forward, the s. 274A finance-cost reduction, and a property allowance that no longer stacks on expenses already netted from profit. The lock's UK side moves exactly to 2.123.0 (uv lock --upgrade-package policyengine-uk==2.123.0) and nothing else moves: policyengine-core stays 3.32.19 on the UK side, which 2.123.0 accepts, and 3.32.5 on the US side (#1086's per-country pins). The UK extras of microcosm-build, microcosm-data and microcosm-frame require >=2.123.0. The step from #1121's 2.122.2 also brings #2160, #2096, #2097 and #2144. Re-derived with no data change: the uprating pin stamp (values unchanged), the concept coverage (288 inputs, the three property inputs uncovered) and the mapping reviewed against 2.123.0 (the property_income note quotes its new documentation, alignment still approximate; the liquid-asset reason holds unchanged), the spec's declared dependency and the H2 fixture's, the coverage manifest's source digests, and APPROVED_UV_LOCK_SHA256. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Arm c6x on 7b20ef7: the share-filled walk with PRIS a diagnostic, spine and calibration built afresh. All 7 calibrated-seam gates and all 33 spine gates pass with #1121's stale West Midlands deferral dropped at gate time; receipts at the calibrated weights against PRIS; the engine's landlord quantities at 2025. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
HMRC's Property Rental Income Statistics are receipts before allowable expenses; SPI Table 3.7 net income from property is landlords' profit after allowable expenses and before residential finance costs, the concept property_income holds (policyengine-uk#2172 now documents it so). The incumbent's x1.9 scaling (uk-data#311) set the first against the second, so the 13 amount rows were signed out pending a ruling. María ruled on 2026-10-05 to bind each concept on its own variable. - The signed exclusion property_income_undercount_adjustment_missing is retired, the hmrc_spi family outcome becomes active_strict_band_pins with a rationale for the net concept, and the contract note replaces the x1.9 sentence. The uprating index stays obr.per_capita.gdp. - Regenerated from feed 825406f: 1,244 active references on #1121's base (13 added, none changed), 15 signed out; membership candidates 1,253 -> 1,265. - Both national compile-parity receipts gain the 13 rows. A property- specific reason precedes the generic SPI drift reason, which blamed the fixture's one-year projection: the 2025 values are £31.78bn against the fixture's £55.78bn (1.9 x £29.36bn). - Tests: the reference counts, the inverted property test (13 rows on the per-capita GDP hold, no value operation), the membership outcome and signed-rationale lists; the income-anchors note. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2.123.0 carries PolicyEngine/policyengine-uk#2172: property_rental_income, property_finance_costs and property_finance_costs_brought_forward, the s. 274A finance-cost reduction, and a property allowance that no longer stacks on expenses already netted from profit. The lock's UK side moves exactly to 2.123.0 (uv lock --upgrade-package policyengine-uk==2.123.0) and nothing else moves: policyengine-core stays 3.32.19 on the UK side, which 2.123.0 accepts, and 3.32.5 on the US side (#1086's per-country pins). The UK extras of microcosm-build, microcosm-data and microcosm-frame require >=2.123.0. The step from #1121's 2.122.2 also brings #2160, #2096, #2097 and #2144. Re-derived with no data change: the uprating pin stamp (values unchanged), the concept coverage (288 inputs, the three property inputs uncovered) and the mapping reviewed against 2.123.0 (the property_income note quotes its new documentation, alignment still approximate; the liquid-asset reason holds unchanged), the spec's declared dependency and the H2 fixture's, the coverage manifest's source digests, and APPROVED_UV_LOCK_SHA256. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Arm c6x on 7b20ef7: the share-filled walk with PRIS a diagnostic, spine and calibration built afresh. All 7 calibrated-seam gates and all 33 spine gates pass with #1121's stale West Midlands deferral dropped at gate time; receipts at the calibrated weights against PRIS; the engine's landlord quantities at 2025. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1121 named the SPI amounts' ITL band index in the contract before this branch rebased, so C2 adds only the test that pins every reference's index to its contract target's; there is no user-visible fix to record. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1121 named the SPI amounts' ITL band index in the contract before this branch rebased, so C2 adds only the test that pins every reference's index to its contract target's; there is no user-visible fix to record. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The calibration of #1121's head ran on 2026-10-08 (arm head-r3, tree c7fe76e8a, the tree of the merged head): loss 0.00712, 98.3% of 1,167 targets within 10%, 7 of 7 seam gates and the certifier's input-mass gate passing with the West Midlands deferral and the two UC band exclusions in force. The results were posted on #1121 rather than pushed, to avoid another CI run; this records them in the receipts. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#1086 is settled: each country has its own policyengine-core pin (option 2), which landed on its own as #1143. This PR is the policyengine-uk bump that follows it: B0 moves only the UK side of the lock. C1 can still be cherry-picked on its own.
Before merge: a calibration of this head, which is queued. After merge, as for #1100: the signed-difference entries for the net-new columns (C5, C6, B2–B5) and for B1's mechanism change, whose drafts stay outside the repository until signed, then the national build and the certifier.
Summary
This ports every remaining unblocked item on #1095. It covers:
On the locked engine (C1–C6)
uk/target_references.json. The contract now declares the band-growth index, so regenerating reproduces the committed references. The compiled values are unchanged.household_adult_countandhousehold_child_countand are counted fromage, so they no longer read the engine's deprecatedis_adultandis_child. The stage notes are now quoted in full. The imputation is value-identical (see Measurement).dwp.hb.amount_pension_ageis bound at the calendar-2025 window: 3/12 of FY2024-25 (£6,851.0m) plus 9/12 of FY2025-26 (£7,114.7m), £7,048.8m.calendar_year_windowgains the selector keysource_measure_id_by_opening_year.is_blindfrom the FRS blind registration question (Set is_blind from the FRS blind registration flag (SPCREG1) policyengine-uk-data#523), on the adult and child tabs alike.uc_is_in_startup_periodfrom the FRS claim and trade start dates (Set the UC start-up period from the FRS claim and business start dates policyengine-uk-data#527).On policyengine-uk 2.122.2 (B0–B5)
APPROVED_UV_LOCK_SHA256.car_list_priceandlifetime_isa_balance, and Universal Credit's split of household capital by claimant and partner count.is_claimant_or_partnerandis_hbai_dependent_childcome from the adult and child tables (Supply is_claimant_or_partner from the FRS adult table policyengine-uk-data#524, Supply is_hbai_dependent_child from the FRS and move targets and imputations off the deprecated is_child/is_adult policyengine-uk-data#486).pension_credit_reported_capitaltakes the same recorded capital asuc_reported_capital(Use the FRS benefit-unit capital for Pension Credit's capital test policyengine-uk-data#513).liable_for_share_of_household_rentfollows Mark the benefit units that share their household's rent policyengine-uk-data#512's rule.CVPAYbecomes the payer'srent_paid_as_boarderorrent_paid_as_lodger. UK FRS spine: stop counting lodgers' rent and property losses as property income; sub-letting rent for every tenure #1081, which merged first, already leaves it out ofproperty_income.Calibration registers (X, Y)
The diagnoses are under Measurement.
From the review (R1, rounds 2 and 3)
np.averageover the linked rows with thegross4household weights. It is not a microdfMicroSeries, because microdf reaches an environment only with an engine and the FRS spine runs in the engine-free lane.Where this departs from the plan
is_blindfor children.uk-take-up-per-person-spabranch.Measurement
Each arm was built and calibrated locally on Chronicle 825406f. The control is A9, main's code. The arms predate the rebase onto #1081, so their spines lack its property-income rules.
uk_target_fitfails on two UC payment bands that hold no benefit unit under policyengine-uk 2.122.2: singles at £26,400–27,600 and childless couples at £24,000–25,200.obr.child_benefitcalibrates to 0.0%.hmrc.spi_region.income_tax_by_region_12570_15000@E12000005) fails at +27.4%. It was +8.9% on arm E and +23.6% on B0.total_income, which leaves outother_investment_incomealthoughincome_taxcharges it.total_incomeincludes other investment income. That fix belongs upstream:total_incomecites ITA 2007 s. 23, which counts all income charged to income tax.Full numbers are in
experiments/1095-uk-data-ports-2-receipts.md.Testing
e3e3d881f:engine-freelane's 509 test files: 14,929 passed and 133 skipped, with the same two environmental failures;engine-uklane's 40 test files, run in full: 170 passed. Its Add the liquid financial assets concept, schema version 2 (NZ v0, G3a) #1120 liquid-asset test had failed on 2.122.2 since the previous rebase.test_batched_scoring_matches_whole_pool_policyengine_usfailed on both Pythons. It's a Maryland child-care rate lookup under policyengine-us 2.2.1 on core 3.32.19. With the per-country pins (Give each country its own policyengine-core pin (#1086) #1143), a US install from the new lock resolves core 3.32.5, andtest_us_post_export_scoring.pypasses there (4 tests). The lock-level test passes on this head.ruff checkandruff format --checkpass on all changed Python files.tools/ci_test_plan.py verifyandtools/graph_acceptance_burndown.py --verifypass.Receipts:
experiments/1095-uk-data-ports-2-receipts.md.🤖 Generated with Claude Code