dsh-verify-judge
Goal-completion verification gate for DeepSeek Harness: intercept update_goal(complete), run workspace verification commands, and only let the goal close when they pass
安装
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:zriyox/dsh-verify-judge说明文档
阅读完整 README ↗dsh-verify-judge
English | 中文
一个 DeepSeek Harness(dsh)插件:不让 agent 自己给自己判卷。当模型调用 update_goal 宣布"完成"时,插件先在工作区里跑验证命令(测试套件);任何命令非零退出就拒绝盖章,并把失败输出喂回模型作为下一步指令;全部通过才放行。
动机:模型自评存在"迎合偏置"(会为自己的错误找理由)。verify-judge 把"模型说完成了"换成"测试套件说完成了"。
解决了什么
goal 自主续跑模式下,agent 会自己一轮轮干活——但"我完成了"这个瞬间此前是纯自说自话:目标模糊或测试还是红的,模型也可能直接盖章。verify-judge 把盖章变成有门槛的动作:只有工作区自己的验证命令全部退出 0,goal 才能关闭。
实测数据(2026-08-14 真实 API、headless profile)
同一工作区、同一个失败测试(add 被写成 a - b),只差闸门开关:
| 运行 | 闸门 | 模型行为 | 结果 |
|---|---|---|---|
| A/B 对照 | 关(disabled: true) | 建 goal 后测试还红着就直接盖章 | ❌ 盖章通过——测试失败却"完成",0 轮 |
| A1 | 开 | 不修代码直接举手 | 🚫 被拒:"Verification failed — the goal cannot be marked complete yet",反馈带失败命令和输出尾部;goal 保持 active |
| A2 | 开 | 按反馈修好后再次举手 | ✅ npm test 退出码 0 后放行,goal complete 并自动 disarmed |
| A4 | 开 | 在无检测命令的工作区(写个文本文件) | ✅ 正常盖章——无可验内容,默认 allow |
完整理念演示(goal + plan.md 验收清单 + 闸门):agent 修好 capitalize、补上缺失的 reverseWords、自己把 plan.md 三项验收全部打勾,然后盖章——闸门重跑 npm test(2 过 0 败)后放行。磁盘上的 plan.md(三勾齐全)与测试现实一致。
演示
仓库自带可复现演示:demo/——一个带故意失败测试的工作区 + plan.md 验收清单 + run-demo.sh,完整走"被拒 → 修复 → 放行"闭环,还附 A/B 对照(禁用闸门后看着它带病盖章)。
安装
dsh plugin --profile web add github:zriyox/dsh-verify-judge
# 或本地目录:
dsh plugin --profile web add /absolute/path/to/dsh-verify-judge
重启 dsh web(或等 patch 监听热重载)。之后所有会话的 update_goal(complete) 都会过这道闸。
工作原理
模型调用 update_goal(action: "complete")
→ tools/pre-execute 安检口拦截
→ 选验证命令:config.commands 优先;否则在工作区自动检测
package.json 带 scripts.test → 按 lockfile 选包管理器跑
test
go.mod → go test ./...;Cargo.toml → cargo test
→ 经 ctx.shell 执行(继承部署的沙箱)
→ 全部退出码 0 → next() 放行盖章
→ 有失败 → deny,模型收到失败命令 + 退出码 + 输出尾部作为修复指令