Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
90d6f44
Sign the v20 self-employment 20-30k deferral on the target-fit regist…
juaristi22 Sep 18, 2026
795b71b
Scoring prepare: drop injected measure inputs and take a contract ban…
juaristi22 Sep 18, 2026
c7c8193
Retire six A16 exclusions the v20 national build measures inside the …
juaristi22 Sep 21, 2026
b7beb71
Evidence for the microcosm#968 BHC poverty diagnosis
juaristi22 Sep 21, 2026
cf2d24f
Bring the #968 evidence receipts through lint and the incumbent-refer…
juaristi22 Sep 21, 2026
09b564f
Score the UK national candidate on the surface both artifacts can mat…
juaristi22 Sep 21, 2026
a93dd39
Key the pruned targets of the score receipt so the staging content po…
juaristi22 Sep 21, 2026
800eae8
Certifier pins carry the byte size the Logbook digest requires
juaristi22 Sep 21, 2026
48e1777
Retire the two stale input-mass exclusions the national cut measures …
juaristi22 Sep 21, 2026
821c134
Retire the June-path CGT family; a stage that records no receipt requ…
juaristi22 Sep 21, 2026
ea90778
Certifier evidence: enum domains on both UK engines, the build-state …
juaristi22 Sep 21, 2026
acb0b04
Spine builder: collect the fit-weight records through the run proxies
juaristi22 Sep 21, 2026
d5e2d50
Re-pin the two register count tests to this branch's deferral and A16…
juaristi22 Sep 21, 2026
06d7a1f
Keep the any-tenure housing row as a measured-not-fit diagnostic; fil…
juaristi22 Sep 22, 2026
2bbd93c
Test the scoring route on a synthetic cross-grain surface
juaristi22 Sep 22, 2026
4d686cf
Prune from both arms only under a reviewed incumbent-unresolvable reg…
juaristi22 Sep 22, 2026
63370e9
Every column-writing spine stage records its household-mass receipt
juaristi22 Sep 22, 2026
2f97e08
Sign the six incumbent-unresolvable measures on the reviewed register
juaristi22 Sep 22, 2026
d34df63
Regenerate the UK spine graph parity fixture for the stage receipts
juaristi22 Sep 22, 2026
4ee986f
Bind the release cut's spine to the recorded parent; validate the can…
juaristi22 Sep 22, 2026
981dd31
Relabel the take-up span and the child-poverty comparison in the #968…
juaristi22 Sep 22, 2026
c4d7056
Fold in Vahid's third pass: register digest at certification, public …
juaristi22 Sep 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/uk-a16-housing-element-restored-967.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Restore the `dwp.uc.households_housing_element` entry on the UK calibration measure-exclusion register (retired on 2026-09-21 as measured inside the fence): the −2.8 % the v20 candidate measures unbound is the structural other/unknown-tenure gap the entry records (112,518 of 4,037,650), so the row stays a measured-not-fit diagnostic under María's #921 reading to its 2026-10-15 expiry. The A16 measurement receipt (`a16_rows_on_v20.json` and its script) is filed under `docs/evidence/uk-a16-v20/`.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The UK national scorer (`tools/score_uk_national_candidate.py`, core now in `microcosm.build.uk_runtime.candidate_score`) scores the candidate and the incumbent on the surface both can materialize: a target whose measure the incumbent lacks is pruned from both arms and reported (stderr warning naming every absent measure; `incumbent_unresolvable_pruned` in the receipt) instead of refusing the score, band edges come from the full register, and the receipt's `evaluation` block decides rule 1 (#578) with a `verdict` the release-cut certifier requires to be `passed`. `--no-prune-incumbent-unresolvable` restores the refusal.\n
1 change: 1 addition & 0 deletions changelog.d/uk-certifier-logbook-pins-967.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
`tools/certify_uk_release_cut.py` no longer refuses every certification up front: its Logbook pin roles now carry the byte size beside the digest, the shape `role_pins_digest` requires, so the release-cut battery actually runs on a real candidate.
1 change: 1 addition & 0 deletions changelog.d/uk-certifier-parent-spine-binding-967.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
`tools/certify_uk_release_cut.py` and `compose_uk_release_certification` bind the spine supplied as stage evidence to the parent the calibration recorded (the build record's input posture and input pin, the signed diagnostics' build block): a spine that pins correctly on its own hash but is not that parent is refused before any family build-state gate reads its receipts, and the certification records the parent under `parent_spine`. The data contract's certification field set gains `parent_spine` (a sha256 digest), so a published certification always names the spine its release cut measured.
1 change: 1 addition & 0 deletions changelog.d/uk-certifier-register-window-967.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The release-cut certifier re-checks each pruned measure's reviewed incumbent-unresolvable entry against its window at the certification's own evaluation date, so a score receipt does not outlive the entry it was pruned under. Against the committed register of record, the receipt's `reviewed_register.sha256` must be the committed register's digest.
1 change: 1 addition & 0 deletions changelog.d/uk-certifier-spine-frame-967.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
`tools/certify_uk_release_cut.py` pins the spine (`--spine-sha256`, a Logbook pin role) and loads its frame, and the release-cut battery hands it to `uk_release_input_coverage` as the evidence for the stage families' build state: typed `importance` weights and each stage's mass receipt are a spine-stage contract, and the first release-cut run evaluated them on the calibrated candidate, where the weights are `calibrated` by construction, failing all thirteen families. The coverage and effective-mass halves still read the release frame; the gate's details name which frame the build state came from.\n
1 change: 1 addition & 0 deletions changelog.d/uk-enum-domain-accessor-967.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The UK enum-domain gates (`uk_uc_deduction_combination_enum_domain`, `uk_student_loan_plan_enum_domain`) resolve their domain through a public `enum_domain(column)` accessor carried by both engine adapters, the frame adapter's `PolicyEngineUKEngine` and the release cut's `PolicyEngineUKCoverageEngine`; the first release-cut run failed both gates with an `AttributeError` because the coverage engine lacked the private lookup the evaluator read, and an engine with neither now names itself in the refusal.\n
1 change: 1 addition & 0 deletions changelog.d/uk-evaluation-candidate-first-967.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The UK rule-1 evaluator validates the candidate on the full comparison surface before pruning the incumbent's unresolvable measures, so an export missing a listed measure refuses (as the strict scorer does) instead of scoring on a surface reduced by the incumbent's gap; the receipt records `candidate_validated_on_full_surface`.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Pruning a target from both arms of the UK rule-1 evaluation now stands on a reviewed register, `uk/incumbent_unresolvable_measures.json` (reviewed-exclusion schema, keyed `entity.variable`): the scorer prunes a measure only under a signed, in-force entry and refuses an unlisted one, the receipt records the register digest and the entries each pruned row stands on, and the release-cut certifier re-checks every pruned measure against the committed register. Skip rows are matched to the failing measure exactly (`'entity.variable'`), never by substring. The six measures the enhanced FRS is known not to carry (the four administrative-basis UC family inputs, the ONS household type, the CGT asset type) are signed by María on 2026-09-22, in force to 2026-12-22.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Retire the two reviewed input-mass exclusions the first release-cut certification (2026-09-21) reports as stale, since the register's rule fails a stale entry: on the candidate measured, `charitable_investment_gifts` carries £5.9m against the enhanced FRS reference's £597m (−99.0 %, nonzero on 0.02 % of persons) and `owned_land` £105.5bn against £397.6bn (−73.5 %), both inside the ±452 % fence. Neither signed reason is confirmed by the measurement: microcosm#630 was signed for the opposite sign (the candidate carrying the admin SPI channel the incumbent lacks, +15,169 %), and the column has instead all but emptied, a data finding raised for adjudication rather than a resolved asymmetry; microcosm#714 was signed for seed-to-seed realization variance, which a level comparison does not measure, and its revisit stays registered on microcosm#145 (the entry was expiring 2026-09-26). The `efrs-post-calibration` block is empty, the contract's input-mass evidence digest is re-pinned, and the bindings' expired-register test injects its own lapsing receipt.
1 change: 1 addition & 0 deletions changelog.d/uk-input-mass-gate-note-967.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The `uk_input_mass_parity` gate note no longer describes the retired `charitable_investment_gifts` exclusion as the sole breach; it records the 2026-09-22 retirements and the two genuine breaches the gate names. The note rides the policy digest, so the UK gate-battery policy, manifest and fingerprint pins move with it (data contract and its test, lockstep-checked).
1 change: 1 addition & 0 deletions changelog.d/uk-pass-through-mass-receipts-967.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Every UK column-writing source stage (`was_wealth`, `lcfs_consumption`, `etb_vat`, `etb_services`, `regional_property_uprating`) now records a household-mass conservation receipt under its own module constant, declared by a `record_mass_conservation_receipt` operation in the sources spec; the coverage manifest requires exactly that record, so the terminal family gate asserts positively that each stage left household mass unchanged (the E8 pattern on every stage). The generator refuses a stage that declares no receipt instead of inventing one, and the loader again requires a reason on every family. Spines built before this change carry none of the five receipts, so their families fail the release-cut coverage gate until rebuilt.
1 change: 1 addition & 0 deletions changelog.d/uk-retire-june-cgt-family-967.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Retire the June-path UK capital gains stage `hmrc_cgt_gains` (the wrapper driven from the certified June H5, its `cgt_source_stages.json` manifest and its coverage family): the FRS spine's `hmrc_cgt_gains_spine` is the only CGT gains stage, its receipt reason is the default for the shared imputation, and the release contract no longer carries the superseded June family.
1 change: 1 addition & 0 deletions changelog.d/uk-score-receipt-shape-823.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Write the UK rule-1 score receipt as the score block itself instead of wrapping it under a `score_vs_enhanced_frs` key, so `tools/certify_uk_release_cut.py` finds `artifacts.candidate.sha256` where it reads it and a CLI-produced receipt can be certified.\n
1 change: 1 addition & 0 deletions changelog.d/uk-scorer-public-factory-967.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
`candidate_score.uk_default_measure_resolver_factory` is the public name of the production measure-resolver factory; the rowwise driver's national role imports it (the private name stays as an alias), and a national-role test loads the real scorer module to prove the name exists.
1 change: 1 addition & 0 deletions changelog.d/uk-scoring-route-test-967.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
`test_uk_scoring_route.py` drives `prepare_uk_target_frame` on a synthetic cross-grain surface (one input name injected at the person and the household entity): both targets materialize, the injected inputs are dropped from both tables, the same injection without the drop is refused by the prepared frame, and the band-edge register reaches materialization.
1 change: 1 addition & 0 deletions changelog.d/uk-spine-fit-weight-records-967.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
The UK spine builder finds each fitting stage's `fit_weight_records` through the telemetry and graph proxies a staged run wraps every stage in, so the sidecar carries the weights-audit evidence again; every telemetry-enabled spine built since the graph driver (2026-09-01) silently lacked the block and the release-cut `uk_weights_audit` gate reported it absent.\n
31 changes: 31 additions & 0 deletions docs/evidence/uk-a16-v20/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# A16 exclusion rows measured on the v20 national candidate

Evidence for the 2026-09-21 retirements on [PolicyEngine/microcosm#967](https://github.com/PolicyEngine/microcosm/pull/967) (commit `4173ab38`), filed on the review's ask that the retirement evidence live in the repository. `receipts.json` carries the digests of the candidate measured, the register and the two files here.

## What was measured

Every entry on the calibration measure-exclusion register (67 on 2026-09-21) is compiled in the contract register but pruned from the calibration surface, so the candidate never solved toward it. `scripts/measure_a16_rows_on_candidate.py` resolves and scores the full frozen contract register (705 specs) on the v20 national candidate's calibrated weights, pruning loudly only the rows whose measures cannot resolve at all, and reports each excluded row's relative error. A row inside the 25 % fence at weights that never saw it is evidence its exclusion can be retired; the retirement itself remains a signed register change.

Result (`outputs/a16_rows_on_v20.json`): 67 excluded entries, 62 measured, 5 unresolvable on the candidate, 10 inside the 25 % fence.

## The rows retired in `4173ab38`

- `hmrc/employment_income_count_income_band_1_000_000_to_inf` (microcosm#757): +16.9 % unbound
- `dwp/uc_payment_dist/LONE_PARENT_annual_payment_10_800_to_12_000` (uk-data#452): -8.1 % unbound
- `hmrc/self_employment_income_count_income_band_500_000_to_1_000_000` (microcosm#757): +0.0 % unbound
- `dwp.benefit_cap.capped_households_200_01_to_300` (microcosm#882): -10.1 % unbound
- `dwp.benefit_cap.capped_households_400_01_to_500` (microcosm#882): -3.8 % unbound

### What the retirements do and do not say

Three of the five rows were signed for *support*, not error size: `hmrc/employment_income_count_income_band_1_000_000_to_inf` (zero in-band carrier records on total income), `hmrc/self_employment_income_count_income_band_500_000_to_1_000_000` (four carriers under the SPI concept, sixteen under the proxy) and the two benefit-cap bands (a capped population resting on a handful of source households cloned many times; the two count as one concern). A +0.01 % or −3.8 % measured on a cell that thin does not speak to the concern those reasons named, that the solver distorts neighbouring cells to hit a published value with too few carriers. The retirement rests on the register's fence discipline (the row measures inside the fence at weights that never solved toward it), and the support concern stays live as a diagnostic: the cells are measured on every evaluation and the next build's target-fit diagnostics say whether binding them moved their neighbours (review note on PR #967, third pass). The other two rows (`dwp/uc_payment_dist/LONE_PARENT_annual_payment_10_800_to_12_000`, signed as a one-sided undershoot; the employment 1m+ row's sibling concern is above) were signed for error, which the measurement answers directly.

## The row measured inside the fence but kept

- `dwp.uc.households_housing_element` (microcosm#882): -2.8 % unbound. This is not noise inside the fence: DWP's any-tenure count includes an "other or unknown" tenure the engine's housing element cannot pay, 112,518 of 4,037,650 in calendar 2025 (2.79 %), so the model's any-tenure count is identically social plus private and the measured gap is the structural gap the entry records. María signed that reading in review of microcosm#921 on 2026-09-15; `4173ab38` had retired the entry on the measurement, and this PR restores it (the entry stays a measured-not-fit diagnostic to its 2026-10-15 expiry).

Four uk-data#452 payment bands measuring 18–25 % unbound stay excluded: binding-time competition can push a marginal cell over the fence, and the v20 self-employment 20–30k deferral on the target-fit register is that mechanism in action.

## Provenance

The evaluation stack is not a public repository, so the script is copied rather than linked (it is untracked there; the receipt digest is of the copy as taken, before this repository's formatter). Paths inside the output are machine-local. The candidate is the v20 national build (`microcosm_uk_2024.h5`, sha `8883e5925679…`), the same file the #968 poverty evidence measured.
Loading
Loading