Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
8 changes: 8 additions & 0 deletions changelog.d/757-certification-contract.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
The publication contract verifies the multi-part release certification
(`release_certification.json`): exact field set, the three mirrored part
scopes and their committed scoped-manifest digests, full-manifest spec
pins, union/no-gap/no-overlap over the declared entry set, per-part
fully-passed status censuses (shippability recomputed, never read off the
flag), the diagnostics digest join, and the release-key signature over the
whole document. The mirrored constants are held in lockstep with the build
shard by the contract-pins sync tests.
11 changes: 11 additions & 0 deletions changelog.d/757-compile-parity-registers-current.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
The two ledger compile-parity signed-difference registers are regenerated
against the pinned chronicle feed before their runner ships: 13 stale
entries pruned (scotgov council-tax stock and SCP spending, three SLC
recipient rows - the live compilation now matches the fixture) and 13 SLC
entries re-kinded `fixture_only` -> `calibration_drift` with measured
values (the SLC chronicle waves completed after the June fixtures froze).
Zero entries added: the live diff carried no unsigned differences, so the
regeneration is exactly the correction the gate's own anti-rot refusals
demanded. Both release-cut preflight gates now pass against the pinned
feed - verified live, so the producer's first real invocation does not
open on a known-stale register.
10 changes: 10 additions & 0 deletions changelog.d/757-national-release-id.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
The certified UK national line gets its release id (ruling 2026-08-27):
`microcosm-uk-2024-25-national`, one constant name across cuts - run
identity and ordering live in the Logbook chain and artifact versioning,
not in the id. The `2024-25` segment follows the uk-data survey-vintage
convention and the `-national` segment keeps the id disjoint from the
exact-k ladder's `-k<N>` shape. The seam refuses it (a shippable name
belongs to the release-cut producer), and `required_release_files()` now
demands `release_certification.json` for it - completing the review
round's finding 1 at the id-keyed layer, with the content-keyed refusal
staying as the belt for part-carrying directories under other ids.
12 changes: 12 additions & 0 deletions changelog.d/757-phase3-acceptance.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
The committed spine acceptance receipt moves to spine-i, the candidate
rebuilt at the follow-up tip: payload-identical to spine-g (the
certification machinery, exclusion pass, QRF re-arm, and lever revert are
all payload-inert), 14/14 battery at release-candidate strictness with a
signed report, fit-weight records in the sidecar, identity ladder e4-e8
green, strict parity `signed_parity` with 0 unsigned. The first certified
cut itself is blocked at `uk_target_fit` on 13 characterized cells - 8 UC
caseload/two-child cells (the U8 lever is measured and exhausted; the
binding constraint is capital-test support, microcosm#750), 4
exclusion-set-dependence artifacts (microcosm#792), and 1 sparse-band
sibling - with the signed blocked-run receipts in the 757-swap acceptance
evidence and the adjudication queue in the PR.
12 changes: 12 additions & 0 deletions changelog.d/757-qrf-tail-rearm.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
`uk_qrf_tail_concentration` is re-armed from the #686 L3 baselines (#757
B4): top_k 100 stays the measurement grid anchor, max_top_share moves to
the exact measured maximum over the checked surface (0.9994670564654868,
hmrc_spi_other_social_security_income at 104 carriers on spine-a), and
min_nonzero_records to the thinnest measured column above the grid anchor
(104). The three saturated sub-anchor columns (taxable termination pay,
charitable investment gifts, SDA; 12-24 carriers, top-100 share 1.0) go
thin visibly on every run. The gate notes record the measuring run - the
baselines file digest, the measured artifact, and the defining column per
threshold. The 12 household-surface grids are measured but not yet armed
(declared follow-up). Gate policy/manifest/fingerprint digests re-cut from
the live producer payload.
16 changes: 16 additions & 0 deletions changelog.d/757-release-cut-certification.added.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
The release-cut certification producer (#757 B5): the 16 declared national
preflight/terminal gates get their executable home back
(`tools/certify_uk_release_cut.py` over
`uk_runtime/release_certification.py`), running as a scoped release-candidate
battery against the calibrated candidate with evidence reconstructed from
the persisted artifacts - the spine sidecar (which now carries each fitting
stage's `FitWeightRecord`s across the run boundary), the seam's diagnostics
and build record, and the per-run licensed input-mass reference. The
multi-part certification the 5413502559 audit specified composes over the
spine, seam, and release-cut reports: union to the full declared entry set,
no gap, no overlap beyond `uk_aggregate_admin`, per-part signatures and
committed-spec scoped digests, full phase coverage, a closed identity join
(spine report -> sidecar -> build record -> diagnostics -> candidate
bytes), the doctrine and its receipted overrides recorded verbatim, and the
rule-1 score receipt cross-pinned. A candidate's shippability verdict comes
only from the certification.
18 changes: 18 additions & 0 deletions changelog.d/757-review-dispositions-793.fixed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
The #793 review round (four findings, all the reports-success-without-
testing class): a release shipping national-line gate artifacts without
`release_certification.json` now refuses instead of validating clean by
omission (the id-keyed required-files rule waits on the canonical national
release-id); the rule-1 cross-pin reads `artifacts.candidate.sha256` - the
field that names what the scorer measured - instead of a substring scan; a
malformed sidecar fit-weight block raises as corruption instead of
degrading to the empty tuple (a genuinely empty fitting stage still fails
the audit, never vacuously passes); and the parity evidence's shared
name@period grain is now a loud refusal rather than an implicit
convention. Alongside, the duplication the round pointed at is
consolidated: one scope-filtering helper (`uk_scoped_gate_manifest`, with
a source parameter serving the spine driver's stub point) replaces three
copies and a dead zero-caller variant, one `finalize_uk_scoped_gate_report`
grafts and re-signs every scoped report, the certification's private
cross-module imports become public names, and `GateBatteryRun` exposes its
attested digests as properties so derivation stops routing through a
signed payload.
7 changes: 7 additions & 0 deletions changelog.d/757-seam-refuses-release-candidate.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
The calibration seam refuses `--release-candidate` outright and refuses
canonical UK release ids (the #757 release-cut audit, issue comment
5413502559): its scoped battery covers 6 of the declared gate entries and
must never sign a shippability claim. The hand-written build-record
`shippable` literal retires with it, replaced by a pointer to the
release-cut certification artifact
(`<staging>.release_certification.json`) whose verdict is authoritative.
12 changes: 12 additions & 0 deletions changelog.d/757-target-fit-exclusion-pass.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
The calibration measure-exclusion register carries the adjudicated
`uk_target_fit` disposition pass (microcosm#757, issue comment 5427936411):
42 windowed exclusions covering the eleven 1m+ top-income channel cells,
the three SLC zero/structural-support channels, the sixteen UC
payment-distribution cells, the OBR welfare-cap pair, the three ONS
household-composition cells pending a relationship-to-head frame column
(microcosm#791), the six sparse HMRC band cells, and `obr.fuel_duties`
(universe scope; ledger retarget pending chronicle-side adjudication).
The six UC caseload/two-child-limit cells are deliberately not excluded —
they ride the `would_claim_uc` lever run — and neither are
`couple_no_children` nor `state_pension_income_band_40_000_to_50_000`,
which the exclusion re-run is expected to pull inside the band.
11 changes: 11 additions & 0 deletions changelog.d/757-would-claim-uc-lever.changed.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
The pre-registered `would_claim_uc` U8 lever (uk-data#452) was run and
measured per the #757 `uk_target_fit` dispositions (issue comment
5427936411), and reverted on the receipts: a raise to 0.85 leaves every
failing UC caseload cell unchanged (`dwp.uc.households` -44.9% at both
rates) while destroying the legacy housing-benefit surface
(`obr.housing_benefit` -0.0% at 0.55 vs -52.4% at 0.85 - the raise moves
claimants off legacy benefits) and perturbing the QRF predictor surface
through engine-computed `household_net_income`. The contract entry stays
frozen at 0.55 and now records the run; the receipts live in the 757-swap
acceptance evidence. The binding constraint on UC caseload is capital-test
support (microcosm#750), not take-up support.
18 changes: 18 additions & 0 deletions packages/microcosm-build/src/microcosm/build/gate_battery.py
Original file line number Diff line number Diff line change
Expand Up @@ -835,6 +835,24 @@ def _next_phase(self) -> str | None:
return phase
return None

@property
def gates_manifest_sha256(self) -> str:
"""Canonical digest of the scoped manifest this run attests."""

return self._gates_manifest_sha256

@property
def spec_fingerprint(self) -> str:
"""Composition fingerprint derived from the manifest digest."""

return self._spec_fingerprint

@property
def policy_sha256(self) -> str:
"""Canonical digest of the declared gate policy entries."""

return self._policy_sha256()

def run_phase(self, phase: str, context: EvidenceContext) -> GatePhaseReport:
"""Evaluate one phase and persist the full report before returning.

Expand Down
Loading
Loading