同一句「这个模型在 Terminal-Bench 上 65 分」,背后藏着一整套必须成立的前提。框架要解决的,是让这些前提可验证。
同一个模型换一个 agent harness(Claude Code / Codex CLI / 自研 scaffold),分数就会变。比的是「模型 + harness + 环境」的组合,框架必须把三者都记录清楚,否则数字不可比。
题目版本、容器镜像、依赖、超时、网络策略、模型参数……任一项漂移,分数就不可复现。框架要把「影响结果的输入」全部锚定,而不是只存一份配置。
agent 可能改测试、伪造日志、利用判分脚本漏洞。评分侧必须与执行侧隔离:独立环境、白名单产物、受限网络、非特权评分进程。
由 Terminal-Bench 团队(Laude Institute)出品的评测与优化框架;官方 Terminal-Bench harness;生态已整体迁入 harbor-framework 组织。
Terminal-Bench 1/2/2.1/3/Science、SWE-bench、Aider Polyglot、SWE-smith、GAIA… 通过 85 个 adapters 变成统一任务包。
任务格式 · rollout 引擎 · ATIF 轨迹 · RewardKit 评分 · Registry / Hub 榜单 · RL rollout 生成。
前沿实验室跑榜、企业做内部评测、训练团队生成 SFT/RL 数据(SkyRL / OpenThoughts-Agent / Prime-RL)。
34 个 sandbox(docker / modal / daytona / e2b / k8s …)× 48 个 agent(Claude Code / Codex / Gemini CLI / mini-swe-agent / ACP 协议)。
Pier(DataCurve 的 Harbor fork,为 DeepSWE)· Inspect AI(UK AISI 跨领域评测框架)。见 L4。
基准会过时,模型会换代,但「任务格式 + 轨迹格式 + 评分协议」是长期资产——它决定了未来所有评测能否互相比较。
任务包:指令 + 环境 + 评分脚本。目录即格式。
一次尝试:一个 agent 跑一个 task 的完整生命周期。
一批 trial 的组合与聚合:并发、重试、统计。
被评测的智能体程序:installed CLI 或 API 型。
执行环境抽象:启动、执行、上传/下载、健康检查。
评分:跑 tests/,解析 reward(单值/多维)。
ATIF 轨迹:步骤、工具调用、token/成本,跨 harness 统一。
跨任务聚合:mean / sum / min / max / 自定义脚本。
init → lint
→ publish(content hash)
→ registry / Hub
→ download(3 种来源)
→ Task(解析 task.toml)
→ 挂载进沙箱
核心不变量:任务内容 = content_hash。
agent native logs
→ convert_trajectory()
→ ATIF v1.8
→ trajectory.json
→ viewer / 分析 / SFT
核心不变量:跨 harness 的同一表示(覆盖 CLI 与 API 型 agent)。
tests/test.sh
→ reward.txt / reward.json
→ VerifierResult.rewards
→ 多步聚合 → metrics
→ JobStats / 榜单
核心不变量:reward 是文件协议,可审计、可重放。
启动沙箱
healthcheck
agent setup
相位式网络策略
run(instruction)
超时/取消
上传 agent logs
同步 ATIF
trajectory.json
收集 artifacts
白名单 + manifest
(sidecar 可停主服务)
上传 tests/
跑 test.sh
解析 reward
result.json
lock.json
job 聚合
原地使用;内容哈希在 lock 时计算
子目录 + 可选 commit;sparse checkout,解析出真实 commit
org/name@ref;按 digest 寻址缓存,tar 解包
BaseAgent 接口统一 installed CLI 与 API 型两类。
48 个适配器:Claude Code / Codex / Gemini CLI / mini-swe-agent / Terminus…
接入清单:安装方式 · 凭据注入 · 会话日志 → ATIF · 退出码/超时 · 网络 allowlist。
BaseEnvironment 抽象 5 个动作:启动 / 健康检查 / 执行命令 / 上传文件 / 下载文件。
34 个后端:docker / modal / daytona / e2b / runloop / k8s / 本地。
替换成本:实现 5 个方法即可,Trial 代码零改动。
跑 tests/test.sh,解析 reward.txt / reward.json。
两种模式:shared(与 agent 同环境,便宜)vs separate(独立镜像 + 只挂白名单产物,隔离强)。
默认解析为 SHARED,需任务显式声明——这是风险点(见 L3 第 14 页)。
所有 agent 的输出统一转成 ATIF v1.8(schema_version),落盘 trajectory.json。它是 viewer、分析、SFT/RL 训练的唯一输入。
关键字段:steps[](source / message / tool_calls / reasoning_content / metrics)· llm_call_count · subagent_trajectories · final_metrics(token / cost / duration)。
跨任务聚合:mean / sum / min / max / 自定义脚本。
注意:job 聚合有 3 个坑——无 verifier 结果计 0、单 key 时输出键被改名、多 key 时缺失维度记 0。见 L3 第 13 页。
Harbor 有两套同名模型:models/task/config.py 描述「任务是什么」,models/trial/config.py 描述「这次执行怎么跑、从哪拿任务」。
| 同名类 | 声明层(task.toml 内容) | 执行层(运行时参数) |
|---|---|---|
| TaskConfig | schema 1.4:task / verifier / agent / environment / steps / artifacts | 任务来源指针:path / git_url / name / ref / download_dir |
| AgentConfig | timeout、user、相位级网络策略 | name、model、kwargs、env、skills、load_trajectory |
| EnvironmentConfig | 镜像、OS、资源、网络、healthcheck | type、import_path、force_build、override_cpu/mem… |
| VerifierConfig | timeout、env、environment_mode、collect | override_timeout、max_timeout、include_logs、disable |
| 步 | 位置 | 做什么 | 关键产物 |
|---|---|---|---|
| 1 | job_plan.py:35 from_config | 解析 skills → 展开任务 → 解析 metrics → 预下载任务 | JobPlan |
| 2 | job_plan.py:115 resolve_task_configs | tasks + datasets 展开成「任务来源指针」列表 | list[TaskConfig(exec)] |
| 3 | tasks/client.py:586 download_tasks | local/git/package 三类来源统一下载与缓存 | path + content_hash |
| 4 | job_plan.py:140 build_trial_configs | 三重笛卡尔积;继承 env/verifier/timeouts | list[TrialConfig] |
| 5 | trial/trial.py:469/532 | 下载任务 → Task(task_dir) → 分派单步/多步/regrade | Trial 实例 |
同一个 job 目录不允许换配置重跑:写出 lock 前比较已有 lock,不一致直接 FileExistsError(job.py:957),防止结果被污染。
TaskLock 只比 digest;TrialLock 逐项冻结;JobLock 的 trials 用无序比较——顺序不影响语义。
每个影响重放的输入都要:稳定摘要 + 比较规则 + 可读序列化;再加 ~100 行 Harbor 安装来源探测(direct_url.json / git rev-parse)。
multi_step_reward_strategy:mean 按 key 跨步均值(缺失 key 记 0、无 verifier 的 step 不进分母);final 取最后一步。
① 无 verifier 结果 → 计 0;② 单 key 时输出键被改名成 metric 名(如 mean);③ 多 key 时缺失维度记 0。
聚合口径直接决定结论:同一批 trial,换 metric 语义就能改变排名。评测论文必须报告口径。
error_policy.py:33 把 sandbox/provider 失败标成 grade=False,但 reward_valid 只在 TrialResult 上定义,聚合路径没有引用它——基础设施失败可能以 0 分计入平均。
影响:平均分被系统性拉低,且失败与模型能力无关。
trial/queue.py:222 重试前删除 trial 目录,最终只保留成功/最后一次尝试。中间失败样本与轨迹不可见,误差分析会失真。
影响:样本分布被重采样,方差被低估。
shared verifier 与 agent 共享文件系统;separate 模式才是隔离设计。但默认解析逻辑是 SHARED(verifier_mode.py:29),需要任务显式声明——默认值即风险。
影响:默认配置下攻击面更大,报告须披露 mode。
| FailureCause | retry | grade | reward_valid | 典型异常 |
|---|---|---|---|---|
| SANDBOX_FAILED | ✅ | ❌ | ❌ | EnvironmentStartTimeout、Healthcheck、BuildFailed |
| MODEL_PROVIDER_FAILED | 部分 | ✅/❌ | ❌ | ApiRateLimit、Authentication、Timeout |
| HARBOR_FAILED | ❌ | ❌ | ❌ | ServiceOperationsUnsupported、RegradeError |
| UNCLASSIFIED | ✅ | ✅ | ❌ | NonZeroAgentExitCodeError |
| AGENT_EXHAUSTED_BUDGET | ❌ | ✅ | ✅ | AgentTimeout、ContextWindowExceeded |
| AGENT_REFUSED_TASK | ❌ | ✅ | ✅ | AgentSafetyRefusal、ContentPolicyViolation |
| VERIFIER_FAILED | ❌ | ✅ | ❌ | VerifierTimeout、RewardFileNotFound |
| CANCELLED | ❌ | ❌ | ❌ | CancelledError |
separate verifier:独立镜像 + 只挂白名单 artifacts(manifest 化);shared 模式则共用文件系统。
四相位策略:agent 基线 / agent 相位 / verifier 基线 / verifier 相位;受限策略自动放行推理端点 host。
只收集 task.toml 声明的 artifacts;regrade 依据 manifest 判断「可重评性」。
RewardKit worker:在 verifier 容器内以非特权用户跑提交代码,不能改 grader、读 tests、写 reward。
在沙箱里安装并运行 Claude Code / Codex / Gemini CLI 等;需要解决安装、凭据注入、会话日志抓取、退出码语义、网络策略。
难点:air-gapped 任务中「安装要网、推理也要网」。
48 个适配器里大多数是 installed 型;Pier 的独有改动(构建期安装 + 推理代理)也集中在这一层。
由 Harbor 直接驱动模型 + 工具循环(如 Terminus、computer-use);能力声明更细,但少了「真实 CLI 的复杂度」。
适合做细粒度能力对比(token/步数可控、实验便宜),但离真实用户工作流更远——这也是「换 harness 分数就变」的根源之一。
setup() + run(instruction, environment, context) + capabilities(resume / atif / reasoning_effort…)。
Claude Code、Codex、Gemini CLI、OpenCode、mini-swe-agent、OpenHands、Cursor CLI… + ACP 协议统一接入。
同一模型换 harness → 分数差异巨大。ATIF 是唯一能对齐差异的表示;这也是 Pier 等 fork 的主攻方向。
没有它,每个 viewer/训练管线都要写 agent 专用解析器;有它,轨迹可比较、可回放、可训练。
代码已接受 ATIF-v1.8(新增音频内容),但文档仍写「current format is ATIF-v1.7」——文档滞后于代码,是引用时最容易错的点。
「同一模型、同任务、不同 harness」的 token/步数/工具调用模式差异,只有 ATIF 级对齐才能归因。→ 选题 B。
AGENTS.md 里写的 orchestrators/、inspect/、dataset/ 实际不存在;ATIF 文档版本也落后于代码。以代码为准。
Job.create 与 JobPlan.from_config 两条创建路径;_resolve_metrics 在 job.py 与 job_plan.py 各一份——先确认实际生效路径。
TaskConfig / AgentConfig / EnvironmentConfig / VerifierConfig 各有声明层与执行层两个定义;看 import,不看名字。
CHANGELOG 的 Unreleased 段就有 10+ 条 breaking(agent auth、网络策略、verifier 默认模式、skills 目录)。笔记必须带 commit。
| Pier 宣称的差异 | 分类 | 证据 |
|---|---|---|
| critique run(新沙箱里让新 agent 审查已完成 trial) | STILL UNIQUE | Harbor 全仓 0 命中;Pier 1,592 LOC + 唯一文档页 |
| air-gapped 下的 installed agent(构建期安装 + 推理代理) | PARTIALLY | 机制独有(squid egress proxy),但 Harbor 用相位式网络策略解决同一场景,且 allowlist 更丰富;Pier 反而拒收 Harbor allowlist 任务 |
| augmented ATIF v1.7(每 API turn 一步、peak_context_tokens 等) | PARTIALLY | ATIF 模型是 Harbor 逐行 copy(Harbor 已 v1.8);只有 2 个指标仍独有(peak_context_tokens / summarization_count) |
| chat 式 viewer | PARTIALLY | 实为「task-definition chat」,README 描述夸大 |
Pier 4.6 MB / 28k LOC vs Harbor 145 MB / 173k LOC;依赖 harbor>=0.5.0(落后上游 ~19 个 minor)。
拒收 Harbor 1.3/1.4 任务字段与 allowlist 模式;跨 fork 比较分数前必须重测任务集。
读 1 天,不是 1 周:只读 critique、安装/代理、两个 ATIF 指标、task chat 四处。
① Solver/Agent/Scorer/Tool/Sandbox 全是 Protocol + 注册表,第三方可注册;② Scorer 与 Metric 分离,自带 stderr / ci / bootstrap / pass@k;③ log 是版本化可重放产物(retry/rescore/edit);④ agent 可组合(as_solver / as_tool / handoff);⑤ limit 与 approval 是政策对象。
① 34 个沙箱后端 vs Inspect 2 个内置(容器/agent 负载的决定性差距);② 声明式任务包可分发(Inspect 任务是 Python 模块);③ 环境内验证 + 多步部分奖励 + regrade。
架构/版本/环境
声明 vs 执行、lock
格式/哈希/来源/lint
骨架完成
installed vs API
轨迹可比性
RewardKit/攻击面
并发/沙箱/成本
registry/Hub
Pier/Inspect
速通 1 天(P0+P3 主线+P6+跑一个任务)· 主线 9 天(P0→P9)· 研究 3 周(主干 + 选题卡)。
85 个 adapter 只读 2 个;48 个 agent 只读 3 类;34 个沙箱只读 docker+modal;省 60% 时间。
每阶段:能画数据流图 + 回答设计问题 + 写出「如果我来重写」三句话 + 引用路径可校验。
问题:agent 在什么条件下能「伪造通过」?防护的边界在哪?
素材:separate verifier、RewardKit worker(RFC-0003)、harbor-index 的泄题审计。
最小实验:3 类攻击 × 现有防护,统计拦截率。
问题:同模型不同 harness 的分数差,有多少来自 harness 而非模型?
素材:ATIF + 48 个 agent 适配器 + Pier 的计量字段。
最小实验:同模型 2–3 个 harness 跑同一小任务集,做 token/步数/工具调用归因。
问题:continuous benchmark 与静态榜单如何可比?80 题蒸馏是否引入偏差?
素材:85 份 parity 实验、harbor-index 蒸馏流程、任务 content hash。
最小实验:复现 2 个 adapter 的 parity,统计分数偏移分布。
任务 = 内容哈希;执行 = lock.json 合同;重放 = manifest 驱动。任何「分数」都要能回答:哪个任务版本、哪个 harness、哪套配置。
证据:TaskLock.digest、lock 冲突检测、regrade 的 artifact manifest。
评分侧隔离(separate verifier / 网络相位 / artifact 白名单 / 非特权 worker)+ 失败语义表。剩余风险:grade 未接入聚合、重试幸存者偏差。
证据:error_policy 的 8 类失败、RewardKit worker、shared/separate 两种模式。
ATIF 把不同 harness 的轨迹对齐;48 个 agent 适配器 + 85 个 benchmark adapter 让比较规模化。可比性是评测的产品,不是副产品。
证据:ATIF v1.8、统一 Task 格式、85 份 parity 实验。
| 仓库 | 版本/commit | 用途 |
|---|---|---|
| harbor | v0.24.0 @6099b8c | 主体(1,593 py / 55 models / 85 adapters) |
| pier | 0.3.1 @4d3c14d | fork 差异(critique 等) |
| inspect_ai | 0.3.284 @641b871 | 跨领域方法论对照 |
| terminal-bench | @e67a2cb | 156 个真实任务 |
| harbor-index | @5399ea1 | 80 题高信号 benchmark |
ROADMAP.md · notes/00..03 · notes/inspect-ai-map.md · notes/pier-diff-map.md · scripts/check_refs.py
harborframework.com/docs · github.com/harbor-framework · hub.harborframework.com · github.com/UKGovernmentBEIS/inspect_ai · tbench.ai
G 总览 · F 全屏 · Ctrl/Cmd+P 导出 PDF(打印样式已适配 1280×720)
| → Space PageDown | 下一页 |
| ← PageUp | 上一页 |
| Home / End | 首/尾页 |
| G / Esc | 总览 / 关闭 |
| F | 全屏 |
| Ctrl/Cmd+P | 导出 PDF(打印) |
| ? / H | 本帮助 |
点击画面右侧 1/3 下一页、左侧 1/3 上一页;支持触摸滑动。