已经装好 DSH 的读者,可以直接用这一篇完成一次有明确答案的练习。我们要修复采购合计:当前结果 55 元,正确结果 83 元。这不是“帮我优化项目”的开放题;允许修改的文件、输入数据和通过条件都写好了。
下载材料,知道每个文件的职责
下载练习 ZIP,解压到独立目录。里面有四个文件,没有依赖;只需要 Node 即可运行测试。安装与工作区配置尚未完成时,先读 一站式上手。
| 文件 | 用途 | 本次能否修改 |
|---|---|---|
| README.md | 需求说明 | 不修改 |
| budget.mjs | 合计计算函数 | 只修改这里 |
| budget.test.mjs | 三项自动验收 | 不修改 |
| task.txt | 完整任务提示 | 不修改 |
这一练习没有数据库、网络请求或个人材料,便于比较同一个任务在不同模型、权限和提示下的表现。
先用人工算出标准答案
| 商品 | 单价(分) | 数量 | 小计(分) |
|---|---|---|---|
| 笔记本 | 1200 | 2 | 2400 |
| 台灯 | 3500 | 1 | 3500 |
| 笔 | 800 | 3 | 2400 |
| 合计 | 8300 |
程序当前把单价直接相加,得到 1200 + 3500 + 800 = 5500。单位使用整数“分”,是为了让本次练习不混入浮点精度问题;这不是完整的财务计算系统。
第一次运行:失败是正确起点
在练习目录执行:
node --test budget.test.mjs
**本站实际基线:**三项测试,一项通过、两项失败。合计测试为 5500 !== 8300;三件单价 199 分的商品应为 597 分,程序却返回 199。空订单测试通过。
为什么要先测?它让你确认材料真的有这个问题,也排除了“模型把测试命令说对了,但根本没跑”的误判。把这次输出留着,稍后做前后比较。
第一个提示:只收集依据
在 DSH 标准模式中选择练习工作区,发送:
阅读 README.md、budget.mjs、budget.test.mjs。
请解释当前实现与需求的差异,引用具体文件和表达式。
暂时不要修改,不要安装依赖,不要执行命令。
如果你没读取到文件,明确说明。
检查过程里是否有文件读取记录。答案应该提到数量被忽略,而不是先建议增加框架、调整目录或重写全部测试。
如果模型直接给出修复代码也不用立刻复制:先问“这个判断来自哪个文件和测试?”本轮练习的重点是把结论与证据连接起来。
第二个提示:授权一个明确改动
确认分析后发送:
请按刚才的分析修复。
只允许修改 budget.mjs,不改函数导出名,不改测试,不添加依赖。
使每项金额等于 unitPriceCents * quantity,再求和。
完成后运行 node --test budget.test.mjs,并报告实际输出。
如果命令无法运行,保留改动并说明未验证,不要编造结果。
允许文件修改不代表授权其他行为。遇到范围外操作,应暂停并检查。read 与 edit 是默认文件工具的真实名称;模型也可能选择其他可用工具,不能要求所有真实运行都逐字复刻演示。
观察 DSH 做了什么
对于默认文件工具,一条常见路线是:
- 模型返回
read调用,参数指向budget.mjs。 - DSH 读取文件,把结果写回会话并用于下一次模型请求。
- 模型返回
edit调用,带上精确匹配的旧文本与新文本。 - DSH 经过当前权限与执行策略处理后,修改文件或返回失败。
- 模型在后续请求中看到工具结果,继续测试、解释或结束。
这不是“模型直接写磁盘”。模型产生调用意图,DSH 的工具执行器操作文件。默认组合的读后改约束由另一个观察策略插件提供,不是所有 edit 的硬编码通用规则。更多解释见 机制文章。
第三个步骤:独立检查产物
在自己的终端执行:
node --test budget.test.mjs
本站修复后结果为 三项通过、零项失败。用编辑器看差异,应只需要把合计表达式改成:
export function totalCents(items) {
return items.reduce((sum, item) => sum + item.unitPriceCents * item.quantity, 0);
}
你的模型可以使用等价写法。验收应看行为与修改范围,不能仅因代码排版不同就判失败。
如果使用 Git,运行 git diff -- budget.mjs budget.test.mjs 检查。没有 Git 也可以把原 ZIP 解压到另一个目录,在编辑器里比较两个文件。尤其确认测试仍在检查 8300 和 597,而不是把期望值改成错误输出。
没有全通过,按结果处理
| 结果 | 通常应该先查什么 | 下一次给模型的信息 |
|---|---|---|
| 仍为 5500 | 改动没有落盘、改错目录或编辑失败 | 真实文件内容与 edit 结果 |
| 语法错误 | 括号、导出或意外改动 | 完整错误首行和对应代码 |
| 测试找不到文件 | 终端所在目录不对 | pwd / Get-Location 的目录 |
| 聊天说通过,终端失败 | 模型未测试或测试的是其他文件 | 独立测试输出,要求解释差异 |
| 不断重复失败操作 | 没有利用错误结果更新策略 | 停止重复,先总结失败原因 |
避免发送“再试试”让它无目标重跑。给出新证据,再要求一个具体修正。
进阶练习:把拒绝也当成结果
在新的会话中选择只读权限,再要求修改练习文件。观察实际策略是否拒绝或要求确认。不要预设一定出现某一种弹窗;不同工具和配置的处理可能不同。
如果拒绝修改,正确状态是“文件仍旧、测试仍失败,模型应解释限制”,而不是动画直接跳到绿色成功。完成观察后通过 /permission 调整当前会话权限,再重新提出合法改动。
本站验证范围与可复现记录
我们用 DSH 0.1.2-rc.1 的真实执行器验证了 read → edit → 工具结果回传,并独立运行测试;返回工具调用的是本地确定性脚本服务,没有使用 DeepSeek API。它验证传输与工具链,不验证模型能否自主发现错误。
查看验证摘要 JSON。你用真实模型完成后,可以留下如下记录:
DSH 版本 / Node 版本 / 系统:
模型与提供方:
权限模式:
基线:pass __ / fail __
修改了哪些文件:
独立验收:pass __ / fail __
未完成的检查:
不要在记录中写密钥。一次成功之后,再考虑把这套步骤保存成 Skill,而不是立刻扩大到整个生产仓库。