Skip to content

Run the £100,000 childcare lane on policyengine.py's certified Microcosm pair (6cba5d71, policyengine-uk 2.132.6) #228

Closed

Description

@MaxGhenis

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.

Activity

  1. MaxGhenis commented on Oct 25, 2026

    @MaxGhenis
    ContributorAuthor

    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
      • add a lane-specific certified-pair registry.

      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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions