#30731 [Bug]: llm_as_a_judge guardrail fails open — missing overall_score defaults to 100 (pass)
## Summary
In `litellm/proxy/guardrails/guardrail_hooks/llm_as_a_judge/__init__.py:184-185` (`apply_guardrail`):
```python overall_score = max(0.0, min(100.0, float(judge_result.get("overall_score", 100)))) ... passed = overall_score >= self.overall_threshold ```
The default for a **missing** `overall_score` key is `100` — the maximum/passing score. So when the judge returns per-criterion verdicts that all fail (e.g. `verdicts: [{safety, passed:False, score:2}, {policy, passed:False, score:5}]`) but omits the top-level `overall_score`, `passed` evaluates True and, with `on_failure="block"`, the `HTTPException(422)` is skipped and the flagged response is returned to the client. There is no warning on this path — it silently passes.
This sits alongside two other fail-open paths in the same function that *do* warn: a judge-call exception (`failing open`) and an invalid/unparseable `overall_score` (`failing open`). So the guardrail fails open in three places; the missing-key case is the quietest.
## Reproduction (deterministic)
``` [failing_verdicts_no_overall_score] judge verdicts: [safety passed:False score:2, policy passed:False score:5] [failing_verdicts_no_overall_score] ove…