Umbra 0.8.0 evals

61 graded tasks,every result

We build Umbra against an eval of 61 coding tasks. Each task has a hidden check, and every change to the prompt, the loop or the defaults is run against them before it's kept. This page has the method, the results of Umbra 0.8.0 and where the eval falls short.

Tasks
61
Categories
9
Runs for each agent
183
Final run
14 Nov 2026

Hard set20

Context fills9

Sessions7

Bug fixes6

Precise edits5

Finding code4

New files4

Large output3

Instructions3

Each square is one run of Umbra 0.8.0 in run final-8df86c3. Tap, hover or focus a square for the task.

How we use it

A change stayswhen the numbers improve

Every idea for Umbra is an experiment with a target measure, written in the ledger before it runs. It's kept only when its target improves by more than Pi's own spread between its best and worst of three runs, and no other measure gets worse by more than its spread.

Otherwise it is reverted, and the ledger says so. Of 27 experiments so far, 6 were turned off or reverted, among them an edit tool beside bash and saving long output to a file.

What is measured

The same tasks,the same model

  • The tasks.

    61 tasks in 9 categories, written by Black Rainbow Labs. Each has a hidden check that the agent never sees, which passes or fails the result.

  • The runs.

    Each agent ran every task 3 times, 183 runs for each agent, one at a time.

  • The agents.

    Umbra 0.8.0 and Pi 1.3.0, each as shipped, with their own default prompts.

  • The model.

    ninfer-qwen3.8-27b-coletti-v9, served on one RTX 5090 with 32 GB of memory, with the same server and sampling settings for both agents.

  • The proxy.

    A measuring proxy sits between each agent and the model, so every token count and every time comes from the model server’s own responses.

  • A tie.

    A difference counts only when it is larger than the spread between Pi’s own best and worst of its three runs.

Umbra 0.8.0

Results forthis release

Umbra 0.8.0, 61 graded tasks in 9 categories, 3 runs each, 14 November 2026.
Runs passed91.3%
Mean score of the hidden checks98.7%
Hard set, runs passed78.3%
Tasks that fill the context window, runs passed92.6%
Time for each task69.4 s
Time to the first reply text382 ms
Prompt tokens served from the cache95.8%
Cache hit rate right after a compaction74.2%
New prompt tokens for each passed task14,694
Requests for each passed task24
Size of the first request1,835 tokens
Start time when resuming a long session36 ms
Session store bytes for each step763
Runs passed by category
CategoryTasksPassed
Hard set2078.3%
Context fills992.6%
Sessions7100%
Bug fixes6100%
Precise edits593.3%
Finding code4100%
New files4100%
Large output3100%
Instructions3100%

The 0.5.2 and 0.6.2 baselines ran 33 tasks once, so they aren’t shown next to this result.

Tested on local models,on purpose

We run the evals on a 27B model on one PC. A smaller model makes more mistakes, so a weak prompt or a wasteful loop shows up in the pass rate straight away, and we can run every task three times at no cost.

We expect what the harness gains there to carry forward to frontier models, because the gains come from sending less, caching more and handling long sessions better. We haven’t measured that yet.

The model: ninfer-qwen3.8-27b-coletti-v9, served on one RTX 5090 with 32 GB of memory.

Next to Pi

Next toPi 1.3.0

We ran Pi 1.3.0 as shipped on the same tasks, the same model and the same settings. "Pi's spread" is the difference between Pi's best and worst of its three runs.

MeasureUmbra 0.8.0Pi 1.3.0Pi’s spreadResult
Runs passed91.3%80.3%6.6 pointsUmbra
Mean score98.7%90.7%5.4 pointsUmbra
Hard set, runs passed78.3%66.7%10.0 pointsUmbra
Tasks that fill the context window92.6%44.4%22.2 pointsUmbra
Time for each task69.4 s117.5 s22.1 sUmbra, 69% faster
Time to the first reply text382 ms1,095 ms27 msUmbra, 187% faster
Total model seconds3,8416,092130Umbra, 59% faster
Prompt tokens, total19.6 million21.9 million0.7 millionUmbra, 10% fewer
New prompt tokens for each passed task14,69478,9447,646Umbra, 81% fewer
Completion tokens, total606,332848,60117,840Umbra, 29% fewer
Requests, total1,3271,63141Umbra, 19% fewer
Prompt cache hit rate95.8%82.4%1.1 pointsUmbra
Cache hit rate right after a compaction74.2%32.4%1.7 pointsUmbra
Start time when resuming a long session36 ms498 ms248 msUmbra
Session store bytes for each step7631,09429Umbra, 30% fewer
Reasoning tokens, total338,858315,43425,289tie inside the band

A paired sign test over the 61 tasks finds Umbra better on 15, Pi better on 5 and 41 tied (p = 0.041).

Where Pi does better

  • Precise edits: Pi passed 100% of runs and Umbra 93.3%.
  • No Pi run reached the eval's own task files. One Umbra run of 183 did: it found the reference solution in the checkout and ran it to check its own output, and the eval failed that run.

Ties

  • Reasoning tokens, 338,858 against 315,434, inside Pi's spread.
  • Runs that hit a limit, 0 against 1, and runs with a nonzero exit, 0 against 1.
  • Resume after a crash, 3 of 3 against 2 of 3.

What this does not show

The limitsof this eval

Run it yourself

Run the evalon your machine

The suite needs Node 24, Python 3.13, git, Git Bash, Umbra on the PATH, Pi, and a model server on port 8080. These are the commands from evals/README.md.

node evals/run.mjs selftest
node evals/run.mjs run --agents umbra,pi --reps 1 --category bugfix
node evals/run.mjs report <run id>