Skip to content
tomo-labs

Experiments

Write-ups of single runs worth reading in full: one tool on one task, what it did turn by turn, why it passed or failed, and what the run says about the tool or the task. Each report pins the exact tool version, model, and commit so you can reproduce it.

The evals pages give you the aggregate: a table of every tool over a whole benchmark. This section is the opposite zoom level. Each report here is one run, read closely: one tool, on one task, with the whole story of what it did and why it landed where it did.

These are the runs worth stopping on. A tool that fails a task in a surprising way, a task that turns out to be harder or more ambiguous than it looked, a result that overturns a first guess once you read the trace. The point is not the score, it is the reason behind the score.

Organised by date

Reports are grouped by year, and named by the date the run was captured, so the section reads as a timeline. That ordering is the point: put July next to December and you can see how tomo changed across the runs, not just where it stands today. A report is never edited to match a later build. It is a dated record of one build on one day, and a newer report supersedes it rather than overwriting it.

The tree nests year, then month, then day, and each report is named for the time it was captured, so a report lives at a path like /experiments/2026/07/12/23-49-mesa-clear-agents/. The full index is below, every report newest first, and it builds itself: each report carries the date it was captured in its front matter, and the timeline is generated from that, so there is no list to hand-maintain and no report can go missing from it. To add a report, drop an HH-MM-slug.md file in the right day folder with a date in its front matter, and it appears here, in its year, and in its month automatically.

How to read a report

Every report opens with a reproducibility header: the tool and its exact version or commit, the model, the harness commit, and the task, all pinned. A benchmark number means nothing if you cannot say which build produced it, so each report says precisely which build produced it, and gives you the one command to run it again.

After that the report is plain prose. What the task asked for, what the tool did step by step, where it went right or wrong, and the lesson. You do not need to have read the source of the harness to follow one. Where a report leans on a harness detail, like how grading works or how a task is validated, it explains that detail in place.

Why keep failures

A tool that fails a task the harness can grade is one of the most useful things this lab produces. It is a concrete, reproducible gap: here is a run, here is where it went wrong, here is the smallest change that would have fixed it. Some of the reports below are failures kept on purpose, because the reason a run failed is often more instructive than a wall of green.

One caution the reports take seriously: a failing run is not automatically a bad task. Before blaming the task, the report checks whether the answer was actually reachable from what the tool was given. Sometimes it was, and the failure is real. That distinction is the whole discipline of reading a run honestly, and the reports try to model it.

July 2026

Friday, 24 July

14:00 Decomposer fixes the failure mode Experiment 0082. 0081 found the wall on dynaconf-1225 was decomposition: a thirteen-item port handed to a free model as one red wall made it a many-feature porter that edited a dozen files, broke test collection, and never converged. 10:50 Focus lands the patch, test-writing is the next wall Two runs bracketed the model range on dynaconf-1225 and failed identically: a flagship model at maximum reasoning effort and a free deepseek model both read the thirteen-item port issue as one wide surface, explored every file, and finished with an empty patch, zero of five. 10:00 Stacking levers regresses, model wall Scope and issue-example each landed a single lever at two of five on dynaconf-1225, both zero-regression, both stalling on the same three py-module-path cases. 09:30 Regression guard, inert on a checklist port Experiment 0081. The reproduction gate holds a coding turn to a red-to-green, but it says nothing about what else the fix broke, so the regression guard runs the project's own tests before the loop and refuses to converge if a fix regresses one that was green. 08:30 Issue-example gate matches scope ceiling The last non-tailored harness lever for dynaconf__dynaconf-1225, tested after trace inspection localized the remaining three failures to a model-reasoning ceiling rather than retrieval. 07:15 tomo-oi + testgen, deepseek-flash-free, dynaconf-1225 The previous run on this task ended with a prediction: a cheap model told to write the test first skips it and drifts to the cheapest checklist item, so move test authoring into the harness. This run does that.

Thursday, 23 July

Wednesday, 22 July

