dsh-skill-autopilot:用模型审查技能进化建议,并用反碎片策略准入

前言

在 DeepSeek Harness(DSH)里做技能管理时,会碰到一个反复出现的问题:技能进化页每次攒下一批待处理建议,逐条点开看本身就是负担;而由模型自动提出的建议,往往是「某次任务的流水」,如果直接采纳,技能库会很快膨胀成几百个互不相干的窄技能。

dsh-skill-autopilot 就是把「审」和「发」这两步交给你配置的大模型,但把「什么样的技能才配进库」写成确定性的准入规则。模型只能在这个框里做判断,代码再判一遍,最后通过的技能打包成 SKILL.md 走技能数据源落盘,带版本记录、可回滚。

这是什么

  • 插件名:dsh-skill-autopilot
  • 维护者:BrainZombie
  • 分类:工作流
  • 来源:SkillHub 目录页、GitHub
  • 版本与许可证:0.1.0,MIT

它解决的问题很明确:把进化链路里积累的 pending 建议,经模型审查和反碎片化闸门后,变成真正进入技能库的技能,而不是把每次建议都变成新文件。

它做什么(一次运行)

一次运行的流程如下:

pending 建议 ──► 审查模型(你选的) ──► 确定性闸门 ──► 打包 SKILL.md ──► 落盘 + 版本记录
   (mnemon)        (语义判断)          (不可绕过)        (蒸馏/清洗)        (adopt)
  1. 读:从 mnemon 的 Skills Source 取 pending 建议、证据轨迹、评测用例,以及全量技能目录。
  2. 审:一次批量调用审查模型,对每条建议给出 create / merge / dismiss / defer,并附理由和归并目标。
  3. 闸:模型说完不算数,代码再判一遍。这一层是插件的核心,后面专门讲。
  4. 打包:为通过的条目单独再调一次模型产出正文,同时剔除会随时间腐化的内容,如日期、会话 id、uuid、机器绝对路径、「N 小时前」。
  5. 落盘:recordDraft → adoptDraft,走技能数据源自己的写入口。建议置为 adopted,生成版本记录,必要时可从「技能管理 → 版本/回收站」回滚。插件不直接写 SKILL.md。

默认情况下 autoApply: false,review 只输出决策和将要落盘的正文,一个字节都不写;确认后 apply 才真正落盘。

反碎片策略

这是插件的核心。它把「库是类级知识,不是流水」这条原则拆成了可执行的规则。

规则 判据
库是「类级知识」,不是流水 一个技能带 N 个带标签小节,胜过 N 个窄兄弟技能
归并优先于新建 同 xxx-* 前缀簇且内容相关,或 description 相似,就归并;只共用产品名不算
不重复造插件已有的能力 对照 ctx.skills.list()(宿主实际广告的技能,含插件技能),命中即 dismiss
小打小闹不单独建 必须同时满足强信号、置信度门槛、正文长度下限
不写 hub/router 技能 正文超过 60% 的行是「指向别的技能」,直接拒绝
description 一句话 超长会被系统技能索引截断,触发词等于失效
归档不删除 归并时被吸收的技能进回收站,可恢复

闸门里几个硬条件值得单独列出来:

  • 建议置信度低于 minConfidence → 不建(这一条不进模型审)。
  • 模型对「新建」的把握低于 minModelConfidence → 留待下轮,不硬发。
  • 没有强信号(procedure / correction / directive / skill-gap / skill-misleading / approach-change)→ 不建。
  • 插件已提供该能力 → 不建。
  • 与已有技能相似度 ≥ mergeSimilarity,或同属 xxx-* 前缀簇且内容相关 → 强制归并,不许新增兄弟技能。
  • 本轮 create 超过 maxNewPerRun → 留到下一轮。
  • 打包后的 SKILL.md 必须过 lint。

consolidate 是配套的存量体检,对已有技能按前缀/同域聚簇,让模型判断哪些该收敛成一个 umbrella。应用时把合并后的正文写到 keeper,把被吸收的移入回收站。

打包校验

打包校验在 lib/policy.js: lintSkillDoc 实现。硬拦项包括:名字非 kebab-case 或重名;缺 description 或超长;正文为空、过短、超长;正文里又带 frontmatter;缺「何时使用」或「步骤」;是 router 技能。软提示包括缺验收小节、正文没有可执行命令、description 开头是套话。

安装与启用

安装命令来自仓库自带的 install.ps1,共有两种模式。标准模式写 profile 的 package.json(link: 依赖 + dsh.profile.bundles)并执行 pnpm install:

# 先看计划
powershell -ExecutionPolicy Bypass -File .\install.ps1 -DryRun

# 执行标准安装
powershell -ExecutionPolicy Bypass -File .\install.ps1

免 pnpm 模式只建软链,并往 profile 的 cordis.patch.yml 追加 insert 条目:

powershell -ExecutionPolicy Bypass -File .\install.ps1 -Link

回滚两种模式都认,会还原 package.json / cordis.patch.yml 的备份:

powershell -ExecutionPolicy Bypass -File .\install.ps1 -Rollback

装完不启动、不重启的情况下可以先做预检:

