@@ -85,6 +85,30 @@ def test_all_reviewers_unavailable_degrades_with_durable_alert(self, mock_orches
8585 def test_disagreement_is_a_hard_block (self ) -> None :
8686 self .assertEqual (_exit_code ({"ok" : True , "outcome" : "disagreement" }), 2 )
8787
88+ @patch ("scripts.run_dual_review_pipeline.orchestrate_from_payload" )
89+ def test_reconciliation_baseline_requires_human_recovery_approval (self , mock_orchestrate ) -> None :
90+ from service .dual_review import DualReviewTrigger
91+ from service .dual_review_orchestrator import DualReviewResult
92+
93+ candidate_sha256 = "a" * 64
94+ mock_orchestrate .return_value = DualReviewResult (
95+ trigger = DualReviewTrigger .RECONCILIATION_BASELINE ,
96+ strategy_profile = "soxl_soxx_trend_income" ,
97+ primary_review = {"verdict" : "approve" , "confidence" : 0.95 },
98+ outcome = "pass" ,
99+ evidence_binding_sha256 = candidate_sha256 ,
100+ )
101+ result = run_pipeline (
102+ trigger = "reconciliation_baseline" ,
103+ strategy_profile = "soxl_soxx_trend_income" ,
104+ context = {"reconciliation_candidate_sha256" : candidate_sha256 },
105+ primary_review = {"verdict" : "approve" , "confidence" : 0.95 },
106+ )
107+
108+ self .assertTrue (result ["requires_human_recovery_approval" ])
109+ self .assertTrue (result ["recovery_authority" ]["human_review_required" ])
110+ self .assertEqual (result ["recovery_authority" ]["final_action" ], "escalate" )
111+
88112 @patch .dict ("os.environ" , {"DUAL_REVIEW_GATE_SKIP" : "1" }, clear = False )
89113 def test_from_evidence_cli_without_trigger_flags (self ) -> None :
90114 with tempfile .TemporaryDirectory () as tmp :
0 commit comments