Daily paper · Sunday, September 20

No harness part helps every model: what a component-by-component ablation found

cs.AI · Fan, Zhang & Ma et al. · 55 upvotes on HF · arXiv:2609.20804

A controlled study switched three coding-harness parts on and off across four models and 176 settings. No part helped everywhere. Context management mattered only when the window was small, planning raised accuracy for the weakest model but only cut cost for the strong ones, and a bare shell beat a typed tool set for the most capable model.

The problem

A coding agent is a model inside a harness. The harness is the software loop that sends the model its history, runs the tool calls the model emits, and appends the results. Real products bundle a planning scaffold, a tool set, and a rule for a full context window, and benchmarks score the whole bundle. When one harness beats another, the score does not say which part did the work. The authors ask: is each harness part useful in general, or does its value depend on the model, the task type, and the token budget?

One fixed loop, three switches

The authors built a small harness from scratch so they could change one part at a time. The loop is fixed. Each turn, the model reasons and emits tool calls, the harness runs them in the task container, and the output goes into the history. Three parts can be switched.

The fixed harness loop and its three switchable parts. Planning enters the model input as an injected plan, the action space sets which tool calls the model can emit, and context management decides which history the model sees. Switch 1: Planning plan injected into every input Switch 2: Action space typed tools, or bash only Assemble model input history, plus plan if on Model reasons and emits tool calls Harness runs the calls inside the task container History tool output appended each turn Switch 3: Context management which history the model sees
The loop never changes. Each experiment flips one switch: whether a plan is injected, which tool calls the model may emit, or how the history is trimmed.

Planning. A system instruction asks the model to write a plan on the first turn and to keep it current through an update_plan tool. The harness injects the current plan into every model input. With planning off, the instruction, the tool, and the injection are all removed.

Action space. Either a typed tool set (file read, write, and edit; list, glob, and grep; web fetch; and bash) or bash alone.

Context management. Five tiers, T0 to T4, built from three mechanisms. Elision replaces the body of an old tool output with a short stub. Recall stores the elided body on disk and gives the model a tool to read it back. Summarization makes a separate call to the same model to fold the oldest messages into a running summary. T0 uses none of them, and the run dies when the window overflows. T1 uses elision. T2 adds recall. T3 uses summarization alone. T4 uses all three in stages: elide when the history passes 60% of the window, summarize the oldest part when it passes 85%. The system prompt, the task, and the last two turns always stay verbatim.

The staged T4 context policy. The system prompt, the task, and the last two turns always stay verbatim. When the history passes 60 percent of the window, old tool outputs are replaced by short stubs. When it passes 85 percent, the oldest messages are folded into one running summary. 0% of context window 60%: elide 85%: summarize 100% Below 60% nothing is changed prompt + taskold tool outputslast 2 turns Past 60% elide by rule, no model call prompt + taskstubsrecentlast 2 turns Past 85% summarize, one extra model call prompt + tasksummarystubsrecentlast 2 turns kept verbatim raw tool output stub, body saved to disk running summary
Tier T4. Elision is a cheap rule and runs first. Summarization costs a model call and runs only when elision is not enough.

The models are three sizes of Nemotron-3 (30B, 120B, 550B) and Mistral-Medium-3.5-128B. The benchmarks are SWE-Bench Verified (500 real GitHub issues, all Python) and Terminal-Bench 2.1 (89 command-line tasks). The context window is capped at 32k, 64k, 96k, or 128k tokens. That gives 176 settings, each run once per task.

Context management prevents overflow failures

At a 32k window, no management is fatal. On SWE-Bench, T0 success rates sit between 6% and 13% across the four models. Any managed tier lifts them to between 20% and 66%. Nemotron-3 550B goes from 6.4% to between 51% and 58%. At 128k the gap shrinks to a few points: the same model scores 59.8% with T0 and between 65% and 67% with management.

Every managed tier had zero overflow failures at every budget, and T0's loss tracks its overflow rate, which falls as the window grows. At 32k, median SWE-Bench runs under T0 end after 20 to 30 turns, mostly while still locating the bug. Under management they run for 50 to 180 turns and reach verification.

