DeepSeek Harness 架构设计分析:当「一切皆插件」从口号变成源码
DSH 开源后的源码级架构分析。九个架构决策指向一个判断:DSH 在建 Agent 操作系统层。但这个操作系统只会执行不会学习——架构提供了进化的全部接口,反馈回路却是空的。
泄露报告把 DSH 框定为"模型绑定的 Harness 竞争者"。源码说的不一样。
引子:我们漏看了什么
24 小时前,我们基于泄露报告写了 DSH 的竞争格局分析。当时的判断是:DSH 是"模型绑定派"——和 ZCode 一样,赌的是模型-Harness 深度协同。我们把它放进"三条路线分歧"的框架里,和 Qoder/WorkBuddy 的"模型无关派"对立。
然后 DSH 开源了。
源码推翻了这个框架。DSH 不是在"模型绑定 vs 模型无关"的轴上选了一边——它无视了这个轴。它的架构设计指向一个更根本的问题:Harness 层到底应该长什么样?
答案不是"一个产品",而是"一个运行时"。
本文的分析逻辑是:逐个审视 DSH 做出的九个架构决策,每个决策都有源码证据,每个决策都暗示了一种战略意图。把它们连起来,你会看到一个连贯的判断——DSH 想成为 Agent 的操作系统层,而不是 Agent 本身。
决策一:Vendored Cordis Fork——赌的是编程范式,不是框架
DSH 的 README 第一句话把关系说清楚了:
"It uses an architecture where everything is a plugin, and is powered by Cordis, whose design is described in A Programming Paradigm for Spatiotemporal Composability."
注意"described in"——Cordis 的设计论文不是 DSH 写的,是 cordiverse 组织独立发表的。DSH 团队不是"选了一个现成框架",而是围绕一套编程范式构建了产品。
AGENTS.md 的仓库布局确认:Cordis 源码以 vendor/ 方式 vendored 进来——fork 而非依赖。同时 @deepseek-ai/cordis 作为 peerDependency 发布——vendored fork 被重新 scope 后对外暴露,使得外部插件开发者可以依赖同一个 Cordis 运行时。
这个决策暗示什么? DSH 不是在"用一个框架快速搭建产品"。它是在投资一套编程范式。Cordis 的核心概念——注册是 effect,卸载即回滚——不是工具特性,而是运行时语义。DSH 赌的是:这套语义是 Agent 运行时的正确基础。
决策二:没有特权核心——这是微内核设计,不是模块化产品
architecture.md 的关键声明:
"Every part of the product is a plugin, including the model adapter, the tool registry, the session log, and the agent loop itself, so every part is replaceable from configuration. There is no privileged core to patch."
"No privileged core"——在大多数"可扩展架构"中,核心循环(agent loop)是硬编码的,插件只能扩展外围。DSH 把 agent loop 本身也变成了插件。
composition.md 的 mermaid 图列出了 base bundle 的全部 78 个插件行。每一个能力——LLM 调用、bash 执行、会话持久化、审批策略、文件系统——都是一个可替换的插件。没有任何能力是硬编码在核心中的。
这个决策暗示什么? DSH 的设计更接近微内核操作系统,而不是"可扩展的 coding agent"。在微内核中,进程调度、内存管理、文件系统都是内核外的可替换服务。DSH 把同样的原则搬到了 Agent 领域:工具注册表、模型适配器、会话存储都是"用户态服务",内核只负责插件生命周期管理。
决策三:三平面分离——多租户从第一天就是设计基础
这不是"后来加的多 session 支持"。Host / Agent Preset / Client 三平面的分离是 DSH 的地基。
Host Plane 拥有进程级单例——ctx.tools(工具注册表)、ctx.llm(模型适配器)、ctx.sessions(会话存储)、ctx.fs(文件系统)、ctx.sandbox(沙箱后端)。这些是"内核服务"。
Agent Preset Plane 拥有 per-session 的工具实例和 prompt sections。每个 preset 是一个 cordis.yml,在 session 创建时挂载。isolate: true 创建 entry-local realm——多 session 在同一进程内共存时,各自的 compaction、workflow、terminal 实例完全隔离。
Client Plane 通过 ctx.slots.inject() 向浏览器 UI 注入 React 组件。
TypeScript 双聚合体编译(tsconfig.host.json 和 tsconfig.client.json)不是架构偏好——是语言层面约束。Host 和 Client 两侧 declaration-merge 同一个 Context 接口但注册不同服务,放在同一个 program 中会报键冲突。
这个决策暗示什么? 多租户不是功能,是设计前提。同一进程内的多个 session 各自持有私有的工具集、prompt 和状态——这不是"单用户工具加了多 session 支持",而是"从一开始就按多租户运行时设计"。
决策四:Agent 生命周期是事件流,不是函数调用
这是理解 DSH 的关键——agent 不是"调用模型然后执行工具"的线性程序,而是一个事件驱动的状态机。
完整生命周期
启动:Profile 组合插件树。不是"加载配置文件",而是堆叠 patch 层——bundle → profile → home → 命令行 overlay——每一层可以替换任何一行或插入新行。FiberState.boot() 挂载最终插件树。同一个 DSH 安装,不同 profile 产生完全不同的运行时。
输入:所有输入进入同一个 inbox。用户消息是"唤醒型"(立即触发),agent.inject() 注入的上下文是"排队型"(等下一条唤醒型消息才被 claim)。这防止了注入上下文触发不可控的模型请求。
Turn Flow——一个 Turn 是处理一次用户输入的完整周期:
turn/start
claim input + queued messages
assemble prompt sections + tool schemas
→ agent/pre-step reject | enter(messages)
step/start
derive model history from log
agent/request → llm/stream → assistant/chunk* → assistant/message
tool/call* → tools/pre-execute → tools/execute → tools/post-execute → tool/result*
step/end
more tools owed or new input → next step
→ agent/turn-stopping
turn/end
六个阶段,每个阶段都有扩展点:
agent/pre-step 是最重要的阀门——waterfall 事件,多个监听器串联,可以改写模型看到的消息或直接拒绝执行。即使被拒绝,一个 durable turn 仍被记录——"agent 尝试了但被阻止"的证据永久保留。
工具执行管道是三段式 waterfall:pre-execute(审批/权限)→ execute(实际运行)→ post-execute(脱敏/截断)。任何一个监听器可以阻止执行。
多 Step 链式:一个 step 结束后,如果模型还欠工具调用或 inbox 到达了新输入,driver claim 下一个 step。用户视角的"一轮对话"可能包含 5-10 个内部 step。
三类事件
| 类型 | 行为 | 持久化 | 示例 |
|---|---|---|---|
| Waterfall | 监听器必须调 next(),不调则中断 |
否 | agent/pre-step, tools/* |
| Serial | 按顺序执行 | 否 | agent/turn-stopping |
| Durable | 追加到 session log | 是 | turn/*, assistant/*, tool/* |
这个决策暗示什么? 策略、安全、审计不是"加在外面的壳",而是挂在事件流上的监听器。你不需要修改 agent loop 来加一个审批策略——你注册一个 tools/pre-execute 监听器就够了。这是策略与机制的彻底分离。
决策五:Session Log 是唯一真相源——金融系统级 Event Sourcing
DSH 的会话不是"对话历史",是 append-only event log。
核心不变量:
"Model-visible means logged. Anything that reaches a model request must be reconstructable from the log, and a runtime invariant asserts it."
这不是约定——有运行时断言验证。任何到达模型的输入必须可以从 log 重建。新增模型可见的输入必须新增一种 SessionEvent。
deriveMessages() 是投影函数——从原始事件流派生出模型可见的消息序列。同一个 log 同时服务六个消费者:模型上下文、UI 渲染、JSONL 持久化、OpenTelemetry 遥测、确定性回放(含 streaming chunks)、分叉/恢复。
Event 版本管理用 fail-loud 策略:未识别的事件类型默认拒绝读取,除非显式标记 ignorable: true。
这个决策暗示什么? 这是 Jane Street 式的金融系统思维——交易日志是唯一真相源,所有视图(持仓、盈亏、审计)都是投影。DSH 把同样的原则搬到了 Agent 领域。fork、resume、replay、audit 全部自然实现,不需要特殊的持久化逻辑。
配图直观展示了这个架构:

决策六:四种 Preset 揭示了产品路线图
DSH 不是"一个产品"。四种 preset 是一条能力光谱。
Minimal:两工具(bash + str_replace_editor),persona 独占 system prompt(complete: true),runtime context 关闭。benchmark 专用——据媒体报道 V4-Flash 的 TerminalBench 82.7 分跑在这个 preset 上(仓库 BENCHMARK.md 只说明了运行方式,未公布分数)。
Standard:完整编码 Agent。bash/pwsh、文件系统、后台任务、技能系统、子代理(spawn/fork)、工作流、计划模式、上下文压缩、目标系统、联网搜索。
Code:Standard 超集。模型不再逐个调用工具,而是编写 TypeScript 程序一次性执行(run_code)。五次工具往返压缩为一次。
Cordis:Agent 编辑自身运行时。 cordis preset 的声明:
"It exists so a person can ask an agent to author another agent."
"TRUST:
cordis_mountevaluates model-written JavaScript against the live runtime... Treat a session on this preset as shell access."
Agent 可以读取当前插件树、挂载临时 JavaScript 到 live runtime、编写新的 cordis.yml 作为其他 session 的 preset。这不是未来计划——v0.1 已实现。
这四个 preset 暗示什么? 它们不是"四个功能档位",而是一条从沙箱到元编程的渐进光谱。minimal 是"被锁死的工具",cordis 是"可以重写自己的工具"。没有任何其他 Harness(Claude Code、Codex、Cursor)有等价于 cordis preset 的能力。
但 cordis preset 不等于 Harness 自主进化
这里需要踩刹车。cordis preset 展示的"自修改"能力令人印象深刻,但如果把它等同于"Harness 自主进化",就混淆了两个不同的层次。
三层进化能力要分清:
| 层次 | 能力 | DSH v0.1 状态 | 源码证据 |
|---|---|---|---|
| 人指挥改 | 用户让 agent 编辑 cordis.yml | ✅ 已实现 | cordis preset + dsh-tool-cordis |
| Agent 自主改 | agent 自己决定挂载什么插件 | ⚠️ 半实现 | self-modification/ 包存在,但 AGENTS.md 描述只有 "inspects/mounts its own plugins"——没有决策逻辑 |
| 系统从模式学习 | Harness 自动分析执行历史、优化工具链、生成新技能 | ❌ 不存在 | grep auto.*learn / feedback.*loop / pattern.*recogn / reinforce 在源码中全部空结果 |
关键缺口在这里:DSH 有 Event Sourcing(完整执行历史)、有 Telemetry(OpenTelemetry 导出)、有 Plugin System(可变机制)——这三个加起来是自进化的原料,但缺少消费者。
session log 记录了每一次工具调用、每一次模型请求、每一次错误和恢复。这些事件流被六个消费者读取——模型上下文投影、UI 渲染、持久化、遥测、回放、分叉。但没有第七个消费者:没有组件从历史中提取模式。没有组件统计"这个用户 80% 的 bash 命令都是 git 操作,应该预加载一个 git 技能"。没有组件发现"这个工具链每次都要三步才能完成文件搜索,应该合并成一步"。
换句话说,DSH 的架构为 Harness 自主进化留出了所有必要的接口——事件流、插件热重载、技能系统、上下文注入——但 v0.1 没有实现反馈回路。这像是一座建好了发电厂和输电网但没有接上用电器的城市。
这是一个重要的判断分界点:
- 如果 DeepSeek 计划在后续版本中填补这个回路——比如一个分析 session log 并自动生成技能的插件——那 DSH 的架构地基是正确的
- 如果不打算做——那 cordis preset 只是"让用户手动改 config 的 fancy UI",不是真正的 Harness 进化
源码中没有给出明确答案。但有一个间接信号:self-modification/ 作为一个独立的包组存在(和 core/、llm/ 平级),说明 DSH 团队把自我修改视为一级能力域,不是一个 preset 的附属功能。这个包目前只有 "inspects/mounts" 能力,但它的位置暗示了更大的野心。
决策七:竞品不是威胁,是插件
standard/agent.cordis.yml 中最意外的发现:
- id: tool-subagent-codex
name: '@deepseek-ai/dsh-tool-subagent'
disabled: true
config:
provider: codex
- id: tool-subagent-claude-code
name: '@deepseek-ai/dsh-tool-subagent'
disabled: true
config:
provider: claude-code
DSH 内置了 OpenAI Codex 和 Anthropic Claude Code 作为子代理 provider,默认禁用。用户在自己的 preset 中启用后,可以让 DeepSeek V4 做主编,把子任务委托给 GPT-5.5 或 Claude Opus 执行。
CI 配置进一步证实:.github/workflows/pi-ai-provider-e2e.yml 测试 GPT-5.5(Azure OpenAI)和 Claude Opus 4.8(Anthropic)通过 llm-pi-ai 适配。媒体报道的"支持近 40 家模型提供方"如果成立,最可能的路径就是 llm-pi-ai(在我们获取的源码中 packages/ 目录不完整,无法逐文件验证完整 provider 列表)。
这个决策暗示什么? DSH 不把自己定位为 Claude Code 的竞争者。它把自己定位为 Claude Code 的编排层。竞品模型不是威胁——它们是 DSH 工具链中的可插拔组件。这个姿态和"模型绑定派"的框架完全矛盾。
决策八:100% Coverage + ts type-equiv——基础设施级工程纪律
"
test:coverage, nottest, is the CI coverage gate."
per-file 100% on packages/*/*/src。这不是目标,是门控(注:AGENTS.md 声明当前处于 pre-release 阶段,SESSION_FORMAT_VERSION = 0 with no compatibility promise,这个 100% gate 可能是 pre-release 极端标准)。
ts type-equiv 是 DSH 独有的机制:文档中粘贴的类型声明用 ```ts type-equiv 标记,verify-type-equiv gate 从源码提取声明并通过 TypeScript parser 断言文档与源码一致。源码类型变了,文档 gate 就失败。
package.json 中有超过 40 个 verify-* / gen-* 脚本——从 Markdown 换行检查到运行时闭包验证到 Cordis 配置目录验证。knip --treat-config-hints-as-errors——连配置提示都视为错误。
每个非平凡变更必须在同一个 PR 中附带 Agent Note(设计决策记录)。
据公开履历,崔添翼在 Jane Street 工作九年。这套工程纪律带有明确的金融系统基因——高频交易系统不会在本地跑全量回归测试,但 CI 每次都跑全覆盖。本地只跑相关检查(AGENTS.md: "Never default to the full suite"),CI 负责全面覆盖。
这个决策暗示什么? 这不是初创项目的质量标准。如果 DSH 只是想做一个 coding agent MVP,不需要 40 个 verify gate 和 ts type-equiv。这种工程纪律只有在你想建别人依赖的基础设施时才值得。
决策九:MIT 协议——争的是标准,不是市场
DSH 选择 MIT——最宽松的开源协议。允许商业使用、修改、再授权,只需保留版权声明。
对比 Claude Code(闭源商业产品)和 Codex(闭源 API 服务),MIT 开源是一个激进选择。
这个决策暗示什么? MIT 最大化社区采纳。企业可以内部部署修改,云厂商可以提供托管服务,竞品可以借鉴架构。DSH 赌的是:Harness 层的竞争不是产品竞争,而是标准竞争。谁控制了开源标准,谁就控制了开发者与模型之间的分发通道。
九个决策指向同一个判断
把九个决策连起来:
- 投资编程范式 → 不是做产品,是做基础设施
- 没有特权核心 → 微内核,不是模块化产品
- 三平面分离 → 多租户是设计前提
- 事件驱动生命周期 → 策略与机制彻底分离
- Event Sourcing → 金融系统级的状态管理
- 四模式光谱 → 从沙箱到元编程的完整频谱
- 竞品是插件 → 不竞争,编排
- 基础设施级工程纪律 → 为别人依赖做准备
- MIT 协议 → 争标准,不争市场
DSH 不是在建"中国版 Claude Code"。它在建 Agent 的操作系统层。
但这个操作系统目前只会执行,不会学习。架构提供了进化的全部接口——事件流、插件热重载、技能系统——但反馈回路是空的。session log 记录了一切,但没有任何组件从中学习。
如果 DeepSeek 在后续版本中填补这个回路——一个从执行历史中自动提取模式、生成技能、优化工具链的插件——那 DSH 将不只是 Agent 的操作系统,而是第一个会成长的 Agent 操作系统。
如果填不上——那"一切皆插件"和 cordis preset 的自修改能力,最终只是一个非常好的手动配置系统。
风险
第一:Cordis 底座的长期技术债。 Vendored fork 意味着每次上游更新需要手动 merge。随着 DSH 和 Cordis 各自演进,diff 会越来越大。
第二:cordis preset 的安全面。 cordis_mount 执行模型编写的 JavaScript——等同于 shell access。v0.1 的坦诚值得尊重,但生产环境需要沙箱化。
第三:贡献者门槛。 ts type-equiv、40+ verify gates、100% coverage——外部贡献者面对的进入壁垒不低。MIT 协议降低法律门槛,但工程 gate 提高了技术门槛。
第四:从 v0.1 到 v1.0 的距离。 架构设计可以领先,但插件生态、社区采纳、跨平台稳定性、生产级可靠性——每一项都需要时间。78 个插件行中很多还在快速迭代(AGENTS.md: "THERE WILL BE COMPATIBILITY-BREAKING CHANGES")。
数据来源
- DeepSeek Harness 仓库源码 v0.1 开发者预览版(github.com/deepseek-ai/deepseek-harness)
- AGENTS.md(monorepo 结构、工程纪律、CI 规范)
- docs/architecture.md(架构设计文档,通过 GitHub raw 获取)
- docs/development.md(开发指南、TypeScript 双聚合体设计)
- apps/cli/composition.md(base composition 插件图)
- apps/cli/config/agent-presets/(4 个 preset 完整 YAML)
- .github/workflows/(CI 配置,含 pi-ai-provider-e2e)
- package.json(monorepo workspace、scripts)
约束声明:本文基于 DSH v0.1 开发者预览版仓库的 apps/ 目录完整源码、AGENTS.md、docs/architecture.md(通过 GitHub raw 获取)、docs/development.md、composition.md、4 个 agent preset 完整 YAML、CI 配置和 package.json。packages/ 目录因 tarball 截断未完整获取,部分涉及 packages/ 的结论基于 AGENTS.md 包列表和 composition.md 插件行推断。所有引用 architecture.md 原文的段落来自 GitHub raw 获取的文件,未能在本地仓库中逐字验证。
本文不构成投资建议。分析日期:2026-08-13。
