Skip to content

Benchmarking Beyond Scores: How harness9 Iterates from Execution Traces

About harness9

harness9 is a Local-First, lightweight, feature-complete, production-ready Agent framework for Go.

TL;DR

  • SWE-bench evaluates whether an Agent can turn an issue and a repository revision into a patch that passes hidden tests.
  • Terminal-Bench evaluates the final state of a real terminal environment through Harbor and a task verifier.
  • A score alone cannot distinguish an engine defect, a broken environment, an adapter constraint, and a model decision.
  • harness9 uses trajectory analysis to turn those distinctions into narrowly scoped changes: bootstrap steps, verification gates, retries, timeouts, and stall prompts.
  • M1 is the shipped v1.0.0 Agent Harness baseline. M2, a local multi-Agent OS, is a roadmap rather than a benchmark result.

The benchmark-to-iteration feedback loop

SWE-bench: patch quality without test leakage

A SWE-bench instance supplies a repository, a base commit, and an issue description. The runner creates an isolated work directory and Sandbox, runs the Agent with normal file and shell tools, then collects the resulting git diff. The official evaluator applies its private test_patch only after the Agent has finished.

This boundary matters. problem_statement is valid Agent input; test_patch, FAIL_TO_PASS, and PASS_TO_PASS are evaluator-only evidence. Exposing them to the prompt would turn an evaluation into test leakage.

The SWE-bench execution and evaluation boundary

The runner also preserves new files with git add -A -N before collecting the diff. Benchmark execution uses bounded turns, retry policy, an expanded shell timeout, and project bootstrap commands so a recoverable dependency failure does not look like a model failure.

A verification gate, not an infinite loop

Early trajectories showed a basic failure mode: Agents often stopped without running a real test. runWithVerificationGate observes bash tool events. If a run ends without a detected test command, the benchmark runner injects one verification reminder and resumes with the same MemorySession.

The continuation is deliberately capped at one attempt and remains bounded by the instance timeout and MaxTurns; it is a measurement guardrail, not a generic change to the Agent loop.

The one-shot verification gate

Terminal-Bench: final environment state

Terminal-Bench 2.0 is integrated through benchmarks/terminal_bench/harness9_agent.py. Harness9Agent, a Harbor BaseInstalledAgent, installs the static harness9 binary into the task container, uploads the instruction file, and runs the binary non-interactively. Harbor owns lifecycle and verifier execution; reward.txt records the outcome.

This exposed different classes of engineering work. Some task images lacked ca-certificates, so HTTPS failed deterministically for static Go binaries; retrying an unavailable trust store is not resilience. The adapter now installs the certificate package. Likewise, the adapter keeps a wide absolute fallback while Harbor respects task-specific timeout budgets.

The Harbor and Terminal-Bench adapter lifecycle

Use trajectories as evidence

Every conclusion needs three aligned records: agent/harness9.log for turns and tool calls, the patch or terminal state for actual behavior, and verifier output for an external judgment. Only then can an apparent regression be classified as a runtime issue, an environment issue, an evaluation-adapter issue, or model behavior.

Trajectory analysis turns evidence into focused changes

On a controlled SWE-bench Lite comparison of 24 instances, resolved tasks rose from 16 to 19 and tasks that ran a real test rose from 1 to 18. The important result is not a single percentage point: it is restoring a test-feedback loop that makes subsequent changes explainable.

From M1 to M2

M1, harness9 v1.0.0, established the production-ready Agent Harness baseline: the ReAct engine, providers, tools, Sandbox, permissions, MCP, planning, Skills, Sub-Agents, AutoDev, memory, evaluation, benchmarks, observability, TUI, CLI, and bilingual documentation.

M2 is the roadmap for a local multi-Agent OS. It covers role and permission boundaries, task graphs and scheduling, worktree-session-sandbox lifecycle, resumable state, conflict-aware file ownership, provenance-aware memory, benchmark regression dashboards, and operator controls. It is explicitly not a claimed delivery or an extrapolation from the benchmark score.

Delivered M1 versus the planned M2 boundary

Conclusion

Benchmarks become useful when they are treated as a chain of evidence, not a leaderboard number. That discipline is what lets harness9 improve an Agent runtime without confusing accidental wins for product progress.

Released under the MIT License.