Among the managed tiers, accuracy is similar but cost is not. T4 had the lowest mean cost per task in seven of the eight model-benchmark pairs. Cheap elision runs first, so the harness makes fewer summarization calls and peak context stays lowest. Recall did not help. T1 and T2 differ only in recall, and across 32 paired comparisons T2 won 15, lost 14, and tied 3. In 36 of the 64 settings that offered recall, the model never called it.

Planning raises accuracy for the weak model and cuts cost for the strong ones

With planning on, Nemotron-3 30B goes from 13.6% to 25.2% on SWE-Bench and from 9.0% to 13.5% on Terminal-Bench. Cost goes up, by 75% on Terminal-Bench. Without a plan, 68.6% of its SWE-Bench runs end without editing any file, and the median run lasts 5 turns. With a plan, those numbers are 27.8% and 40 turns. The plan keeps the model working long enough to attempt an edit.

For the strong models, the effect reverses. Nemotron-3 550B drops from 67.8% to 65.8% on SWE-Bench, but its cost per task falls from $3.31 to $2.33. Mistral drops from 69.0% to 68.6%, and its cost falls from $4.65 to $3.14. The removed turns are almost all checks the model makes after its edit is already done. The median 550B run shortens from 108 to 74 turns. A plan tells a capable model when it is done.

Typed tools for the weak model, a bare shell for the strong ones

Nemotron-3 30B needs the typed tools. With bash only, its SWE-Bench score falls from 25.2% to 10.2%. The model emits tool calls it learned during training, the bash-only harness has no such tools, and the run ends.

Nemotron-3 550B does better with bash alone. Its SWE-Bench score rises from 65.8% to 69.4%, and its cost per task falls from $2.33 to $1.11. The shell lets it bundle several operations into one command. Re-patches of an already edited file fall from 4.6 to 1.5 per task.

Mistral splits by task type. On SWE-Bench the typed tools win, 68.6% against 45.4%, and 32.8% of its bash-only runs end without editing any file. On Terminal-Bench bash wins, 43.8% against 37.1%. Terminal-Bench tasks are mostly shell work, so typed tools compete with the actions the model prefers there.

Two-by-two grid. Switching planning on raises the weakest model from 13.6 to 25.2 percent but lowers the strongest from 67.8 to 65.8 percent while cutting its cost. Switching to bash only lowers the weakest model from 25.2 to 10.2 percent but raises the strongest from 65.8 to 69.4 percent while halving its cost. SWE-Bench Verified pass rate, 128k window, tier T4 Planning switched on Bash only, typed tools removed Nemotron-3 30B weakest model Nemotron-3 550B strongest model 13.6% → 25.2%accuracy up, cost upmedian run 5 turns to 40 turns 25.2% → 10.2%runs end on tool callsthe harness does not have 67.8% → 65.8%accuracy about the same,cost per task $3.31 → $2.33 65.8% → 69.4%accuracy up,cost per task $2.33 → $1.11
The same switch moves the two models in opposite directions. Mistral is not shown: it wants typed tools on SWE-Bench and bash on Terminal-Bench.

Caveats

Each setting ran once per task, and Terminal-Bench has only 89 tasks, so many of its contrasts are not statistically significant. Planning and the action space were switched only at the 128k, T4 setting. The bash-only switch also removes the read-before-write check and the automatic lint pass, so it measures a whole interface, not tool count alone. The models are open-weight mid-tier models, not frontier models. The authors say every crossover point (the level of model capability at which a part stops helping and starts hurting) should be re-measured before it is applied to another model family.

What you can do with it

Measure your overflow rate first. If your agent runs rarely hit the window, a compaction scheme adds little accuracy. If they do, the choice between schemes is about cost.

Stage cheap before expensive. Elide stale tool outputs by rule first. Call the model to summarize only when elision is not enough.

Do not build recall until a trace shows the model asking for it. The models in this study did not use it.

Treat planning as a cost control for capable models. Measure its effect on the verification turns after the edit, not on the pass rate.

Test the tool set per model and per task type. Bash alone halved cost for the strongest model here. Keep typed tools for weaker models.