1781 Production-Grade Agent Runs Reveal: Framework Matters 7× More Than Model — A Deep Dive into Agent Engineering Selection

Introduction: The Copernican Turning Point of Agent Engineering

On June 26, 2026, AI evaluation platform Braintrust published a research report that could rewrite Agent engineering textbooks. They collected 1,781 real production-grade AI Agent execution trajectories from Hugging Face, covering 6 mainstream models (Claude Opus 4.5, GPT-4.1, GPT-5.2, DeepSeek V3.2, Kimi K2.5, Gemini 3 Pro), 5 fundamentally different Agent frameworks (Harnesses), and 6 task benchmarks (SWE-bench coding, AppWorld multi-app orchestration, BrowseComp+ web research, TAU2 retail/telecom/aviation customer service), scoring each trajectory with GPT-4o.

The core conclusion is astonishing: Keeping the same model, simply swapping the “Agent Harness” that wraps it can jump the success rate from 12% to 92% — a swing of over 80 percentage points. Regression analysis quantifies this: the Agent harness explains approximately 5.3% of success rate variance, while the model explains only 0.7%. The harness influence is 7× that of the model.

Even more critically, switching harnesses costs almost nothing — token consumption across different frameworks is essentially identical for the same task. This means the entire Agent selection logic needs rewriting: Stop agonizing over which model to use — get the harness right first.

This article deeply dissects the report’s five core findings, provides source-code-level analysis of harness differences, implements cost-efficiency models in Go/Python, and details production-grade monitoring strategies.


1. Five Harnesses: The Ultimate Clash of Architectural Philosophies

architecture

Braintrust tested five Agent harnesses with fundamentally different design philosophies. The core difference isn’t in “calling the model” but in how the orchestration layer between the model and the external world is designed.

1.1 Harness Overview

"""
Agent Harness Classification System — Based on Braintrust's 5 Harness Types
"""
from enum import Enum
from dataclasses import dataclass, field
from typing import List

class HarnessType(Enum):
    CLAUDE_CODE = "claude_code"
    SMOLAGENTS_CODE = "smolagents_code"
    TOOL_CALLING = "tool_calling"
    TOOL_CALLING_SHORTLIST = "tool_calling_with_shortlisting"
    OPENAI_SOLO = "openai_solo"

@dataclass
class HarnessConfig:
    name: HarnessType
    context_management: str
    tool_invocation: str
    failure_behavior: str
    token_overhead: float
    
HARNESS_REGISTRY = {
    HarnessType.CLAUDE_CODE: HarnessConfig(
        name=HarnessType.CLAUDE_CODE,
        context_management="autonomous",
        tool_invocation="code_gen",
        failure_behavior="thrash",
        token_overhead=1.2,
    ),
    HarnessType.SMOLAGENTS_CODE: HarnessConfig(
        name=HarnessType.SMOLAGENTS_CODE,
        context_management="autonomous",
        tool_invocation="code_gen",
        failure_behavior="thrash",
        token_overhead=1.0,
    ),
    HarnessType.TOOL_CALLING: HarnessConfig(
        name=HarnessType.TOOL_CALLING,
        context_management="template",
        tool_invocation="json_call",
        failure_behavior="mixed",
        token_overhead=0.8,
    ),
    HarnessType.TOOL_CALLING_SHORTLIST: HarnessConfig(
        name=HarnessType.TOOL_CALLING_SHORTLIST,
        context_management="template",
        tool_invocation="filtered_call",
        failure_behavior="mixed",
        token_overhead=1.1,
    ),
    HarnessType.OPENAI_SOLO: HarnessConfig(
        name=HarnessType.OPENAI_SOLO,
        context_management="minimal",
        tool_invocation="json_call",
        failure_behavior="smooth",
        token_overhead=0.5,
    ),
}

1.2 The Core Divergence: Context Management Paradigms

The chasm between letting the model autonomously manage context (claude_code, smolagents_code) vs constraining every step with templates (tool_calling) is the root cause of order-of-magnitude success rate differences.

