KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
DeepSeek Harness(dsh)解析 — keel 龙骨
DeepSeek Harness 的参考信息:DeepSeek Harness(dsh)解析
课程导读 · 当「一切皆插件」遇上「日志即真相」
这门课针对一个具体问题:如果要把一个 Agent 运行时的每个部件都做成可替换插件、把它的每次运行都做成可重放的事件日志,工程上要付出什么、能换回什么?
内核怎么挂插件 → 插件有哪些 → 一轮怎么跑 → 日志怎么记 → 程序怎么写 → 沙箱怎么挡
六章的对应关系:
| 章节 | 解决的核心问题 |
|---|---|
| 01 Cordis 内核 | 依赖驱动的自动挂/卸载是怎么用 Proxy 和 epoch 实现的 |
| 02 插件全景 | 46 类约 300 个插件怎么归类,bundle 与 boot 怎么分工 |
| 03 主循环 | 没有 maxSteps 的循环靠什么停,工具结果为什么要按 model order 提交 |
| 04 Session 事件流 | 62 种事件怎么扩展,消息历史为什么只能是投影 |
| 05 Preset 与 Code Mode | 四种 preset 差在哪,PTC 怎么把工具编译成一段 TypeScript |
| 06 沙箱与 Provider | 沙箱不可用时为什么 fail closed,claude-code 怎么被当成 subagent |
每章结构统一:正文机制 → 代码地图 → 关键取舍 → 自测题。
这门课的一条主线
把「控制层」与「能力层」彻底拆开
→ 控制层只剩两样东西:一个依赖响应式的插件内核 + 一条 append-only 事件流
→ 能力(模型、工具、沙箱、UI、渠道)全部以插件身份挂进来
→ 于是 fork / resume / replay / 换 preset 都退化成「对同一条日志做不同读法」
→ 代价是:每一层都要为「可重放」让步(abort 也要补合成结果、事件类型要注册)
第 03 章的 model order 提交、第 04 章的 surface 投影、第 05 章的 SDK 字节稳定输出,都是这条主线的不同切面。读完你应该能回答:为什么这个运行时敢于不设 maxSteps?
与其它板块的关系
- Claude Code 板块:另一条路线——单进程紧耦合、生成器主循环、内存即状态。两门课对照读,「单进程交互式」与「插件化事件溯源」的代价一目了然。
- Hermes / OpenClaw 板块:前者是 Python 世界的自改进助理,后者是 TypeScript 世界的本地控制平面,扩展机制与 dsh 的 Cordis 各有取舍。
- 对比课:本板块代表「插件化 + 事件溯源」这一类,九槽位对比里有它的完整定位。
版本与可信度
- 分析对象是官方仓库 0.1.7-rc.1(commit 46a7f68) 的 HEAD 树。分析时工作树曾被标记删除,内容一律取自
.git对象库(git show HEAD:<path>),文件清单以 HEAD 树为准。 - README 自述与代码不一致处以代码为准(例:README 宣称的
creatorpreset 在该 commit 不存在,实际第四个 preset 是cordis)。 - 版本会漂移。行号只作定位参考,请以符号名为准;跨包扩展的事件类型(
declare module合并)在不同 fork 里可能不同。