from __future__ import annotations

from dataclasses import dataclass
from statistics import mean

@dataclass(frozen=True)
class EvalRecord:
    case_id: str
    success: bool
    quality: float
    critical_violation: bool
    cost_usd: float

def summarize(records: list[EvalRecord]) -> dict:
    if not records:
        raise ValueError("Evaluation set must not be empty")
    if any(not (0 <= r.quality <= 4) or r.cost_usd < 0 for r in records):
        raise ValueError("Invalid score or cost")
    return {
        "cases": len(records),
        "success_rate": sum(r.success for r in records) / len(records),
        "mean_quality": mean(r.quality for r in records),
        "total_cost_usd": sum(r.cost_usd for r in records),
        "critical_violations": sum(r.critical_violation for r in records),
        "release_eligible": all(not r.critical_violation for r in records),
    }

sample = [
    EvalRecord("case-1", True, 4, False, 0.20),
    EvalRecord("case-2", True, 4, True, 0.30),
    EvalRecord("case-3", False, 1, False, 0.10),
]
result = summarize(sample)
assert result["cases"] == 3
assert abs(result["success_rate"] - 2 / 3) < 1e-12
assert result["critical_violations"] == 1
assert result["release_eligible"] is False
print(result)
