Skip to main content

Yet Another Coding Harness Testbed

Project description

YACHT

Yet Another Coding Harness Testbed.

YACHT is an evaluation control plane for agentic coding systems. It runs the same coding course across different agents, models, tools, prompts, memory systems, and runtime environments, then records the evidence needed to decide whether a change actually helped.

The goal is not only to produce benchmark scores. A useful YACHT run should also answer:

  • Did the setup solve the task?
  • Was the runtime available, isolated, and configured as claimed?
  • Which tools were actually used?
  • How many tokens did the run spend?
  • What did it cost?
  • How long did it take?
  • Which artifacts prove the result?

YACHT is designed as open-source infrastructure for reproducible, inspectable coding-agent evaluation.

Current Status

YACHT runs real end-to-end benchmark comparisons:

  • two real harness adapters: containerized Pi and containerized Claude Code
  • rigging for tools under test: agent extensions, config files, pinned npm packages, and MCP servers rendered into the harness's own configuration
  • explicit secret injection, runtime and rigging preflight before tokens are spent
  • SWE-bench Lite task context loading, per-task repository checkout, agent task attempts and transcripts, candidate patch extraction, and native SWE-bench Docker grading
  • a Terminal-Bench 2.0 course that delegates rollout and verification to the official Harbor harness: YACHT-owned agents install the pinned harness and rigging inside each task container, orchestrated from a pinned launcher image, with install-only preflight before tokens are spent
  • a LiveCodeBench course graded by the official evaluator in a pinned container, with contest-date windows recorded as contamination provenance
  • comparison verdicts graded by statistical evidence: Wilson intervals, paired sign tests, and t-intervals over repeated runs, with insufficient-evidence verdicts labeled as observations
  • benchmark scorecards with outcome, token, cost, duration, and tool-use metrics, plus run provenance (harness, model, and tool versions resolved from evidence)
  • self-contained HTML reports with verdict banners and variance badges, and a local read-only dashboard (yacht serve) that filters and groups runs by provenance

See the Validating a Tool Claim tutorial for the core workflow: turn a tool's claim into a pinned, preflighted comparison and read the verdict.

Core Concepts

Concept Meaning
Course A benchmark suite, task set, or evaluation route.
Vessel An agent, model, runtime, or full coding setup being evaluated.
Rigging Tools, prompts, skills, MCP servers, memory systems, and policies added to a vessel.
Runtime The reproducible environment used to run a vessel.
Preflight Machine evidence that a runtime and its rigging are available, configured, and isolated before spending task tokens.
Wake The artifacts left by a run: transcripts, metrics, logs, tool calls, patches, reports.
Logbook The persisted directory containing a run's wake and scorecards.
Scorecard The final comparison view across vessels.

The nautical vocabulary is part of the project identity, but the artifacts stay plain JSON so other tools can consume them.

First Real Benchmark

Prerequisites:

  • Python 3.12 or newer available to uv
  • uv
  • Git on PATH
  • Docker installed, running, and usable by the current user
  • network access for the first uv dependency sync, SWE-bench metadata, and Docker image build
  • no manual SWE-bench install: uv resolves the swebench harness on demand for native benchmark launches, and yacht doctor performs and verifies the first resolution
  • an Anthropic API key exported as ANTHROPIC_API_KEY
  • the repo-local Pi runtime image built with the command below

Build the Pi runtime image:

docker build -t yacht/pi-agent-runtime:pi-0.74.0 containers/pi-agent-runtime

Run the benchmark smoke:

LOGBOOK=/private/tmp/yacht-real-benchmark-$(date +%Y%m%d-%H%M%S)

uv run yacht doctor examples/container-pi-fff-real-benchmark-smoke.toml

uv run yacht run examples/container-pi-fff-real-benchmark-smoke.toml \
  --logbook "$LOGBOOK" \
  --workspace . \
  --secret anthropic=@env:ANTHROPIC_API_KEY

uv run yacht status --logbook "$LOGBOOK"
uv run yacht report --logbook "$LOGBOOK"
uv run yacht report --logbook "$LOGBOOK" --vessel pi-container-fff

The default smoke config runs one SWE-bench Lite instance to keep iteration cheap. For a slightly broader two-instance check, use examples/container-pi-fff-real-benchmark-small.toml with the same commands.

Fish shell:

set -x LOGBOOK /private/tmp/yacht-real-benchmark-(date +%Y%m%d-%H%M%S)

uv run yacht doctor examples/container-pi-fff-real-benchmark-smoke.toml

