前言¶
在 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 单独使用。
- 目录页:https://www.skillhub.cn/plugins/Ushio155/dsh-verify-cheap
- 源码:https://github.com/Ushio155/dsh-verify-cheap
- 当前 package 版本:0.1.1,许可证 MIT
技能覆盖什么¶
技能文档把验证拆成可执行的规则,主要包括:
- 成本阶梯 L0–L3:静态检查 / 探针 / 单个测试套件 / 全量,各自典型耗时与适用场景,以及按「改的是行为还是表现」选档。
- 不要用固定延时等后台作业:条件轮询 + 超时;只有满足文档列出的三个并列条件时才考虑固定延时,否则等于猜。
- 断言必须能失败:举不出失败场景的断言等价于没有验证;优先断言具体取值,而不是「存在 / 不为空 / 小于 N」。
- 耗时必须实测:脚本打印分段耗时表,并同时给出外部总时长与脚本内计时;两者差距明显时,提示可能有句柄、连接或定时器挂在事件循环上。
- 把坑沉淀给下一个会话:读代码读不出来的事实写入该仓库的长期索引(如已有
SUMMARY.md则并入「成本表」小节),而不是只写在 README 或阶段笔记里。 - 何时不该用 / 直接跳档:改动触及公共代码或构建配置 → 直接 L3;探索性调试先弄清问题再选档;安全、并发、时序类改动静态检查置信度低,可从 L2 起步。
- 成本表落位:每次验证记三项(档位 / 实测耗时 / 能否再降一档),表落在仓库根
.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 或汇报。
典型用法(与技能配合)¶
- 根据改动类型在 L0–L3 中选档(触及公共代码或构建配置时 README 建议直接 L3,不必先 L0 试探)。
- 需要等构建、文件、端口或日志关键字时,用
wait-until.mjs轮询,而不是写死延时。 - 跑检查时用
measure-runtime.mjs记录档位与实测耗时,并判断能否再降一档。 - 将结果写入仓库根
.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 仓库。