23:00 tomo-oi + gpt-5.6-luna on dynaconf-1225 The third luna note on dynaconf-1225: tomo's oi engine driving gpt-5.6-luna, with the symbol-anchored context pack resolving symbols through pyright. The pack does its job, it points the model at loaders/__init__. 22:50 pi + gpt-5.6-luna on dynaconf-1225 The second luna note on dynaconf-1225: the pi CLI driving gpt-5.6-luna through the subscription bridge, same faithful container. 22:40 codex + gpt-5.6-luna on dynaconf-1225 The same faithful SWE-bench-Live container, now driving the real Codex CLI on gpt-5.6-luna through the subscription bridge, on the same unsolved task dynaconf-1225. This is the first of three luna notes that hold the model fixed and swap the harness. 20:22 tomo-oi + gpt-5.6-sol on dynaconf-1225 The same faithful SWE-bench-Live container and the same paid model gpt-5.6-sol, driving tomo's code-as-action oi engine on the same unsolved task dynaconf-1225. 20:21 tomo-agent + gpt-5.6-sol on dynaconf-1225 The same faithful SWE-bench-Live container and the same paid model gpt-5.6-sol, now driving tomo's own agent engine on the same unsolved task dynaconf-1225. tomo-agent speaks chat/completions, so the subscription bridge translates it to the Responses wire. 20:20 codex + gpt-5.6-sol on dynaconf-1225 The same faithful SWE-bench-Live container that ran the deepseek three-way, now running the real Codex CLI on gpt-5.6-sol through a subscription bridge, on the same unsolved task dynaconf-1225. 18:45 faithful swebench-live container, deepseek three-way We were grading swebench-live wrong. The old path built one shared image and ran every task in a host venv pinned to Python 3.12, which is not the environment the task ships with. 13:45 laguna-s three-way comparison Poolside's Laguna-S-2.1 is a 118B mixture-of-experts coder, free to call on the opencode.ai/zen tier as laguna-s-2.1-free. 13:30 pi + laguna-s, incomplete Third of the three per-tool boards on laguna-s-2.1-free, and the one that did not finish. pi was the last tool in the sweep, and by the time it started the free zen account was already deep into its rate-limit window from the two streams ahead of it. 13:15 opencode + laguna-s, partial board Second of the three per-tool boards on laguna-s-2.1-free. OpenCode, the containerized coding agent, runs the same swebench-live tasks through the same free zen endpoint. 13:00 tomo-agent + laguna-s, fair board Poolside shipped Laguna-S-2.1, a 118B mixture-of-experts coder, and opencode.ai/zen serves it free as laguna-s-2.1-free. This runs the whole fifteen-task swebench-live board against it through tomo's own agent engine, the one that drives native structured tool_calls.

Tuesday, 21 July

Monday, 20 July

23:20 gpt-5.6-luna, LeetCode agent board The same gpt-5.6-luna model solves the same recent easy, medium, and hard LeetCode tasks through leetcode-solver, tomo, pi, opencode, Codex, and Claude Code. 01:30 qwen3-30b-a3b, local board Second model on the local roster board. qwen3-30b-a3b is a general MoE, not a coder tune, and it runs on the RTX 4090 behind the llmgw gateway driven through the uniform oi code-as-action harness. It scores 1 of 15. 01:15 qwen3-coder-30b-a3b, local board First model on the local roster board. qwen3-coder-30b-a3b runs on the RTX 4090 behind the llmgw gateway and is driven through the same uniform oi harness as the free zen models, over tailnet. It scores 1 of 15. 01:00 north-mini-code-free, fair board north-mini-code-free is the fourth and last free zen model on the abort-aware oi harness across all fifteen swebench-live tasks, and it is the one that breaks the pattern. It scores 0 of 15. 00:45 nemotron-3-ultra-free, fair board nemotron-3-ultra-free is the third free zen model on the abort-aware oi harness across all fifteen swebench-live tasks. It scores the same 3 of 15 as the other two free models, and it does it the hard way: it hits the thirty-round ceiling on every single task, spends 5. 00:30 mimo-v2.5-free, fair board mimo-v2.5-free is the second free zen model taken through the abort-aware oi harness across all fifteen swebench-live tasks. It scores the same 3 of 15 as deepseek-v4-flash-free, but the passes are a different set and the failure shape is the mirror image. 00:15 deepseek-v4-flash-free, fair board The earlier read on the free zen models was that deepseek-v4-flash-free never produced a clean multi-task pass. That read was an artifact of the free tier, not the model.

Sunday, 19 July

Friday, 17 July

