---
title: 0.5B exact-stdout eval
description: Eighteen held-out scripts, three repeats. Ollama qwen2.5-coder 0.5B scored 7/54 base and 12/54 after one traceback repair. Most runs crashed or printed extra words.
permalink: /investigations/held-out-exec-eval/
date: 2026-09-05
type: article
---
# 0.5B exact-stdout eval
**Question.** If the 0.5B writes a short script and we *run* it, how often
does stdout match? Does one traceback repair help?
**Answer.** **7 / 54** base. **12 / 54** after one repair. The 0.5B is still
not daily work. Repair is worth keeping. More style pairs are not.
Cite this note:
[Cite]({{ '/cite/' | relative_url }}).
Related:
[0.5B sample-and-run]({{ '/investigations/sample-and-run/' | relative_url }})
· [0.5B vibe review]({{ '/research-vibe-review/' | relative_url }})
· [Fine-tune or harness]({{ '/investigations/fine-tune-or-harness/' | relative_url }})
· [Experiments]({{ '/investigations/experiments/' | relative_url }}).
## How this was scored
5 September 2026. One laptop. Ollama `qwen2.5-coder:0.5b` (untuned base,
not the LoRA). Eighteen prompts that are **not** in the 45 train pairs.
Each task three times. A run counts only when the extracted script exits
0 and stdout matches the expected line (trailing newline ignored).
The unit tests for the checkers all passed: every reference script scores,
junk output fails. The failures below are the **model**, not the harness
tests.
LoRA variants were not run on Ollama. The same-day MLX pair
(four drafts, then greedy, with and without the step-100 LoRA) is
[0.5B sample-and-run]({{ '/investigations/sample-and-run/' | relative_url }}).
Engines differ, so the rates are directional, not a paired A/B.
## The score
7 / 54base 0.5B
12 / 54base + one repair
24base crashes
23base wrong stdout
| Variant | Passed | Rate | Typical miss |
| --- | --- | --- | --- |
| base | **7 / 54** | 13% | crash, or extra words |
| base + one traceback repair | **12 / 54** | 22% | still extra words |
Repair lifted the total. It did not make the model reliable. Verdicts
still flip on the same prompt: fizzbuzz 2/3, hhmmss 2/3.
## What failed
Two classes, almost even on the base runs:
| Class | Base runs | What it looked like |
| --- | --- | --- |
| Nonzero exit | 24 / 54 | Often `NameError: sys is not defined` — the script used `sys.argv` and never imported `sys`. Also `TypeError` on `%`, `IndexError` on argv |
| Wrong stdout | 23 / 54 | The number was right, the line was not. `Clamped value: 10` instead of `10`. `The median is: 3` instead of `3` |
| Pass | 7 / 54 | fizzbuzz, hhmmss, and a few others, not every repeat |
Repair then failed 42 of 54: 22 wrong stdout, 20 still crashing.
The 0.5B can write a FizzBuzz. It does not print only what it was asked
to print, and it often forgets the import that its own `argv` read needs.
## Per task
Passes out of three repeats.
| Task | Base | + repair |
| --- | --- | --- |
| fizzbuzz | 2 | **3** |
| hhmmss | 2 | 2 |
| fib | 1 | 2 |
| unique-order | 0 | 2 |
| rotate | 1 | 1 |
| wrap | 1 | 1 |
| median | 0 | 1 |
| weekday | 0 | 0 |
| count-ext | 0 | 0 |
| clamp | 0 | 0 |
| slugify | 0 | 0 |
| palindrome | 0 | 0 |
| sum-even | 0 | 0 |
| csv-col | 0 | 0 |
| indent4 | 0 | 0 |
| anagram | 0 | 0 |
| iso-date | 0 | 0 |
| relpath | 0 | 0 |
Eleven of eighteen tasks never passed, even with a repair.
## Decision
Freeze the 0.5B adapters. Keep generate → run → one repair in the loop.
Daily work stays an 8B. Do not add more handwritten style pairs to chase
these eighteen scripts. The MLX follow-up put a number on that: greedy
LoRA scored 0 / 54. Four untuned drafts plus one repair scored 9 / 18.
The later loop scored 12 / 18 with zero hint-repairs.