Repository navigation
Conversation
CenTax's HMRC tabulations of English parents of 3- and 4-year-olds (Advani, Flew, Pepin-Hall and Summers 2026, Removing the childcare cliff-edge, Figures 3.1, 3.3, 3.6 and 3.7, tax year 2021-22) become nine derived facts in uk/centax_childcare_parent_facts.json. Four are ANI band shares of the parents in (0, £200k]: (0, 50k], (50k, 80k], (80k, 120k] and (120k, 200k]. Five split the parents in (£80k, £150k]: women, a main income source other than employment, London, the South excluding London, and the North and Midlands. Each share is multiplied by the baseline build's own parent count, so the targets set the shape and leave the level to the DfE caseloads. uk_runtime/centax_childcare_parents.py holds the cells, the edges (the 2021-22 edges aged by policyengine-uk's OBR average earnings index, 2025 over 2021, which is 1.24772), the loader's checks, and two measures: - centax_parent_of_eligible_3_4_year_old: an adult of a benefit unit with a dependent child in England, DfE age 3 to 5, before school in at least one term; - centax_employment_main_income_source: employment is the year's largest income source. The measure resolver computes both and refuses a persisted column of either. adjusted_net_income_annual joins the annual income measures, because HMRC's data count the tax year's income. tools/build_uk_centax_childcare_parent_facts.py reads the pinned workbook (sha256 8c238557…). tools/diagnose_uk_centax_parents.py reports each cell's fit and household support on any national H5. The parent count, 2,165,344, comes from its run on the a6299504 staged national. Never targets: CenTax's model outputs, which are the bunching tables, frictions, elasticities, marginal bunchers and costs. The Table A.1 levels and the Figure 2.1 and 3.12 shares are kept as diagnostics. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nine targets (microcosm.centax_childcare_parents.*) bind the derived CenTax facts on the national line only, at England grain: four adjusted net income bands and five splits of (£80k, £150k]. One loader, uk_runtime/derived_facts.py, merges them with the high-value home stock at every national compile site, and the target-input receipts name both resources. The reference generator reads the new resource, pins the family to England and streams the feed line by line. The compile-parity receipt tool marks the nine rows ledger_only with a stated rationale. Tests cover the resource, the two person measures, the contract and the merged compile sites, with Hypothesis properties for the edges, the measures and the share partition. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…w CenTax finds parents The plain-column review test lists every variable a contract binding reads as a filter or band. The two CenTax measures are new there. Neither is a stored read: the resolver refuses them as frame inputs, computes the parent flag from the engine's term shares at the calibration period, and computes the main income source from the annual measures. So they join the reviewed set. Each CenTax target's selector note now says how CenTax identifies parents (childcare accounts, PAYE parental leave, address matching of partners) and that this leaves out some parents above £100k, so the upper cells may lean low. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… correct the bunching claim Review r1 (GPT-6.1 Sol) found the main-source measure left out other investment income and taxable miscellaneous income. A parent with £30,000 of pay and £100,000 of other investment income counted as an employee, so the non-employee cell undercounted. The measure now weighs pay against every component of the engine's total_income (ITA 2007 s. 23), with social_security_income taken benefit by benefit. An engine test pins the compared set to the installed engine's own total_income leaves. A parametrized test checks that each source can outrank pay, and a resolver regression covers other investment income. The selector notes said the (£80k, £120k] band's count does not depend on bunching. That held in 2021-22, when the cliff sat inside the band. Aged to 2025, the band and the split band start at £99,817 while the cliff stays at £100k, so a parent who bunches below that edge leaves them. The notes now say so, and size the lean with CenTax's 2,610 bunching parents of 3- and 4-year-olds in 2022 (p. 22). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
@vahid-ahmadi could you email Arun Advani and ask whether we may publish the values this PR derives from CenTax's workbook ( Workbook recommendation (María): if Arun agrees, the workbook goes into Chronicle as a CenTax source, the way the high-value home inputs (HM Land Registry's Price Paid Data and the NSPL) are registered there. Microcosm then keeps only its own derivation: each share times the build's own parent count, with the band edges aged. That follows our rule that publisher numbers come from Chronicle, not from files copied into microcosm. @MaxGhenis this recommendation is for you too. Could you also push your four local commits (3b9941603, ea2e3d6ed, c35cd4eb5 and ad0b2ee24) to this branch, so the rebase on current main can start from them? Design sign-off (María, 3 November): the design calls in the description are signed off:
Not signed yet: the bunching edge after ageing, the couples CenTax's linkage misses, the non-employee cell's support and the fit evidence. They wait for a build on current main. |
|
Review of 85181c8. I looked at the derivation (share times the baseline's parent count), the bands and how they are aged, how the five splits are defined, the parent and main-source measures, the loader, the build tool and the tests. I checked the figure definitions only against the public PDF (Advani, Flew, Pepin-Hall and Summers 2026). I did not open the workbook. The head is stale and four commits aren't pushed yet, so I kept to points that should survive the rebase. A full re-review can follow once those commits are pushed and the branch is rebased. I don't reopen María's signed-off design calls, and I leave her four open items (the bunching edge after ageing, couples the linkage misses, non-employee support, fit evidence) to her list. Must
Should
Nit
Checked and fine
CI at 85181c8: no workflow runs; combined status pending with no checks reported. Verdict: the shares-times-count derivation is clean and well guarded. Before the rebased build is judged on fit, two things should be settled: what population 🤖 Generated with Claude Code |
WIP (draft). Stacked on #1396 (
uk-pair-release-2151). Don't merge before #1396.Adds CenTax's HMRC tabulations of parents' incomes as Microcosm UK national calibration targets (Advani, Flew, Pepin-Hall and Summers 2026, Removing the childcare cliff-edge). The targets set the income distribution of parents of 3- and 4-year-olds in England around the £100k childcare cliff, which the £100k childcare dashboard reads.
What it adds
uk/centax_childcare_parent_facts.jsonholds 9 England cells built from Figures 3.1, 3.3, 3.6 and 3.7. Each cell is CenTax's published share times the baseline build's own parent count.tools/build_uk_centax_childcare_parent_facts.pybuilds the file, and the workbook's sha256 is pinned (8c238557…).microcosm.centax_childcare_parents.*, bound on the national line only, with registry-parity accounting:centax_parent_of_eligible_3_4_year_oldandcentax_employment_main_income_source. The second weighs the year's pay against every component of the engine'stotal_income(ITA 2007 s. 23), takingsocial_security_incomebenefit by benefit; a tie goes to pay. The resolver also computesadjusted_net_income_annualon the annual-income simulation.uk_runtime/derived_facts.pymerges the high-value home stock and the CenTax cells at every national compile site. Those sites are the full and national target inputs, the release-cut certifier, the compile-parity receipts, the UC matrix diagnostic and the incumbent evaluation. The receipts name both resources.tools/diagnose_uk_centax_parents.pyreports each cell's fit and support on any national H5: records, Kish effective households and the top-ten household share.Never targets (d2014): CenTax's model outputs. That means the bunching estimates (Tables 3.1, 3.2 and 4.1), frictions, elasticities, marginal bunchers and every cost. Figure 2.1 (childcare-account shares), Figure 3.12 (non-working partners) and Table A.1's levels stay diagnostics inside the resource.
Design calls
early_years_term_share_before_schoolis above a sixth. DfE age is the model year lessbirth_year, keyed asuk_runtime/dfe_spring_term.pykeys it. The term-share rule means the child is age-eligible for the universal hours in at least one of the year's three terms. CenTax counts it the same way: "eligible for free childcare hours in 2022 for a positive number of months" (Table A.1 notes). The DfE caseload rows read the same age and term share but count the spring term only (a share above one half).adjusted_net_income_annualon the annual-income simulation, not the point-in-time ANI.TARGET_PREFIX_GEOGRAPHY_PINS).calibration_lines: ["national"]; the local line drops the rows.Invariants (tested)
total_incomeleaves (an engine test).Hypothesis properties cover the edges, both measures, the share partition on any positive workbook, and the order-independent rows digest.
Status
target_references.json, the membership report and the signed compile-parity receipt. These are additions only: nine references, nine membership entries, nineledger_onlyreceipt rows. Each feed read peaked at 27 GB and took 11–13 min. They're committed locally and not pushed yet.axiom: n/a: microsim calibration targets only, no policy rule changes.
🤖 Generated with Claude Code