The reform-validation registry is being consolidated into policyengine-scorecard (PolicyEngine/policyengine-scorecard#15, adapter in #16); calibration-diagnostics' External checks tab retires (calibration-diagnostics#140). The registry and producer stay here — release-exact scoring at each build's engine pins is engine-adjacent work — but the artifact becomes a scorecard input, which exposes two gaps in reform_validation.json:
-
No executable reform dicts. Scorecard claims key off a ReformRef; with only a row id available, scored rows use policy_ref descriptors ({"policy": "ks_hb2620_eitc"}). The param dicts already exist in state_reforms.json — emitting each row's reform_params (and non-current-law baseline where applicable, e.g. the OBBBA suite's TCJA-expiration counterfactual) upgrades claims to framework="policyengine_us", making identical policy worlds share a reform key across sources (JCX-35-25 rows could then resolve against the scorecard's harvested JCT claims instead of coexisting as duplicates).
-
No publisher slugs. The scorecard derives publishers from citation strings ("CA FTB…" → ca_admin); a benchmark_publisher field per spec (e.g. ks_lrd, ct_ofa, jct, census) would make source attribution exact instead of heuristic.
Both are additive to schema v1 (consumers ignore unknown keys). Happy to PR this once the scorecard-side design questions in PolicyEngine/policyengine-scorecard#15 settle.
🤖 Generated with Claude Code
The reform-validation registry is being consolidated into policyengine-scorecard (PolicyEngine/policyengine-scorecard#15, adapter in #16); calibration-diagnostics' External checks tab retires (calibration-diagnostics#140). The registry and producer stay here — release-exact scoring at each build's engine pins is engine-adjacent work — but the artifact becomes a scorecard input, which exposes two gaps in
reform_validation.json:No executable reform dicts. Scorecard claims key off a
ReformRef; with only a rowidavailable, scored rows usepolicy_refdescriptors ({"policy": "ks_hb2620_eitc"}). The param dicts already exist instate_reforms.json— emitting each row'sreform_params(and non-current-law baseline where applicable, e.g. the OBBBA suite's TCJA-expiration counterfactual) upgrades claims toframework="policyengine_us", making identical policy worlds share a reform key across sources (JCX-35-25 rows could then resolve against the scorecard's harvested JCT claims instead of coexisting as duplicates).No publisher slugs. The scorecard derives publishers from citation strings ("CA FTB…" →
ca_admin); abenchmark_publisherfield per spec (e.g.ks_lrd,ct_ofa,jct,census) would make source attribution exact instead of heuristic.Both are additive to schema v1 (consumers ignore unknown keys). Happy to PR this once the scorecard-side design questions in PolicyEngine/policyengine-scorecard#15 settle.
🤖 Generated with Claude Code