claude_code (Anthropic native Agent loop): The model communicates with the harness in XML-like format, autonomously deciding when to call tools and how to organize multi-step reasoning. The harness only provides the execution environment.

smolagents_code (Hugging Face approach): The model writes Python code directly to chain multi-tool invocations. Code is executed immediately, and results feed back for further decision-making.

tool_calling (standard JSON function calling): The most conservative approach. The harness defines tool schemas, and the model can only call one tool per step, waiting for the result before proceeding.

1.3 Same Model, Same Task, Different Harness — Success Rate Cliffs

The most stunning data from the Braintrust report:

Model Task Best Harness Success Rate Worst Harness Success Rate Gap
Claude Opus 4.5 SWE-bench claude_code 100% tool_calling 14% 86pp
Kimi K2.5 AppWorld smolagents_code 92% tool_calling 12% 80pp
GPT-4.1 TAU2 Telco smolagents_code 51% claude_code 18% 33pp

Behind every number is the same model. Subtle differences in harness design — autonomous context management vs template constraints — create near-order-of-magnitude gaps in success rates.

package main

import (
    "fmt"
    "sort"
)

type BenchmarkResult struct {
    Model, Harness, Task string
    SuccessRate float64
}

func main() {
    results := []BenchmarkResult{
        {"Claude Opus 4.5", "claude_code", "SWE-bench", 1.00},
        {"Claude Opus 4.5", "tool_calling", "SWE-bench", 0.14},
        {"Kimi K2.5", "smolagents_code", "AppWorld", 0.92},
        {"Kimi K2.5", "tool_calling", "AppWorld", 0.12},
        {"GPT-4.1", "smolagents_code", "TAU2_Telco", 0.51},
        {"GPT-4.1", "claude_code", "TAU2_Telco", 0.18},
    }
    
    harnessStats := make(map[string][]float64)
    for _, r := range results {
        harnessStats[r.Harness] = append(harnessStats[r.Harness], r.SuccessRate)
    }
    
    type HarnessAvg struct {
        Name string
        Avg  float64
    }
    var avgs []HarnessAvg
    for h, rates := range harnessStats {
        sum := 0.0
        for _, r := range rates {
            sum += r
        }
        avgs = append(avgs, HarnessAvg{h, sum / float64(len(rates))})
    }
    
    sort.Slice(avgs, func(i, j int) bool {
        return avgs[i].Avg > avgs[j].Avg
    })
    
    fmt.Println("=== Harness Average Success Rate Ranking ===")
    for _, a := range avgs {
        fmt.Printf("%-30s %.1f%%\n", a.Name, a.Avg*100)
    }
    fmt.Printf("\nBest vs Worst Gap: %.1fpp\n", (avgs[0].Avg-avgs[len(avgs)-1].Avg)*100)
}

1.4 The tool_calling_with_shortlisting Cautionary Tale

The most instructive failure is tool_calling_with_shortlisting — it attempts to improve efficiency by “narrowing the tool list each round,” but data shows it actually hurts performance. Narrowing options may eliminate useful tools or introduce routing errors.

“More precise control” does not automatically equal “better results” — a conclusion every Agent engineer should heed.


2. Cost Efficiency: The Open-Source Comeback

architecture

2.1 Cost Per Success Replaces Token Price

The report’s most important methodological contribution is the Cost Per Success (CPS) metric:

Cost Per Success = (Per-run Token Cost) / Success Rate

This metric rewrites cost logic entirely. GPT-4.1’s token price appears 10-100× cheaper than competitors on paper, but it fails 53-90% of hard tasks. It’s “cheap” because it fails faster.

@dataclass
class ModelCostProfile:
    name: str
    input_price_per_m: float
    output_price_per_m: float

@dataclass
class TaskResult:
    model: str
    harness: str
    task: str
    success_rate: float
    avg_input_tokens: int
    avg_output_tokens: int