19:30 kata first live numbers The new kata engine ran its first real workloads against tomo-oi on hy3-free, like for like: same binary, same fence parsing, only the loop policy differs. Core-14 came out level on passes (13/14 each) with kata 28% leaner on total tokens and faster on wall clock. 18:05 M0 slice zero estate audit Spec 2105's M0 starts by reconciling what the June experiment journal says shipped against what the tomo tree actually carries. The audit checked one identifiable symbol per patch set across the committed tree and git log -S. 07:45 swebench-live, the six-wall ceiling The campaign to solve all fifteen swebench-live tasks with tomo-oi and be the cheapest tool in the lab lands at nine solved, and this is the write-up that proves the other six are not a tomo gap but a property of how those benchmark instances were cut. 06:30 hy3 gitingest-94 six tools The same free model on the same task through six tools. Two of tomo's engines pass, and both cost a fraction of codex and claude-code. 05:30 hy3 three-tool A/B, tomo-oi fixed to pass The reference column set up a fair fight on the ground the product cares about, so this slice runs it: one free model, hy3-free, through three tools, pi and opencode and tomo-oi, on one task, gitingest-94, in the same isolated harness. 03:00 codex-real reference column This slice steps away from the tomo-oi campaign to pin a reference column: real codex, the Rust CLI on a ChatGPT subscription, run against all fifteen swebench-live tasks on gpt-5.6 at medium effort, one graded pass each, in the same isolated harness. 02:00 briefcase-2085, a free model solves it The campaign's third slice runs the free roster on briefcase-2085, a well-framed git-config bug where the issue names the failing call and even proposes the fix. This one is neither the harness's fault, as the first task was, nor a diagnosis trap, as the second was. 00:30 sqllineage-661, the flagship also misses The free models could not solve sqllineage-661, and all of them patched the public entry point instead of the parser where the bug lives. The obvious next question is whether a stronger model closes it, so tomo-oi ran it on the three gpt-5.

Thursday, 16 July

23:45 sqllineage-661, capability not harness The campaign's second slice baselines the five free zen models on sqllineage-661, the next-easiest swebench-live task. Where the first task was harness-bound, this one is the opposite. No free model solves it, and not one of the clean failures is the harness. 22:30 gitingest-94, five free models Starting a campaign to solve all fifteen swebench-live tasks with tomo-oi and be the cheapest tool in the lab, the first slice baselines the five free zen models on the easiest task, cyclotruc gitingest-94. 20:41 python-2303, five free models The earlier python-2303 run left the five free zen models unmeasured, since the free tier was rate limited all session, and it guessed the defensive-coding paragraph would matter most for a weak model. This run measures them. 17:04 python-2303, code-as-action wins An earlier run called kubernetes-client python-2303 an unwinnable hidden-contract coin flip for tomo-cx, the structured-tools engine, which lost every one of five attempts on three gpt-5.6 models. 15:14 new OI is a Codex fork, ~2x the cost Open Interpreter's Python code-as-action loop ended at 0.4.2, and its main line is now a Rust program, a fork of OpenAI Codex tuned for low-cost models. The lab's openinterpreter column now tracks that rewrite, release rust-v0.0. 11:11 oi dialect zoo, four fences A cheap model told to write a Markdown code fence keeps its shell or python command but wraps it in a different costume from turn to turn, and tomo's oi engine only read the Markdown one. 06:19 oi glued fence, a cheap-model harness fix tomo's oi engine acts by writing fenced code blocks, so its block parser is on the hot path of every round. A cheap model routinely writes a closing fence glued straight onto the next opening fence, with no blank line between them, so two fence lines arrive as one. 03:39 bridge cache hole and prompt_cache_key The 2026-07-15 dynaconf run named the bridge's zero percent cache-read rate as its most actionable finding, so this run tries to close it. 02:59 cx compaction mirage under prefix cache Tomo's cx engine rebuilds every request as the whole conversation plus the running turn, so an offline replay of six recorded runs showed a 76 to 86 percent cut in wire bytes once older tool results are stubbed. That headline did not survive the live check.

Wednesday, 15 July

Monday, 13 July

