Building the DeepSeek Harness plugin ecosystem: 42 open-source plugins in a 46-repo family (45 PerryLink-owned plus pan17's dsh-wechat, Apache-2.0) — security, workflows, research, messaging bridges, developer experience — plus the DSH Desktop Market catalog, a plugin-certification registry and the dsh-plugin-doctor CI checker. All 42 ship CI and a Gitee mirror, five-language docs held to the same section count, install command and configuration keys by a gate in each repo's own CI, and the dsh.bundle contract; 137,423 npm downloads over the trailing 30 days. I also contribute upstream to Cordis — the plugin-core framework DeepSeek Harness is built on — and to deepseek-ai projects, including a merged FlashMLA fix.
DeepSeek Harness turned "everything is a plugin" into an ecosystem. I build the plugins I wish existed — engineering-discipline guardrails, runtime panels, cross-session memory, and verifiable research engines — and publish them the way production software deserves.
-
The research this family rests on is now a published paper with a DOI — and it is, in large part, a measurement of two things on this profile: laya-mcp and jevcore. When a Judgment Layer's Self-Reported Fields Lie: Cost, Latency and the Failure Boundary of Three Judgment Layers on the Same Items — three judgment layers measured on one item set: Laya (local, non-autoregressive), TypeSafe Jev (remote, typed decisions) and DeepSeek-V4.1-Flash. Four claims; three hold and one the data refutes. A complete Chinese translation is archived separately, and the artifact — code and every
results/JSON — is a third record. -
What it found, in one line each. Cost is not the binding constraint: the real axes are latency and the usable state window, and "an order of magnitude cheaper" stops holding once state grows. The judges' self-reported access-layer fields are not trustworthy, and their failures cluster in one place — the concrete ones being a truncation flag that reports
passedwhile silently dropping input, a probability field that inverts an item's conclusion, and two verdict words that are unreachable under real input. The shape behind them: the judge is near-perfect (0.9909, n=220) where the answer is explicitly stated and collapses (0.3091, n=220) where it must notice an absence — while its self-reported confidence stays high in both cases. -
The negative result is reported as one. A dissimilar judge does not supply incremental coverage in any of the three regimes: when the generator errs the judge is less accurate than its own marginal, and the failure correlation is positive in 3/3 draws. The paper also reports four instances of the error class it names — a specification-level defect masquerading as a finding about the model — each caught by a control and not by review, which is where its 23 mandatory protocol clauses come from.
-
Both language versions say they are one work, in their own pages. Zenodo has no
is translation ofrelation, so the fact is carried in each PDF's front matter and in the record descriptions instead. 10.5281/zenodo.22901853 · 10.5281/zenodo.22902025 — cite one, not both; where they differ, the English text governs.
- Five upstream pull requests merged — three of them in repositories this account had never contributed to before. reactive-resume #3527 (out-of-range months rendered an employment period as
undefined 2019 - Present), laya #94 (a disclaimer footer sharing a paragraph madeclean_email_bodydelete the whole body, with a regression suite wired into CI in the same change), teamai-cli #695 (Qoder CN keeps its user directory at~/.qoder-cn, so a CN install synced nothing; merged after four rounds of the repo's own automated review, each of which found a real defect in the previous attempt), and walkinglabs' plugin list #76 and #65 (36 family plugins added to its curated README). Two further proposals were closed by me rather than left to compete, and are not counted as merged. - Upstream shipped 0.1.7-alpha.1 — it removes
resolutionModeoutright, so a source/pnpmlaunch no longer has two resolvers to disagree about. Worth recording because two of the three threads reporting "Cannot read properties of undefined (reading 'prepare')" were source launches, and the underlying defect was two module instances of@deepseek-ai/dsh-toolseach holding its own privateTOOL_RUNTIME_SCHEDULERsymbol. Eighteen unanswered Discussions threads were answered, carrying that root cause with file-and-line references. - The family's five-language documentation was reconciled with itself, and the last gap in its CI coverage closed. The family table is hand-maintained in five READMEs per repo and had drifted four ways across the 42 plugins: three rows described repos the family no longer publishes, the
dsh-plugin-upgraderow was missing from every sibling table, nine rows had slipped above their own table header, anddsh-fund-research's Chinese file introduced the family with a sentence no other repo used. All 210 files now carry the same 45-row table, byte-verified per file against its own line endings. dsh-plugin-doctor changed roles too — English is now its source of truth — so all 42 plugins carry five-language docs, every one gated in CI; that gate was also found in dsh-plugin-guide having sat for weeks with no workflow calling it, and is now wired.
- laya-mcp is a new project line: Laya typed decisions as an installable sidecar and an MCP server, next to dsh-laya, the DSH plugin that puts the same
noul/choice/scorequestions behind a Cordis service and two model-visible tools. Three published repos carry the line — dsh-laya (0.1.4), laya-mcp (0.1.5) and laya-mcp-npm, the Node launcher that finds the Python side and passes the MCP stream through untouched; the threelayacorename reservations were archived rather than left to look like live projects. - dsh-laya installs nothing and downloads nothing — Laya is PyTorch and cannot live inside a Node plugin, so it is a client of a
laya-mcp serveprocess you start yourself, and when that process is not running it says so instead of failing obscurely at the first tool call. One service (ctx.laya) pluslaya_askandlaya_plan. The sidecar exists to buy the warm model: the cold build costs seconds to tens of seconds and the default lazy router rebuilds a checkpoint on every language switch.
The six most-starred family plugins (★ measured 2026-09-22); every other family repo is listed in full further down, and the research four-piece set is under Research.
| Plugin | What it gives you | Install |
|---|---|---|
| dsh-auto-review | Second-model auto-review on the approval chain, fail-closed by default (193★) | dsh plugin --profile web add dsh-auto-review |
| dsh-research-report | Verifiable research reports: content-addressed evidence ledger, manifest seal hash, byte-level citation checks, drift detection, disproof ledger (152★) | dsh plugin --profile web add dsh-research-report |
| dsh-industry-research | Industry/company research: chain-map SVG with bottleneck detection, timeline, company cards, adversarial review (150★) | dsh plugin --profile web add dsh-industry-research |
| dsh-permission-rules | Claude Code-style declarative allow/deny/ask rules plus a process-level network policy (114★) | dsh plugin --profile web add dsh-permission-rules |
| dsh-memento | Approval-gated cross-session memory (ctx.memory + SQLite) (108★) |
dsh plugin --profile web add dsh-memento |
| dsh-mcp-panel | MCP management console: /mcp + Settings tab + trial calls (65★) |
dsh plugin --profile web add dsh-mcp-panel |
One-command starter pack: dsh-kit — installs the core family in one command.
Counting note: the family's own READMEs say "42 plugins" because they count every repo that declares dsh.bundle.patch. Measured against all 46 repos this page names: 39 of the 41 plugin rows declare the contract, and 3 of the 5 support repos do — dsh-plugin-kit (a review-rule meta package), dsh-cert-mcp (a certification MCP server) and dsh-plugin-doctor (the CI health checker); dsh-catalog and dsh-kit ship none. 39 + 3 = the family's 42. The two plugin rows outside that arithmetic are the sibling project line jevcore (no dsh.bundle; only its jevcore-dsh workspace member is a plugin) and the third-party pan17/dsh-wechat. Both counts therefore describe the same 45 PerryLink-owned repos.
| Plugin | One-liner | npm |
|---|---|---|
| dsh-defend | Injection/jailbreak/secret detection + destructive-delete gate | npm |
| dsh-permission-rules | Declarative allow/deny/ask rules + a local HTTP/CONNECT network policy | npm |
| dsh-mask | PII masking/sanitization | npm |
| dsh-skill-pack-security | Security-audit skill pack + supply-chain gate | npm |
| Plugin | One-liner | npm |
|---|---|---|
| dsh-background-agents | Durable background child agents with a Web UI sidebar, messaging and interrupt | npm |
| dsh-team-rooms | Cross-session team rooms: shared message bus, task board, approval-gated handoffs and a timeline that survive restarts | npm |
| dsh-checkpoint-rewind | Snapshots, forks, one-shot restore | npm |
| dsh-github | GitHub PR/issue integration + Action, writes approval-gated | npm |
| dsh-claude-move | Migrate Claude Code/Codex/OpenCode/Hermes into DSH | npm |
| dsh-click | Desktop control tools (Windows/macOS) | npm |
| dsh-session-sync | Git-backed session synchronization | npm |
| dsh-test-drive | Install→smoke→uninstall test driver for plugins | npm |
| Plugin | One-liner | npm |
|---|---|---|
| dsh-composer-history | Terminal-style input history for the web composer | npm |
| dsh-output-styles | Runtime-switchable model output styles | npm |
| dsh-session-pin | Pin sessions in the Web sidebar | npm |
| dsh-memento | Approval-gated cross-session memory protocol | npm |
| Plugin | One-liner | npm |
|---|---|---|
| dsh-auto-review | Second-model auto-review on the approval chain | npm |
| dsh-doublecheck | Engineering-discipline guard: grill, gates, adversary review | npm |
| dsh-score | Plugin quality scoring across git/gh/npm | npm |
| Plugin | One-liner | npm |
|---|---|---|
| dsh-autotier | Automatic strong/cheap model-tier routing with deterministic risk guards | npm |
| dsh-budget | Token/cost metering, budget caps, carbon estimate, latency benchmarks | npm |
| dsh-observe | OTel/Langfuse telemetry export | npm |
| dsh-fast | Performance diagnostics | npm |
| Plugin | One-liner | npm |
|---|---|---|
| dsh-draw | Image-generation routing | npm |
| dsh-translate | Translation + JSON repair | npm |
| dsh-talk | Speech recognition and voice I/O | npm |
| dsh-library | Local knowledge-base RAG | npm |
| dsh-local-ai | Ollama LLM provider and routing | npm |
| Plugin | One-liner | npm |
|---|---|---|
| dsh-lsp-actions | LSP diagnostics/formatting/completion/actions | npm |
| dsh-mcp-panel | MCP management console | npm |
| dsh-plugin-guide | Plugin-dev knowledge base + CLI toolchain + release-engineering guide | npm |
| dsh-plugin-upgrade | Plugin-author upgrade skill: one package, one corridor index that detects the caller's peer band and routes to the matching closed card (0.1.3-alpha.1 → 0.1.5-rc.1, 0.1.5-rc.2 → 0.1.6-alpha.2), plus a zero-dependency seam scanner (bundle skill + npx CLI) |
npm |
| jevcore | TypeSafe Jev as typed decisions instead of prose (noul/choice/score with calibrated probabilities): offline by default, every transmission named before it happens, disabled gates register nothing (the DSH adapter jevcore-dsh, plus jevcore core and jevcore-mcp for non-DSH MCP hosts) |
npm |
| dsh-laya | Laya typed decisions (noul/choice/score) as a first-class Cordis service (ctx.laya) plus laya_ask/laya_plan tools; a client of a laya-mcp serve sidecar, so it installs and downloads nothing, and reports whether state stays on this machine as a fact rather than a policy |
npm |
Support repos: dsh-plugin-kit (review-rule meta package) · dsh-catalog (DSH Desktop Market catalog source) · dsh-cert-mcp (certification MCP server) · dsh-kit (one-command installer) · dsh-plugin-doctor (plugin health checker). Five repos publish under a @perrylink/ npm name rather than their repo name — the support repos @perrylink/dsh-plugin-kit and @perrylink/dsh-plugin-doctor, and the plugins @perrylink/dsh-github, @perrylink/dsh-ticktick and @perrylink/dsh-skill-pack-security-provider — so the perrylink npm account holds 53 names while the family has 41 plugin repos.
| Plugin | One-liner | npm |
|---|---|---|
| dsh-wechat | WeChat ↔ DSH bridge (Tencent iLink bot): text/image/file/voice, approvals in chat — developed with pan17, who now hosts the repo and publishes the npm package | npm |
| dsh-ticktick | TickTick/Dida365 task bridge: session-header panel + 11 tools | npm |
| dsh-reach | Multi-channel approval/question bridge: WeChat/Telegram/Feishu, session console | npm |
| Plugin | One-liner | npm |
|---|---|---|
| dsh-data-quality | Data profiling/cleaning/verification | npm |
| dsh-fund-research | Mutual-fund research, sealed traceable snapshots | npm |
| dsh-industry-research | Industry/company research domain pack | npm |
| dsh-research-report | Verifiable research-report engine | npm |
Every repo below is external to PerryLink/*; every number is measured, merged work only, and open proposals are deliberately not listed.
★ 1,000+ — named individually, as the rule requires. Thirteen external repos above a thousand stars carry merged work:
| Repository | ★ | Merged |
|---|---|---|
| reactive-resume | 43,315 | 2 PRs |
| awesome-dsh-plugin | 16,613 | 42 PRs (44 commits) |
| laya | 14,755 | 1 PR |
| FlashMLA | 12,953 | 1 PR |
| Cordis | 8,746 | 2 PRs |
| dsh-web | 7,934 | 4 PRs (6 commits) |
| ouroboros | 6,069 | 2 PRs (2 commits) |
| teamai-cli | 4,900 | 1 PR |
| agent-client-protocol | 4,301 | 2 PRs |
| deepseek-harness-desktop | 2,496 | 2 PRs (2 commits) |
| dsh-plugin-radar | 1,464 | 48 PRs (46 commits) |
| awesome-deepseek-harness | 1,091 | 49 PRs (53 commits) |
| awesome-vibecoded-saas | 1,020 | 1 PR |
Cordis is the upstream plugin-core framework that powers DeepSeek Harness; FlashMLA #224 is the only merged pull request in the whole deepseek-ai org.
The rest of the contributor set: dsh-handbook (801★, 2 commits — the official DSH handbook) · goraven (737★, 1) · Zhiyuan-Fan's list (567★, 5) · dsh-genui (473★, 1) · bruc3van/awesome-dsh-plugin (358★, 11) · Dominic789654's list (345★, 6) · imsai-sh's catalog (248★, 41) · beancookie/awesome-dsh-plugin (150★, 14) · Oh-My-DSH (86★, 3) · walkinglabs' list (29★, 4) · dsh-advisor (22★, 1) · awesome-deepseekharness (15★, 1) · jiji262's list (14★, 1) · vvlife's list (9★, 3) · pan17/dsh-wechat (8★, 2) · diegosouzapw's catalog (17★, 10). 32 external repositories carry merged work of ours, and 287 merges outside PerryLink/* were counted in the 62 external repositories probed for this round — so 287 is a floor, not an estimate. (SihanTeng's list carries entries but no attributed commit, so it is deliberately not counted.)
Security — published advisory GHSA-j922-p6h6-p255 for dsh-permission-rules (medium, patched in 0.6.16).
Official harness repo — it does not accept external pull requests, so that line runs through issues, Discussions (the Show Your Plugins! post #6104) and the plugin ecosystem instead — while the wider deepseek-ai org is open to fixes (FlashMLA #224 merged).
- GitHub (this profile), Gitee and npm — source, CI and releases here; 104 owned repos mirrored to Gitee by a daily job (default branch + all tags); the
perrylinkaccount holds 55 npm names and 827 versions, 48 of them active and 44 carrying a provenance attestation - npm downloads — 137,423 over the trailing 30 days (npm window 08-22..09-20, the last day its daily series covers); dshfind independently tracks 22k+ across the 8 family plugins it has a download figure for — dshfind reports rounded tiers, so that is a floor rather than a total
- DSH Desktop Market — add the catalog source
https://perrylink-dsh-catalog.perrylink.workers.dev/catalog-source.jsonunder Market → Sources to browse the family in-app; MCP Registry — three servers, all published from their release workflows over GitHub OIDC:dsh-cert-mcp,jevcore-mcpandlaya-mcp - GitHub Actions — dsh-github and dsh-test-drive also ship composite actions, so they install as
uses: PerryLink/dsh-test-drive@vX
Published to a dozen-plus third-party DSH directories and curated lists — awesome-dsh-plugin, DSH Directory, Awesome DeepSeek Harness, walkinglabs' list, Zhiyuan-Fan's list, the AdamPlatin123 radar, dsh-suite, dshfind.com, deepseek1024.com and Glama among them — and scored on OpenSSF Scorecard; the GitHub dsh-plugin topic is what most of them ingest from.
我在 DeepSeek Harness 上把自己希望存在的插件做了出来:检查点回退、声明式权限、输出风格、跨会话记忆、MCP 面板、模型档位路由、微信/TickTick 桥接,以及可验证研究报告 / 基金研究 / 行业研究 / 数据质量「研究四件套」——共 42 个插件(Apache-2.0):全部带 CI 与 Gitee 镜像,42 个插件仓全部带五语文档(五份文件的一致性由每个仓自己的 CI 闸门守着:段落数、安装命令、配置键),且全部声明 dsh.bundle 契约。perrylink 这个 npm 账号下共有 55 个名称、827 个版本:其中 48 个在用(本账号 42 个非 scoped + 5 个 @perrylink/ scoped + pan17 的 dsh-wechat),7 个已弃用(折进 dsh-plugin-upgrade 2.0.0 的三条走廊腿、作者撤回的 dsh-personal-directive、改名前的 scoped @perrylink/dsh-cert-mcp,以及上面三个已归档的 layacore 名字);55 个里有 44 个当前 latest 版本带 provenance 证明(11 个没有:@perrylink/dsh-plugin-doctor、jevcore 四包、dsh-laya、laya-mcp、dsh-wechat)。下载量近 30 天 137,423(窗口 08-22..09-20):8 月 69,059 + 9 月截至 20 日 97,843;按名称拆开是 42 个非 scoped 60.0k/84.7k/120.0k、5 个 scoped 4.0k/8.3k/10.5k、7 个弃用名 2.7k/3.7k/6.3k、pan17 的 dsh-wechat 5.1k/2.8k/4.8k。一键全家桶:dsh-kit。同时我是 DeepSeek Harness 上游核心框架 Cordis(cordiverse/cordis)的贡献者,也是 deepseek-ai 官方仓贡献者:FlashMLA 的修复已合并(#224),这是该组织下唯一一条已合并的外部 PR;此外还有 13 个「千星以上」外部仓的已合并贡献(逐仓星数与合并数见上方 Upstream 一节的表格)。
2026-09-23 轮:这一家子所依赖的那项研究,现在是一篇有 DOI 的论文 —— 而且它测的很大一部分,正是这份主页上的两个项目:laya-mcp 与 jevcore。《当判定层的自报字段说谎时:三类判断层的成本、延迟与失效边界实测》在一套相同条目上实测了三类判定层:Laya(本地、非自回归)、TypeSafe Jev(远程、定型决策)与 DeepSeek-V4.1-Flash。四条主张,三条成立,一条被自己的数据否定。
① 成本不是约束。 真正分离三者的是延迟与可用状态窗口;「便宜一个数量级」在状态变大后就不成立了。
② 判定器的接入层自报字段不可信,且失效集中在同一个位置:截断标志一边报「通过」一边静默丢弃输入、概率字段把条目结论反号、两个判定词在真实输入下根本不可达。这些现象收敛成一条形态 —— 答案被明确陈述时近乎完美(0.9909,n=220),必须注意到「缺席」时塌缩(0.3091,n=220),而两种情形下自报置信度都不低。
③ 负结果照负结果报。 异种判定器在三个区制上都没有提供增量覆盖:生成器出错时,判定器比它自己的边际准确率还低,失败相关在 3/3 次抽样中为正。论文还如实报告了它自己命名的那类错误的四个实例 ——规格级缺陷伪装成关于模型的发现 —— 每一个都是被对照抓出来的,不是被审阅抓出来的;那 23 条强制协议条款就来自这里。
④ 两个语言版本各自说明它们是同一项工作。 Zenodo 没有 is translation of 这个关系(CORAR 词表里就没有),所以这件事写在两份 PDF 的扉页和记录描述里:英文原文 · 中文译本;制品(代码与全部 results/ 产物)是第三条记录 10.5281/zenodo.22901248。引其一即可,不要当两篇引;两者有出入以英文为准。
2026-09-21 轮:① laya-mcp 是一条新战线:把 Laya 的定型决策做成可安装的 sidecar 与 MCP server,旁边是 dsh-laya —— 把同样的 noul/choice/score 问题放进一个 Cordis service 和两个模型可见的 tool。 真正发布的只有三个仓:dsh-laya(0.1.4)、laya-mcp(0.1.5),以及负责找到 Python 侧、把 MCP 流原样透传的 Node 启动器 laya-mcp-npm;三个 layacore 名字仓已归档,只作名称保留,不再像在跑的项目。
② 为什么必须拆开,而不是顺手装。 Laya 是 PyTorch,不可能塞进 Node 插件里,所以 dsh-laya 什么都不装、什么都不下 —— 它是你自己启动的 laya-mcp serve 进程的客户端;那个进程没在跑时它会直说,而不是在第一次 tool 调用时莫名其妙地失败。它给出一个 service(ctx.laya)外加 laya_ask / laya_plan 两个 tool。sidecar 存在的意义是买到热模型:冷启动要几秒到几十秒,而默认的懒路由每换一次语言就重建一次 checkpoint。
③ 同一天还有 5 条上游 PR 合并:dsh-genui #194(把 lib 清理挪进 Node,Windows 打包才成立)、dsh-advisor #89(prepare-release 夹具改成 Windows 安全)、ouroboros #2427(随 skill 发布的 Getting Started 链接 404)、dsh-web #1657、beancookie/awesome-dsh-plugin #184;同时给 laya 本体发了第一条提案(免责声明页脚与会话正文同段时 clean_email_body 会整段删掉正文),该提案已于 09-21 合并;另有两提案由我主动关闭,不再留在队列里,也不计入已合并。
① jevcore 是新项目:把 TypeSafe Jev 接进 DeepSeek Harness 与任何其他 MCP host,拆成三个包——jevcore(决策内核,不 import 任何 DSH/Cordis 东西)、jevcore-dsh(DSH 插件:一个 service、三个 tool、两道 opt-in 门)、jevcore-mcp(同样三个 tool 走 MCP,带 stdio 二进制)。三个包今天全部上了 npm:12:53 发 0.1.0,13:06 发 0.1.1,内核已于 13:08 到 0.1.2。 仓库今天下午新建,头三小时(10:14–13:08)就有 38 次提交;MIT,并由 jevcore-dsh 通过 dsh.bundle 契约。
② 它为什么存在,以及围绕什么保证来写。 审计那些把 Jev 接进 DSH 的插件后,发现一个被项目自己 README 直说的规律:标着 guard、gate、warden 的那个模块,恰好也是把 prompt、tool 参数和文件内容发往第三方的模块,而 README 一般不说——其中有几个还是默认开启的。jevcore 把这些失效模式设计掉:默认 provider 是离线 mock,走活线要同时满足 provider: live 与已解析的凭据;每个功能都在启动日志里自报是否外发(off,或 SENDS <feature> { fields });被关掉的门不注册任何事件监听器,由测试而非策略来保证;没有任何 tool 暴露门的配置,所以模型无法放宽自己的约束;判不出来时走显式配置,默认落到 ask 而不是 allow。
③ 前一天晚上(09-19)的其他事:dsh-plugin-upgrade 2.0.0 把三条已退役的走廊腿折成一个包 + 走廊索引路由(0.1.6-alpha.2 批量 PR 与「已发布线」CI 尺子同时落地)、dsh-cert-mcp 0.2.2 进入官方 MCP Registry,当晚共 27 个家族仓 32 个 Release;其余为例行卫生与依赖升级。
待业中。近期考虑给自己安排一次体检。因此最近将减少熬夜,后续的更新迭代节奏会适当放缓。当然,问题和缺陷修复不会停,只是发布频率会降低一些,还请大家谅解。





