Skip to content

judge: {"match": "false"} is scored as PASS (bool("false") is True), and judge_llm defaults a missing verdict to pass #295

Description

@reacher-z

src/clawbench/runner/judge.py:187:

return bool(obj.get("match")), str(obj.get("reason", ""))

If a judge model replies {"match": "false", "reason": "..."} — a string, which LLMs emit routinely — then bool("false") is True and a mismatch is scored as a PASS. Verified: python3 -c 'print(bool("false"))'True.

src/clawbench/runner/judge_llm.py:156 has the same bug plus a worse default:

return bool(obj.get("match", True)), str(obj.get("reason", ""))

A verdict object missing the match key defaults to True (pass). This is the lenient rubric — the one that produces the published Reward-lenient column.

Also conflated today: a missing/garbled verdict is indistinguishable from a genuine mismatch, both collapsing to False in judge.py.

Ask: parse tri-state explicitly — accept real booleans, accept case-insensitive "true"/"false" strings, return None (inconclusive) for anything else, and never default a missing key to a pass. _parse_verdict currently has no unit tests; a small matrix (bool / string / missing / garbage / nested) would pin this.

Impact is scoring integrity on published numbers, so worth doing before the next leaderboard refresh.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions