import json from pathlib import Path ROOT = Path(__file__).resolve().parents[1] def load_jsonl(path: Path): return [json.loads(line) for line in path.read_text(encoding="utf-8").splitlines() if line] def test_v11_3_eval_set_is_strict_provenance_only(): rows = load_jsonl(ROOT / "data" / "substitution_eval_set_v11_3.jsonl") assert len(rows) >= 80 assert len({row["pair_id"] for row in rows}) == len(rows) assert {row["answer_shape"] for row in rows} <= {"one_to_one", "accord_rebuild", "partial"} assert {row["grade"] for row in rows} <= { "acceptable", "partial", "functional-only", "odor-only", "not-a-substitute" } assert all(row["eval_only"] is True for row in rows) assert all(row["provenance_flag"] in { "authoritative-supplier-page", "authoritative-supplier-catalogue" } for row in rows) assert all(row["source_url"].startswith(("https://", "local:")) for row in rows) def test_v11_3_report_keeps_exclusions_out_of_misses(): report = json.loads((ROOT / "artifacts" / "pimt_v11_3_powered_retriever.json").read_text()) assert report["eval_set_n"] >= 80 assert report["primary_rule"].startswith("one_to_one only") assert report["verdict"] in {"holds", "collapses", "ambiguous"} for conditions in report["by_answer_shape"].values(): for result in conditions.values(): assert result["n_eval_rows"] == result["n_evaluable"] + result["n_excluded"] assert result["n_evaluable"] == result["n_hit"] + result["n_missed"]