> 本地可组装的 Agent 运行时底座 —— 一切皆插件,连 Agent Loop 都是插件
>
> 研究对象:github.com/deepseek-ai/deepseek-harness(v0.1.0-rc.5,MIT 协议,本地浅克隆 deepseek-harness-research)
> 研究时间:2026-08-14 | 四路专项 Agent 并行深读真码(Cordis/工具流水线、四模式、多Agent、事件流)+ 外源核实(InfoQ、多家技术拆解、WebSearch)
> 方法:代码级核证为主,每条关键结论附 文件:行号;凡与外源/InfoQ 不符处,单列「事实校正」。
—
〇、费曼视角 · 一句话讲清
设想市面上有三家卖「智能手机」的:Claude Code 与 Codex 是把模型与外壳焊死的成品机——你拿到就能用,但想换颗螺丝都得找原厂;DeepSeek Harness(下称 dsh)则不卖整机,它卖的是一整套「手机图纸 + 可拆装的乐高模组」:电池(模型适配器)、摄像头(工具)、操作系统(Agent Loop)、屏幕(UI)、甚至「怎么打电话」的规矩(调度/权限),全是一个个能拔能插的插件。
一句话:Claude Code 像 iPhone(闭源、垂直整合),Codex 像开源但成品化的「一加」,dsh 像安卓——它把「造手机」的全套图纸开源,让任何人拼出自己的 Agent。官方公式 Model + Harness = Agent:模型是千里马,Harness 是鞍辔缰绳——让马在真实世界里干活的整套工程。
然则天下无免费之宴:dsh 把「可换」做到极致,也把「稳定」推到最远。v0.1 距「能放心上生产」尚有漫漫长途。此乃后文 PK 之主战场。
—
一、它到底是什么(侦察结论 + 事实校正)
1.1 基本档案
| 项 | 内容 |
|---|---|
| 定位 | 开源 Agent 运行时底座(Plugin-Centric / Concrete-harness),非功能固定的 Coding Agent |
| 作者 | DeepSeek(幻方) |
| 首发 | 2026-08-13(开发者预览) |
| 当前版本 | v0.1.0-rc.5(README 明示「THERE WILL BE COMPATIBILITY-BREAKING CHANGES」) |
| 实现 | TypeScript / Node.js(需 Node ≥ 22.19);底座为 Cordis 插件元框架 |
| 规模 | 49 包 monorepo,1981 个 TS 文件(外源估约 19.8 万行) |
| 许可 | MIT(可闭源商用);但 README 明示暂不接收外部 PR,引导至 GitHub Discussions 与社区插件 |
| 启动 | npx @deepseek-ai/dsh web → 默认 http://127.0.0.1:3080(本机监听) |
| 模型 | 模型无关:默认 DeepSeek,provider 目录含 Anthropic/OpenAI/Bedrock/Vertex/Azure 及任意 OpenAI 兼容端点 |
| 首日星标 | 各源悬殊(33k–65.6k),待官方定论;社区 topic dsh-plugin |
1.2 四处事实校正(读码前极易被带偏,已逐项以真码核证)
| 常见说法 | 核证结论 | 依据 |
|---|---|---|
| 「四种模式 = 标准/PTC/极简/创造」 | 内部命名为 Standard / Code(对外称 PTC 模式)/ Minimal / Creator;四者确为四套 cordis.yml preset 组合,非四套独立系统 | apps/cli/config/agent-presets/{standard,code,minimal,cordis}/agent.cordis.yml |
| 「创造模式令 Agent 改写自身 Harness」 | 半真,边界须正:cordis_* 七工具齐备,动态包不可变、仅内存态(进程重启即失);纯 host 半激活无需审批(仅含浏览器 client 半的未授权包才 await-approval);「改自身」实为会话内临时叠加/换版本 + 借 tool-fs 写盘创作新 preset(需重启挂载),非运行中热替换当前装配 | tool-cordis/src/index.ts:148-379、cordis-host-runner/src/sandbox.ts:6-7、prompt.ts:7-8 |
| 「无特权内核(no privileged core)」 | 成立但有边界:实现层——Cordis 服务层白名单门面、禁止服务返回 Context(denyContext);但 Host half 的 node:vm 沙箱自承「is not containment」,OS 级隔离另靠 packages/sandbox;契约语义层确有一「事实内核」(ctx. 服务键、agent/ 事件族、SessionEvent 类型、waterfall 分派) | cordis-host-runner/src/guard.ts:669-781、sandbox.ts:1-7、docs/architecture.md:13,58,84 |
| 「记忆压缩/冲突清理/路径复用/Plan 校验是下一步重点」(InfoQ 专家) | 仅 compression 落地:CompactionEngine 可替换缝 + BasicCompactionEngine 基础 provider 已实装;「长期记忆 / 自适应上下文压缩 ACP / 因果图检索」本版本代码与文档全无痕迹,属路线图而非已实现 | packages/compaction/*、tool-ralph/src/index.ts:159(仅「工作区即长期记忆」一句设计陈述) |
> 结论:dsh 的架构主张(一切皆插件、无特权内核、机械强制可观测性)代码级属实;但「创造模式自改 Harness」「无特权内核」「长期记忆」三处,InfoQ 与外部热文的表述均需在边界上打折。
1.3 Cordis 来历(外源 + 代码双证)
dsh 的底座 Cordis 源自 Koishi 生态的插件内核(cordiverse 组织维护),理论根基为论文 《A Programming Paradigm for Spatiotemporal Composability》(时空可组合,北大与 DeepSeek 研究者合著),已在 Koishi 实战四年。README.md:7 明确引用 Cordis 与该论文;仓库文档含「Koishi」字样,属同谱系前身。
—
二、架构鸟瞰(技术深拆)
2.1 第一性设计:微内核 + 插件星系
┌─────────────────────────────────────────┐ │ DeepSeek Harness (dsh) │ │ npx @deepseek-ai/dsh web │ └────────────────────┬────────────────────┘ │ 装配 (cordis.patch.yml, last-write-wins) ▼ ┌─────────────────────────────────────────┐ │ Cordis Context (微内核·无特权) │ │ 服务/事件/依赖 · Plugin挂载→effect │ │ 卸载→fiber.dispose() 一次性回卷 │ └──┬──────────┬──────────┬────────┬─────────┘ ┌────────────┘ │ │ └────────────┐ ▼ ▼ ▼ ▼ 模型适配器(llm) 工具注册(tools) 会话日志(session) 沙箱/权限(sandbox,guard) 可换:DeepSeek/ waterfall 拦截面 append-only OS级隔离 Anthropic/OpenAI/… pre→exec→post→result Turn/Step Windows/Linux/macOS │ │ │ deriveMessages │ ▼ ▼ ▼ ▼ Provider 插件 bash/fs/web/ model-visible Spawn/Fork/ skill/subagent means logged Ralph/workflow 机械强制 (Agent Loop 亦可换)
运行中的 dsh 本质上就是一个 Cordis Context:所有能力作为插件向 Context 注册服务、事件与 effect,最后由一份 cordis.yml 配置组装成可运行的 Agent。packages/extensions/cordis-host-runner/src/index.ts:7-8 直接 import { Context } from '@deepseek-ai/cordis'——Cordis 是真实内联框架,非营销名词。
2.2 四层配置合成(Profile → Bundle → patch → –patch)
配置合成是一条管道(apps/cli/src/dump-config.ts:30-52):bundle 层 → profile 自身 patch → home 可选 patch → --patch 覆盖层,按行 id 后写覆盖(last-write-wins)。dsh --dump-config 在不启动、不求值 !!js 的前提下纯合成并打印——配置即运行态,无漂移(packages/bundle/base/cordis.patch.yml:1-13)。这正是「一切皆插件」的操作入口:换能力 = 改配置,而非改源码。
2.3 三承重机制
其一,会话日志即唯一事实源(详第五章):Turn/Step 皆为日志事件,deriveMessages() 纯函数投影模型视图,且 agent-loop invariant 在每次派发前用 JSON.stringify 比对「即将发出的请求」与「日志重建结果」,不一致即 fail。
其二,waterfall 拦截面(详 2.4):工具与 Agent 的关键决策点,是一串 around-middleware 事件瀑布。
其三,Capability Seam 三角色:可替换能力被规定为 服务定义(接口)/ 服务提供方(实现)/ 消费方(模型面向的工具)。其威力在「执行世界」抽象——文件系统与子进程共享同一 provider,把 provider 指向远端沙箱(仓库已有 E2B 概念验证),则 Bash/终端/LSP 整体迁移,消费方零改动。Subagent 是同一逻辑的极点:一个接口下并存六个 provider(详第四章)。
2.4 工具调用流水线(waterfall)
工具执行由 Cordis ctx.waterfall 驱动:tools/pre-execute → tools/execute → tools/post-execute → tools/result,外加 tools/code-dispatch-log(packages/core/tools/src/index.ts:1475-1666)。每个拦截监听器都拿到 next(),必须显式调用才继续——不调用即中断链路。由此:
– Hook/审批/权限/沙箱/超时全部串入同一条瀑布:超时挂 tools/execute(guard/timeout-policy/src/index.ts:56)、沙箱提醒挂 tools/post-execute(guard/repeat-tool-reminder/src/index.ts:213)、外部 Hook 桥(兼容 Claude Code/Codex 脚本)直接挂钩 tools/pre|post-execute 与 agent/pre-step(hooks/hooks-claude-code/src/index.ts:219-291)、审批 ask 在 pre-execute 返回 kind:'ask' 时触发(tools/src/index.ts:1479)。
– PTC 与普通调用共享同一安全观测:所有调用(模型驱动、workflow 脚本、subagent、ACP、remote)皆经同一个 ToolRuntime.execute 闸门(prepareExecution,tools/src/index.ts:1463-1507),故 PTC 子调用不能绕过审批与沙箱——InfoQ 此说代码坐实。
2.5 沙箱 OS 级(非应用层「自觉」)
| 平台 | 实现 | 依据 | ||
|---|---|---|---|---|
| Windows | CreateRestrictedToken(DISABLE_MAX_PRIVILEGE | LUA_TOKEN | WRITE_RESTRICTED)+ 原生 FFI,fails closed | sandbox-windows-acl/src/token.ts:195-222 |
| Linux | Landlock(@deepseek-ai/node-addon-landlock-run)/ bwrap(--ro-bind / / --die-with-parent) | sandbox-local/src/profiles.ts:16-36 | ||
| macOS | Seatbelt(sandbox-exec SBPL) | sandbox-local/src/profiles.ts:51-58 |
bash-sandbox 经 ctx.sandbox.confine 串联(packages/shell/bash-sandbox/src/index.ts:88-179)。注意:Host half 的 node:vm 动态包沙箱自承「is not containment」(cordis-host-runner/src/sandbox.ts:1-7)——Creator 模式的信任边界依赖用户审批与人工把关,而非技术沙箱(详第三章)。
—
三、四种模式与创造模式(乙路核证)
3.1 四模式 = 四套 preset 组合
| 模式(内部名) | 基础工具集 | 专属 diff | 用途 |
|---|---|---|---|
| Standard | 文件编辑/Shell/检索/Skills/Plan/子代理/Workflow 全集 | 无 | 常规 Agent 任务 |
| Code(对外 PTC) | 继承 Standard 全集 | 末行加 tool-presentation mode:code,wire 工具塌缩为仅 [run_code] | 模型写 TS 程序编排多步调用,把 5 轮往返压成 1 轮 |
| Minimal | 仅持久 bash + str_replace_editor | includeRuntimeContext:false | 最小环境测模型 |
| Creator(cordis) | 继承 Standard 全集 | 追加 tool-cordis + 两 authoring skill | 运行时内省、试装插件、创作新 preset |
PTC/Code 机制:模型只能直接调 run_code(tools/src/code-mode.ts:20),在程序内以 await tools.name(args) 调原本独立工具;SDK 由系统提示生成,子调用作为嵌套执行仅外层结果入模型历史(code-mode.ts:1-6)。隔离跑在 ctx.codeRuntime 抽象 seam 上(worker-thread 后端)。
3.2 创造模式:cordis_* 七工具与真实边界
tool-cordis 定义 7 工具(tool-cordis/src/index.ts:42-379):cordis_define(不可变包定义,仅校验语法,不审批)/ cordis_run(激活,仅含 client 半的未授权包才 await-approval)/ cordis_stop / cordis_undefine / cordis_inspect_list|query|self(只读内省)。
真实能力边界:
– 路径 A(内存态·临时):define+run 能让 Agent 在当前进程实时挂载模型写的 JS 插件、注册工具/服务、监听事件——确在「改正在运行的自己」。但仅内存态,重启即失;且是追加式换版本,不能就地热改当前已装载 composition。
– 路径 B(持久态·改预设):persona 允许 Agent 经 tool-fs 把新 cordis.yml 写至 ${DSH_HOME}/.agent-presets//,成为其他会话可挂载的 preset——但需重启/重新挂载方生效,且 PresetTree.write() 被刻意留空(preset 是输入而非自动回写目标)。
结论:Creator 能令 Agent「临时扩展运行时 + 持久创作新 preset」,但非运行中热替换当前装配;纯 host 半动态包激活无需审批即触达真实运行时(安全下限在此)。此正修正 InfoQ/外源「动态包激活前需审批」的笼统说法。
3.3 模式锁定
会话一旦开始(非空),服务端 agentPreset.select 硬性返回 agent-preset-locked(host/apiproxy/src/api-proxy.ts:3105),仅 blank 会话可切——保可复现(preset 写入 session header 并 deep-frozen)。
—
四、多 Agent 编排(丙路核证)
4.1 Spawn / Fork / Ralph / Workflow
– Spawn(subagent-spawn-in-process/src/index.ts:44):inheritsParentContext=false、无 seed,全新上下文子 Agent。
– Fork(subagent-fork-in-process/src/index.ts:48-75):取父 session.events 中最后 turn/end 之前的前缀作 seed,inheritsParentContext=true,继承已完成回合(一次性快照,非活引用)。
– Ralph(workflow/tool-ralph/src/index.ts:90-177):写死的 JS 固定脚本,for 循环每轮一个全新 structured-output 子 Agent,轮间仅传有界结构化 handoff;requireFreshProvider 强制 !inheritsParentContext,故只能跑在 spawn 上。模型只喂数据,不能改循环/provider/schema。
– Workflow(tool-workflow/src/index.ts:138-150):模型手写 JS,在 worker-thread vm.Context 执行(workflow-worker-thread/src/runtime.ts:90-108),仅注入 agent/parallel/pipeline/phase/log/args 六钩子,无 fs/net/timer;parallel=Promise.all barrier,pipeline=每 item 串行穿 stage,并发/总数均设闸。
4.2 Subagent 接口:六 provider,仅 spawn/fork 默认开
ctx.subagents 是命名 provider 注册表(subagent/src/index.ts:171-202、SubagentProvider 契约 types.ts:285-323)。内置 6 provider:
| provider | 形态 | 默认 |
|---|---|---|
spawn / fork | in-process | 开 |
claude-code(官方 Agent SDK CLI) | out-of-process | 关 |
codex(codex app-server --stdio) | out-of-process | 关 |
acp(任意 ACP 子进程,permission 默认 reject) | out-of-process | 关 |
dsh-sdk(完整 dsh 运行时 via TS SDK) | out-of-process | 关 |
基础 bundle cordis.patch.yml:295-329 仅装 spawn+fork;claude-code/codex/acp/dsh-sdk 全 opt-in。确能把 Claude Code/Codex 经同一 subagent 工具委托出去(接口一致,tool-subagent/src/index.ts:29-31 的 Config.provider 为任意已注册名)——这是架构抽象之妙,亦是「不绑模型、甚至不绑自家 Agent」的明证。
4.3 编排范式判定
dsh 的多 Agent 是受父 Agent/父脚本编排的 Worker 集合,即层级式 Supervisor–Worker:父拆解/分配/汇总,子执行;通信严格 parent↔child,无 sibling 直连;深度闸默认 maxDepth:3 巩固树状。全仓 grep swarm/self-organ/blackboard/peer-to-peer/negotiat 在编排域零命中——距真正 Swarm(自主发现/协商/竞争/动态接管/网状拓扑)有结构性差距,缺口在契约层无 Agent 对等原语,非「未实现某函数」。
故「架构有新意、编排范式无突破」成立(有代码硬证):把 Spawn/Fork/外部竞品/协议 Agent 统一到同一契约,确是清晰架构抽象;但编排本身未超出既有范式。
—
五、统一事件流与可观测性(丁路核证)
5.1 SessionEvent:唯一事实源 + 机械强制
一次运行拆为 Turn(零或多个 Step)/ Step(一次模型请求 + 工具调用),皆为 SessionEventMap 边界事件(session/src/types.ts:243-297)。「model-visible means logged」是运行时强制,非口头约定:agent-loop/src/invariant.ts:39-52 在 llm/stream 派发前,用 JSON.stringify 比对「即将发出的请求 options.messages」与「session.deriveMessages() 重建结果」,不一致即 fail;并比对 request/header 重建。
Session.deriveMessages() 沿 surface 折叠 deriveEventMessage()(session/src/index.ts:726-747、surface.ts:83-114),纯函数投影 user/message、assistant/message、tool/result 三类——模型历史从不单独存储,从日志派生;回放即同事件再派生(docs/subsystems/session.md:5)。
5.2 Trajectory:按来源看「模型当时所见」
来源由 user/message.source 标注(MessageSourceMap = user|plugin|model|tool,llm/llm/src/message.ts:100-105),plugin 带 ContextForm(instructions/catalog/snapshot/notice/relay/recall)覆盖系统提示/推理/工具/子Agent/上下文注入五轴。session-query 包提供 traceEvent/sourceEventSeqs/derivedEventSeqs 引用级溯源(tool-session-query/src/operations.ts:54-237),UI 在 ui-trajectory 组装轨迹节点。注:代码库无名为 Trajectory 的单一服务,它是 surface + request/header + session-query + ui-trajectory 的组合概念。
5.3 恢复/分叉/回放共用同流 + 崩溃修复
– Fork:取源会话前缀事件深拷贝为子 seed,原会话不受影响(session/src/index.ts:1081-1138)。
– Resume:取完整存储日志(index.ts:495)。
– 检索/回放:直读同一 SessionEvent 流。文档明示「Fork, resume, transcripts, telemetry, and persistence all derive from this stream」(docs/architecture.md:94)。
– 崩溃修复:repair.ts:27-133 扫描「有调用无结果」的工具调用,合成 TOOL_OUTCOME_UNKNOWN/TOOL_NOT_STARTED,补 step/end 与 turn/end{interrupted};interrupted 原因循环从不产生,专由恢复合成(types.ts:170-173)。
– 自动续跑需「经人授权的 Resume」:docs/glossary.md:27 明确 goal activation 刻意不进持久回放,resume/fork 后须人授权 resume 方自动工作——印证 dsh 假定「人坐在前面」,自动性是特权而非本职。
5.4 压缩与长期记忆(早期能力)
CompactionEngine 可替换缝 + BasicCompactionEngine 基础 provider 已落地(回放前缀复用 KV cache 摘要)。但 InfoQ 专家所言「长期记忆 / 自适应上下文压缩 ACP / 因果图检索」本版本代码与文档全无痕迹——属路线图。冲突清理仅见 surface 的 replace 阴影语义,路径复用/Plan 校验无直接对应代码。
—
六、对比坐标(代码事实 + 外部常识,后者标「外部」)
| 维度 | dsh(Plugin-Centric) | Claude Code(闭源成品·外部) | Codex(Rust 内核+双形态·外部) | Anthropic Managed Agents(Interface-Centric·外部) |
|---|---|---|---|---|
| 内核 | 无特权微内核:Cordis 插件树 | 闭源单体精品 | Rust 单体内核 + CLI/云端 | 解耦 Agent/Environment/Session 三组件 |
| 多 Agent | 层级式 Supervisor–Worker(树) | 子 Agent 委派 | 子 Agent/沙箱 | 托管式、可被外部编排调用 |
| 对外委托 | 同 SubagentProvider 可挂 claude-code/codex/acp(opt-in) | 自身即被委托方 | 自身即被委托方 | dsh 经 ACP 可对齐 |
| 现场脚本 | 是:workflow 写 JS(vm,无 fs/net) | 无(外部) | 无(外部) | 无(接口而非脚本) |
| 上下文工程 | 契约层:日志为唯一事实源 | 极致上下文工程(外部) | 强上下文/沙箱(外部) | 接口定义上下文边界 |
| 稳定层 | 「无特权内核」但契约语义层有事实内核 | 产品即稳定层 | 闭源代码即稳定层 | 公开接口(wake/emitEvent)承诺稳定 |
| 许可 | MIT,不绑模型 | 闭源商用 | 开源 CLI + 闭源云端 | 云服务一部分 |
> dsh 属 Concrete-harness(给出实现、允许替换);Managed Agents 属 Meta-harness(定义接口、不假设实现)。二者非替代:dsh 的 Loop 是可替换服务,一个实现 wake/emitEvent 的 provider 即可跑在托管平台之上;反之 Managed Agents 的接口亦可被 dsh 的 Subagent 缝吸收。真正竞争在生态标准位——谁的事件语义与接口形状成行业默认,谁握「稳定层」。
—
七、评价与风险(PK InfoQ 观点)
7.1 InfoQ 诸论,代码如何应答
– 「一切皆插件价值,在留替换/组合/试验空间」——成立。代码证实 Loop/模型/工具/UI 全可换,且「无特权内核」使外部作者与官方同平面。 – 「多 Agent 架构有新意、范式无突破」——成立(§4.3 代码证)。 – 「真正差距在局部:记忆压缩/冲突清理/路径复用/Plan 校验」——部分成立:仅 compaction 落地;长期记忆/因果图检索无迹,路径复用/Plan 校验无直接代码。InfoQ 专家把「路线图」说成「已确定方向」,措辞可更谨慎。 – 「差异化押注架构开放」——成立且深远:MIT + 不绑模型 + 可替换 Loop,把「模型之外如何工作」交给社区。
7.2 「什么都能换」不自动等于「更好用」
插件边界越深,五难随之而至(v0.1 尤甚):
1. 接口稳定性:契约语义层的事实内核(ctx./agent//SessionEvent)动不得,否则全生态断裂;README 明示破坏变更在即。
2. 依赖管理/版本兼容:49 包 monorepo,早期进入者承受高迁移成本。
3. 性能开销:waterfall 逐拦截 next()、日志逐事件投影,长任务有累积成本。
4. 调试复杂度:错误散落多插件,需 Trajectory 回放方能定位。
5. 生态治理:暂不收外部 PR,社区插件质量与跨版本稳定性待验。
7.3 战略解读:Commoditize Your Complement
dsh 与 DeepSeek 模型是软协同——适配器默认路由 DeepSeek,但无硬绑定(上下文缓存计量对齐模型 API 形态,仅此而已)。这与 DeepSeek 一贯开源策略同构:模型权重如此,harness 亦如此——互补品免费且通用,需求自然流向最好的模型。
双刃:MIT + 通用模型缝意味着竞品可零成本接入,harness 无法成模型护城河;此交易成立的前提是 DeepSeek 模型持续居 Agentic 能力第一梯队。商业化出口已被架构预留——无特权内核恰好允许把差异化能力(云端编排、托管运行时、企业治理)做成闭源 Bundle 挂开放底座,即「开放平台 + 私有云端 Profile」的 open-core 形态。
同期信号:DeepSeek 于 8-13 发布 V4-Pro 的同时,V4-Pro API 将于 8-16 起涨价约 4.6×(剃刀+刀片:送运行时、收推理)。开发者是否愿为开源底座承受涨价模型费,是未来十二个月的关键问。
—
八、结论
DeepSeek Harness v0.1 是迄今最激进的「一切皆插件」Agent 运行时:代码级证实其无特权微内核、机械强制的可观测性(model-visible means logged)、OS 级沙箱、以及把 Claude Code/Codex 接到同一 Subagent 接口的架构抽象。它不止是「DeepSeek 版 Claude Code」——它是把「造 Agent」的图纸开源。
然其成败不在当下体验,而在三件事: 1. 「可替换空间」能否转化为「稳定开发标准」——契约语义层的事实内核必须冻结,否则生态无根; 2. 官方能否给出高质量默认插件 + 可信组合范式 + 可信评测——插件系统给的是差异化空间,不是成功率; 3. 第三方是否围绕它持续构建——暂不收外部 PR、破坏变更在即、同日模型涨价,皆考验生态意愿。
v0.1 仍是一张设计蓝图:破坏变更在即、长期记忆未落地、Swarm 无原语、自动续跑需人值守。它最值得观察的,不是「今天多好用」,而是「一切皆插件」能否长成更多 Agent 产品共同采用的底层 Harness,还是止步于 DeepSeek 自己的 Coding 产品雏形。
—
附:四路专项报告原始路径(供溯源)
– 甲·Cordis 与工具流水线:deepseek-harness-research/report-甲.md
– 乙·四模式与创造模式:deepseek-harness-research/report-乙.md
– 丙·多 Agent 编排与对比:deepseek-harness-research/report-丙.md
– 丁·统一事件流与可观测性:deepseek-harness-research/report-丁.md
