from scripts.run_four_file_automation import gate_summary def test_gate_summary_does_not_qualify_when_protected_and_answer_gates_remain(): report = gate_summary( source_checks=[{"status": "pass"}], review_ledger={"summary": {"evidence_bindings_invalid": 0, "claims": 2, "items": 1}}, retrieval_score={ "question_count": 24, "mean_conditional_recall_at_5": 0.9, "conditional_hit_rate": 1.0, "pagination_blocked_queries": 0, }, answer_reports={ "answers": {"status": "invalid", "checked": 1, "issues": [{"code": "BAD"}]} }, support_judgments={"strict_group_support_fraction": 1.0}, answer_scores={"50k": {"content_points_before_citation_penalty": 48, "max_points": 48}}, behavioral_results={ "exact_replay": {"passed": True}, "quote": {"status": "invalid"}, "offset": {"status": "invalid"}, "extraction": {"status": "invalid"}, "revision": {"status": "invalid"}, "meaning": {"status": "eligible"}, "unauthorized_get_node": {"denied": True}, "unauthorized_search": {"denied": True}, }, ) assert report["qualification"] == "not_qualified" assert report["gates"]["retrieval_tuning"]["status"] == "pass" assert report["gates"]["answer_citations"]["status"] == "fail" assert report["gates"]["owner_protected_decisions"]["status"] == "pending_owner" assert report["gates"]["behavioral_suite"]["status"] == "partial" assert report["gates"]["semantic_support_review"]["status"] == "gap_demonstrated_not_judged" assert "reserved_questions" in report["remaining_gates"] def test_gate_summary_marks_retrieval_failure_when_pagination_is_blocked(): report = gate_summary( source_checks=[{"status": "pass"}], review_ledger={"summary": {"evidence_bindings_invalid": 0, "claims": 0, "items": 0}}, retrieval_score={ "question_count": 24, "mean_conditional_recall_at_5": 0.9, "conditional_hit_rate": 1.0, "pagination_blocked_queries": 1, }, answer_reports={"answers": {"status": "valid", "checked": 0, "issues": []}}, support_judgments={"strict_group_support_fraction": 1.0}, answer_scores={"50k": {"content_points_before_citation_penalty": 48, "max_points": 48}}, ) assert report["gates"]["retrieval_tuning"]["status"] == "fail" assert report["qualification"] == "not_qualified" def test_semantic_judge_completion_remains_advisory_until_candidate_actions_finish(): report = gate_summary( source_checks=[{"status": "pass"}], review_ledger={"summary": {"evidence_bindings_invalid": 0, "claims": 1, "items": 1}}, retrieval_score={"question_count": 24, "mean_conditional_recall_at_5": 1.0}, answer_reports={"answers": {"status": "valid", "checked": 0, "issues": []}}, support_judgments={"strict_group_support_fraction": 1.0}, answer_scores={"50k": {"content_points_before_citation_penalty": 48, "max_points": 48}}, semantic_results={ "claim_count": 1, "outcomes": {"advisory_support_consensus": 1}, }, ) assert ( report["gates"]["semantic_support_review"]["status"] == "advisory_complete_candidate_actions_pending" ) assert report["qualification"] == "not_qualified"