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>
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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