llmcoderlab

The anatomy of a 48.6 — what partial credit really means

2026-07-17field note

← all findings

Run 2 introduced harder challenges, and with them the lab's first partial-credit scores: qwen2.5-coder:3b got 48.6 in both modes on the calculator challenge (build an arithmetic expression evaluator with precedence and parentheses — eval() forbidden and test-enforced). A 48.6 sounds like "half a calculator." It isn't.

What the 48.6 is made of

Our blend is tests 60% / deliverables 20% / content checks 20%. On both attempts:

  • Tests: 1 of 7 passed — and the one pass was the source-inspection check that verifies eval() isn't used. Every functional test failed. The one-shot parser crashes with IndexError on every expression; the agentic one returns None instead of numbers.
  • Deliverables: 100% — calc.py exists.
  • Content checks: 100% — it contains def evaluate.

So: 0.14×60 + 1.0×20 + 1.0×20 ≈ 48.6. The model produced something calculator-shaped that does not calculate, and shape is what the non-test axes reward.

Why it matters

Blended scores are convenient for ranking and terrible for understanding. Two lessons we're baking into the site rather than hiding:

  • Every score on the leaderboard expands into its axes (the meters on each card), and every attempt page shows the actual pytest output — the blend is never the only number.
  • Deliverable/content axes measure compliance, tests measure competence. When they disagree this hard, the disagreement is itself the finding: the model followed instructions perfectly and failed the engineering. Recursive-descent parsing appears to be where 3B coding models crack.

What we'll do about it

Weights stay frozen for the current challenge-set hash (changing them mid-set would corrupt comparability). For the next set we'll consider gating the compliance axes on at least one functional test passing, so "shaped like the answer" stops earning 40 points on its own.