Same Model, Different Harness: Different Coding-Agent Results
Abstract
A coding agent combines a model with a harness, which decides what the model sees, which tools it can use, and how the work continues. We ask whether changing the harness changes the result when the model and task stay fixed. We compare two configurations of the same harness on three coding benchmarks. The control supplies the full conversation in time order, while the treatment keeps the same record but mechanically shortens older tool results as the context fills and responds to repeated or stalled work. Under tight context, the treatment raises mean per-task fail-to-pass fraction (F2PF) in all three pressure comparisons and increases complete solutions on SWE-bench Verified and SWE-bench Pro. The tight-window Verified comparison uses 169 tasks, a 20,480-token window, and a fixed 480-second attempt endpoint; on this cohort, treatment raises mean per-task F2PF from 28 percent to 49 percent and complete solutions from 43 to 72. Without model-specific retuning, the same frozen treatment also raises both endpoints on the same cohort for three additional models with different designs. In the wide-window Qwen3.6 comparisons, observed arm outcomes are close on Verified and Pro, while FeatureBench retains a higher mean per-task F2PF under treatment. On the wide-window Verified cohort, treatment also serves fewer prompt tokens per turn. Because changing the harness changed what unchanged model weights could accomplish, coding-agent evaluations should treat the model and harness together as the tested solver.
Figures & tables
| Cell (context window) | Active runs | First turn | Typical reduction |
|---|---|---|---|
| Verified 43,008 | 107/169 (63.3%) | 23 [11, 41] | 52.9% [41.3, 64.8] |
| Verified 20,480 | 140/169 (82.8%) | 10 [8, 19] | 45.2% [33.1, 52.0] |
| Pro 49,152 | 246/316 (77.8%) | 13 [8, 22] | 64.4% [55.6, 71.3] |
| FeatureBench 47,104 | 143/183 (78.1%) | 9 [7, 18] | 55.7% [42.6, 64.6] |
| benchmark | mean per-task F2PF C T | complete solutions C T |
|---|---|---|
| SWE-bench Verified | 28% 49% | 43 72 |
| SWE-bench Pro | 15% 33% | 31 72 |
| FeatureBench | 11% 20% | 2 3 |
| model | design | F2PF C T (gain; ) | solutions C T (gain; ) |
|---|---|---|---|
| Qwen3.6 [ 3 ] | DeltaNet/attention MoE | 28% 49% (+21; 1.8 ) | 43 72 (+29; 1.7 ) |
| Devstral [ 9 ] | dense transformer | 17% 37% (+20; 2.1 ) | 22 53 (+31; 2.4 ) |
| Nemotron [ 10 ] | Mamba-2/attention MoE | 12% 18% (+6; 1.5 ) | 16 25 (+9; 1.6 ) |
| Qwen3.8 [ 11 ] | dense DeltaNet/attention | 20% 35% (+15; 1.7 ) | 32 54 (+22; 1.7 ) |
Appendix figures & tables16 assets
Supplementary material from the paper’s appendix.
Appendix
| benchmark | selection rule | |
|---|---|---|
| SWE-bench Verified | 169 | The original pressure pool contained 187 tasks. We applied the fixed 480-second cap to both arms and retained the 169 tasks that produced complete paired outcomes within that cap. We use the same task IDs at every Verified window and on every model. |
| SWE-bench Pro | 316 | We select tasks whose earlier large-window control run crossed the frozen reading-demand threshold. |
| FeatureBench | 183 | We use every canonical task runnable in the evaluation setup. Reading demand does not determine membership. |
| item | fixed setting |
|---|---|
| Cohort | We use the same 169 task IDs at every window. |
| Endpoint | We select the best finalized patch within the fixed 480-second budget. |
| Context windows | We use 20,480, 43,008, and 262,144 tokens. |
| Within a campaign | Control and treatment share one model-facing code state. |
| Across windows | We collected campaigns successively. The ordering describes the observed context regimes. |
| window | F2PF difference [95% interval] | resolution difference [95% interval] |
|---|---|---|
| 20,480 (tight) | +21.1 [+14.1, +28.3] | +17.2 [+10.7, +23.7] |
| 43,008 (pressured) | +6.4 [+0.5, +12.4] | +6.5 [+0.6, +13.0] |
| 262,144 (effectively unconstrained) | -0.3 [-4.5, +3.9] | -0.6 [-5.9, +4.7] |
| benchmark | window | solutions C | solutions T | T-only:C-only ( ) | |
|---|---|---|---|---|---|
| SWE-bench Verified | 20,480 | 169 | 43 | 72 | 34:5 ( ) |
| SWE-bench Pro | 49,152 | 316 | 31 | 72 | 47:6 ( ) |
| FeatureBench | 47,104 | 183 | 2 | 3 | 1:0 ( ) |
| SWE-bench Verified | 43,008 | 169 | 76 | 87 | 20:9 ( ) |
| SWE-bench Verified (common cohort) | 262,144 | 169 | 102 | 101 | 9:10 ( ) |
| SWE-bench Pro | 262,144 | 316 | 101 | 99 | 11:13 ( ) |
| benchmark | window | F2PF C (%) | F2PF T (%) | ratio | higher T:C:tie ( ) |
|---|---|---|---|---|---|
| SWE-bench Verified | 20,480 | 28.0 | 49.1 | 1.75 | 42:6:121 ( ) |
| SWE-bench Pro | 49,152 | 15.2 | 32.7 | 2.15 | 84:13:219 ( ) |
| FeatureBench | 47,104 | 10.5 | 19.6 | 1.86 | 47:9:127 ( ) |
| SWE-bench Verified | 43,008 | 53.8 | 60.1 | 1.12 | 21:10:138 ( ) |
| SWE-bench Verified (common cohort) | 262,144 | 69.0 | 68.7 | 1.00 | 9:8:152 ( ) |
| SWE-bench Pro | 262,144 | 44.8 | 44.5 | 0.99 | 22:24:270 ( ) |
| benchmark | model turns C / T | prompt tokens (millions) C / T | solver wall time (hours) C / T | |
|---|---|---|---|---|
| SWE-bench Verified | 169 | 3,280 / 6,517 | 37.8 / 80.7 | 1.3 / 4.6 |
| SWE-bench Pro | 316 | 8,357 / 25,750 | 210.6 / 657.1 | 5.4 / 21.8 |
| FeatureBench | 183 | 5,281 / 15,178 | 140.3 / 412.8 | 2.5 / 14.7 |
| measure | paired tasks | T/C ratio [95% interval] |
|---|---|---|
| Prompt tokens per task | 154 | 0.959 [0.856, 1.071] |
| Prompt tokens per turn | 153 | 0.928 [0.878, 0.979] |
| model | F2PF C/T (%) | difference [95% interval] | solutions C/T | |||
|---|---|---|---|---|---|---|
| Devstral | 17.2/36.8 | +19.5 [+12.0, +26.9] | 22/53 | |||
| Nemotron | 12.0/18.3 | +6.4 [+1.4, +11.4] | 16/25 | |||
| Qwen3.8 | 20.4/35.3 | +14.9 [+9.9, +20.4] | – | 32/54 |
| benchmark | repositories | F2PF difference [95% interval] | higher T:C:tie ( ) |
|---|---|---|---|
| SWE-bench Verified | 11 | 21.1 [13.7, 25.0] | 7:0:4 ( ) |
| SWE-bench Pro | 11 | 17.5 [11.8, 24.3] | 11:0:0 ( ) |
| FeatureBench | 22 | 9.1 [5.8, 14.1] | 16:2:4 ( ) |
| benchmark | repositories | resolution difference [95% interval] | higher T:C:tie ( ) |
|---|---|---|---|
| SWE-bench Verified | 11 | 17.2 [9.6, 20.1] | 6:0:5 ( ) |
| SWE-bench Pro | 11 | 13.0 [8.2, 19.1] | 11:0:0 ( ) |
| FeatureBench | 22 | 0.5 [0.0, 1.5] | 1:0:21 ( ) |
| item | specification |
|---|---|
| Fit | We fit a logistic regression of stopping while reading on . |
| Interval | We use the 2.5th to 97.5th percentile of the bootstrap distribution. |
| Resampling | We draw 2,000 repository samples with replacement, using seed 20260806. |
| Excluded draws | We exclude draws with one outcome class, a singular fit, or a non-positive fitted slope. |
| Paired ratio | We use the same repository sample for both arms. |
| Valid ratios | All 2,000 paired samples produced estimates on all three benchmarks. |
| benchmark | control location | treatment location | stretch | |
|---|---|---|---|---|
| SWE-bench Verified | 166 | 0.71 [0.59, 0.84] | 1.81 [1.43, 2.21] | 2.53 [1.81, 3.59] |
| SWE-bench Pro | 315 | 0.97 [0.90, 1.04] | 2.15 [1.72, 3.23] | 2.21 [1.80, 3.25] |
| FeatureBench | 170 | 0.93 [0.82, 1.01] | 2.09 [1.74, 2.34] | 2.26 [1.86, 2.56] |
| Cell | command | errors | condense | decay | |
|---|---|---|---|---|---|
| Verified (20k) | 169 | 484/117 | 313/105 | 0/0 | 4079/140 |
| Verified (43k) | 169 | 786/150 | 435/142 | 0/0 | 3212/107 |
| Pro (49k) | 316 | 6926/236 | 6181/230 | 519/104 | 9318/246 |
| FeatureBench (47k) | 183 | 1250/131 | 1017/127 | 44/16 | 5057/143 |
| Cell | checks | valid | setup | positive | applies | restores |
|---|---|---|---|---|---|---|
| Verified (20k) | 2193/168 | 2193/168 | 0/0 | 45/31 | 56/31 | 24/21 |
| Verified (43k) | 2895/169 | 2895/169 | 0/0 | 50/36 | 62/36 | 32/29 |
| Pro (49k) | 10109/314 | 10109/314 | 0/0 | 2464/153 | 633/153 | 240/145 |
| FeatureBench (47k) | 3490/181 | 3490/181 | 0/0 | 424/84 | 262/84 | 90/75 |
| family | model | policy setting | solutions / | mean per-task F2PF (%) |
|---|---|---|---|---|
| R6 depth | Qwen3.6 | frozen caps, prior run | 6/15 | 45.3 |
| frozen caps, rerun | 7/15 | 47.5 | ||
| all caps 0.5 | 5/15 | 45.0 | ||
| all caps 2.0 | 4/15 | 33.3 | ||
| R7/R8 timing | Qwen3.6 | activation 0.50, protect 4 | 3/15 | 22.2 |
| activation 0.25, protect 4 | 2/15 | 13.3 |