편집자 노트

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 5timeoutMs: 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 独立类别(不会把环境故障逼成改测试)。

许可证

MIT

REPOSITORY SIGNALS

보안 및 설치 증거

이 점수는 공개 저장소 메타데이터와 이 사이트에 등록된 설치 증거에만 기반하며, 코드 보안 감사와 다릅니다.

출처 추적 가능

공개 플러그인 카탈로그에서 왔으며, 공개 GitHub 저장소로 연결됩니다.

라이선스

저장소가 MIT 라이선스를 선언했습니다.

유지보수 활동

최근 180일 내 코드 업데이트가 있습니다.

설치 증거

재현 가능한 정확한 설치 메타데이터가 아직 등록되지 않았습니다. 저장소 설명에 따라 직접 확인하세요.

설치 라이프사이클 스크립트

검사한 패키지 메타데이터에 설치 라이프사이클 스크립트가 선언되지 않았습니다.