All courses · Course overview · Lesson sequence
Skip to lesson textproject/gate.py
#!/usr/bin/env python3
"""Replay handwritten synthetic classification records; never call a model or deploy.
Python 3.11+; standard library only. PASS means the supplied fixture meets its
local policy, not that a real model or production release has been approved.
"""
from __future__ import annotations
import argparse
import hashlib
import json
import math
from pathlib import Path
import sys
ROOT = Path(__file__).resolve().parent
ROUTES = {"answer", "clarify", "escalate"}
PROVENANCE = "handwritten-synthetic"
class InputError(ValueError):
"""Evidence is incomplete, malformed, or incompatible."""
def require(condition: bool, message: str) -> None:
if not condition:
raise InputError(message)
def unique_object(pairs: list[tuple[str, object]]) -> dict:
result = {}
for key, value in pairs:
require(key not in result, f"Duplicate JSON object key: {key}")
result[key] = value
return result
def reject_constant(value: str) -> None:
raise InputError(f"Non-finite JSON value: {value}")
def read_json(path: Path) -> tuple[dict, str]:
raw = path.read_bytes()
try:
value = json.loads(raw, object_pairs_hook=unique_object,
parse_constant=reject_constant)
except (json.JSONDecodeError, UnicodeDecodeError) as exc:
raise InputError(f"Invalid JSON in {path.name}: {exc}") from exc
require(isinstance(value, dict), f"{path.name} must contain a JSON object")
return value, hashlib.sha256(raw).hexdigest()
def text_field(value: object, label: str) -> None:
require(isinstance(value, str) and bool(value.strip()), f"{label} must be nonempty text")
def integer(value: object, label: str) -> None:
require(type(value) is int and value >= 0, f"{label} must be a nonnegative integer")
def fraction(value: object, label: str) -> None:
require(type(value) in (int, float) and 0 <= value <= 1
and math.isfinite(value), f"{label} must be a finite number from 0 to 1")
def fields(obj: object, expected: set[str], label: str) -> None:
require(isinstance(obj, dict), f"{label} must be an object")
require(set(obj) == expected, f"{label} fields must be exactly {sorted(expected)}")
def validate(cases: dict, baseline: dict, candidate: dict, policy: dict) -> dict[str, dict]:
fields(cases, {"schema_version", "dataset_id", "provenance", "cases"}, "Dataset")
require(type(cases["schema_version"]) is int and cases["schema_version"] == 1,
"Dataset schema_version must be 1")
text_field(cases["dataset_id"], "dataset_id")
require(cases["provenance"] == PROVENANCE, "Only handwritten-synthetic evidence is supported")
require(isinstance(cases["cases"], list) and bool(cases["cases"]), "Dataset must contain cases")
index = {}
for case in cases["cases"]:
fields(case, {"id", "slice", "input", "expected_route", "critical", "rationale"}, "Case")
for key in ("id", "slice", "input", "rationale"):
text_field(case[key], f"Case {key}")
require(case["id"] not in index, f"Duplicate case id: {case['id']}")
require(isinstance(case["expected_route"], str) and case["expected_route"] in ROUTES,
f"Unknown expected route: {case['id']}")
require(type(case["critical"]) is bool, f"Case critical must be boolean: {case['id']}")
index[case["id"]] = case
for run in (baseline, candidate):
fields(run, {"schema_version", "run_id", "dataset_id", "provenance", "system", "results"}, "Run")
require(type(run["schema_version"]) is int and run["schema_version"] == 1,
"Run schema_version must be 1")
text_field(run["run_id"], "run_id")
require(run["dataset_id"] == cases["dataset_id"], "Run dataset_id differs from dataset")
require(run["provenance"] == PROVENANCE, "Run must declare handwritten-synthetic provenance")
fields(run["system"], {"model", "prompt_revision", "code_revision"}, "System manifest")
for key, value in run["system"].items():
text_field(value, f"System {key}")
require(run["system"]["model"] == "none-fixture", "This lab supports fixtures, not model runs")
require(isinstance(run["results"], list), "Run results must be a list")
seen = set()
for row in run["results"]:
fields(row, {"case_id", "route", "latency_ms", "cost_microusd"}, "Result")
text_field(row["case_id"], "Result case_id")
require(row["case_id"] not in seen, f"Duplicate result id: {row['case_id']}")
require(isinstance(row["route"], str) and row["route"] in ROUTES,
f"Unknown route for {row['case_id']}")
integer(row["latency_ms"], "latency_ms")
integer(row["cost_microusd"], "cost_microusd")
seen.add(row["case_id"])
require(seen == set(index), "Run must contain every case exactly once, with no extra cases")
require(candidate["run_id"] != baseline["run_id"], "Baseline and candidate run_id must differ")
fields(policy, {"policy_id", "rationale", "min_overall", "min_by_slice", "max_critical_failures",
"max_new_failures", "max_p95_latency_ms", "max_mean_cost_microusd"}, "Policy")
text_field(policy["policy_id"], "policy_id")
text_field(policy["rationale"], "Policy rationale")
fraction(policy["min_overall"], "min_overall")
require(isinstance(policy["min_by_slice"], dict) and bool(policy["min_by_slice"]),
"Policy needs slice thresholds")
require(set(policy["min_by_slice"]) == {case["slice"] for case in index.values()},
"Policy must name every dataset slice exactly once")
for name, value in policy["min_by_slice"].items():
fraction(value, f"Slice threshold {name}")
for key in ("max_critical_failures", "max_new_failures", "max_p95_latency_ms", "max_mean_cost_microusd"):
integer(policy[key], key)
return index
def nearest_rank(values: list[int], percentile: float) -> int:
"""Nearest rank: sorted values at ceil(percentile*n), counting from one."""
require(bool(values), "A percentile needs observations")
require(0 < percentile <= 1, "Percentile must be in (0, 1]")
return sorted(values)[math.ceil(percentile * len(values)) - 1]
def metrics(index: dict[str, dict], run: dict) -> tuple[dict, dict[str, bool]]:
passed = {row["case_id"]: row["route"] == index[row["case_id"]]["expected_route"]
for row in run["results"]}
slices = {}
for name in sorted({case["slice"] for case in index.values()}):
ids = [key for key, case in index.items() if case["slice"] == name]
count = sum(passed[key] for key in ids)
slices[name] = {"passed": count, "total": len(ids), "accuracy": count / len(ids)}
results = run["results"]
total_cost = sum(row["cost_microusd"] for row in results)
return {
"passed": sum(passed.values()), "total": len(index),
"accuracy": sum(passed.values()) / len(index), "by_slice": slices,
"failed_case_ids": sorted(key for key in index if not passed[key]),
"critical_failure_ids": sorted(key for key, case in index.items()
if case["critical"] and not passed[key]),
"p95_latency_ms": nearest_rank([row["latency_ms"] for row in results], .95),
"total_cost_microusd": total_cost, "mean_cost_microusd": total_cost / len(index)
}, passed
def evaluate(cases: dict, baseline: dict, candidate: dict, policy: dict) -> dict:
index = validate(cases, baseline, candidate, policy)
base_metrics, base_passed = metrics(index, baseline)
cand_metrics, cand_passed = metrics(index, candidate)
new_failures = sorted(key for key in index if base_passed[key] and not cand_passed[key])
fixed = sorted(key for key in index if not base_passed[key] and cand_passed[key])
checks = []
def check(name: str, observed: float, limit: float, direction: str) -> None:
passed = observed >= limit if direction == "minimum" else observed <= limit
checks.append({"name": name, "observed": observed, direction: limit, "passed": passed})
check("overall_accuracy", cand_metrics["accuracy"], policy["min_overall"], "minimum")
for name, limit in sorted(policy["min_by_slice"].items()):
check(f"slice_accuracy:{name}", cand_metrics["by_slice"][name]["accuracy"], limit, "minimum")
check("critical_route_failures", len(cand_metrics["critical_failure_ids"]),
policy["max_critical_failures"], "maximum")
check("new_case_failures", len(new_failures), policy["max_new_failures"], "maximum")
check("p95_latency_ms", cand_metrics["p95_latency_ms"], policy["max_p95_latency_ms"], "maximum")
check("mean_cost_microusd", cand_metrics["mean_cost_microusd"],
policy["max_mean_cost_microusd"], "maximum")
return {
"report_schema_version": 1, "evidence_kind": "synthetic_fixture_replay",
"release_authorized": False, "dataset_id": cases["dataset_id"],
"policy_id": policy["policy_id"],
"decision": "PASS" if all(item["passed"] for item in checks) else "BLOCK",
"baseline": {"run_id": baseline["run_id"], "system": baseline["system"], "metrics": base_metrics},
"candidate": {"run_id": candidate["run_id"], "system": candidate["system"], "metrics": cand_metrics},
"new_failure_ids": new_failures, "fixed_case_ids": fixed, "checks": checks,
"blocking_reasons": [item["name"] for item in checks if not item["passed"]],
"limitations": [
"Handwritten routes, latencies, and costs; no model was called or timed.",
"These synthetic cases do not estimate production performance or safety.",
"Only route equality is graded; answer content is not evaluated.",
"PASS is a local policy result, not permission to deploy or a learner pilot."
]
}
def main(argv: list[str] | None = None) -> int:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--cases", type=Path, default=ROOT / "fixtures/cases.json")
parser.add_argument("--baseline", type=Path, default=ROOT / "fixtures/baseline.json")
parser.add_argument("--candidate", type=Path, required=True)
parser.add_argument("--policy", type=Path, default=ROOT / "policy.json")
parser.add_argument("--report", type=Path, help="Optional JSON output; input files cannot be overwritten")
args = parser.parse_args(argv)
try:
paths = {"cases": args.cases, "baseline": args.baseline,
"candidate": args.candidate, "policy": args.policy}
if args.report:
require(args.report.resolve() not in {path.resolve() for path in paths.values()},
"Report path cannot overwrite an input file")
require(not args.report.exists() or not any(
path.exists() and args.report.samefile(path) for path in paths.values()),
"Report path cannot overwrite an input through a hard link")
loaded = {name: read_json(path) for name, path in paths.items()}
report = evaluate(*(loaded[name][0] for name in ("cases", "baseline", "candidate", "policy")))
report["input_sha256"] = {name: loaded[name][1] for name in paths}
encoded = json.dumps(report, indent=2, sort_keys=True, allow_nan=False) + "\n"
if args.report:
args.report.parent.mkdir(parents=True, exist_ok=True)
args.report.write_text(encoded, encoding="utf-8")
print(f"{report['decision']}: {report['candidate']['run_id']} (synthetic fixture replay)")
print(f"Accuracy: {report['candidate']['metrics']['passed']}/{report['candidate']['metrics']['total']}")
print("Blocking reasons: " + (", ".join(report["blocking_reasons"]) or "none"))
print("Release authorized: false")
return 0 if report["decision"] == "PASS" else 1
except (InputError, OSError, TypeError) as exc:
print(f"INPUT ERROR: {exc}", file=sys.stderr)
return 2
if __name__ == "__main__":
raise SystemExit(main())