"""Evaluate a specific verse sample with the project's evaluator. Writes per-verse dimension scores to a JSON file WITHOUT touching the canonical chapter eval files — the harness used for all A/B experiments (register calibration, morphology, translator-model comparisons). Usage: uv run python scripts/evaluate_verse_sample.py book:ch:v [...] """ import json, subprocess, sys sys.path.insert(0, str(__import__("pathlib").Path(__file__).parent.parent)) from src.context.builder import ContextBuilder from src.context.glossary import GlossaryManager from src.data.loader import DataLoader from src.data.storage import Storage from src.evaluation.evaluator import ( EVALUATION_SYSTEM_PROMPT, TranslationEvaluator, parse_evaluation_response, ) from src.models.verse import VerseReference from src.pipeline.translator import DEFAULT_MODEL if len(sys.argv) < 3: print(__doc__) raise SystemExit(2) out_path, refs = sys.argv[1], " ".join(sys.argv[2:]).split() loader = DataLoader("data") glossary = GlossaryManager(loader.load_glossary()) builder = ContextBuilder(loader, glossary) storage = Storage("data") evaluator = TranslationEvaluator(data_dir="data") results = {} for r in refs: book, ch, v = r.split(":") ref = VerseReference(book=book, chapter=int(ch), verse=int(v)) t = storage.load_translation(ref) if not t: print(f"{r}: no translation"); continue ctx = builder.build_context(ref) prompt = evaluator.build_verse_prompt(t.text, ctx) full = f"{EVALUATION_SYSTEM_PROMPT}\n\n{prompt}" p = subprocess.run(["claude", "--print", "-p", full, "--model", DEFAULT_MODEL], capture_output=True, text=True, timeout=300) if p.returncode != 0: print(f"{r}: eval failed: {p.stderr[:100]}"); continue try: scores = parse_evaluation_response(p.stdout.strip()) except ValueError as e: print(f"{r}: parse failed: {e}"); continue results[r] = { "text": t.text, "scores": {k: {"score": s.score, "reasoning": s.reasoning} for k, s in scores.items()}, "avg": sum(s.score for s in scores.values()) / len(scores), } print(f"{r}: avg={results[r]['avg']:.1f}") json.dump(results, open(out_path, "w"), ensure_ascii=False, indent=1) print(f"saved {len(results)} to {out_path}")