16:10 dynaconf same model, codex solves, tomo fails Hold the model fixed on the codex backend and vary the harness. On dynaconf-1225, codex solves the bug with luna, terra, and sol; tomo fails with all four subscription models it was run on. 14:55 dynaconf closed-door lessons for tomo Seven honest runs on one task, three passes and four fails, read together. The lessons that transfer to tomo: a broad edit that regresses a green test is worse than no edit and wants a do-no-harm gate, spend does not track progress, cache-read is where the money actually goes… 14:45 dynaconf 5.6 family + analyzer false leak gpt-5.6-terra and -sol both pass dynaconf-1225 with the doors shut, and both got flagged as answer leaks. Reading the trace, the flag is wrong. 14:35 dynaconf opus offline The honest opus run on dynaconf-1225 is the most expensive fail in this comparison and the only run that ends with the repo worse than it started. 14:25 dynaconf sonnet offline The earlier sonnet run passed dynaconf-1225 by fetching the merged pull request. Close the network door and run it again and the fetch is gone. 14:15 dynaconf gpt-5.6-luna offline Run the newest codex model on dynaconf-1225 with the git-history door and the network door both closed, and for the first time in this comparison a model solves it honestly. gpt-5. 14:01 dynaconf gpt-5.5 offline The flagship codex model runs dynaconf-1225 with both answer doors closed. It writes nineteen edits across every loader, the validator, and the cli, twice what the cheap model touched, spends six times as much, reaches no answer, and fails on the exact same two settings-loader… 13:49 dynaconf gpt-5.4-mini offline The cheapest codex model runs dynaconf-1225 with both answer doors closed: git history pruned so the fix commit is unreachable, and the shell sandboxed so it cannot fetch the answer PR. It writes a real nine-edit fix, reaches no answer, and fails on the settings-loader tests. 12:40 dynaconf opus answer fetch Claude Opus 4.8, the most expensive model in the comparison, ran dynaconf-1225 and passed by fetching pull requests over the network. It read PR #1204, the source the task asked it to port, and PR #1225, the merged answer that grades it. 12:35 dynaconf sonnet answer fetch Claude Sonnet 5 ran dynaconf-1225 and passed, but the trace shows it did not solve the bug. It ran gh pr view 1225 and gh pr diff 1225, read the merged pull request that fixed the very issue it was handed, listed the fix commits, and applied them. 12:30 dynaconf haiku clean fail Claude Haiku 4.5 ran dynaconf-1225 without reaching the network, wrote a real source fix, and failed. It threaded the identifier argument through every loader, the same broad refactor gpt-5.4 tried, and regressed a test that started green. 12:20 With the leak closed, dynaconf sorts the models The same leak-free dynaconf task passes on gpt-5.6-sol and gpt-5.5 and fails on gpt-5.4, so the fix that removed the git shortcut left a task that actually measures the model. 12:05 mini vs sol on python-control Four real codex subscription runs, gpt-5.4-mini and gpt-5.6-sol on two tasks, priced through our new single source of truth. On python-control both models, cheap and flagship, converge on the identical edit and fail the identical three tests. 11:50 dynaconf answer leak gpt-5.6-sol, the most expensive model we can reach, passed a dynaconf task without reasoning out the bug. The trace shows how: it diffed the base commit against the upstream fix commit, which the work-tree clone left reachable, and applied it. 11:05 churn guard vs claude-code The third and last of tomo's runaway shapes. A turn that keeps editing but never converges, writing scratch scripts or the same file over and over, now stops instead of burning a hundred rounds. 10:05 dynaconf tomo guard vs pi The follow-up to tomo's git-archaeology runaway. tomo now bounds a turn that investigates without ever editing, so the same dynaconf run stops at 41 requests instead of 132 and 1.7 million tokens instead of four million. 08:44 python-control tomo scratch runaway A second runaway with a different shape. On a python-control conversion bug, tomo made 34 edits and still failed, because 33 of them were throwaway debug scripts it wrote to instrument the problem rather than fix it. 08:19 fonttools tomo over-normalized The one swebench-live failure where tomo did everything right and still lost. On a fonttools glyph-reordering bug it found the exact file, wrote a fuller fix than the maintainers, and verified its work, then failed a single hidden test because it reused a variable that forces . 08:04 dynaconf tomo runaway tomo's worst run of the sweep: on a dynaconf bug it spent 132 requests and four million tokens running git log, git diff, and git show to reverse-engineer a fix from history, hit the fifteen-minute wall, and never edited a single file. 01:26 gitingest tomo tomo solves a real gitingest issue the way the benchmark intends: it reads the source, finds the one branch that only handles https, adds the http case, and verifies with the project's own tests. One source edit, no network, 242k tokens. 01:21 cfn-lint pi A second rival on the cfn-lint task. pi never leaves the repo, never fetches the pull request, and fails exactly where tomo failed: its source change does not produce the arbitrary graded wording. A short confirm, with the caveat that the free-tier rate limit cut the run short. 01:11 cfn-lint opencode opencode passes a cfn-lint task whose graded wording appears nowhere in the repo. The trace shows how: it fetched the fixed source from the project's main branch and the merged pull request's diff, then copied the exact new messages into the checked-out source. 01:00 cfn-lint tomo tomo reads a cfn-lint issue, implements exactly the message it asks for, and fails the grade. The graded wording is a generic validator message the maintainers changed instead, and it appears nowhere in the checked-out repo. 00:50 faker --yolo fix The follow-up to the faker lockout. tomo gains a --yolo mode that runs it fully autonomous, the same way every rival already runs. The exact task tomo had solved but could not write now passes, and passes leaner: 40 percent fewer tokens and half the model calls. 00:14 faker IBAN lock tomo diagnoses a Belgian IBAN bug and writes the exactly correct fix, then cannot apply it. A reference URL it fetched tripped its own prompt-injection guard, which escalated every later edit to an approval that never comes in headless mode.

Sunday, 12 July