dsh-verify-cheap:用最低成本验证改动

前言

在 DSH 里改完代码,agent 往往要么跑全量测试、要么用固定 sleep 等构建或 dev 进程就绪。前者耗时长,后者容易白等或仍不稳定。常见做法是凭经验选检查项、凭印象报耗时,很难在会话之间沉淀「这一档够不够、还能不能再降」。

下面介绍社区插件 dsh-verify-cheap(维护者 Ushio155,分类:工作流)。它把一份名为 verify-cheap 的技能装进 harness,并附带两个零依赖 Node 脚本,用来:按成本阶梯选能给出明确结论的最便宜检查、用条件轮询替代固定延时、用实测耗时替代口头估计。

这是什么

dsh-verify-cheap 是一个可安装的 DSH 插件,包内只有一份技能:用最低成本验证改动。安装时通过 cordis.patch.yml 把包内的 skills/ 注册为技能根,技能随插件进入 agent 的技能目录。技能正文与 SKILL.md 的 description(触发面)为中文;捆绑脚本与语言无关,可脱离 DSH 单独使用。

技能覆盖什么

技能文档把验证拆成可执行的规则,主要包括:

  1. 成本阶梯 L0–L3:静态检查 / 探针 / 单个测试套件 / 全量,各自典型耗时与适用场景,以及按「改的是行为还是表现」选档。
  2. 不要用固定延时等后台作业:条件轮询 + 超时;只有满足文档列出的三个并列条件时才考虑固定延时,否则等于猜。
  3. 断言必须能失败:举不出失败场景的断言等价于没有验证;优先断言具体取值,而不是「存在 / 不为空 / 小于 N」。
  4. 耗时必须实测:脚本打印分段耗时表,并同时给出外部总时长与脚本内计时;两者差距明显时,提示可能有句柄、连接或定时器挂在事件循环上。
  5. 把坑沉淀给下一个会话:读代码读不出来的事实写入该仓库的长期索引(如已有 SUMMARY.md 则并入「成本表」小节),而不是只写在 README 或阶段笔记里。
  6. 何时不该用 / 直接跳档:改动触及公共代码或构建配置 → 直接 L3;探索性调试先弄清问题再选档;安全、并发、时序类改动静态检查置信度低,可从 L2 起步。
  7. 成本表落位:每次验证记三项(档位 / 实测耗时 / 能否再降一档),表落在仓库根 .verify-cost.md。

参考资料在 skills/verify-cheap/references/:anti-patterns.md、cost-measurement.md、probe-cookbook.md。

安装与启用

安装命令来自仓库 README(注意 --profile web 与 GitHub 大小写):

dsh plugin --profile web add github:Ushio155/dsh-verify-cheap

插件通过 package.json 的 dsh.bundle.patch 指向 cordis.patch.yml,插入 @deepseek-ai/dsh-skill-filesystem,并用 customSkillDirs 指向本包的 skills/。providerName 需每包唯一,且 includeDefaultRoots: false,避免与 harness 自带 provider 撞名。

安装前建议自行查看源码与 MIT 许可证;插件以当前 dsh 进程权限 运行,技能触发的工具调用同样在该权限下执行。

两个零依赖脚本(Node >= 18)

两个脚本只使用 node: 内建模块,不依赖第三方包;它们负责等待与计时,被执行的是你传给它们的命令。

wait-until.mjs:条件轮询 + 超时

替代脚本内的固定 sleep:每次尝试重新判断条件,满足即返回,超时则失败退出。

node skills/verify-cheap/scripts/wait-until.mjs --timeout 120 -- npm run build
node skills/verify-cheap/scripts/wait-until.mjs --timeout 90 --file out/index.js
node skills/verify-cheap/scripts/wait-until.mjs --timeout 30 --port 3080
node skills/verify-cheap/scripts/wait-until.mjs --timeout 120 --match "listening on" -- npm run dev

也可作为库导入 waitUntil。退出码:0 条件已满足 / 1 超时 / 2 参数错误。--match 需捕获子进程 stdout,在禁止管道 stdio 的受限沙箱中不可用。

measure-runtime.mjs:实测耗时

CLI 模式测任意命令的外部总时长(子进程启动到退出),退出码透传子进程;无法启动时为 127:

node skills/verify-cheap/scripts/measure-runtime.mjs --label "L2 集成测试" -- npm test
node skills/verify-cheap/scripts/measure-runtime.mjs --json -- pwsh -File build.ps1

库模式提供分段耗时与内外对比:按 [小节] 打印分段表,标出外部总时长与脚本内计时的差值,便于写进 .verify-cost.md 或汇报。

典型用法(与技能配合)

  1. 根据改动类型在 L0–L3 中选档(触及公共代码或构建配置时 README 建议直接 L3,不必先 L0 试探)。
  2. 需要等构建、文件、端口或日志关键字时,用 wait-until.mjs 轮询,而不是写死延时。
  3. 跑检查时用 measure-runtime.mjs 记录档位与实测耗时,并判断能否再降一档。
  4. 将结果写入仓库根 .verify-cost.md,便于后续会话沿用。

适用场景与注意

适合:希望在 agent 工作流里统一「最便宜但结论明确」的验证策略、需要可复用的轮询与计时工具、希望在项目内长期维护验证成本表的团队或个人。

注意:

  • 插件声明 peerDependencies 为 @deepseek-ai/cordis 与 @deepseek-ai/dsh-skill-filesystem 的 "*";README 说明了预发布 harness 版本与 semver 范围的实测背景,安装后若技能未出现,可对照 README 中 cordis.patch.yml 路径解析写法(应用 createRequire 定位包目录,而非误用 new URL('skills/', baseUrl))。
  • research/trigger-ab/ 为 description 触发实验归档,不属于 npm 包 files 内容,与日常使用无关。
  • 社区目录 SkillHub 为独立站点,与 DeepSeek / 幻方无官方从属关系;星标等元数据以目录页为准。

结尾

dsh-verify-cheap 把「选档、轮询、实测、落表」收成一份 verify-cheap 技能和两个可独立运行的脚本,适合作为 DSH 工作流类插件,降低验证环节的默认成本。进一步了解可访问 SkillHub 目录页 与 GitHub 仓库。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye