Lab 002:同一任务交给 Claude Code、Codex、OpenCode,谁更稳?
工具对比如果只看功能表,很容易变成主观偏好。本文设计一个可复现的横评实验:同一批任务、同一代码库、同一验收标准,分别交给 Claude Code、Codex CLI 和 OpenCode,比较通过率、改动范围、成本、耗时和人工干预次数。
一、实验目标
本实验关注“稳定性”,不是只看某一次输出是否惊艳。
| 指标 | 说明 |
|---|---|
| 一次通过率 | 首次执行后测试和检查全部通过的比例 |
| 平均耗时 | 从启动到产出可评审 diff 的时间 |
| 平均成本 | 单任务 Token 或美元成本 |
| 改动聚焦度 | 是否只修改任务相关文件 |
| 人工干预次数 | 中途需要人类补充说明或纠正的次数 |
| 结果可审查性 | 是否输出清楚的修改摘要和验证证据 |
二、任务集设计
任务集要覆盖不同难度,不能只挑某个工具擅长的场景。
tasks:
- id: "bugfix-001"
type: "bugfix"
title: "修复金额四舍五入错误"
acceptance:
- "新增边界值测试"
- "pytest tests/billing -q 通过"
- id: "feature-001"
type: "feature"
title: "新增用户导出 CSV 接口"
acceptance:
- "支持 created_after 参数"
- "新增 API 测试"
- "OpenAPI 文档更新"
- id: "review-001"
type: "review"
title: "审查认证模块潜在安全问题"
acceptance:
- "输出 P0/P1/P2 分类"
- "每个问题包含文件和修复建议"
- id: "refactor-001"
type: "refactor"
title: "将同步邮件发送改为异步任务"
acceptance:
- "业务行为保持不变"
- "新增失败重试测试"三、统一运行协议
为避免比较不公平,每个工具都使用同一份任务模板。
你将完成一个受控实验任务。
## 任务
{{title}}
## 代码库
当前目录就是待修改仓库。
## 约束
- 只修改完成任务所需的文件
- 不要引入新依赖,除非验收标准明确要求
- 修改后必须运行指定验证命令
- 最后输出:修改摘要、验证结果、剩余风险
## 验收标准
{{acceptance}}
## 验证命令
{{verify_command}}四、执行脚本
下面的脚本展示如何统一调度三个工具。实际项目中可以替换命令适配本地环境。
#!/usr/bin/env bash
set -euo pipefail
TASK_ID="$1"
TOOL="$2"
BASE_DIR="${BASE_DIR:-/tmp/agent-benchmark}"
PROMPT_FILE="$BASE_DIR/prompts/$TASK_ID.md"
RUN_DIR="$BASE_DIR/runs/$TASK_ID/$TOOL"
rm -rf "$RUN_DIR"
git clone "$REPO_URL" "$RUN_DIR"
case "$TOOL" in
claude)
(cd "$RUN_DIR" && claude -p "$(cat "$PROMPT_FILE")")
;;
codex)
(cd "$RUN_DIR" && codex exec "$(cat "$PROMPT_FILE")")
;;
opencode)
(cd "$RUN_DIR" && opencode run -f "$PROMPT_FILE")
;;
*)
echo "unknown tool: $TOOL" >&2
exit 1
;;
esac
(cd "$RUN_DIR" && git diff --stat > "$BASE_DIR/results/$TASK_ID-$TOOL.diffstat")
(cd "$RUN_DIR" && git diff > "$BASE_DIR/results/$TASK_ID-$TOOL.patch")参数说明
| 参数 | 说明 |
|---|---|
TASK_ID |
任务编号,对应 prompts 目录里的任务文件 |
TOOL |
claude、codex、opencode |
BASE_DIR |
实验输出目录 |
REPO_URL |
被测代码仓库地址 |
五、评分卡
{
"task_id": "feature-001",
"tool": "codex",
"result": {
"completed": true,
"tests_passed": true,
"changed_files": 5,
"unrelated_files": 0,
"manual_interventions": 1,
"duration_seconds": 184,
"estimated_cost_usd": 0.42
},
"scores": {
"correctness": 34,
"focus": 18,
"test_quality": 17,
"reviewability": 8,
"cost_efficiency": 7,
"total": 84
}
}| 评分项 | 分值 | 说明 |
|---|---|---|
| 正确性 | 40 | 功能是否完成,测试是否通过 |
| 聚焦度 | 20 | 是否避免无关修改 |
| 测试质量 | 20 | 是否覆盖关键路径和边界值 |
| 可审查性 | 10 | 摘要、风险、验证结果是否清楚 |
| 成本效率 | 10 | 成本和耗时是否合理 |
六、结果展示表
任务 工具 通过 文件数 干预 成本 总分
bugfix-001 Claude Code 是 2 0 0.18 91
bugfix-001 Codex CLI 是 2 0 0.09 89
bugfix-001 OpenCode 是 3 1 0.12 82
feature-001 Claude Code 是 6 0 0.58 88
feature-001 Codex CLI 是 5 1 0.42 84
feature-001 OpenCode 否 4 2 0.36 61七、常见偏差控制
| 偏差 | 控制方式 |
|---|---|
| 顺序偏差 | 随机化工具执行顺序 |
| 缓存偏差 | 每次使用干净 clone |
| 人工提示偏差 | 使用统一 prompt,不中途追加私货 |
| 验收偏差 | 由脚本执行同一套验证命令 |
| 评审偏差 | 盲评 patch,先不看工具名 |
八、横评结论怎么写
横评文章不要写成“某某工具天下第一”,而要输出任务适配建议:
recommendation:
simple_bugfix:
preferred: "Codex CLI"
reason: "速度快、改动小、成本低"
complex_refactor:
preferred: "Claude Code"
reason: "跨文件推理和一致性更强"
interactive_iteration:
preferred: "OpenCode"
reason: "TUI 体验好,适合人机来回调整"总结
真正有价值的工具横评,不是功能清单,也不是单次体验,而是可复现的任务集、统一验收标准和结构化评分。只有这样,团队才能知道什么任务该交给什么工具,而不是靠感觉选型。