redrob-ranker / src /rationale /validator.py
MrNK2107
feat: Phase 8 rationale generation — LLM + template fallback, validator
00e3bc2
Raw
History Blame Contribute Delete
1.28 kB
from __future__ import annotations
from src.core.models import MatchRecommendation, Rationale
class RationaleValidator:
def validate(self, rationale: Rationale) -> tuple[bool, list[str]]:
issues: list[str] = []
if len(rationale.summary) < 10:
issues.append("Summary too short (min 10 chars)")
if len(rationale.summary) > 500:
issues.append("Summary too long (max 500 chars)")
if not rationale.strengths:
issues.append("No strengths listed")
valid_recommendations = {r.value for r in MatchRecommendation}
if rationale.recommendation.value not in valid_recommendations:
issues.append(f"Invalid recommendation: {rationale.recommendation}")
return len(issues) == 0, issues
def validate_batch(self, rationales: list[Rationale]) -> dict[str, int]:
total = len(rationales)
valid = 0
all_issues: list[str] = []
for r in rationales:
is_valid, issues = self.validate(r)
if is_valid:
valid += 1
all_issues.extend(issues)
return {
"total": total,
"valid": valid,
"invalid": total - valid,
"total_issues": len(all_issues),
}