You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Run the £100,000 childcare lane on policyengine.py's certified Microcosm pair (6cba5d71, policyengine-uk 2.132.6) #228
The uk-childcare-100k lane (#207) computes its PolicyEngine counterparts on the default replay variant: populace-uk build populace-uk-2023-dd68c73-4aa4b14-20260619T023711Z with policyengine-uk 2.89.2. That pair was built before microcosm#1299 (merged 16 October 2026) fixed the extended-hours draw that microcosm#1126 identifies as the main reason PolicyEngine's free-hours spending is low.
policyengine.py#685 (merged 21 October 2026) certified Microcosm UK 2024-25 national cut microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71, the first with the fixed draw, with policyengine-uk 2.132.6. The latest release, policyengine.py 6.11.0 (25 October), still pins that pair. This repository records it only as the experiment population exp-pe6.10.0_uk2.132.6_microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71 (data/uk/experiments/populations.json), not as a replay variant, so the lane cannot run on it yet.
What done looks like
pipeline/compute_uk_childcare_100k.py can run on that certified pair, with the same identity checks it applies to a replay variant (package records, release bundle, dataset sha256). It reads the pair from the experiment population record or from a new variant record, whichever fits the replay design. Adding a replay variant also brings in the CI replay-regenerate check.
Every note whose basis is the engine or a run is checked at policyengine-uk 2.132.6, and the pair is added to its variants. Where a note does not hold, a replacement note is written. In particular:
centax-static-vs-static: are the labour-supply elasticities still zero?
pe-universal-switch-off: does 2.132.6 contain policyengine-uk#2177?
pe-under-ones
pe-england-only
A verified_pairs entry in results/uk/childcare_100k/construction_annotations.json, including whether a pe_gap diagnosis still applies.
An artifact under results/uk/childcare_100k/ from a real run, with the full-use diagnostic years. Ingest keeps the 19 June pair's run and the figure published on policyengine.org (12–21 October) in the history.
The lane README's comparison table and "Why PolicyEngine is below CenTax" section are updated from the new run.
Context: #225 (draft) computes the two-child-limit lane on the same certified pair through the managed route.
Leads for re-checking the pair-scoped notes, read on 2026-10-25. The sources are the policyengine-uk 2.132.6 wheel from PyPI (sha256 cc54025f…) and the policyengine 6.10.0 wheel. None of this has been run on the pair yet.
centax-static-vs-static: still holds by the same mechanism, if the run goes through the managed route as it does today.
employment_income still adds employment_income_behavioral_response.
That variable returns 0 when gov.simulation.labour_supply_responses.income_elasticity and substitution_elasticity are both 0. Both are 0 from 2020.
gov.dynamic.obr_labour_supply_assumptions defaults to true, and 2.132.6's own deprecation text says the OBR elasticities "are applied by Simulation.apply_dynamics … when gov.dynamic.obr_labour_supply_assumptions is true, which it is by default". However, nothing in policyengine-uk 2.132.6 or policyengine 6.10.0 calls apply_dynamics; only policyengine-uk's tests do. The same is true of 2.89.2 and policyengine 5.0.2.
The verified_pairs entry should say so. It should not rest on the elasticities alone.
pe-universal-switch-off: does not hold. 2.132.6 contains policyengine-uk#2177 ("Preserve universal and targeted hours alongside extended childcare", merged 2026-10-12): the 2.132.6 tag is 197 commits ahead of its merge commit and 0 behind.
The note needs a replacement for this pair.
The compute test's "universal hours fall" invariant becomes pair-specific.
pe-under-ones: needs a measurement.extended_childcare_entitlement_qualifying_child requires age >= young_child_minimum_age, which is 0.75 from 2024-09-01 (SI 2023/1330 reg 2(5)(b)).
Whether any under-1 gets hours depends on whether the Microcosm cut's age is fractional. The artifact's age measurement answers that.
pe-england-only: the extended entitlement still tests country == ENGLAND (extended_childcare_entitlement_qualifying_child). The universal and targeted heads still need a check.
The dataset is already in the local Hugging Face cache. Snapshot bb2258482ef8… of policyengine/populace-uk-private holds microcosm_uk_2024_25.h5, the record's sha256 810ba980… (322 MB).
The population record lists only the Modal executor.
The requirements file is resolved for x86_64 manylinux.
The three policyengine wheels are pure Python, so their RECORD hashes should match on a local venv. Verify this rather than assume it.
The record says "Policy experiments only; never a replay variant", and experiment results carry the modern_population_sensitivity label ("not a replay or a costing of {event}"). Running this lane on the pair is therefore a design choice:
read the experiment population's identity in the lane's own preflight, or
Activity
Scope each engine note to the pairs it was checked on; record the pub…
MaxGhenis commentedon Oct 25, 2026
Leads for re-checking the pair-scoped notes, read on 2026-10-25. The sources are the policyengine-uk 2.132.6 wheel from PyPI (sha256
cc54025f…) and the policyengine 6.10.0 wheel. None of this has been run on the pair yet.centax-static-vs-static: still holds by the same mechanism, if the run goes through the managed route as it does today.employment_incomestill addsemployment_income_behavioral_response.gov.simulation.labour_supply_responses.income_elasticityandsubstitution_elasticityare both 0. Both are 0 from 2020.gov.dynamic.obr_labour_supply_assumptionsdefaults to true, and 2.132.6's own deprecation text says the OBR elasticities "are applied by Simulation.apply_dynamics … when gov.dynamic.obr_labour_supply_assumptions is true, which it is by default". However, nothing in policyengine-uk 2.132.6 or policyengine 6.10.0 callsapply_dynamics; only policyengine-uk's tests do. The same is true of 2.89.2 and policyengine 5.0.2.verified_pairsentry should say so. It should not rest on the elasticities alone.pe-universal-switch-off: does not hold. 2.132.6 contains policyengine-uk#2177 ("Preserve universal and targeted hours alongside extended childcare", merged 2026-10-12): the 2.132.6 tag is 197 commits ahead of its merge commit and 0 behind.pe-under-ones: needs a measurement.extended_childcare_entitlement_qualifying_childrequiresage >= young_child_minimum_age, which is 0.75 from 2024-09-01 (SI 2023/1330 reg 2(5)(b)).ageis fractional. The artifact's age measurement answers that.pe-england-only: the extended entitlement still testscountry == ENGLAND(extended_childcare_entitlement_qualifying_child). The universal and targeted heads still need a check.The dataset is already in the local Hugging Face cache. Snapshot
bb2258482ef8…ofpolicyengine/populace-uk-privateholdsmicrocosm_uk_2024_25.h5, the record's sha256810ba980…(322 MB).The record says "Policy experiments only; never a replay variant", and experiment results carry the
modern_population_sensitivitylabel ("not a replay or a costing of {event}"). Running this lane on the pair is therefore a design choice:It is not a reuse of the experiment label. Add the two-child limit child-poverty benchmarks, recomputed on the certified Microcosm pair #225 takes the managed route for the same pair.
Document certified pairs alongside replay variants
Refuse a stripped pair id and a registry ingest would read differently
Re-export the feeds: two CBP rows cite the certified pairs file
Close the round-2 review nits on the pair registry
Record policyengine.py 6.11.0's certified pair for the childcare lane (…
Answer the second review of the 6.11.0 childcare run