Skip to content

Wire the eCPS parity_gate into the US release with a pinned reference and a reason'd exemption register #313

Description

@MaxGhenis

Problem

The launch contract for replacing the eCPS is parity_gate (gates.py): every layer the incumbent populates, the candidate must populate — share-based (an exported-but-all-zero column fails), with exemptions only by documented name (known_gaps), recorded in the gate details.

It is registered in the declarative gate registry (country_spec.py, "parity") but no US spec selects it and no release tool calls it — the only parity enforced today is input_mass_parity_gate, which audits mass on columns the build already persists. Absent layers never enter its universe. Concrete consequence: ~ten programs' take-up inputs (takes_up_*, see #312) are missing outright and no release has ever failed on them; the same blind spot covers the SCF wealth vars (#49) and SPM inputs (#32).

Plan

  1. Pin the reference. Compute the incumbent eCPS artifact's per-variable nonzero shares ONCE from the pinned, sha-verified policyengine-us-data release file, and check the result in as a JSON reference (variable → nonzero share + the source artifact's sha256). Never recompute from a moving artifact.
  2. Wire the gate. Select parity in the US release path (declarative spec selection where the gate consumes frame evidence, or direct call in the release tool alongside the other gates) with that reference; failure blocks the release like the geography-ladder and weights-audit gates (nonzero exit), and the result lands in the release manifest.
  3. Seed the exemption register honestly. First run will fail on every known-missing layer. Each known_gaps entry must carry a reason and a tracking issue — take-up flags → Seed take-up inputs across programs (parity with policyengine-us-data's stochastic flags) #312 and children; SCF wealth vars → Verify US wealth, property, and asset imputation backlog #49; SPM inputs → Track SPM-specific input gaps: housing, WIC, school meals, child support, workers comp, and expense deductions #32; anything else the first run surfaces gets a new child. The register is the debt ledger; the launch condition is that it shrinks to entries that are deliberate scope decisions, not TODOs.
  4. Manifest surface. exempted + gaps already serialize via GateResult details — ensure the release manifest carries them so every release states its remaining distance from full eCPS parity.

Acceptance

  • The pinned-reference JSON exists with the source artifact sha.
  • A US release run executes parity_gate and fails loudly on an unexempted missing layer (prove-it-can-find-something test: plant a reference layer the candidate zeroes).
  • The initial known_gaps register is checked in, every entry reason'd and issue-linked.
  • Release manifest reports populated layers, gaps, and exemptions.

Related: #312 (take-up inputs, the largest current exemption family), #49, #32, #204 (incumbent-replacement epic), #299 (Build E certification).

Metadata

Metadata

Assignees

No one assigned

    Labels

    tier:standardSpec'd build/assembly with acceptance tests; suitable for Opus/GPT-class agents

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions