Seat Harbor as the workbench's effectiveness engine

c383c8dbf24e · AtlantisPleb · · parent 465e7a7ce4fc

Seat Harbor as the workbench's effectiveness engine

A deep read of the Harbor clone (the Terminal-Bench 2.0 harness) shows
it already is the graded agent-effectiveness harness the workbench's
axis 2 specified by hand: an 80-dataset registry, 48 agent adapters
that make the competitive baseline free, pluggable container
environments, typed error taxonomies driving retry policy, and ATIF —
the trajectory format the coder already exports — as its native
format. The new plan document records the adapter contract precisely
and the comparative matrix the compute mix wants; the workbench spec's
axis 2 now runs on Harbor with AgentX unchanged on the serving axis.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GoYpb8FEmdxVErsv7ABCYi
Co-Authored-By
Claude Fable 5 <noreply@anthropic.com>

Deploy story

What this commit did to the running system — joined from the forge receipt chain, the part a commit page elsewhere cannot show.

pushed
by user · WAL seq 318 · 2026-08-24T23:01:54.343395Z

Changed files

  • modified docs/2026-08-24-benchmark-workbench-agentx.md
  • added docs/2026-08-24-harbor-terminal-bench-plan.md

Diff

2 files changed, +160 -8

docs/2026-08-24-benchmark-workbench-agentx.md modified +23 -8

@@ -109,18 +109,30 @@ Shape:

109 109
  run at bounded concurrency with provider consent where terms require
110 110
  it. Full-ladder runs are for endpoints we own.
111 111
112
## 4. Workbench axis 2: effectiveness (graded agent runs)
112
## 4. Workbench axis 2: effectiveness (graded agent runs on Harbor)
113 113
114 114
**Goal:** a number that moves when `openagents coder` gets better or
115 115
worse, computed the same way every time.
116 116
117
This axis runs on **Harbor**, the Terminal-Bench 2.0 harness from the
118
Terminal-Bench team (`projects/repos/harbor`) — the full plan is
119
`docs/2026-08-24-harbor-terminal-bench-plan.md`. Harbor is the right
120
engine rather than a hand-rolled runner because it already is the graded
121
agent-effectiveness harness: an 80-dataset registry (Terminal-Bench 2.0,
122
SWE-bench, Aider Polyglot, and more behind one contract), 48 existing
123
agent adapters that make the competitive baseline free, pluggable
124
container environments, and — decisively — **ATIF as its native
125
trajectory format**, the same v1.7 the coder already exports.
126
117 127
Shape:
118 128
119
- A curated task suite replayed through the real CLI, not a harness fork:
120
  start with a bounded public set (a SWE-bench-lite subset is the obvious
121
  candidate; InferenceX itself wires SWE-bench rows into its agentic
122
  evals) plus an owned set drawn from this tracker's own closed issues —
123
  tasks with known accepted outcomes and receipts.
129
- An `openagents-coder` installed-agent adapter (out-of-tree first;
130
  Harbor takes a custom import path, no fork needed), writing the
131
  coder's own ATIF export as each trial's trajectory.
132
- First dataset `terminal-bench@2.0` — agent-agnostic terminal work,
133
  closest to what the coder is for — then SWE-bench and Aider Polyglot
134
  from the same registry with zero new harness code, plus an owned set
135
  drawn from this tracker's own closed issues later.
124 136
- Each run pins: CLI version, model catalog revision, plugin set, task
125 137
  digest. Scores validate against floors in a `thresholds.yaml`; a run
126 138
  below floor fails the gate rather than shipping a quiet regression.

@@ -169,8 +181,11 @@ Shape:

169 181
   proxy-vs-direct per catalog model at bounded concurrency, receipted
170 182
   results into `bench-results`. Acceptance: one honest comparison table
171 183
   for two models with proxy overhead quantified.
172
2. **Effectiveness suite v1** (monorepo): 20–30 graded tasks through the
173
   real CLI with thresholds and cost-per-accepted-outcome reporting.
184
2. **Harbor adapter for the coder** (`OpenAgentsInc/openagents#35`): the
185
   `BaseInstalledAgent` subclass with ATIF out and typed error mapping.
186
   **Effectiveness suite v1** (`OpenAgentsInc/openagents#34`, blocked by
187
   the adapter): Terminal-Bench 2.0 per compute-mix lane beside the stock
188
   adapters, with thresholds and cost-per-accepted-outcome reporting.
174 189
   Acceptance: two consecutive scheduled runs producing comparable rows,
175 190
   and one deliberate regression caught by the floor.
176 191
3. **Thread-to-WEKA trace exporter** (openagents.com): consent-gated
docs/2026-08-24-harbor-terminal-bench-plan.md added +137

@@ -0,0 +1,137 @@

1
# Harbor and Terminal-Bench: the effectiveness engine
2
3
Date: 2026-08-24
4
5
Status: plan. Companion to `docs/2026-08-24-benchmark-workbench-agentx.md`,
6
whose effectiveness axis (axis 2) this document re-bases on Harbor. Read
7
from the clone at `projects/repos/harbor` (v0.16.x, Apache-style OSS from
8
the Terminal-Bench creators).
9
10
## 1. What Harbor is
11
12
Harbor is the official harness for Terminal-Bench 2.0 and a general
13
framework for evaluating agents in container environments: a task is a
14
container image plus an instruction plus a verifier; an agent is installed
15
into the environment, runs against the instruction, and the verifier
16
grades the outcome. One command runs a whole benchmark:
17
18
```sh
19
harbor run --dataset terminal-bench@2.0 --agent claude-code \
20
  --model anthropic/claude-opus-4-1 --n-concurrent 4
21
```
22
23
What makes it the right effectiveness engine for the workbench rather
24
than anything hand-rolled:
25
26
- **The registry is 80 datasets**, not one: Terminal-Bench 2.0 first, and
27
  then SWE-bench (plus multilingual/pro/smith variants), Aider Polyglot,
28
  OSWorld, GAIA, CyberGym, tau3-bench, and 70 more, all runnable through
29
  the same contract (`registry.json`).
30
- **48 agent adapters already exist** — Claude Code, Codex, Gemini CLI,
31
  Goose, Grok Build, Cursor, Devin, Hermes among them — which means the
32
  competitive baseline table is free: the same task set, the same grader,
33
  our agent beside the field.
34
- **ATIF is its trajectory format.** The spec the coder already exports
35
  (`rfcs/0001-trajectory-format.md` lives in this repo); adapters write
36
  `trajectory.json` in ATIF after each trial, and `harbor-atif2otel`
37
  projects it to OpenTelemetry. Our `/export` speaks this natively,
38
  including the plugin-provenance system steps shipped as
39
  `OpenAgentsInc/openagents#32`.
40
- **Environments are pluggable** — local Docker plus ~30 providers
41
  (Daytona, Modal, E2B, GKE, EC2…) behind one interface with network
42
  policies (allowlist/no-network, probed rather than assumed) and
43
  resource policies. This is the same shape as the cloud-computer lane's
44
  owner-hosted/managed split, and a later OpenAgents environment provider
45
  is a natural (not urgent) extension.
46
- **RewardKit** turns the same trials into RL rollouts (judges, criteria,
47
  rewards) — the optimization loop waiting at the end of the measurement
48
  loop.
49
50
## 2. The adapter contract, precisely
51
52
`BaseInstalledAgent` (src/harbor/agents/installed/base.py) is what an
53
`openagents coder` adapter implements:
54
55
- `install(environment)` — in-container install; for us,
56
  `npm install -g @openagentsinc/cli` (a pinned version).
57
- A run command built from the instruction, with prompt-template support;
58
  for us, `openagents coder --plain` fed the instruction, on a lane that
59
  works headless in a container (an API-key/base-URL model connection via
60
  Harbor's `ModelConnectionSpec`, or the account lane where a token can
61
  be provisioned; the offline refusal must never look like a task
62
  failure).
63
- **Typed error patterns**: Harbor classifies agent failures
64
  (rate-limited, usage-exhausted, context-window, overloaded, safety
65
  refusal, auth) from output patterns so retry policy can target them —
66
  `--retry-include ApiRateLimitError`. The adapter must map the CLI's