dsh --profile web --dump-config | Select-String skill-autopilot

生效需要重启 DSH,这一步由使用者自己执行。

典型用法

装好并重启后,在任意会话里可以直接用斜杠命令:

/skill-autopilot status       # 看队列、计数、审查模型、策略、日志目录
/skill-autopilot review       # 只审不写(默认 dry-run)
/skill-autopilot apply        # 审完直接落盘
/skill-autopilot consolidate  # 存量归并审查(只出方案)
/skill-autopilot history      # 最近决策

也可以直接让 agent 调工具:

{"action": "review", "maxItems": 3}
{"action": "apply", "ids": ["<suggestionId>"]}
{"action": "apply", "provider": "deepseek-official", "model": "deepseek-reasoner"}
{"action": "consolidate", "confirm": true}

决策日志是 append-only 的 JSONL,另有最近一次完整结果,位于 $DSH_HOME/storages/skill-autopilot/:decisions.jsonl 每条建议一行,含最终动作、理由、是否落盘和错误;last-run.json 是最近一次运行的完整内容,含将要落盘或已落盘的 SKILL.md 正文。review 默认 dry-run 的意义就在这里,可以先读再发。

相关配置

插件 patch 里的 config 都可省略。常用键如下,默认值取自 README:

键 默认值 说明
enabled true 关掉后工具仍在,任何运行直接返回 disabled
mnemonDataDir ~/.mnemon 其下应有 skills/ledger.json,自动探测
targetRoot user-dsh 新技能写到 ~/.dsh/skills(也可设 user-agents)
reviewer.provider/model 空 = 宿主默认模型 留空时用设置页里选的那个模型
reviewer.maxTokens 4096 审查/打包单次上限
policy.minConfidence 0.8 建议置信度低于此值不建
policy.minModelConfidence 0.5 模型对「新建」把握低于此值留待下轮
policy.maxNewPerRun 2 每轮最多新建几个
policy.mergeSimilarity 0.45 相似度阈值,超过即强制归并
policy.descriptionMaxChars 240 description 上限
policy.maxBodyChars / maxMergedBodyChars 16000 / 24000 正文字符上限
policy.requireStrongSignal true 必须有强信号
autoApply false 定时任务是否直接落盘
intervalMinutes 0 大于 0 时后台定时跑,默认只 review
logDir 空 = $DSH_HOME/storages/skill-autopilot 日志目录

想让判断更严格,可以把 reviewer.model 指向更强的模型、把 mergeSimilarity 调到 0.55、maxNewPerRun 调到 1。需要注意,deepseek-flash 对「新建」的自评通常在 0.65–0.8 之间,这是校准值不是裁决值,所以 minModelConfidence 默认只设 0.5。真正决定「配不配进库」的是建议置信度、强信号、去重和文档 lint。

验证

node test/selftest.mjs          # 单元闸门/去重/打包/落盘(临时 ledger + 临时技能根,不动真实数据)
node test/selftest.mjs --live   # 追加:只读真实 ledger,确认能读到 pending 与目录
node test/host-contract.mjs     # 用真实 dsh-tools/dsh-llm 走一遍注册与一次 llm 组装调用
dsh-plugin verify .             # 真打包、真安装、挂载检查

selftest 从不碰 ~/.mnemon/skills 与 ~/.dsh/skills:它在 %TEMP% 下复制一份 ledger、建一个空的临时技能根,跑完即删。需要「本机已装 DSH / 已装 mnemon 数据源」的两段测试在没有安装的机器上会自动 skip 而不是失败,所以 CI 只跑 npm test;host-contract 与 verify 需要真实宿主,请在装好 DSH 的机器上跑。

适用场景与注意

适合这个插件的人,是已经在 DSH 里用 mnemon 管理技能、并且被进化建议的人工审查和技能库碎片化困扰的开发者。

需要注意几点:

  • 插件以当前 DSH 进程的权限运行,安装前应先检查源码与许可证(MIT)。本插件通过 dsh-mnemon-source-skills 的 manage() 读写同一份 ledger,属于信赖 mnemon 内部契约的实现。
  • apply 会真的新增或修改 ~/.dsh/skills 下的技能,但只经数据源写入口,因此有版本记录和回收站两条退路。模型判断不会 100% 合意,所以默认 dry-run。
  • 不要把 autoApply 和短 intervalMinutes 一起开,那等于让模型无限自增长技能库。建议 apply 手动触发,或 autoApply 只配合 maxNewPerRun: 1。
  • 项目级技能(project-dsh / project-agents)默认只读不建,consolidate 只处理 user-dsh / user-agents。
  • 运行时要求:DeepSeek Harness >= 0.2.0,Node.js >= 20;dsh-mnemon-source-skills >= 0.4.0 为可选 peer,缺失时插件仍可加载,但读不到 pending 建议。

结尾

dsh-skill-autopilot 的价值不在于让模型说了算,而在于把「什么样的技能才配进库」固化成确定性的规则,让审查和归并可以自动跑,同时保住版本记录和回滚能力。如果恰好在 DSH 技能进化这条链路上,可以从 dry-run 的 review 开始试。

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

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

小夜