The harness scores an empty completion identically to a wrong answer. Both are simply a
failed task, so a server that returns nothing silently costs the model points.
Measured on the two runs whose raw generations still exist:
| Run |
Empty completions |
| Qwythos-9B-v2 (MLX) |
26 / 164 (15.9%) |
| Qwythos-9B-v2 (llama.cpp) |
8 / 164 (4.9%) |
| Ternary-Bonsai-27B (MLX) |
33 / 164 (20.1%) |
| Ternary-Bonsai-27B (llama.cpp) |
33 / 164 (20.1%) |
These are raw, pre-sanitisation, zero-length responses — not code-extraction failures.
Comparing which tasks went empty separates two causes:
- Model-deterministic — Ternary-Bonsai-27B produced the identical set of 33 empties on
both runtimes. Fair to score as failures.
- Runtime flakiness — Qwythos overlapped on only 5, leaving 21 MLX-only empties where
llama.cpp answered the same prompt fine. That is noise depressing the MLX column.
Ruled out: the 4096-token cap. It is set in evalplus/provider/base.py and passed through
provider/openai.py, so both runtimes inherit it, and it predates these runs. Surviving MLX
generations show zero unclosed <think> blocks and a longer median than llama.cpp's.
Suggested fixes
- Retry on empty in the codegen loop — retry 2-3× on a zero-length completion before
recording a failure.
- Preserve
*.raw.jsonl next to the .evalplus summaries. Scratch cleanup destroyed the
evidence for 13 of 15 models, which is why most MLX cells can no longer be audited.
- Report an empty count per cell so the artifact is visible rather than buried in pass@1.
- Capture
mlx_lm.server stderr — ternary-bonsai-27b.mlxserver.log is 0 bytes, so the
root cause of the MLX-only empties is currently unknowable.
Two affected cells were withdrawn in the meantime (see METHODOLOGY.md): Qwen3.5-9B MLX (70.7)
and Qwythos-9B-v2 MLX (75.0).
The harness scores an empty completion identically to a wrong answer. Both are simply a
failed task, so a server that returns nothing silently costs the model points.
Measured on the two runs whose raw generations still exist:
These are raw, pre-sanitisation, zero-length responses — not code-extraction failures.
Comparing which tasks went empty separates two causes:
both runtimes. Fair to score as failures.
llama.cpp answered the same prompt fine. That is noise depressing the MLX column.
Ruled out: the 4096-token cap. It is set in
evalplus/provider/base.pyand passed throughprovider/openai.py, so both runtimes inherit it, and it predates these runs. Surviving MLXgenerations show zero unclosed
<think>blocks and a longer median than llama.cpp's.Suggested fixes
recording a failure.
*.raw.jsonlnext to the.evalplussummaries. Scratch cleanup destroyed theevidence for 13 of 15 models, which is why most MLX cells can no longer be audited.
mlx_lm.serverstderr —ternary-bonsai-27b.mlxserver.logis 0 bytes, so theroot cause of the MLX-only empties is currently unknowable.
Two affected cells were withdrawn in the meantime (see METHODOLOGY.md): Qwen3.5-9B MLX (70.7)
and Qwythos-9B-v2 MLX (75.0).