@@ -28,6 +28,7 @@ class SignalValidationError(ValueError):
2828ALLOWED_REGIMES = frozenset ({"risk_on" , "risk_off" , "neutral" , "mixed" , "unknown" })
2929ALLOWED_BIAS_VALUES = frozenset ({"positive" , "negative" , "neutral" , "watch" , "avoid" })
3030REQUIRED_SIGNAL_HORIZON = "1-3 years"
31+ SUPPORTED_SCHEMA_VERSIONS = frozenset ({"1" , "2" })
3132
3233
3334def _require_mapping (value : Any , name : str ) -> Mapping [str , Any ]:
@@ -82,11 +83,15 @@ def validate_signal(payload: Mapping[str, Any]) -> None:
8283 if missing :
8384 raise SignalValidationError (f"missing required keys: { ', ' .join (missing )} " )
8485
85- if _require_string (payload ["schema_version" ], "schema_version" ) != "1" :
86- raise SignalValidationError ("schema_version must be '1'" )
86+ schema_version = _require_string (payload ["schema_version" ], "schema_version" )
87+ if schema_version not in SUPPORTED_SCHEMA_VERSIONS :
88+ raise SignalValidationError ("schema_version must be '1' or '2'" )
8789 _require_iso_date (payload ["as_of" ], "as_of" )
8890 _require_iso_datetime (payload ["generated_at" ], "generated_at" )
8991 _require_iso_date (payload ["expires_at" ], "expires_at" )
92+ if schema_version == "2" :
93+ _require_string (payload .get ("model_version" ), "model_version" )
94+ _require_string (payload .get ("scoring_version" ), "scoring_version" )
9095
9196 if payload ["mode" ] != "shadow" :
9297 raise SignalValidationError ("mode must be 'shadow'" )
0 commit comments