67
  typed errors and exit codes onto these classes; our exit-code
68
  discipline makes that mechanical.
69
- `populate_context_post_run` — write `logs_dir/trajectory.json` in ATIF.
70
  The coder's existing exporter is the implementation; the adapter runs
71
  `/export` (or reads the export the session already wrote) and copies it
72
  out.
73
- **Capabilities**: declare `atif=True` on day one. `resume` maps to
74
  `--resume --last`; `load_atif_trajectory` (seeding a session from an
75
  ATIF file, which the Claude Code adapter implements bidirectionally) is
76
  exactly the foreign-session import direction of
77
  OpenAgentsInc/openagents.com#198 — declare it when that lands, not
78
  before.
79
- **No fork needed to start**: `harbor run --agent` accepts a custom
80
  import path (`create_agent_from_import_path`), so the adapter can live
81
  in our tree and run against upstream Harbor immediately. Upstreaming it
82
  to Harbor's 48-adapter roster is the distribution move — every Harbor
83
  user gains `-a openagents-coder` — and worth doing once the adapter is
84
  stable.
85
86
## 3. What we measure, and what stays ours
87
88
Harbor produces graded trials with ATIF trajectories. The workbench's own
89
layer on top stays exactly as specified: score floors in a thresholds
90
file (a run below floor fails the gate), digest-pinned recipes (CLI
91
version, model catalog revision, plugin set, dataset@version), receipted
92
results in `bench-results`, and **cost per accepted outcome** as the
93
headline — computable directly because every trial's ATIF carries token
94
metrics and the model catalog carries pricing.
95
96
The comparative matrix the compute mix wants falls out of Harbor's
97
design:
98
99
| Comparison | How |
100
| --- | --- |
101
| Our coder across house lanes | `-a openagents-coder` per catalog model through the proxy |
102
| Our coder vs the field | Same dataset, Harbor's stock adapters (claude-code, codex, goose…) |
103
| Fable via us vs Fable native | `-a openagents-coder` on the foreign-harness lane vs `-a claude-code` — measuring what our orchestration adds or costs |
104
| Plugin value | Same suite with and without a plugin loaded; provenance-stamped `tool.ran` steps in the ATIF make the delta attributable |
105
106
Start with `terminal-bench@2.0` because it is agent-agnostic terminal
107
work — closest to what the coder is for — then widen to SWE-bench and
108
Aider Polyglot from the same registry with zero new harness code.
109
110
## 4. Sequencing
111
112
1. **The adapter** (`OpenAgentsInc/openagents#35`): out-of-tree
113
   `BaseInstalledAgent` subclass, ATIF out, typed error mapping, pinned
114
   install. Acceptance: `harbor run -d terminal-bench@2.0 -a <import
115
   path>` completes trials locally on Docker with graded results and
116
   valid ATIF trajectories.
117
2. **The baseline** (folds into `OpenAgentsInc/openagents#34`): a scored
118
   Terminal-Bench 2.0 run per compute-mix lane beside the stock
119
   claude-code adapter, published to `bench-results` with thresholds set
120
   from the first honest numbers.
121
3. **Cadence**: per-release gate and weekly trend, as the workbench spec
122
   already states.
123
4. **Later, recorded not filed**: upstream the adapter to Harbor;
124
   `load_atif_trajectory` once #198's import half exists; an OpenAgents
125
   cloud-computer environment provider; RewardKit rollouts feeding the
126
   optimization loop (GEPA-style, candidates never auto-promoted).
127
128
## 5. Division of labor with AgentX
129
130
Unchanged from the workbench spec, now with the right engine in each
131
seat: **AgentX measures the serving side** (how the compute mix carries
132
coder-shaped traffic per dollar — axis 1), **Harbor measures the agent**
133
(does the coder finish graded tasks, at what cost — axis 2), and the
134
thread-to-WEKA exporter (axis 3, #218) feeds AgentX-style replay with our
135
own consented traffic. Harbor's ATIF trials are also raw material for
136
axis 3's cousin: consented trajectories are the corpus the registry
137
strategy wants, in the format we already speak.

This page updates live while a promote is in flight · changelog