import importlib.util import unittest from pathlib import Path def load_audit_runner(): script_path = Path(__file__).resolve().parents[1] / "scripts" / "run_round05_1_selector_patch_audit.py" spec = importlib.util.spec_from_file_location("run_round05_1_selector_patch_audit", script_path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module class Round051SelectorPatchAuditTests(unittest.TestCase): def test_behavior_record_contains_diff_contract_fields(self): runner = load_audit_runner() record = runner.build_behavior_record( source="round04_blind_pool", case_id="R04-BI-010", input_text="谁负责这件事一直说不清楚。", selector_result={ "selected_models": [ { "model_id": "qpi", "score": 0.57, "reasons": ["QPI problem-definition gate matched"], "penalties": [], } ], "rejected_models": [ { "model_id": "intellectual_archaeology", "score": 0.12, "reasons": [], "penalties": ["no IA heavy-depth gate"], } ], "no_call": False, }, targeted=True, ) self.assertEqual(record["case_id"], "R04-BI-010") self.assertEqual(record["source"], "round04_blind_pool") self.assertEqual(record["selected_model_ids"], ["qpi"]) self.assertEqual(record["rejected_model_ids"], ["intellectual_archaeology"]) self.assertEqual(record["scores"]["qpi"], 0.57) self.assertEqual(record["scores"]["intellectual_archaeology"], 0.12) self.assertEqual(record["reasons"]["qpi"], ["QPI problem-definition gate matched"]) self.assertEqual(record["penalties"]["intellectual_archaeology"], ["no IA heavy-depth gate"]) self.assertIs(record["no_call"], False) self.assertIs(record["targeted"], True) def test_diff_marks_target_and_non_target_changes_with_deferred_disposition(self): runner = load_audit_runner() before = [ { "case_id": "R04-BI-010", "source": "round04_blind_pool", "input": "谁负责这件事一直说不清楚。", "targeted": True, "selected_model_ids": [], "rejected_model_ids": ["qpi", "intellectual_archaeology"], "scores": {"qpi": 0.31, "intellectual_archaeology": 0.0}, "no_call": True, "reasons": {"qpi": [], "intellectual_archaeology": []}, "penalties": {"qpi": ["QPI positive signal missing"], "intellectual_archaeology": []}, }, { "case_id": "R04-BI-028", "source": "round04_blind_pool", "input": "我又卡住了。", "targeted": False, "selected_model_ids": [], "rejected_model_ids": ["qpi", "intellectual_archaeology"], "scores": {"qpi": 0.2, "intellectual_archaeology": 0.0}, "no_call": True, "reasons": {"qpi": [], "intellectual_archaeology": []}, "penalties": {"qpi": ["QPI positive signal missing"], "intellectual_archaeology": []}, }, ] after = [ { **before[0], "selected_model_ids": ["qpi"], "rejected_model_ids": ["intellectual_archaeology"], "scores": {"qpi": 0.56, "intellectual_archaeology": 0.0}, "no_call": False, "reasons": {"qpi": ["QPI problem-definition gate matched"], "intellectual_archaeology": []}, "penalties": {"qpi": [], "intellectual_archaeology": []}, }, { **before[1], "scores": {"qpi": 0.25, "intellectual_archaeology": 0.0}, "penalties": {"qpi": [], "intellectual_archaeology": []}, }, ] diff = runner.diff_behavior_records(before, after, targeted_cases={"R04-BI-010"}) self.assertEqual(diff["summary"]["targeted_changes"], 1) self.assertEqual(diff["summary"]["non_target_changes"], 1) target_change = diff["changed_cases"][0] self.assertEqual(target_change["case_id"], "R04-BI-010") self.assertIs(target_change["targeted"], True) self.assertIn("selected_model_ids", target_change["changed_fields"]) self.assertIn("no_call", target_change["changed_fields"]) non_target_change = diff["changed_cases"][1] self.assertEqual(non_target_change["case_id"], "R04-BI-028") self.assertIs(non_target_change["targeted"], False) self.assertEqual(non_target_change["owner_disposition"], "defer") self.assertEqual(non_target_change["ccra_disposition"], "defer") if __name__ == "__main__": unittest.main()