diff --git a/app-instance/backend/beaver/tasks/models.py b/app-instance/backend/beaver/tasks/models.py index 7e2a172..88182c3 100644 --- a/app-instance/backend/beaver/tasks/models.py +++ b/app-instance/backend/beaver/tasks/models.py @@ -70,10 +70,12 @@ class ValidationResult: if not isinstance(payload, dict): return None raw_status = payload.get("status") - status: ValidationStatus | None = raw_status if raw_status in VALIDATION_STATUSES else None + if "status" in payload and raw_status not in VALIDATION_STATUSES: + raise ValueError(f"unknown validation status: {raw_status}") + status: ValidationStatus | None = raw_status if "status" in payload else None return cls( status=status, - passed=bool(payload.get("passed")) if status is None else None, + passed=bool(payload.get("passed")) if "status" not in payload else None, score=float(payload.get("score", 0.0) or 0.0), issues=[str(item) for item in payload.get("issues") or []], missing_requirements=[str(item) for item in payload.get("missing_requirements") or []], diff --git a/app-instance/backend/tests/unit/test_task_mode_feedback.py b/app-instance/backend/tests/unit/test_task_mode_feedback.py index dc81dda..d23a756 100644 --- a/app-instance/backend/tests/unit/test_task_mode_feedback.py +++ b/app-instance/backend/tests/unit/test_task_mode_feedback.py @@ -439,6 +439,11 @@ def test_validation_result_rejects_unknown_status() -> None: ValidationResult(status="pending", score=0.9, validator="test") # type: ignore[arg-type] +def test_validation_result_from_dict_rejects_unknown_explicit_status() -> None: + with pytest.raises(ValueError, match="unknown validation status"): + ValidationResult.from_dict({"status": "pending", "passed": True, "score": 0.9}) + + def test_validation_result_evidence_gaps_round_trip() -> None: validation = ValidationResult( status="insufficient_evidence",