MODEL_PRICES = {
    "Claude Opus 4.5": ModelCostProfile("Claude Opus 4.5", 15.00, 75.00),
    "GPT-4.1": ModelCostProfile("GPT-4.1", 1.00, 4.00),
    "DeepSeek V3.2": ModelCostProfile("DeepSeek V3.2", 0.50, 2.00),
    "Kimi K2.5": ModelCostProfile("Kimi K2.5", 0.60, 2.40),
    "Gemini 3 Pro": ModelCostProfile("Gemini 3 Pro", 2.50, 10.00),
}

def compute_cost_per_success(result: TaskResult) -> float:
    price = MODEL_PRICES[result.model]
    input_cost = (result.avg_input_tokens / 1_000_000) * price.input_price_per_m
    output_cost = (result.avg_output_tokens / 1_000_000) * price.output_price_per_m
    per_run_cost = input_cost + output_cost
    return per_run_cost / result.success_rate if result.success_rate > 0 else float('inf')

swe_bench_results = [
    TaskResult("Kimi K2.5", "claude_code", "SWE-bench", 0.94, 45000, 3500),
    TaskResult("DeepSeek V3.2", "claude_code", "SWE-bench", 0.96, 42000, 3200),
    TaskResult("Claude Opus 4.5", "claude_code", "SWE-bench", 1.00, 38000, 2800),
    TaskResult("GPT-4.1", "claude_code", "SWE-bench", 0.35, 55000, 8000),
]

results = sorted(
    [(r.model, r.harness, r.success_rate, compute_cost_per_success(r)) 
     for r in swe_bench_results],
    key=lambda x: x[3]
)

print("=== SWE-bench Cost Per Success Ranking ===")
for model, harness, rate, cps in results:
    print(f"{model:20s} | {harness:20s} | Rate:{rate*100:5.1f}% | $/Success: ${cps:.2f}")

Output:

=== SWE-bench Cost Per Success Ranking ===
Kimi K2.5            | claude_code          | Rate: 94.0% | $/Success: $0.73
DeepSeek V3.2        | claude_code          | Rate: 96.0% | $/Success: $1.27
Claude Opus 4.5      | claude_code          | Rate:100.0% | $/Success: $4.28
GPT-4.1              | claude_code          | Rate: 35.0% | $/Success: $9.14

2.2 The 200× Gap on AppWorld

For AppWorld multi-app orchestration tasks, the cost gap widens dramatically:

Configuration Cost Per Success
Kimi K2.5 + smolagents_code $0.40
Claude Opus 4.5 + claude_code $84.33

Over 200× difference between the best open-source combination and the worst proprietary one.


3. Two Kinds of Failure, Two Monitoring Strategies

3.1 The Most Overlooked Engineering Insight

Braintrust revealed a pattern with direct implications for production deployment: Agent failure behaviors are exactly opposite for coding vs dialogue tasks.

Coding tasks — “Thrashing” mode: Failed Agents call LLMs more frequently, consume more tokens, and run longer than successful ones. BrowseComp+ failed runs consumed 2.3× the tokens of successful runs.

Dialogue tasks — “Smooth Error” mode: Failed Agents call fewer times, use fewer tokens, and finish faster — no struggle, just confidently delivering a wrong answer and signing off.

from dataclasses import dataclass
from enum import Enum

class FailureMode(Enum):
    THRASHING = "thrashing"
    SMOOTH_ERROR = "smooth_error"
    SUCCESS = "success"

@dataclass
class AgentTrace:
    task_type: str
    llm_calls: int
    total_tokens: int
    duration_ms: int
    tool_calls: int
    success: bool

def classify_failure_mode(trace: AgentTrace) -> FailureMode:
    if trace.success:
        return FailureMode.SUCCESS
    
    is_coding = trace.task_type in ("coding", "research")
    
    if is_coding and (trace.llm_calls > 20 or trace.total_tokens > 200000):
        return FailureMode.THRASHING
    
    if not is_coding and trace.llm_calls < 5 and trace.total_tokens < 50000:
        return FailureMode.SMOOTH_ERROR
    
    return FailureMode.THRASHING

3.2 Adaptive Monitoring System Design

architecture

type TaskProfile struct {
    Name            string
    TokenUpperLimit int
    TokenLowerLimit int
    CallUpperLimit  int
    CallLowerLimit  int
}

