DeepSeek Harness 把工具、提示词、Provider、权限、交互和界面贡献都放进同一套插件运行图。模型可以在运行期间定义插件、挂载工具、观察结果,再停止或切换版本。这套设计回答了一个关键问题:Agent 的能力变更怎样进入运行时,同时保留所有权、清理和诊断信息。

五个概念组成运行图
Cordis 是底层插件组合与生命周期框架。Plugin 定义行为;每次挂载创建独立 Fiber;Context 是该实例访问 Service、事件和 registry 的能力视图;Inject 声明运行前需要哪些 Service;Effect 把一次注册和清理动作归到当前 Fiber。

以工具插件为例,源码只是 Plugin。它被 profile 挂载后产生 Fiber,ctx.tools.register() 把工具注册进 registry,并返回 disposer。Fiber 卸载时工具随之消失。文件写入、网络调用等外部操作不会自动回滚,插件必须自己设计补偿动作。
依赖也不会按 YAML 书写顺序硬跑。缺少必需 Service 的 Fiber 可以停在 PENDING;Provider 出现后,Cordis 根据新的依赖版本判断它能否进入 ACTIVE。PENDING 是合法等待,FAILED 才表示装载出错。
冷启动与即时生效
dsh --profile ... 先组合 bundle、profile、home 和 patch 层,再创建根 Context。Loader 为配置项生成稳定 Entry ID,通过 ctx.plugin() 创建 Fiber,最终得到一棵包含 ACTIVE、PENDING 和 FAILED 状态的运行图。

假设模型创建 repo_stats 插件统计 Typesc ript 文件数。Fiber 的 apply() 注册工具后,新工具已经存在于当前 Agent scope 的 registry。下一次 preStep 重组提示词和 tool schema,模型就能看到它。已经发给 LLM 的请求保持冻结,更新从下一次请求开始可见。停止 Fiber 后,disposer 注销工具,后续请求也不再看到它。
Agent Loop 没有识别动态插件的特殊分支。它每次从当前运行图读取能力,因此组合线可以变化,执行主循环仍保持稳定。
AGENTS.md 如何进入上下文
AGENTS 指令由 packages/context/agent-instructions 插件提供。首次 agent/pre-step 会读取 $DSH_HOME/AGENTS.md,再沿项目根目录到当前工作目录收集候选文件。插件构造带来源字段的 UserMessage;Agent Loop 将它记录成普通 user/message,随后投影到模型请求。

增量刷新没有依赖全局 watcher。成功且未取消的 read、write、edit 调用会从执行参数取得 file_path。路径先暂存,step/end 后再排队刷新。下一次 agent/pre-step 等待读取完成,只有嵌套 AGENTS 内容确实变化时才生成新消息。
错误、取消、空路径、内容无变化或读取失败都会继续使用现有上下文。这个约束保证模型可见指令能从 Session 事件重建,失败的工具结果不会伪造上下文更新。
模型如何写插件并挂载
自修改能力由普通 preset 组合出来。cordis preset 挂载 tool-cordis 后,模型才可能获得 inspect、define、run、stop 和 undefine 等七个 cordis_* 工具。

cordis_define 校验元数据、预编译 Host/Client 函数体,并生成稳定 Plugin ID 与不可变 Package ID。这个阶段保存候选版本,不创建 Fiber。cordis_run 在 Host 侧用 node:vm 求值函数体,确认返回值是 Plugin,再挂到 dynamic group。Inject 满足后,apply() 才注册工具或 Service。
这使一次演进留下明确记录:哪段源码定义 P1、哪个 Fiber 正在运行、注册了什么、为何失败、何时停止。动态 Package 把候选版本与运行实例拆开,我认为这是 DSH 最有价值的设计点。
工具调用的真实管线
一个 turn 可以包含多个 step。turn/start 先写入 Session,preStep 组装上下文;只有 preStep 接受后,系统才记录 step/start 和本 step 的 user/message。模型返回 tool call 时,scheduler 先写 tool/call,再交给 Tool Runtime。

