DeepSeek Harness 深度评测 · Ep6DEEP DIVE
插件装得上不算赢:DSH 0.2.1 把生态做成了三道门
视频版:B站 公开投稿中无对应视频(已核对全部 16 个投稿) 视频总览 →
本期要点POINTS
本期要点
关键实测数据DATA
关键实测数据
结论先说:DeepSeek Harness 在 10-17 一天里连发 0.2.1-rc.1 和 rc.2。这两个预发布真正改的不是功能表,是门槛——谁能把插件送进来、按哪个版本判定、对方的东西能不能真跑。我们把这三件事拆成三道门,逐条在本机实测。
一句话概括全片:「子集」不是谦虚,是字面意思。
全文结论只针对
dsh 0.2.1-rc.2(2026-10-20 实测环境)。「三道门」是我们的观察框架,官方文档没有这个说法。我们是审计者,不是标准制定者。
一、一天两个 rc,改的不是功能表
dsh-v0.2.1-rc.1(2026-10-17 05:22Z)的新增功能第 1 条写的是「支持自定义插件索引源」;同一分支当天又推了 rc.2。同日还有 alpha.4(10-14 13:32Z)在「其他变更」第 1 条把一条规则钉死:第三方插件兼容性优先按 engines.dsh 判定。
把这三条并排看,方向很清楚:DSH 不是在攒插件数量,而是在立准入规则。规则一立,生态就从「谁都能塞」变成「过门才算」。
我们按时间顺序,把这三道门一道道过。
二、第一道门:谁能进
索引源就是事实上的市场
官方文档写得很直白:目前没有官方插件市场,发现页只列出用户自己添加的索引源(来源:@deepseek-ai/dsh-experimental-plugin-market-bundle/README.zh.md:56)。
这句话的含义比字面更硬:谁提供清单,谁就决定谁被看见。官方把入口开给第三方,等于把「市场运营权」也一并下放了——但没有下放「判定权」,那是第三道门的事。
格式 1 的硬规则
官方没有公开索引格式文档,但 dsh-plugin-market-index 包里自带校验器(parseMarketIndex / marketInstallTarget),规则是可执行的。逐条读源码,硬约束如下:
format必须等于1;title必须含en键,语言键匹配^[a-z]{2,8}(-[a-z0-9]{1,8})*$;versions非空、不得重复、按semver.rcompare降序;- 每个版本号必须是精确 SemVer(不接受 range);
publishTimestamp必须是整数 Unix 秒,且小于1e11;source只有两种:npm,或git;- 走
git必须钉 40 位小写 commit,URL 必须 https、至少两段路径、不能是 tarball; - 包名上限 214 字符;内联图标解码后不超过 32 KiB。
已知限制(源码里写明的):校验器只校验「清单长得对不对」,不校验「清单说的和包实际是不是一回事」——是否有 engines.dsh、是否声明 bundle、版本与包是否一致,它都不管。这一格留给了第二道门和运行时。
本机实测:自建一个最小索引源
我们造了一份两列表的最小索引(一个本地插件 + 一个官方 bundle),用官方校验器验,输出:
VALID format=1 plugins=2 title=锐Owl 演示索引
dsh-ep19-demo-plugin@0.0.1
-> dsh-ep19-demo-plugin@0.0.1
dsh-experimental-voice-input-bundle@0.2.1-rc.2
-> git+https://github.com/deepseek-ai/deepseek-harness.git#687f282e...#path:/packages/experimental/voice-input-bundle
判定:索引本身合格,每个版本都能被翻译成一条精确安装目标;git 条目被钉到 40 位 commit,不怕分支漂移。
第一道门的结论:门是开着的,但门框上有尺寸。
三、第二道门:按哪个版本判定
规则:engines.dsh 优先
alpha.4 把这条写进了「其他变更」第 1 条:第三方插件兼容性优先按 engines.dsh 判定。意思是插件自己声明「我适配哪个宿主版本」,宿主按这个声明放行或拒绝。没声明的,退回旧的 peer 依赖规则。
本机实测:三插件三态
造三个最小插件,只差一行声明:
| 插件 | 声明 | 结果 |
|---|---|---|
plugin-compat |
engines.dsh: ^0.2.1-rc.1 |
放行,Done in 231ms |
plugin-incompat |
engines.dsh: ^0.3.0 |
拒绝 |
plugin-undeclared |
不声明 | 走旧 peer 规则,放行 |
← 表格可左右滑动查看
拒绝时的原文值得完整抄一遍:
dsh: installation rejected: Plugin dsh-ep19-demo-incompat@0.0.1 is incompatible
with dsh 0.2.1-rc.2: requirements {"engines.dsh":"^0.3.0"}. Running it may cause
crashes or data loss. ...
dsh: nothing was installed.
关键在最后一句:nothing was installed。拒绝发生在包管理器之前——不下载、不跑构建脚本、不留半成品。这跟「装完再报错」是两种安全等级。
装不上还有一条路:版本豁免。dsh plugin allow-version 会警告「可能破坏应用或损坏数据」,之后把授权写进 profile 的 compatibility.json,键是「包名@精确版本 × 运行时精确版本」。换一个版本,授权不继承。
第二道门的结论:判定权在宿主手里,而且提前行使。
四、第三道门:对方的能不能真跑
这一道门最容易被忽略:装上了、版本也对,代码在这个宿主里到底能不能跑?
打包方式:它不读你的清单
Claude Code 兼容层不读 plugin.json,也不读 hooks.json;模组要用 defineMod({ name, version, root, userConfig, register }) 定义,装配走 cordis.yml,config 按标量类型校验(来源:docs/subsystems/claude-code-mods.zh.md:11)。
事件面:能触发的事件是更小的一个集合
文档里逐条列了哪些不触发(同上 :13、:30、:31):
tool.check/tool.describe/tool.list/tool.register—— 不触发;ui.render只支持AbovePrompt一处渲染位,其余面板形态没有;- 层级全部按
user加载,next.to直接拒绝; turn.step等事件同样缺失。
权限:不施加沙箱
钩子以 Node 全局对象在进程内运行,拥有 $.env、$.http.fetch、$.fs、$.tool.call(同上 :16)。官方原话是:只挂载你愿意当插件运行的东西。
这不是漏洞,是设计选择:兼容层不做隔离,隔离靠「你信不信这个包」。
最硬的一张表:四个官方示例模组,全部不可运行
官方文档给了一张示例表(同上 :92–98)。我们逐字复核了中英文两版,并对齐 2026-10-05 的 commit ffd791a110,三处一致:
| 模组 | 判决 | 缺什么 |
|---|---|---|
diff(约 570 文件) |
不可运行 | $.settings.read、$.telemetry.*、pane 上的 $.session.messages、ui.focus/ui.scroll 事件、已放置的 Pane |
agents-md |
不可运行 | prompt.context、agent.spawn 不触发;$.fs.ancestors、$.telemetry.* 无实现 |
sec-default |
不可运行 | 托管层策略,基于本宿主不触发的事件 |
telemetry |
不可运行 | telemetry.*、engine.create 不触发;$.session.repo、$.settings.read 不服务 |
← 表格可左右滑动查看
真正「按发布原样运行」的,是桥接自己实现的三个示例:Token Weather、Blast Radius、Replay Theater。
实测彩蛋:官方桥接被同一道门拒了一次
装官方兼容桥接 @deepseek-ai/dsh-experimental-claude-code-mods@0.2.1-alpha.1 时,第二道门把它拦下了:它的 13 个 peer 依赖全部锁在 alpha.1,而运行时已经是 0.2.1-rc.2。原文同样是 nothing was installed。
开 allow-version 之后装上,豁免落盘:
{ "@deepseek-ai/dsh-experimental-claude-code-mods@0.2.1-alpha.1": ["0.2.1-rc.2"] }
**官方自己的兼容桥接,也被自己的版本门拒过一次。**这条我们列为全片第二硬的事实。
第三道门的结论:兼容不是把接口对齐,是把对方的语义翻译进你的事件模型;翻译不了的部分,只能留在门外。
五、谁在定标准:收编式标准化
把三道门合起来看,会发现一个不太好听但准确的描述:这不是「开放」,是「收编」。
三个动作都很克制:
- 入口开放:插件索引源交给你自己提供,官方不开市场,也不背书;
- 门槛字段化:兼容性不靠文档口头约定,靠
engines.dsh这一个字段声明,判定在宿主; - 对方接口写成「子集」:兼容层只保证能被表达成插件的那些部分,表达不了的明确写「不可运行」。
**标准不是开个会宣布的,是被门槛逼出来的。**当所有第三方都得写 engines.dsh、都得把自己的功能翻译成宿主事件,那个字段和那套事件表就成了事实标准——不需要任何人签协议。
这条线索接着 ep16 的那句话:**定制权可以交,兜底权不能交。**这一期可以补半句:连「翻译权」,也在宿主手里。
六、观众拿得走的三问
下次评估任何插件生态,问这三句,比看功能列表有用:
- 能不能换索引源? —— 你装的东西从哪个市场来,决定了谁能决定它被看见。
- 版本怎么声明、谁来判? —— 声明写在包上,判定在宿主;判定如果发生在安装之前,失败就是干净的。
- 对方的插件能不能真跑? —— 不看宣传,看事件表:哪些事件不触发、哪些服务没有、兜底还在不在。
三问都能答「是」,这个生态才算真的能长东西。
七、三条可验证的预判
写在 2026-10-20,留到 2026-12-31 回来看,兑不兑现都能查:
- 官方自己的索引源会不会出现? 出现 → 第一道门从「用户自建」变成「官方托管」,市场运营权收回;
engines.dsh会不会进官方插件模板? 进了 → 它从可选字段变成事实标准;不进 → 它只是推荐做法;- 兼容层会不会补上
tool.check/tool.list或托管层? 补了 → 「子集」在长大;不补 → 它就是一块兼容壳。
八、边界与来源
边界:全片结论只对 dsh 0.2.1-rc.2;rc 期行为可能变,不向正式版外推。「三道门」是我们的观察框架,官方没有这个表述。
来源清单(逐条到文件行号)
- 自定义插件索引源:
dsh-v0.2.1-rc.1release notes(2026-10-17 05:22Z)新增功能第 1 条 engines.dsh优先判定:dsh-v0.2.1-alpha.4release notes(2026-10-14 13:32Z)「其他变更」第 1 条- 兼容层定位=验证「Claude Code Mods API 大致为 DSH 插件的一个子集」:
rc.1新增功能第 6 条 - 不读
plugin.json/hooks.json、走defineMod:docs/subsystems/claude-code-mods.zh.md:11 - 无沙箱、进程内全权限:同上
:16 - 事件/界面/层级收窄:同上
:13、:30、:31 - 四个示例模组全部不可运行:同上
:92–98(中英文两版 + 2026-10-05 commitffd791a110三处一致) - 无官方插件市场、发现页只列用户添加的索引源:
@deepseek-ai/dsh-experimental-plugin-market-bundle/README.zh.md:56 - 索引格式 1 硬规则与已知限制:
@deepseek-ai/dsh-plugin-market-index/lib/index.js nothing was installed/ 官方桥接被同一门拒 /compatibility.json精确豁免:本机实测,2026-10-20,dsh 0.2.1-rc.2,独立目录 + 隔离DSH_HOME,日志已归档
复现方式:demo/run-ep19-gates.sh(一道命令跑完三道门,输出不显示本机路径)。
锐Owl · DSH 系列 Ep6 · 2026-10-20
信号来源SIGNALS
信号来源
这一期从哪条雷达长出来(雷达 → 产出的双向可追溯):
node_links/radar_items.intent 的 feeds 指向关系当前为 0(M2 首轮回填统一先落 standalone,待人工指认)——回填后此处显示「雷达 YYYY-Www 条目 ③ → 已成为本期」。
来源表SOURCES