120 lines
5.0 KiB
Python
120 lines
5.0 KiB
Python
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()
|