Repository navigation
Add overseas and other real estate as property components, and count UK land once in household land - #2688
Add overseas and other real estate as property components, and count UK land once in household land#2688MaxGhenis wants to merge 27 commits into
Conversation
UC Regs 2013 reg. 49(1) and its legacy equivalents (HB Regs 2006 reg. 47, HB (SPC) Regs 2006 reg. 45, IS Regs 1987 reg. 49, JSA Regs 1996 reg. 111, ESA Regs 2008 reg. 113, SPC Regs 2002 reg. 19) calculate capital at market or surrender value less 10% where a sale would incur expenses and less any encumbrance secured on it. The model summed every capital source at full value. Each programme gets a capital.sale_expenses node (rate 0.1 and the sources whose sale incurs expenses: land, property and corporate_wealth, not cash savings). A shared helper applies the 10% before the encumbrance and never values an encumbered asset below nil. New household inputs carry debt secured on other residential property, non-residential property and land; the Enhanced FRS has none, so they default to zero. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Each programme's sale-expense parameters now cite its GB and NI regulations, the guidance paragraph that orders the 10% before the encumbrance, and per-asset guidance with exact PDF page anchors (DMG ch 52 for ESA, HBGM Annex F for HB savings, H1656/H1665/H1673-H1675 for UC). - The source-list descriptions and changelog say plainly that corporate_wealth also holds unit trusts, ISAs, employee share options and, in datasets built before the pension split, non-DB pension wealth. - The helper and secured-debt docs say debts net within a source category. - The property-test oracle fixes the sale-expense assets and the 10% itself instead of reading the parameters, checks pension-age HB, and runs on larger populations. New hand-computed cases cover HB second homes and premises, per-source flooring between two encumbered sources, pension-age HB, and a monthly secured debt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
HBGM W1.430 states only the general 10% rule; the rule that real property always has costs of sale comes from R(IS) 21/93, as DMG 29622 applies it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resolve the capital variables onto main's claimant/partner allocation and person-level sources, valuing household sources through valued_capital. Update the let-property tests #1950 added: £10,000 of property is now £9,000 of capital under reg. 49(1), so 12 tariff steps, not 16. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two tests main added after this branch's earlier base assumed full-value capital: - The CTR savings-credit-only case holds savings 10,000 and a 7,000 second property: capital is 10,000 + 90% of 7,000 = 16,300 (SPC Regs 2002 reg. 19(a)), still over the 16,000 limit, so CTR stays nil. Deemed income is 13 steps x 52 = 676, Pension Credit income 13,314 + 676 = 13,990, and savings credit 60% of (12,376 - 208.07 x 52) less 40% of (13,990 - 12,376) = 288.22. - The reported-capital property test's proxy oracle now values land, property and shares at 90% and savings at face value. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keep main's recorded benefit-unit capital (benunit_reported_capital), which replaces the valued household sources as recorded, and register the secured-debt inputs beside main's uprating entries. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
£20,000 of shares is £18,000 of Pension Credit capital (SPC Regs 2002 reg. 19(a)), still over the CTR limit: deemed income 16 x 52 = 832, Pension Credit income 14,146, savings credit 933.816 - 0.4 x 1,770 = 225.82. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Main's Housing Benefit passport (#1927 and the Universal Credit limb) gives a family on a passporting benefit nil HB capital, so the property's independent reg 47 valuation applies only to non-passported families. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review of 54ed063: half the generated units now decline Universal Credit, so the Housing Benefit passport cannot remove every working-age unit from the reg 47 differential, and a passported unit's HB capital is asserted to be nil rather than skipped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Delta review of b541677 (F1): coverage of the HB passport-nil assertion and the working-age reg 47 differential depended on Hypothesis draws. The checks move into check_valuation(), which counts the branches it ran, and a fixed test asserts both run: a UC claimant with £5,000 of savings (passported, nil HB capital) and a non-claimant with a mortgaged second home (valued under reg 47). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Savings 12,000 plus a 5,000 property is 12,000 + 4,500 = 16,500 of Pension Credit capital (SPC Regs 2002 reg. 19(a)), still over the 16,000 CTR limit. Deemed income is 13 a week, so the savings credit is 0.6 x 29.93 - 0.4 x 15 = 11.958 a week (621.82). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Main now values Universal Credit property on its own path (#2439: property_sources, secured debt, a 10% property_sale_cost_rate) and carries regulation 77 company substitution (#1965). Reconcile: - One UC rate: property_sale_cost_rate becomes capital.sale_expenses.rate, used by the property path and the financial pool; UC sale_expenses.sources lists the financial source with costs of sale, corporate_wealth. - The financial pool is valued with valued_capital, so shares count at 90%. - As the second of #1965 and #1969 to land, value reg. 77 holdings where they leave capital: at 90% from the pool (household_uc_pool_company_holdings), in the override floor (household_uc_reported_financial_capital) and from a complete override, which is a countable figure; in full from a recorded financial total, which is used unvalued. A shared counted_share helper. - Keep main's secured-debt inputs, documenting the legacy equivalents, and add owned_land_secured_debt in the same shape. - Tests main added that assumed full-value shares, rewritten from the law: the reg. 77 company cases, the property-capital and mock suites, the company-override conservation identities and the savings-credit-only cases. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… penny From the GPT-6.1 Sol review of a7d8988: - A recorded benunit_reported_capital total holds its owner's reg. 77 holding at full value, while the pool counts that holding at 90%. The report now consumes its known holding part at the counted 90% (household_uc_reported_financial_capital), so it can no longer eat another unit's savings; the owner's own assessment still takes the full holding off the report. The company-override conservation oracle consumes the same way, and a YAML regression pins the reviewer's case: £16,500 of savings and a £10,000 report that is all holding give [0, 16,500]. - valued_capital rounds the 90% value down to the penny in the claimant's favour (ADM H1665), in float64 with a guard against binary noise. A YAML regression puts £1,000 of savings and £16,666.67 of shares at exactly £16,000.00, which passes the limit (WRA 2012 s. 5(1)(a), UC reg. 18(1)). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Inputs are float32, so 90% of £16,001 came to £14,400.8994 and the penny floor gave £14,400.89 (the HB £16,001 case failed). less_sale_expenses takes the value to the penny in float64 before the 10% deduction and rounds down to the penny (ADM H1665). The UC property path now uses it too, so every reg. 49(1)(a) valuation rounds the same way. Adds a Hypothesis property checking 90% of every whole-penny float32 input up to £131,071.99 against integer pence, and a UC YAML case. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sol review v4b found that rounding the input to the penny first could round up (the ADM H1665 example gave 930.94, not 930.93), that nothing was rounded at the last stage, and that UC rounds to the nearest penny. - capital.round_down per programme: false for UC (UC Regs 2013 reg 6(1); NI reg 7(1)) and HB (HB Regs 2006 reg 80; HB (SPC) reg 61(6); NI 78(8), 59(7)); true for IS (reg 27), JSA (reg 92), ESA (reg 3(a)) and Pension Credit (reg 24A), which count a fraction only to the claimant's advantage. - exact_amount removes float32 storage error only where a value is the stored form of a whole penny; other values are kept exactly. - Each valuation, each UC holding and property share, and each programme's assessed capital (the last stage) is rounded by that rule. - A recorded financial total below its owner's holding now consumes the holding at its counted value, as an override does, so no part of the holding is left for another unit. Tests: the H1665 example (930.93 / 930.94), whole-penny properties for both rules, a never-wrong-way bound for any float32 input, UC half-penny, 16,000.00 after a holding, a three-way split, IS shared-capital rounding, and reports below the holding in the reg 77 conservation grid. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sol review v5 at b3f6f60: - exact_amount raised an underflow warning on zero inputs, failing test_warning_filters. Errors are now ignored inside np.errstate, and twice the gap is compared with the spacing. - IS, JSA and ESA read household values through benunit.max, which is float64, so exact_amount used float64 spacing and never removed float32 storage error: 16,000.01 of savings floored to 16,000.00, at the limit. A value equal to its float32 is now judged at float32 spacing. - From 131,072 float32 cannot hold every penny, so no penny is identified and the stored value is kept; rounding down then never goes against the claimant. - The Lifetime ISA's 75% and UC company capital are worked in float64 from the stored amounts; company capital is rounded under reg. 6(1). - test_uc_capital_allocation expected exact conservation; each share is now its own nearest-penny amount (1.00 three ways is 0.33 each). - Docstrings: the guard's intended tolerance; no report leaves a holding in the pool. Tests: a model-level property that every programme counts whole-penny savings, shares and Lifetime ISA balances to the penny; widened-input and above-131,072 helper checks; YAML for 16,000.01 of savings under IS, JSA and ESA and a 1,000.04 Lifetime ISA. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merge the capital sale-expense prerequisite without rewriting its history, preserve share-component routing, and include worldwide property while counting UK land once. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Keep UK wrapper integration coverage for dataset loading, uprating, monthly stocks, purchases and LVT while avoiding repeated setup for formula-only draws. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Aggregate impact on certified data: passBase Checks: 0 broken by this change, 1 failing on both sides, 0 fixed. Moves flagged for review: 196 (thresholds in Notes
Moves flagged for review
156 more flags are in the report artifact. Receipts by tax head
Spending by benefit and service
Caseloads
Government balance, each component counted once
Model totals
Household income totals
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
Household net income by decileMean change in household net income per household, and as a share of the decile's base income; households stay in the base run's deciles.
No change in any year: population. Checks failing on both base and head (1)
Counted-once checkEach of 91 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
Dataset: Receipts by tax head: head levels
Spending by benefit and service: head levels
Caseloads: head levels
Government balance, each component counted once: head levels
Model totals: head levels
Household income totals: head levels
Population: head levels
Poverty rates: head levels
People in poverty: head levels
Inequality: head levels
Mean household net income in each side's own deciles: head levels
Standard reform costings (change in gov_balance): head levels
Standard reforms: change in each reform's target: head levels
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
juaristi22
left a comment
There was a problem hiding this comment.
Program review
Base repository: PolicyEngine/policyengine-uk
PR number: 2688
Reviewed head SHA: 442f033
Merge base SHA: 5b94537
Mode: full
Scope: All77 changed property-accounting/capital-valuation paths and affected six-benefit/land/wealth/override dependencies, including composed1969prerequisite; no separate1969review or privateproducer audit
Source manifest: /private/tmp/policyengine-command-runs/881387a1b745/pr2688-hb1241-review-20261027-review-sources.json
Review status: PARTIAL
Source Documents
- authorized-1.original — cached original.
- authorized-2.original — cached original.
- authorized-3.original — cached original.
- authorized-4.original — cached original.
- authorized-5.original — cached original.
- authorized-6.original — cached original.
- authorized-7.original — cached original.
- authorized-8.original — cached original.
- authorized-9.original — cached original.
- authorized-10.original — cached original.
- authorized-11.original — cached original.
- authorized-12.original — cached original.
- authorized-13.original — cached original.
- authorized-14.original — cached original.
- authorized-15.original — cached original.
- authorized-16.original — cached original.
- authorized-17.original — cached original.
- authorized-18.original — cached original.
- authorized-19.original — cached original.
- authorized-20.original — cached original.
- authorized-21.original — cached original.
- authorized-22.original — cached original.
- authorized-23.original — cached original.
- authorized-24.original — cached original.
- authorized-25.original — cached original.
- authorized-26.original — cached original.
- authorized-27.original — cached original.
- authorized-28.original — cached original.
- authorized-29.original — cached original.
- authorized-30.original — cached original.
- authorized-31.original — cached original.
- authorized-32.original — cached original.
Critical
C1 — Preserve non-financial property when a financial-only total is reported (critical) (OPEN)
Location: policyengine_uk/parameters/gov/dwp/universal_credit/means_test/capital/sources.yaml:59–60, the new placement of overseas/other property in the financial replacement pool. Affected calculation: uc_assessable_capital.py:63–65,77–112.
benunit_reported_capital.py:9–25 explicitly defines a financial observation that excludes property, with zero meaning no financial capital. It also identifies the separate uc_reported_capital input for a complete countable-capital override. The new source-list entries put real property in a pool that is replaced when this financial-only report is nonnegative. uc_assessable_capital.py:99–103 then selects the financial report, losing the new property; lines104–112 add only the separate existing domestic-property valuation.
A consistent direct-input case is a single otherwise eligible claimant who owns an ordinary, freely transferable overseas investment property worth£20,000, has no secured debt or relevant statutory disregard, and reports£0financial capital. Set overseas_property_value=20000, benunit_reported_capital=0, no domestic countable property, no company holdings, no complete UC override (default−1), and zero other financial sources. These inputs are consistent: property ownership does not contradict a zero cash/investment report. The new code source trace gives assessable capital£0; without that financial report the same new property is valued at£18,000. A financial-only report does not extinguish an owned property.
UC regulation49(1),(2) requires valuation of owned overseas assets, with the sale-cost deduction and secured encumbrances taken into account. Official ADM H1601–H1608 explains that non-disregarded capital is included, foreign assets are valued, and real property incurs sale costs. Schedule10 provides actual disregards; the case above deliberately satisfies none. The correct countable amount for the supplied debt-free asset is£18,000. This is material to the implemented benefit: is_UC_eligible.py:31–32,67 compares assessable capital with the captured£16,000 limit, so the source-traced£0 permits the capital condition while£18,000fails it. No executed award or population prevalence is claimed.
The PR body explicitly requests placement in the financial pool. That records design intent but does not reconcile this existing financial-only input contract with the legal treatment of non-financial property. Merely documenting the replacement does not make the consistent case a complete-capital override. Keep these new property values separately counted when a financial-only total is present, or introduce and consistently apply a properly distinct total-capital observation contract; retain the existing complete-override semantics. Add a discriminating property-plus-zero-financial-report final-eligibility regression rather than pinning the loss as an expected accounting identity.
Primary evidence: UC regulation49 (source27; NIequivalent source28), UC Schedule10 (source31), and the official ADM H1 full PDF source32, physical43–45. Source27SHA5391166a8aebcf520fb05d2898ff4632d56ecb572be6da4996f0e59361480d60; its exact full original and derivative are bound in the manifest. The primary/source/code scenario joins are recorded in /private/tmp/policyengine-command-runs/881387a1b745/pr2688-hb1241-review-20261027-policy-evidence.json. This is a confirmed source-derived case, NOT RUN. CODE independently corroborated the input and branch semantics and does not duplicate this finding.
Coordinator assessment: CODE independently confirms the financial-only report and complete-override distinction and the replacement branch. Its complementary £100,000/£90,000 trace is the same defect; the £20,000/£18,000 policy witness directly crosses the £16,000 capital limit. Counted once. All amounts here are source-derived, NOT RUN.
C2 — Current-head required Python and result checks are failing (OPEN)
At captured head 442f0330c8c99ff9965dd76eebfc539dd6f93bc1, the complete 20-row status connection reports 18 SUCCESS and 2 FAILURE. Both failed checks are in CheckSuite 109486082318, whose commit.oid is this exact head:
Test / Python 1/5, check ID121824890358, completed2026-10-26T21:33:19Z: FAILURE.Test / Result, check ID121862213237, completed2026-10-26T21:35:00Z: FAILURE.
The repository's current docs/engineering/skills/testing.md requires the Python shards and Test / Result: the result job rejects incomplete, duplicated or unaccepted test outcomes. A successful YAML job, the other four Python shards or Aggregate impact does not clear these failed required checks. Resolve the failing required checks and establish a passing current-head result before treating this PR as merge ready.
Only check metadata was inspected. No logs, artifacts, rerun or test execution was accessed. The cause is unproved; this finding does not attribute the failure to the new component code or to the composed prerequisite, and does not claim a particular failed test, error, count or official attempt history. The raw capture is the evidence, not the author's focused-pass/mutation report.
Should Address
None.
Suggestions
None.
Evidence Gaps
- POLICY-G1: Full composed six-programme foreign/historical qualification remains incomplete: complete currency/transfer rules, property-specific disregards and historical applicability at all newly parameterised starting dates are not fully traced across all six programmes. UC C1 ordinary sole-owned property case is primary-source supported; this gap does not convert remaining mappings into confirmed defects.
- Role checks incomplete: pr2688-hb1241-review-20261027-review-policy.md; see recovered report.
Notes
- C1 is introduced by the new overseas/other entries in the financial replacement pool, despite disclosed author design intent. Existing financial-only input semantics exclude property, while a distinct complete UC override remains available. Do not replace the legal/value issue with a documentation-only fix.
- Worldwide gross-property identity, component geography, directland count-once algebra, sale-cost/debt ordering and broad rounding rules have supported static results. Unclassified otherproperty geography, within-category debt pooling, missing new debt inputs, private beneficial ownership/disregards and data501/543 release/reconciliation/calibration are disclosed limits, not verified population or adoption certificates.
- The captured API baseRefOid is cc31bd3; fetched public main is bfe4b5b and actual mergebase is 5b94537. These distinct observations remain recorded; drift cause is unproved. POLICY opening text calls the fetched SHA a captured base; this note distinguishes it from API metadata.
- Scope marker92.894844s aftercapture misses60s aim, including dispatch/coordinator overhead; no retiming. Exactfirstdispatch timestamp was not separately sealed, so parallel_review_seconds is omitted rather than manufactured. Actual role/start/finish and canonical whole elapsed remain.
- Generic partial-role aliases added by the assembler refer to the single specific POLICY-G1 check, not another primary evidence gap. Old1969reviewreservation and source/native/private/timing histories remain; no duplicate1969review or takeover.
Validation Summary
Local country/Core imports, collection, model and tests NOT RUN. CODE inventoried77paths, parsed33changedPythonASTs, checked12capital/sale lists and traced finalbenefit consumers. Exacthead20checks=18SUCCESS2FAILURE: Python1/5 and Test/Result; no logs/artifacts/cause/rerun acquired. POLICY acquired32officialpublic originals (30HTML,1WASpublicXLSX,1DWP PDF), no originalreuses; sourcewindow233.686691/300s CLOSED/checker0, relevantPDFtext read/physical45rendered+visuallyinspected, XLSX inertZIP/XML. BothrolesDONE and all ownnativesclosed; exactsnapshotHEAD/tree/clean verified then normallyremoved/no force, hubretained. Author180passes/8mutations/publicbotimpact are not independent execution or population certificates.
Timing
setup seconds: 12.61s; scope seconds: 92.89s; code role seconds: 499.38s; policy role seconds: 455.41s; adjudication seconds: 0.00s; consolidation cleanup seconds: 131.12s; elapsed seconds: 681.06s; source acquisition window seconds: 233.69s
Review Severity
REQUEST_CHANGES. Open findings: 2 critical, 0 should address, 0 suggestions.
Merge main at b9f55f8, including the six Python CI shards. No merge conflicts; preserve the stacked UC sale-expense changes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Model stored-input precision, holdings scaling and regulation 6(1) penny rounding at each valuation and benefit-unit allocation step. Pin the CI counterexample and the holdings-budget precision boundary. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Route overseas and other property through UC's separate property pool. Keep Pension Credit property in the final assessment when a financial-only report replaces financial proxies, including HB's savings-credit route. Preserve complete overrides and the existing valuation and company rules. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Avoid subtracting components from rounded worldwide property wealth. Pin the float32 cancellation witness and enforce the exact direct-land lower bound. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review at Verdict: the component accounting and ITTOIA scope are sound, and today's commit closes María's C1 for UC. Before this merges, though, the land change and the new Pension Credit contract both act on the current certified data, and neither is measured or stated. The PR also stays blocked on #1969 and data #501/#543. Findings
Checked, no finding
What I ran: a fresh worktree and uv venv (
What I didn't do: review #1969's own changes (the six legacy programmes' sale-expense and debt rules), run the full suite, or run the licensed WAS reconciliation. 🤖 Generated with Claude Code |
|
Addendum at
That is a larger shift than the double-count fix alone (−£201bn at 🤖 Generated with Claude Code |
juaristi22
left a comment
There was a problem hiding this comment.
Program review
Base repository: PolicyEngine/policyengine-uk
PR number: 2688
Reviewed head SHA: 798491c
Merge base SHA: b9f55f8
Mode: incremental from1193614a6436560a443714b7873e7ff26a328e6c
Scope: Our originalC1UCfinancial-only/propertyretention fix and C2currentvalidation, with necessarydependencies. OtherreviewerPC/land/privateimpactfindings notadjudicated; no wholeprogrammeaudit or separate1969review.
Source manifest: /private/tmp/policyengine-command-runs/881387a1b745/pr2688-hb1811-review-20261027-review-sources.json
Review status: PARTIAL
Source Documents
- authorized-1.original — cached original.
- authorized-2.original — cached original.
- authorized-3.original — cached original.
- authorized-4.original — cached original.
- authorized-5.original — cached original.
- authorized-6.original — cached original.
- authorized-7.original — cached original.
- authorized-8.original — cached original.
- authorized-9.original — cached original.
- authorized-10.original — cached original.
- authorized-11.original — cached original.
- authorized-12.original — cached original.
- authorized-13.original — cached original.
- authorized-14.original — cached original.
- authorized-15.original — cached original.
- authorized-16.original — cached original.
- authorized-17.original — cached original.
- authorized-18.original — cached original.
- authorized-19.original — cached original.
- authorized-20.original — cached original.
- authorized-21.original — cached original.
- authorized-22.original — cached original.
- authorized-23.original — cached original.
- authorized-24.original — cached original.
- authorized-25.original — cached original.
- authorized-26.original — cached original.
- authorized-27.original — cached original.
- authorized-28.original — cached original.
- authorized-29.original — cached original.
- authorized-30.original — cached original.
- authorized-31.original — cached original.
- authorized-32.original — cached original.
Critical
C1 — RESOLVED (RESOLVED)
capital/sources.yaml and capital/sale_expenses/sources.yaml no longer contain overseas or unclassified other property. capital/property_sources.yaml:26–30 adds their separately valued variables exactly once, alongside the existing domestic property valuations. Each new household YEAR/STOCK formula calls less_sale_expenses once on the nonnegative assessment-year property value. The existing uc_property_capital then sums these net sources and allocates the household property pool independently of financial reports.
The decisive original case is now source-traced correctly: ordinary freely transferable overseas investment property£20,000, no secured debt/disregard, no other capital, financial-only benunit_reported_capital=0, no complete override. The property's value is£18,000 and remains in uc_property_capital; uc_assessable_capital.py:98–110 adds it after selecting the£0 financial report. The unchanged£16,000 capital limit therefore fails in is_uc_eligible, rather than the prior incorrect£0 assessment. This is a source-derived static result, not an executed award or dataset impact.
The expectation is independently supported by UC regulation49(1)–(2), cached original27 SHA5391166a8aebcf520fb05d2898ff4632d56ecb572be6da4996f0e59361480d60, plus official ADM H1601–H1608 in cached original32, physical44–45: count non-disregarded capital, use the foreign market value where transferable, deduct sale costs for real property, then secured encumbrances. UC6(1)'s penny rule is preserved. These sources and the explicit no-disregard/no-debt premises support this narrow witness; they do not certify every broad property record.
Coordinator assessment: CODE independently corroborates distinct financial/property source lists, unchanged assessment/override branches, debt/saleonce and finaleligibility. Exactordinary£20k/report0case now source-traces to£18k, not£0; tests/modelNOTRUN. This resolves our originalUCfinding only; no private/currentdata/wholeprogrammecertificate.
C2 — Current-head clearance UNVERIFIED (prior critical history retained) (UNVERIFIED)
The supplied exact798 capture has20 terminal observed raw CheckRuns: 11 SUCCESS,8 IN_PROGRESS,1 CANCELLED, rollupFAILURE. Every CheckSuite.commit.oid equals798. Cancellation Fix evidence122362230628/run40553212940 completed17:44:33Z is preserved together with a later successful Fix evidence122363000203/run40553270847 completed17:45:50Z. Neither row is discarded; no official-attempt, rerun, effective-status or cause determination is made, and cancellation alone is not a newly confirmed defect.
Aggregate122362487333, YAML122362858228 and Python1/6–6/6 remain in progress in the capture; Test / Result is not observed. The current tests and required checks are therefore not cleared. Old442/281 failures,119 pending contexts and author/Vahid reports do not certify798. C2 remains UNVERIFIED for current-head clearance, rather than confirmed failed or RESOLVED.
Coordinator assessment: Both rawcancelledFix122362230628 and laterSUCCESSFix122363000203 remain; no newfindingfromcancellationalone or officialattempt/rerun/cause inference. Actual currentPython/YAML/Aggregate stillpending and Resultabsent at capture; oldheadfailures nottransferred.
Should Address
None.
Suggestions
None.
Evidence Gaps
- POLICY-G1: Full composed six-programme foreign/historical qualification remains incomplete: complete currency/transfer rules, property-specific disregards and historical applicability at all newly parameterised starting dates are not fully traced across all six programmes. UC C1 ordinary sole-owned property case is primary-source supported; this gap does not convert remaining mappings into confirmed defects.
- CODE-CI: Exact798requiredYAML/sixPython/Result/Aggregate completion notestablished atcaptured18:12metadata.20raw=11SUCCESS8IN_PROGRESS1CANCELLED, including separate laterSUCCESSFix; localmodel/import/collection/testsNOTRUN.
- Role checks incomplete: pr2688-hb1811-review-20261027-review-code.md; see recovered report.
- C2 remains unverified; its prior severity is retained.
Notes
- BothrolesindependentlyresolveC1bysource/control-flow;0newfindings. Newfinal-eligibilityYAMLusesgenuineproperty/report/ageinputs and source-derivedamounts; not executedlocalRED/GREEN or privateimpactevidence.
- 32cachedofficial originals/derivatives validatedreuse/checker0/0rejected0discarded/sourcebudget0/0GETsearchrender/newwindow. OnlyC1UCnecessarysources newlyinterpreted; G1carriedunchanged, not a32-source or six-programme re-audit. Original233.686691/300closedsourcewindow retained.
- Vahid571comments6449451323/6449462413arecurrentPCstoredsurveycontract/landcalibration/impactreviews. Those findings/privatecounts remain externalreports/ownership, not newRootcriticalfindings, sourcecertificates or adoptedmetrics. Data501-543release/licensedreconciliation/adoption and1969reservation remain; no rawprivate/.job/sourceguess/takeover.
- PriorpublicREQUEST_CHANGES5667352937anditsclaimremainconsumed/preserved; thiscanonicalCOMMENTis a materialC1resolutionfollowup, not APPROVE/dismissal/READY/merge. Publicationrequiresseparatefreshguards/oneclaim/readback.
- Sandboxcaptureeda69aDNSfailureclosed beforeauthorized8b2b73exactclean798capture. Firstdispatch-to-brief/parallelinterval notseparatelyclocksealed; scopebrief18:17:06isactualpostdispatch, no inventedtiming. Rolefirstmarkersinclskillsetup remain actual.
- Consolidation/cleanup duration is measuredfromlastroleseal; anyover120saim is retained asMISS, includingruntime delivery/coordinatorwork, withoutretiming.
Validation Summary
IndependentCODE/POLICYsource/AST/decimal checksresolveC1; no model/Core/country imports, collection or tests. Current798exactbranch/latestcommit/all20CheckSuitejoins; 11SUCCESS8IN_PROGRESS1CANCELLED withlaterFixSUCCESS; Resultunobserved atcapture. Source32reuse/checker0/newsource0. BothrolesDONE/owncommandsclosed; exactsnapshotnormalcleanup below. No private/sourceadoption/performance/cause/wholeCIcertificate.
Timing
setup seconds: 219.37s; code role seconds: 226.51s; policy role seconds: 239.49s; adjudication seconds: 0.00s; consolidation cleanup seconds: 91.51s; elapsed seconds: 603.43s; source acquisition window seconds: 0.00s
Review Severity
COMMENT. Open findings: 1 critical, 0 should address, 0 suggestions.
Fresh pre-publication CI observation
At 2026-10-27T18:23:11.732387+00:00, the same reviewed commit has 20 observed raw checks: 11 SUCCESS, 7 IN_PROGRESS and 2 CANCELLED. Test / YAML 122362858228 completed CANCELLED at 18:14:48Z; Test / Result is not yet observed. The earlier cancelled Fix evidence row remains alongside its separate later SUCCESS. This updates the time-stamped CI observation above; C2 clearance remains unestablished and this follow-up remains PARTIAL/COMMENT. No logs, rerun, cancellation cause or official-attempt classification were acquired.
|
@juaristi22, addressed C1 and C2, including the two Sol findings. Merged current C1 — financial reports erasing property (María and Sol). 6c5cbc8 moves both new categories out of UC's financial pool and into the existing separately valued property route. Financial-only reports retain property; a complete Audit of all six programmes:
Witnesses use 2026, one claimant, £20,000 of the named property, and no debt/disregards. UC claimant age is 40; PC/HB claimant age is 75. Each row applies separately to both
Replaced the YAML expectations that encoded property loss. Added both-category witnesses, complete overrides, secured-debt checks, PC/HB inheritance and large-value PC rounding regressions. The Hypothesis property checks that a nonnegative financial report never reduces counted property, and equals the report plus separately valued property net of disregards. Reinstating the old routing makes it fail: Sol — float32 land lower bound. 798491c sums residential, non-residential and unclassified other property directly before applying intensity (household_land_value.py:22). This preserves the formula in exact arithmetic and avoids subtracting rounded aggregates. The London witness with direct land £20,000.50 and overseas property £8,388,608 changes from £20,000.07421875 to exactly £20,000.50. Added a zero-tolerance YAML regression and tightened the generated lower-bound assertion to C2 — penny-rounding oracle. Reproduced the original oracle failure with the exact CI example pinned: 1193614 models stored-input precision, the raw float32 holdings-budget scale, separately penny-rounded share/holding valuations, each owner's company capital and each unit's final capital under UC regulation 6(1). Household expectations sum rounded units. For the CI case: £5,753.58 − £5,703.03 = £50.55; each £25.275 half rounds to £25.28, giving £50.56. Production results and tolerances are unchanged. The full file passed 7 tests after the initial correction. An additional pin (shares £0.65, two holdings £0.40 each) exposed a scale-precision oracle error: actual £0.02 versus simplified oracle £0. After the conservation-only scale correction, the final focused node passed both new pins and generated cases; the other six nodes and global helpers were unchanged. All seven C2 nodes also passed in final-head CI. #1969 will encounter the original failure when it merges main's claimant/partner-role change and needs this same oracle correction. Validation (one touched file per command):
CI at 798491c: BLOCKED: 18 checks passed, including all six Python shards, but Test / YAML was cancelled twice at its 30-minute limit after printing 5,217 passed. The Core CLI did not exit after the success summary. Test / Result failed with YAML: cancelled; Python: success. The YAML-only retry was attempted; both dropped watch connections were retried. YAML retry log, Result log. 🤖 Generated with Claude Code |
Fixes #2577
Adds the WAS household stock inputs
overseas_property_valueandother_property_value, with GDP-per-capita uprating. Worldwide grossproperty_wealthsums the six saved components and passes them into total wealth once. UK household land directly sums residential, non-residential and unclassified other property before applying regional intensity, then adds directly owned UK land at full value. Identified overseas property contributes no UK household land; direct summation avoids float32 cancellation below the directly owned land value.Both new categories receive the existing real-property sale-expense treatment across six means tests. UC routes them through
uc_overseas_property_capitalanduc_other_property_capitalinto the separate property pool. A financial-onlybenunit_reported_capitalreport retains counted property, including when the report is zero. A completeuc_reported_capitaloverride still replaces ordinary capital before the existing company substitution. Property shares remain allocated across all claimant/partner adults; complete-override units consume their shares. Sale expenses and identified secured debt apply once. No new secured-debt inputs are inferred for the two new categories.Pension Credit now combines reported financial capital with separately valued land and property in its final assessment, without an intermediate float32 total. Its complete programme override defaults to -1, retaining explicit overrides' precedence and year-specific expiry. Housing Benefit's savings-credit-only route inherits this correction. Ordinary HB, IS, income-based JSA and income-related ESA do not replace their capital source pools with financial-only reports and need no routing changes.
share_like_capital,HOLDINGS_SOURCE, and #1969's sale-expense, secured-debt, zero-floor and penny-rounding behavior are preserved.Merged
origin/mainatb9f55f84b5cfwithout conflicts, including #2690's six Python CI shards. Updated the company-owner conservation test's oracle to reproduce stored-input precision, holdings-budget scaling and penny rounding at the same per-person, pool and per-unit steps as the formulas, under UC regulation 6(1), without widening its tolerance. #1969 will require this same oracle correction when it merges current main.This draft remains stacked on #1969, whose history is preserved and which must merge first. Companion data #543 follows data #501; the model and component data release must land together with a compatible dependency pin. A saved
property_wealthinput still overrides that aggregate's formula; household land reads domestic components directly. No licensed-source reconciliation, production rebuild, recalibration or population/LVT estimate is claimed.The component contract and consumer audit documents stock/transaction routing, geographic assumptions, uprating, allocation and data-release limits. Main residence/private pension exclusions and UC's existing omission of direct land are retained. Unclassified real estate continues to use the regional UK-land approximation until its geography can be classified.
Validation
policyengine-core test <file> -c policyengine_uk:uc_assessable_capital.yaml23 passed;pension_credit_reported_capital.yaml31 passed;benunit_reported_capital.yaml6 passed;household_land_value.yaml15 passed.python -m pytest <file> -p no:randomly -q -xcommand:test_property_wealth_components.py41 passed;test_capital_valuation_properties.py8 passed;test_uc_property_capital_mock.py26 passed;test_projection_horizon.py14 passed;test_benunit_reported_capital_properties.py7 passed (the last uses-n 2).test_uc_company_owner_properties.py: 7 passed with-n 2after the initial rounding correction. After the subsequent conservation-only scale correction, its final focused node passed, including both regression pins and generated cases; the other six nodes and global helpers were unchanged. The original oracle and the simplified scale oracle were each observed failing first.assert 0.0 >= 18000.0. All three files were restored byte for byte with matching SHA-256 digests; both restored property parameterizations then passed (2 passed, 39 deselected).make format: passed before every fix commit.CI at
798491cb7: all six Python shards, lint, documentation builds, Python smoke builds, aggregate impact, changelog and fix-evidence checks passed. Both YAML attempts printed 5,217 passed, but the Core CLI remained alive until the 30-minute limit cancelled the job.Test / Resultfailed withYAML: cancelled; Python: success. This shutdown issue remains the CI blocker.Each test command passes one touched file, with
OMP_NUM_THREADS=2and at most two pytest workers. The existing Python 3.13 environment is reused with the lockfile's Core 3.33.12 installed as a workspace-local overlay. No caller environment was modified and no virtual environment was created. Whole-suite/folder runs and licensed-data work are omitted under the shared-host constraint; the heavy-run lock is not bypassed. The documentation build is omitted because this updates a durable engineering page without changing generated documentation.Reproducer: policyengine_uk/tests/test_property_wealth_components.py::test_financial_reports_preserve_separately_valued_property; policyengine_uk/tests/test_property_wealth_components.py::test_household_land_value_is_at_least_direct_uk_land; policyengine_uk/tests/test_uc_company_owner_properties.py::test_household_capital_is_allocated_and_conserved_across_benefit_units
axiom: needed
🤖 Generated with Claude Code