33from __future__ import annotations
44
55import os
6+ import re
67from dataclasses import dataclass , field
78from typing import Any , Callable
89
1617 compare_three_reviews ,
1718 extract_confidence ,
1819 extract_verdict ,
20+ requires_mandatory_multi_review ,
1921 should_escalate ,
2022)
2123from service .dual_review_secondary import dual_api_secondary_reviewer , is_dual_api_secondary
2426from service .model_router import route_model
2527
2628SecondaryReviewer = Callable [["DualReviewRequest" ], dict [str , Any ]]
29+ _SHA256_PATTERN = re .compile (r"^[0-9a-f]{64}$" )
2730
2831
2932@dataclass (frozen = True )
@@ -33,6 +36,7 @@ class DualReviewRequest:
3336 primary_review : dict [str , Any ]
3437 context : dict [str , Any ] = field (default_factory = dict )
3538 escalation_threshold : float = DEFAULT_ESCALATION_THRESHOLD
39+ evidence_binding_sha256 : str | None = None
3640
3741
3842@dataclass
@@ -46,6 +50,7 @@ class DualReviewResult:
4650 outcome : str = ""
4751 reason : str = ""
4852 model_route : dict [str , str ] = field (default_factory = dict )
53+ evidence_binding_sha256 : str | None = None
4954
5055 def to_dict (self ) -> dict [str , Any ]:
5156 return {
@@ -58,6 +63,7 @@ def to_dict(self) -> dict[str, Any]:
5863 "outcome" : self .outcome ,
5964 "reason" : self .reason ,
6065 "model_route" : self .model_route ,
66+ "evidence_binding_sha256" : self .evidence_binding_sha256 ,
6167 }
6268
6369
@@ -77,12 +83,19 @@ def build_request_from_payload(payload: dict[str, Any]) -> DualReviewRequest | N
7783 except (TypeError , ValueError ):
7884 cutoff = DEFAULT_ESCALATION_THRESHOLD
7985 context = {k : v for k , v in payload .items () if k not in {"primary_review" , "secondary_review" }}
86+ evidence_binding_sha256 = None
87+ if trigger is DualReviewTrigger .RECONCILIATION_BASELINE :
88+ candidate = str (payload .get ("reconciliation_candidate_sha256" ) or "" ).strip ().lower ()
89+ if not _SHA256_PATTERN .fullmatch (candidate ):
90+ return None
91+ evidence_binding_sha256 = candidate
8092 return DualReviewRequest (
8193 trigger = trigger ,
8294 strategy_profile = strategy_profile ,
8395 primary_review = primary ,
8496 context = context ,
8597 escalation_threshold = cutoff ,
98+ evidence_binding_sha256 = evidence_binding_sha256 ,
8699 )
87100
88101
@@ -127,27 +140,32 @@ def orchestrate_dual_review(
127140 strategy_profile = request .strategy_profile ,
128141 primary_review = request .primary_review ,
129142 model_route = dict (route ),
143+ evidence_binding_sha256 = request .evidence_binding_sha256 ,
130144 )
131145
132- primary_confidence = extract_confidence (request .primary_review )
133- if primary_confidence is None :
146+ if requires_mandatory_multi_review (request .trigger ):
134147 result .escalated = True
135- result .reason = "primary confidence missing; escalating"
136- elif should_escalate (primary_confidence , threshold = request .escalation_threshold ):
137- result .escalated = True
138- result .reason = f"primary confidence { primary_confidence :.2f} below { request .escalation_threshold :.2f} "
148+ result .reason = "mandatory multi-review for reconciliation baseline enrollment"
139149 else :
140- primary_verdict = extract_verdict (request .primary_review )
141- if primary_verdict == VERDICT_PASS :
142- result .outcome = VERDICT_PASS
143- result .reason = "primary confidence sufficient; approved without secondary review"
144- return result
145- if primary_verdict == VERDICT_FAIL :
146- result .outcome = VERDICT_FAIL
147- result .reason = "primary confidence sufficient; rejected without secondary review"
148- return result
149- result .escalated = True
150- result .reason = "primary verdict unclear; escalating"
150+ primary_confidence = extract_confidence (request .primary_review )
151+ if primary_confidence is None :
152+ result .escalated = True
153+ result .reason = "primary confidence missing; escalating"
154+ elif should_escalate (primary_confidence , threshold = request .escalation_threshold ):
155+ result .escalated = True
156+ result .reason = f"primary confidence { primary_confidence :.2f} below { request .escalation_threshold :.2f} "
157+ else :
158+ primary_verdict = extract_verdict (request .primary_review )
159+ if primary_verdict == VERDICT_PASS :
160+ result .outcome = VERDICT_PASS
161+ result .reason = "primary confidence sufficient; approved without secondary review"
162+ return result
163+ if primary_verdict == VERDICT_FAIL :
164+ result .outcome = VERDICT_FAIL
165+ result .reason = "primary confidence sufficient; rejected without secondary review"
166+ return result
167+ result .escalated = True
168+ result .reason = "primary verdict unclear; escalating"
151169
152170 secondary = reviewer (request )
153171 result .secondary_review = secondary
0 commit comments