Tool Runtime 冻结参数快照和执行上下文,依次经过 tools/pre-execute、ask 类 approval、guard 与 tools/execute 包装。真正分派时,defineTool() wrapper 执行 JSON Schema 校验并调用 Provider body。完成后进入 tools/post-execute,统一物化 ToolResult、附件和 UI 渲染意图。
Session 日志仍由 Agent Loop 负责:调用前记录 tool/call,结果确定后记录 tool/result。可并发工具的 body 可以重叠,但结果按模型顺序提交;exclusive 工具形成调度屏障。模型消息、回放、遥测和界面投影都从这条 append-only 事实流派生。
可回滚的边界
Fiber 卸载会撤回归属于它的注册项,动态 Package 也保留不可变版本,允许显式运行旧 Package。这不等于所有更新路径都有事务级回滚。
带 Client 的更新会先创建审批请求,此时旧 run 继续服务。批准后 Host 才撤回旧 Fiber 并启动候选。若 Client 在撤旧后晚失败,系统通常保留旧 currentPackageId 指针,却不会自动重挂旧实例;恢复运行需要显式执行旧 Package。
Node HMR、Browser HMR、Loader Entry 和 Dynamic Package 的提交点不同。判断能否自动恢复,要看失败发生在旧 Fiber teardown 前还是后,还要区分版本指针和实际运行实例。宣传“可回滚”时不能省略这段失败时序。
用它搭 AutoHarness
DSH 已提供动态 Package、作用域 registry、Fiber 清理、approval、sandbox、permission、Session trace 和旧版本显式运行。仓库里还没有独立 evaluator、隐藏任务集、release controller、长期收益统计和自动晋级策略。

稳妥的控制面应把候选 Agent 放在可变区域,把 Production Harness、隐藏测试、Evaluator、不可变 registry 和 Release Controller 放在外面。候选在隔离 profile 执行任务;Evaluator 只读取产物、Session trace、资源消耗和安全事件;Release Controller 根据预先冻结的规则决定晋级、观察或回滚。
repo_stats 可以验证闭环:基线任务统计 Typesc ript 文件;候选提供聚合工具;隐藏任务换目录、加入符号链接和权限错误;评估器检查正确率、token、延迟、越权和残留 Fiber。候选在未参与生成的任务上持续优于基线,才能证明能力改进。模型写出一个能跑的工具只证明发生了自修改,离 RSI 还差独立验证、跨任务泛化、资源约束和可恢复发布。
社区插件怎样审计
社区已经出现多 Agent Bundle、会话恢复和 memory/evolution overlay。Topic、README 或演示视频只能作为发现线索。我更建议固定 commit 后审计 manifest、入口、Inject、权限、外部进程和清理路径,再放进隔离 profile 跑真实 transc ript。

可靠的组合通常具备这些特征:Bundle 小,组合身份稳定;Host 与 Client 职责分开;tool、listener、timer、process、socket 和 UI 贡献项都能追溯到 Fiber;权限按最小集合申请;验收结果来自可复现的组装级运行。
总结
DeepSeek Harness 用统一语义组织 Agent 运行时:Plugin 定义行为,Fiber 承担实例,Context 与 Scope 路由能力,Effect 撤回贡献,Session 记录模型可见事实。动态 Package 为模型提供可观察的改造入口,Agent Loop 可以继续保持稳定。
它还没有自动解决外部副作用补偿、所有 HMR 路径的事务性、动态 ja vasc ript 强隔离和候选质量证明。补上独立评估与发布控制面后,Agent 自修改才可能从一次演示走向长期、可审计的能力演进。
”
原文作者: Vibe编码
原文链接: https://mp.weixin.qq.com/s/ccqvrHFo6oNUSwzXXYamcw
来源: 微信公众号
推荐学习书籍 《CDA一级教材》适合CDA一级考生备考,也适合业务及数据分析岗位的从业者提升自我。完整电子版已上线CDA网校,累计已有10万+在读~ !



雷达卡






京公网安备 11010802022788号







