.eval.ts 里,分三步:
- 把起始项目放进 Sandbox,也就是 Fixture。
- 给 Agent 发一个具体任务。
- 用文件内容、命令结果和 diff 验收,开放式的质量再交给 Judge。
推荐目录结构
先把起始项目和评估用例分开放。Agent 能看到的只有你上传进 Sandbox 的部分,评估代码和验证材料留在外面:workspaces/ 放 Agent 能看到的起始项目。.eval.ts 决定什么时候上传、发什么任务、怎么检查结果。experiments/ 选择 Agent 和模型,以及是否加载 Skill 或插件。
把起始项目放进 Sandbox
Agent 要在一个真实项目里工作,第一步是把项目上传进 Sandbox:t.sandbox.writeText() 直接写入,适合小任务或安全检查脚本。
fileChanged 不通过时,先用 pnpm exec niceeval show @<locator> --diff 看 Agent 实际改了哪些文件。
写任务 prompt
Prompt 要像一张真实工单:写清目标和约束,但不要把验证答案透露出去。验证文件和代码
Agent 跑完后,读出它改过的文件,检查关键代码是否到位:t.sandbox.fileChanged() 只看 Agent 在 t.send() 期间的改动,判断目标文件有没有被它改过。你自己上传或写入的文件不算。记录规则见 Sandbox Agent · 让文件改动能被记下来。
运行项目测试或检查脚本
文本匹配只能看代码长什么样,跑一遍才知道它对不对。对 Coding Agent 任务,真实命令通常更可靠。下面在 Agent 跑完后写入一个检查脚本并执行:commandSucceeded() 不通过时,用 pnpm exec niceeval show @<locator> 查看命令的退出码和输出。
用 Experiment 做对照组
要知道 Skill 或插件有没有用,就让同一批任务分别在装和不装的条件下跑。条件写在 Experiment 里:它选择 Agent、固定运行配置。命令行第一个参数选 Experiment,后面的参数按 ID 前缀筛选评估用例。不要把 Agent 名、插件名或 URL 写进命令行参数。experiments/baseline.ts:不加额外配置的 Agent。experiments/with-skill.ts:同一个 Agent,用生命周期 Hook 或 Plugin 写入CLAUDE.md。- 两组用同一批评估用例、同一模型、同样的
attempts和预算。
pnpm exec niceeval show --experiment baseline --experiment with-skill 在终端对比,或用 pnpm exec niceeval view 在浏览器里看。两组成绩几乎一样时,先确认 with-skill 的 Sandbox 里真的有 CLAUDE.md。
什么时候用 Fixture
- Agent 要修改真实文件。
- 要运行项目的测试、构建或 lint。
- 要比较代码改动。
- 评估的是 Claude Code、Codex 这类 Coding Agent。
- 要比较 Skill、插件或 Hook 能否改善真实任务的结果。