99from typing import Any
1010
1111STATUSES = {"pass" , "fail" , "insufficient_evidence" , "not_applicable" }
12+ DECISIONS = {"pass" , "fail" , "insufficient_evidence" }
1213
1314
1415def validate_review (payload : Any ) -> list [str ]:
@@ -17,6 +18,8 @@ def validate_review(payload: Any) -> list[str]:
1718 return ["top-level JSON must be an object" ]
1819 if payload .get ("schema_version" ) != "strategy_review.v1" :
1920 issues .append ("schema_version must be strategy_review.v1" )
21+ if payload .get ("decision" ) not in DECISIONS :
22+ issues .append ("decision must be pass, fail, or insufficient_evidence" )
2023 if not isinstance (payload .get ("profile" ), str ) or not payload ["profile" ].strip ():
2124 issues .append ("profile must be a non-empty string" )
2225 gates = payload .get ("hard_gates" )
@@ -45,6 +48,9 @@ def validate_review(payload: Any) -> list[str]:
4548 else :
4649 if evidence .get ("metrics_kind" ) != "performance" :
4750 issues .append ("evidence.metrics_kind must be performance" )
51+ for field in ("data_source" , "cost_model" ):
52+ if not isinstance (evidence .get (field ), str ) or not evidence [field ].strip ():
53+ issues .append (f"evidence.{ field } must be a non-empty string" )
4854 if evidence .get ("placeholder_metrics" ) is not False :
4955 issues .append ("placeholder metrics are not admissible evidence" )
5056 if not isinstance (evidence .get ("sample_count" ), int ) or evidence ["sample_count" ] < 0 :
0 commit comments