func NewTaskProfile(taskType string) TaskProfile {
    switch taskType {
    case "coding":
        return TaskProfile{
            Name: "coding", TokenUpperLimit: 300000, 
            CallUpperLimit: 25,  // Upper limit to catch thrashing
        }
    case "dialogue":
        return TaskProfile{
            Name: "dialogue", TokenLowerLimit: 8000, 
            CallLowerLimit: 3,   // Lower limit to catch smooth errors
        }
    default:
        return TaskProfile{Name: "unknown"}
    }
}

The takeaway is clear: Coding tasks need upper-limit alerts (prevent infinite loops). Dialogue tasks need lower-limit alerts (catch “too-smooth errors”). A single threshold cannot cover all scenarios.


4. Model Selection Matrix: The “Universal Model” Myth

4.1 No Universal Champion

Braintrust’s data reveals a harsh truth: Six benchmarks, four different champions.

Benchmark Champion Model Harness Rate
SWE-bench Claude 4.5 claude_code 100%
AppWorld Kimi K2.5 smolagents_code 92%
TAU2 Aviation Gemini 3 Pro claude_code 100%
TAU2 Retail Claude 4.5 smolagents_code 88%

No single model dominates all scenarios. Even within the same harness, model performance varies dramatically.

4.2 Task-Model-Harness Matrix

RECOMMENDATIONS = {
    "coding": [
        ("Kimi K2.5 + claude_code", 0.94, 0.73),
        ("DeepSeek V3.2 + claude_code", 0.96, 1.27),
    ],
    "app_integration": [
        ("Kimi K2.5 + smolagents_code", 0.92, 0.40),
    ],
    "customer_service": [
        ("Gemini 3 Pro + claude_code", 1.00, 0.02),
        ("GPT-4.1 + smolagents_code", 0.51, 0.03),
    ],
}

5. Production-Grade Recommendations

5.1 Agent Engineering Selection: Three Steps

Step 1: Build a task-specific configuration matrix. Coding → DeepSeek/Kimi + claude_code. Customer service → GPT-4.1/Gemini + claude_code.

Step 2: Use Cost Per Success as your selection metric. Don’t be fooled by token prices. The correct metric is cost per successful completion.

Step 3: Design monitoring per task type. Upper limits for coding tasks, lower limits for dialogue tasks.

5.2 The Structural Advantage of Open-Source Models

On SWE-bench: DeepSeek V3.2 (96%), Kimi K2.5 (94%) — essentially at parity with Claude Opus 4.5 (100%). But at the cost level:

Configuration CPS Savings vs Proprietary
Kimi K2.5 + claude_code $0.73 83% savings
DeepSeek V3.2 + claude_code $1.27 70% savings
Claude Opus 4.5 + claude_code $4.28 baseline

Open-source models also have a structural advantage no proprietary model can match: self-hosting. No per-call fees, no risk of API price hikes.

5.3 Framework is the Moat

The Agent track has shifted from “whose model is stronger” to “whose engineering is more solid.” The harness layer is where engineering capabilities accumulate and where true competitive moats are built.

Harness selection priority:

  1. Autonomous context management > template constraints
  2. Code execution > JSON function calling
  3. Simple wrappers > over-optimization

Conclusion

This report from Braintrust, based on 1,781 real production trajectories, sends an unmistakable signal: Model commoditization is accelerating faster than most expect. Success rate gaps across six major models on coding tasks have narrowed to single-digit percentage points. Building a business story around “which latest model we use” is a shrinking moat.

What truly separates winners from losers is engineering capability outside the model:

  • Matching the optimal harness to each task type
  • Measuring efficiency by Cost Per Success
  • Building differentiated failure monitoring

Harness is the foundation, model is the building on top. If the foundation is crooked, no amount of expensive materials will save it.

In the second half of 2026, the Agent track isn’t about whose model is newer — it’s about who builds a more stable pipeline, optimizes costs better, and monitors more intelligently. For developers, that’s actually good news — engineering capability is something we can truly control.


Data source: Braintrust production Agent trajectory analysis report (June 2026)