Skills › Scientific Agent Skills › scholar-evaluation › validate_rubric.py
validate_rubric.py
54 lines · skills/scholar-evaluation/scripts/validate_rubric.py at 5f2bc03
1#!/usr/bin/env python3
2"""Validate a bounded scholar-evaluation rubric JSON file."""
4from __future__ import annotations
6import argparse
7from pathlib import Path
9import _common
12def validate_file(path: Path) -> dict:
13 rubric = _common.read_json(path)
14 issues = _common.validate_rubric(rubric)
15 errors = _common.error_issues(issues)
16 return {
17 "schema_version": _common.SCHEMA_VERSION,
18 "report_type": "rubric_schema_validation",
19 "status": "invalid" if errors else "valid",
20 "rubric_id": rubric.get("rubric_id") if isinstance(rubric, dict) else None,
21 "error_count": len(errors),
22 "warning_count": len(issues) - len(errors),
23 "issues": [issue.as_dict() for issue in issues],
24 }
27def build_parser() -> argparse.ArgumentParser:
28 parser = argparse.ArgumentParser(
29 description=(
30 "Validate a strict local rubric schema; no document content, "
31 "credentials, models, or network access are used."
32 )
33 )
34 parser.add_argument("--rubric", required=True, type=Path, help="Local rubric JSON")
35 parser.add_argument("--output", type=Path, help="Optional local JSON report")
36 parser.add_argument(
37 "--force", action="store_true", help="Replace an existing output JSON file"
38 )
39 return parser
42def main() -> int:
43 args = build_parser().parse_args()
44 try:
45 report = validate_file(args.rubric)
46 _common.write_json(report, args.output, force=args.force)
47 return 0 if report["status"] == "valid" else 2
48 except _common.ValidationError as error:
49 _common.write_json(_common.failure_report(error), None)
50 return 2
53if __name__ == "__main__":
54 raise SystemExit(main())