uv run yacht run examples/container-pi-fff-real-benchmark-smoke.toml \
  --logbook "$LOGBOOK" \
  --workspace . \
  --secret anthropic=@env:ANTHROPIC_API_KEY

uv run yacht status --logbook "$LOGBOOK"
uv run yacht report --logbook "$LOGBOOK"

The status report is the first thing to inspect after a run. It shows which benchmark artifacts exist, what is missing, and the next recommended command. The benchmark report then summarizes benchmark outcome, agent usage metrics, notable deltas, per-task outcomes, per-task usage, and the relevant per-vessel artifact paths. Use --vessel and --task to narrow the detailed sections when inspecting a specific run. After a scorecard exists, yacht status recommends a filtered inspection command for the first challenger/task outcome. For example:

Benchmark scorecard: container-pi-fff-real-benchmark-small / swe-bench-lite
Status: complete
Comparisons: 1 | Vessels: 2 | Measured: 2 | Missing: 0
Usage: Attempts: 4 | Failed: 0 | Tool calls: 15 | Tokens: 63084 | Cost: 0.020688 | Duration: 210.332s
Artifacts: logbook=/private/tmp/yacht-real-benchmark-... | scorecard=/private/tmp/yacht-real-benchmark-.../benchmark-scorecard.json | attempts=/private/tmp/yacht-real-benchmark-.../task-attempt-scorecard.json | launch=/private/tmp/yacht-real-benchmark-.../benchmark-launch-result.json | grading=/private/tmp/yacht-real-benchmark-.../benchmark-grading-collection.json

Notable deltas:
container-pi-vs-pi-fff-benchmark-small: pi-container-fff vs pi-container-baseline | resolved +0 | rate +0.000 | tokens +10988 | cost +0.001650 | duration +7.792s | tool_calls +3

comparison | baseline | challenger | resolved_delta | rate_delta | measured | missing | eligible | preflight
container-pi-vs-pi-fff-benchmark-small | pi-container-baseline | pi-container-fff | +0 | +0.000 | 2/2 | 0 | 2 | preflight-passed:2

Agent usage by task:
comparison | vessel | task | tools | tokens | cost | duration | attempt_artifact
container-pi-vs-pi-fff-benchmark-small | pi-container-fff | django__django-11179 | fffind:1, read:1, bash:1, edit:1 | 25492 | 0.006795 | 75.793s | /private/tmp/yacht-real-benchmark-.../task-attempts/.../django__django-11179.json

Development Smoke

For a no-token local harness check:

uv run yacht validate examples/local-agent-preflight-smoke.toml
uv run yacht run examples/local-agent-preflight-smoke.toml --logbook logbook
uv run yacht status --logbook logbook
uv run yacht report --logbook logbook

This validates the control-plane path without Pi, SWE-bench, Docker grading, or provider credentials.

Documentation

License

YACHT is licensed under the Apache License 2.0.

Design Principles

  • Prefer reproducible, inspectable evidence over agent attestation.
  • Keep runtime provisioning separate from benchmark task grading.
  • Make secrets explicit and never copy user-home auth state implicitly.
  • Treat benchmarks, smoke tests, and future evaluators as adapters.
  • Keep public artifacts language-neutral and stable enough for other tools to consume.
  • Report success together with cost, tokens, time, tool use, and failure modes.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

yacht_eval-0.5.0.tar.gz (146.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

yacht_eval-0.5.0-py3-none-any.whl (213.0 kB view details)

Uploaded Python 3

File details

Details for the file yacht_eval-0.5.0.tar.gz.

File metadata

  • Download URL: yacht_eval-0.5.0.tar.gz
  • Upload date:
  • Size: 146.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for yacht_eval-0.5.0.tar.gz
Algorithm Hash digest
SHA256 66e419714e80baa511ccb2f3fa330f46a6929835f8e28891b53da855305973de
MD5 05faa251db73f2c55ac41b8f73877b36
BLAKE2b-256 2dd46c8288c626b1449e4abe4d0a5cfc8d1a690a7ee8d48fd4443927bb86a598

See more details on using hashes here.

File details

Details for the file yacht_eval-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: yacht_eval-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 213.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.31 {"installer":{"name":"uv","version":"0.11.31","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for yacht_eval-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 52dd9cd5b667c135d383cba20a8c671b052021376216c727490bcdc82888426d
MD5 121fb8e2c71ad5cafc854889609b62da
BLAKE2b-256 6365db321415ce14b389a4da6ec78f714110156c504c0c16bcc5277c7dcd8fec

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page