|
| 1 | +"""Named CRFB long-run TOB scenario contracts.""" |
| 2 | + |
| 3 | +from __future__ import annotations |
| 4 | + |
| 5 | +from typing import Any, Mapping |
| 6 | + |
| 7 | +from pydantic import BaseModel, Field |
| 8 | + |
| 9 | +CRFB_POST_OBBBA_TOB_SCENARIO_ID = "crfb_post_obbba_tob_75y" |
| 10 | +CRFB_POST_OBBBA_TOB_TARGET_ID = "post_obbba_calibrated_tob_75y" |
| 11 | +CRFB_POST_OBBBA_TOB_TARGET_SOURCE = "oact_2025_08_05_provisional" |
| 12 | +CRFB_POST_OBBBA_TOB_TARGET_SHA256 = ( |
| 13 | + "75e9dbe6a30680670713089ceed3eb10d7ef597b88c4317d0b39571e25f381f3" |
| 14 | +) |
| 15 | +TRUSTEES_CORE_THRESHOLD_LAW_MODE = "trustees-2025-core-thresholds-v1" |
| 16 | + |
| 17 | + |
| 18 | +def _expected_artifact_contract() -> dict[str, Any]: |
| 19 | + return { |
| 20 | + "must_consume_baseline_sha256": CRFB_POST_OBBBA_TOB_TARGET_SHA256, |
| 21 | + "must_expose_scenario_id": CRFB_POST_OBBBA_TOB_SCENARIO_ID, |
| 22 | + "reject_raw_current_law_substitution": True, |
| 23 | + } |
| 24 | + |
| 25 | + |
| 26 | +class CRFBPostOBBBATOBContract(BaseModel): |
| 27 | + """Reproducibility contract for the CRFB Post-OBBBA TOB target source.""" |
| 28 | + |
| 29 | + scenario_id: str = CRFB_POST_OBBBA_TOB_SCENARIO_ID |
| 30 | + calibration_target_id: str = CRFB_POST_OBBBA_TOB_TARGET_ID |
| 31 | + target_source: str = CRFB_POST_OBBBA_TOB_TARGET_SOURCE |
| 32 | + target_sha256: str = CRFB_POST_OBBBA_TOB_TARGET_SHA256 |
| 33 | + baseline_kind: str = "calibration_target" |
| 34 | + not_law: bool = True |
| 35 | + law_mode: str = TRUSTEES_CORE_THRESHOLD_LAW_MODE |
| 36 | + artifact_contract: dict[str, Any] = Field( |
| 37 | + default_factory=_expected_artifact_contract |
| 38 | + ) |
| 39 | + |
| 40 | + def validate_metadata(self, metadata: Mapping[str, Any]) -> dict[str, Any]: |
| 41 | + errors = [] |
| 42 | + checks = { |
| 43 | + "name": self.target_source, |
| 44 | + "scenario_id": self.scenario_id, |
| 45 | + "calibration_target_id": self.calibration_target_id, |
| 46 | + "baseline_kind": self.baseline_kind, |
| 47 | + "not_law": self.not_law, |
| 48 | + "law_mode": self.law_mode, |
| 49 | + "sha256": self.target_sha256, |
| 50 | + } |
| 51 | + for key, expected in checks.items(): |
| 52 | + actual = metadata.get(key) |
| 53 | + if actual != expected: |
| 54 | + errors.append(f"{key}={actual!r}, expected {expected!r}") |
| 55 | + |
| 56 | + artifact_contract = metadata.get("artifact_contract") |
| 57 | + if artifact_contract != self.artifact_contract: |
| 58 | + errors.append( |
| 59 | + "artifact_contract does not match the CRFB Post-OBBBA TOB contract" |
| 60 | + ) |
| 61 | + |
| 62 | + if errors: |
| 63 | + raise ValueError( |
| 64 | + "Invalid CRFB Post-OBBBA TOB scenario metadata: " + "; ".join(errors) |
| 65 | + ) |
| 66 | + return dict(metadata) |
| 67 | + |
| 68 | + |
| 69 | +def crfb_post_obbba_tob_contract() -> CRFBPostOBBBATOBContract: |
| 70 | + return CRFBPostOBBBATOBContract() |
| 71 | + |
| 72 | + |
| 73 | +def validate_crfb_post_obbba_tob_metadata( |
| 74 | + metadata: Mapping[str, Any], |
| 75 | +) -> dict[str, Any]: |
| 76 | + return crfb_post_obbba_tob_contract().validate_metadata(metadata) |
0 commit comments