DeepSeek Harness 深度评测 · Ep6DEEP DIVE

Ep 6 DeepSeek Harness 深度评测 连载中

插件装得上不算赢:DSH 0.2.1 把生态做成了三道门

2026-10-20 阅读约 16 分钟 正文约 6270 字

视频版: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"] }

**官方自己的兼容桥接,也被自己的版本门拒过一次。**这条我们列为全片第二硬的事实。

第三道门的结论:兼容不是把接口对齐,是把对方的语义翻译进你的事件模型;翻译不了的部分,只能留在门外。

五、谁在定标准:收编式标准化

把三道门合起来看,会发现一个不太好听但准确的描述:这不是「开放」,是「收编」。

三个动作都很克制:

  1. 入口开放:插件索引源交给你自己提供,官方不开市场,也不背书;
  2. 门槛字段化:兼容性不靠文档口头约定,靠 engines.dsh 这一个字段声明,判定在宿主;
  3. 对方接口写成「子集」:兼容层只保证能被表达成插件的那些部分,表达不了的明确写「不可运行」。

**标准不是开个会宣布的,是被门槛逼出来的。**当所有第三方都得写 engines.dsh、都得把自己的功能翻译成宿主事件,那个字段和那套事件表就成了事实标准——不需要任何人签协议。

这条线索接着 ep16 的那句话:**定制权可以交,兜底权不能交。**这一期可以补半句:连「翻译权」,也在宿主手里。


六、观众拿得走的三问

下次评估任何插件生态,问这三句,比看功能列表有用:

  1. 能不能换索引源? —— 你装的东西从哪个市场来,决定了谁能决定它被看见。
  2. 版本怎么声明、谁来判? —— 声明写在包上,判定在宿主;判定如果发生在安装之前,失败就是干净的。
  3. 对方的插件能不能真跑? —— 不看宣传,看事件表:哪些事件不触发、哪些服务没有、兜底还在不在。

三问都能答「是」,这个生态才算真的能长东西。


七、三条可验证的预判

写在 2026-10-20,留到 2026-12-31 回来看,兑不兑现都能查:

  1. 官方自己的索引源会不会出现? 出现 → 第一道门从「用户自建」变成「官方托管」,市场运营权收回;
  2. engines.dsh 会不会进官方插件模板? 进了 → 它从可选字段变成事实标准;不进 → 它只是推荐做法;
  3. 兼容层会不会补上 tool.check / tool.list 或托管层? 补了 → 「子集」在长大;不补 → 它就是一块兼容壳。

八、边界与来源

边界:全片结论只对 dsh 0.2.1-rc.2;rc 期行为可能变,不向正式版外推。「三道门」是我们的观察框架,官方没有这个表述。

来源清单(逐条到文件行号)

  1. 自定义插件索引源:dsh-v0.2.1-rc.1 release notes(2026-10-17 05:22Z)新增功能第 1 条
  2. engines.dsh 优先判定:dsh-v0.2.1-alpha.4 release notes(2026-10-14 13:32Z)「其他变更」第 1 条
  3. 兼容层定位=验证「Claude Code Mods API 大致为 DSH 插件的一个子集」:rc.1 新增功能第 6 条
  4. 不读 plugin.json / hooks.json、走 defineMod:docs/subsystems/claude-code-mods.zh.md:11
  5. 无沙箱、进程内全权限:同上 :16
  6. 事件/界面/层级收窄:同上 :13、:30、:31
  7. 四个示例模组全部不可运行:同上 :92–98(中英文两版 + 2026-10-05 commit ffd791a110 三处一致)
  8. 无官方插件市场、发现页只列用户添加的索引源:@deepseek-ai/dsh-experimental-plugin-market-bundle/README.zh.md:56
  9. 索引格式 1 硬规则与已知限制:@deepseek-ai/dsh-plugin-market-index/lib/index.js
  10. 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

来源表

该篇正文里没有可解析的「来源」小节(早期篇目未写文末来源表)——不补造。