哪些内容经过了实际验证
先固定输入和成功标准
输入为 orders.csv、report.mjs 和 report.test.mjs。交付物是 report.mjs 的小范围修改、三项通过的断言、总额 2000 和简短解释。不得修改输入数据或削弱测试。记录实际模型、Provider、工具配置、追加提示和耗时;条件不同时,不能把结果差异全归因于 Harness。
为什么在练习中这样检查
Pi 作者 Mario Zechner 在 2025 年的设计文章中强调上下文可见性与精简工具集。落实到本题,就是记录两边实际读了哪几个文件,又加载了哪些额外指令。Anthropic 的 Agent 评估文章区分对话记录与最终结果,因此这里既检查工具日志,也检查保存后的 report.mjs 和未被改动的测试,不能只给结束语打分。2025 年文章提供设计背景;当前 Pi 命令仍以现行文档为准。
创建一个能看见错误的小项目
准备 Node.js 24 和 Bash 终端,在全新的练习目录中操作。命令适用于 macOS/Linux 的 Bash;Windows 可用 Git Bash 或 WSL。harness-lab 目录必须尚不存在。示例项目无需 npm 依赖、账户、私人数据或生产文件。CSV 特意不含引号内逗号,这不是通用 CSV 解析器练习。
create_harness_lab() {
mkdir harness-lab || return
cd harness-lab || return
cat > orders.csv <<'CSV'
id,status,cents
A,paid,1200
B,refunded,700
C,paid,800
D,pending,400
CSV
cat > report.mjs <<'JS'
export function totalPaid(csv) {
const rows = csv.trim().split(/\r?\n/).slice(1);
return rows.map(row => row.split(','))
.filter(([, status]) => status !== 'pending')
.reduce((sum, [, , cents]) => sum + Number(cents), 0);
}
JS
cat > report.test.mjs <<'JS'
const { default: assert } = await import('node:assert/strict');
const { readFileSync } = await import('node:fs');
const { default: test } = await import('node:test');
const { totalPaid } = await import('./report.mjs');
const csv = readFileSync(new URL('./orders.csv', import.meta.url), 'utf8');
test('only paid orders count', () => assert.equal(totalPaid(csv), 2000));
test('refunds alone count as zero', () => assert.equal(totalPaid('id,status,cents\nB,refunded,700\n'), 0));
test('an empty ledger counts as zero', () => assert.equal(totalPaid('id,status,cents\n'), 0));
JS
cp report.mjs report.original.mjs
node --test report.test.mjs
}
create_harness_lab首次运行应有两项断言失败、一项通过。错误实现把已退款订单的 700 分计入,得到 2700,而正确结果是 2000。规则是只统计 status 为 paid 的行;refunded 与 pending 均不计入。金额统一使用整数分。
保留两个相同起点的独立目录
在任一 Agent 修改文件前执行复制。DSH 使用 harness-lab,Pi 使用 harness-lab-pi;两边都有相同错误实现和原件备份。会话分支不等于独立工作树,比较时不要让两个 Agent 同时修改一个目录。
copy_harness_lab() {
(cd .. && test ! -e harness-lab-pi && cp -R harness-lab harness-lab-pi)
}
copy_harness_lab在 DSH 中逐步完成任务
- 01
核对运行时与模型
先完成文末 Alpha 快速上手,使用其精确源码构建方式。在 Settings → Models 中配置自己的 Provider 凭据,不把密钥写入提示词,并记录实际选中的模型。
- 02
显式选择项目
在 Web UI 选择工作区,添加 harness-lab 的绝对路径。新 Web UI 尚未选中工作区,即使 dsh 进程是从某个项目目录启动的。
- 03
检查实际权限
这个一次性本地练习可在支持时使用 workspace-write 预设,并查看审批请求。它组合 workspace-write 沙箱模式和 ask 策略,边界由已配置的执行器落实;不代表每次文件写入都会弹窗。
- 04
执行并观察
发送下方共用提示词,查看读取、命令、修改和测试结果。请求访问练习目录之外或安装无关依赖时,先停止并收窄任务。
在 Pi 中完成同一个任务
按 Pi 官方快速上手安装后,进入 harness-lab-pi。用 /login 和 /model 配置并选择支持的模型,条件允许时与 DSH 一致。先用下方精简工具集检查文件;禁用可选资源发现,避免比较时悄悄加载无关扩展或项目指令。
npm install -g --ignore-scripts @earendil-works/pi-coding-agent
cd ../harness-lab-pipi --no-extensions --no-skills --no-prompt-templates --no-themes --no-context-files --tools read,grep,find,lsPi 没有内置的文件、进程、网络或凭据权限系统。工具白名单限制模型能调用哪些工具,不改变进程的操作系统权限。不可信项目应放在容器、虚拟机或其他经过验证的操作系统隔离环境中。官方隔离指南说明了为什么仅改变工具执行路径,不能隔离仍在宿主机运行的其他扩展。
pi -c --no-extensions --no-skills --no-prompt-templates --no-themes --no-context-files --tools read,edit,write,bash,grep,find,ls给两边相同且有明确范围的任务
在这个一次性练习项目中修复 report.mjs,使 totalPaid 只统计 paid 行。先读 orders.csv 和 report.test.mjs,执行 node --test report.test.mjs 并报告原始失败。不要改 orders.csv、report.test.mjs 或 report.original.mjs;不要安装依赖或访问其他目录。以最小实现修改完成修复,重跑全部三项断言,并根据 orders.csv 计算总额。最后列出修改文件、实际测试结果、总额和局限。命令因环境原因失败时,请与断言失败明确区分。独立核验,不能只读 Agent 的结束语
node --test report.test.mjs
node --input-type=module -e "import {readFileSync} from 'node:fs'; import {totalPaid} from './report.mjs'; console.log(totalPaid(readFileSync('orders.csv','utf8')))"
diff -u report.original.mjs report.mjs应看到三项测试通过,并单独输出总额 2000。diff 通常只把筛选条件改为 status === 'paid';其他实现只要遵守相同规则且保留测试,也可以接受。diff 发现文件不同会返回 1,在这里是预期结果,不是测试失败。找不到 Node 或权限不足属于环境失败,不能据此判断计算逻辑错误。
比较你实际完成了哪些工作
| Token | 作用 | 检查项 |
|---|---|---|
| 起始上下文 | DSH:选择工作区,检查会话与工具。Pi:当前目录及发现的上下文决定起点,本练习显式关闭可选资源发现。 | 记录精确目录与加载的上下文;相同提示词不代表上下文相同。 |
| 审批与隔离 | DSH:预设组合沙箱和审批设置。Pi:可以控制工具暴露,更强的操作系统边界需要另行配置。 | 记录实际边界和人工审批,不能用弹窗次数衡量安全性。 |
| 计划与委派 | DSH 的组合可包含计划和子 Agent。Pi 核心把 plan-mode、子 Agent 等工作流程交给扩展或包。 | 这个三文件修复无需两者。官方 plan-mode 示例展示扩展做法,本练习不要求额外安装。 |
| 复核与继续 | DSH 记录会话事件日志;Pi 提供 /session、/resume、/tree、/fork。 | 保存经过测试的补丁和交接说明。会话历史提供上下文,但不会恢复已编辑的文件。 |
| 费用与速度 | 模型、提示词、已加载扩展和等待审批的时间都会影响结果。 | 填写观察值或“未测量”;单个合成任务不能形成普遍排名。 |
有意识地暂停、继续与恢复
停止前让 Agent 汇总目标、已改文件、实际命令结果和下一步。DSH 中重新打开原会话并核对工作区;Pi 在同一项目运行 pi -c 继续最近会话,或 pi -r 选择会话。/tree、/fork 分支的是对话历史,不会回滚文件。撤销失败尝试前先保存尝试文件,再只恢复练习实现。
cp report.mjs report.attempt.mjs
cp report.original.mjs report.mjs
node --test report.test.mjs恢复后应再次出现原来的两项失败,这是有意进行的恢复检查。保留 report.attempt.mjs 便于比较。在真实仓库中应使用干净分支或工作树,并逐文件审阅恢复;不要把本练习的覆盖命令用于无关工作。
完成一次审阅后再选择
如果日常工作适合共享 Web 工作台、可见的会话和工具状态、组合式流程,可以试 DSH;如果已有终端工具链,更喜欢显式 CLI 启动与小型可扩展核心,可以试 Pi。完成相同任务并读过 diff 后再决定。两种界面都不能保证补丁正确,也不会自行让不可信代码变安全。
Harness/版本:
模型/Provider:
工作区及初始文件:
实际工具/权限配置:
追加提示与人工审批:
测试:原始 __ 项失败;最终 __ 项通过
实际总额:
修改文件:
耗时/工具报告用量(或未测量):
恢复结果:
剩余局限:带着具体目标继续
阅读一手官方资料
常见问题
修改前需要了解的事项
关于格式、兼容性、证据与回滚的简明说明。
这篇指南核实哪些范围?
本指南覆盖:固定 DSH Alpha 源码与现行 Pi 官方 CLI、会话、扩展文档;已在本地执行的订单统计合成例子、参考修复与指定文件恢复;没有声称完成模型横评或真实 Provider 业务任务
我应该先做什么?
从一个可以观察结果的任务开始:报表错误地统计了已退款订单。创建两份独立项目,在两边都支持时选同一模型,并固定验收测试。比较的是得到可审阅补丁所需的工作,而不是两段产品介绍。
最需要记住的边界是什么?
DSH 步骤采用源码构建的 0.1.3-alpha.1,固定提交 d347e703908d0406b7a7ef80e3a0e594d86b2215。Pi 命令已按 2026 年 9 月 6 日的官方文档核对。订单例子与参考修复已在本地运行;尚未用模型实测两套提示词的比较结果。
三项测试通过就能证明哪个 Harness 更好吗?
不能。它只证明这份实现满足三个示例项目断言。要得出更广泛结论,应增加任务,并保持模型、输入和验收标准一致。
DSH 和 Pi 能共用会话文件吗?
不要假设格式通用。可以复制项目和纯文本交接说明,但应保留各自的会话文件。DSH Alpha 的版本迁移不是 Pi 会话导入器。
这个示例需要安装 plan-mode 插件吗?
不需要,简短的检查、修改、测试循环就够了。确实需要相应流程时再阅读官方 Pi 示例;加载扩展是单独的信任决定。
继续学习
查看验证证据并继续操作
对比已发布制品,或返回安装文档。