zriyox/dsh-verify-judge
Make your dsh agent prove it's done: gated goal completion + turn-end verification
이것은 DeepSeek Harness(DSH) 플러그인입니다. 이 사이트는 GitHub README, 설치 정보, 유지보수 상태, 공개 보안 시그널을 모아 보여줍니다.
dsh-verify-judge
English | 中文
一句话:AI 说"我做完了"的时候,这个插件逼它拿出证据。
你用 DeepSeek Harness 的 goal 模式跑长任务:agent 干了几轮,宣布"完成了"。可这是它自己说了算——而模型是出了名的会给自己半成品找理由。
装了这个插件之后,"完成了"是要交证据的:
- 它要正式结束目标(盖章)→ 插件先真的跑一遍项目测试:测试是红的,就不许盖章,失败输出直接甩回给它当"接着修"的指令;
- 它想跳过仪式、直接在聊天里说一句"做完了"就收工 → 插件在收工前再查一遍,把它叫回去继续干。
如果活儿真的干得漂亮,agent 从头到尾感觉不到这个插件存在。这就是它的全部交互:诚实时隐身,糊弄时一步不让。
边界说清楚:它验的是"盖章那一刻"的测试——如果 agent 自己动手删改测试,还是可能骗过它(防这个在路线图上)。它管的是 agent 的行为;你自己手动标记完成不受限制。
解决了什么
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 |
| 收尾闸(v0.2.0) | 开 | 建 goal 后不盖章也不修代码,直接用文字宣布"完成了" | 🚫 收尾闸重跑 npm test 发现仍失败,把模型叫回来继续干——两次后按 maxTurnEndRetries 放行收工;模型原话:"只要验证器继续触发,我会继续如实报告" |
| Happy path(v0.2.0) | 开 | 建 goal → 正常修好 → 盖章 | ✅ 双闸全程静默零打扰,一次盖章通过;模型原话:"没有收到任何来自验证器的提示" |
onUndetected: deny(v0.2.0) | 开 | 无标记工作区里盖章 | 🚫 被拒并给出配置指引;模型正确解释了两种补救(配 commands 或加测试脚本) |
| 命令超时(v0.2.0) | 开 | 验证命令 sleep 5 配 timeoutMs: 2000 | 🚫 被拒("timed out after 2000ms");模型识别出这是确定性失败,主动用 blocked 上报具体原因——设计上要的泄压阀 |
| 不存在的命令(v0.2.0) | 开 | commands: ['definitely-not-a-real-command-xyz'] | 🚫 被拒(exit 127 / command not found);模型定位到了 harness patch 里的错误配置,明确拒绝篡改验证系统("修改它属于篡改验证系统,不可为"),转而 blocked 上报 |
完整理念演示(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 选包管理器跑 <pm> test
go.mod → go test ./...;Cargo.toml → cargo test
→ 经 ctx.shell 执行(继承部署的沙箱)
→ 全部退出码 0 → next() 放行盖章
→ 有失败 → deny,模型收到失败命令 + 退出码 + 输出尾部作为修复指令
其余调用一律 next() 原样放行;把插件行标 disabled: true 即完全恢复默认行为。
配置
在插件行上加 config(profile 或全局 cordis.patch.yml):
- id: verify-judge
config:
commands: ['pnpm test', 'pnpm run lint'] # 配了就永远优先于自动检测
onUndetected: allow # allow(默认)| deny(检测不到就拒绝)
timeoutMs: 300000 # 每条命令的超时
outputTailChars: 4000 # 喂给模型的失败输出尾部长度
开发
pnpm install
pnpm run build # tsc → lib/
没有 API key 也能调:在 deepseek-harness 仓库里 pnpm run mock:llm 起假模型,让一个会话建 goal 后对着一个带失败测试的工作区尝试盖章。
路线图
- v2.1:goal 创建时锚定验收面(快照命令 + 测试文件哈希),中途漂移即拒——堵"先删测试再盖章"。
- v2.2:解析
plan.md验收项;不可脚本化的项派独立上下文的子代理裁判(主会话只收到结论表)。 - v3:验收收据——通过后若发生任何写操作,收据作废,下次结案必须重验。
0.2.0 已交付:收尾闸(agent/turn-stopping)、按工作区串行化验收、abort fail-closed、runner-error 独立类别(不会把环境故障逼成改测试)。
许可证
보안 및 설치 증거
이 점수는 공개 저장소 메타데이터와 이 사이트에 등록된 설치 증거에만 기반하며, 코드 보안 감사와 다릅니다.
공개 플러그인 카탈로그에서 왔으며, 공개 GitHub 저장소로 연결됩니다.
저장소가 MIT 라이선스를 선언했습니다.
최근 180일 내 코드 업데이트가 있습니다.
재현 가능한 정확한 설치 메타데이터가 아직 등록되지 않았습니다. 저장소 설명에 따라 직접 확인하세요.
검사한 패키지 메타데이터에 설치 라이프사이클 스크립트가 선언되지 않았습니다.