deepseek-harness — 本课题摘录
读了哪几篇: 02-session-log(唯一事实源与投影)、03-agent-loop(turn/step 状态机)、04-tools(工具注册表与执行流水线)。
其余三篇(插件树、能力接缝、每会话组装)本轮没读。
这一家在本课题里的位置:它对"一轮的状态放哪"给了最彻底的答案——不放任何地方,只放一条日志,其余全是它的投影。
它对本课题回答了什么
决定一最重要的一条:取消"同步",只留一份事实
它先把问题说清楚:agent 的"记忆"如果由多个地方各自维护,早晚会对不上。
朴素实现通常有三份状态:内存里的消息数组、界面上显示的对话、磁盘上的存档。靠"每次都记得同步一下"保持一致。只要有一处忘了同步,就出三类经典事故:
| 事故 | 表现 |
|---|---|
| 界面有、模型没有 | 用户看到一条注入的上下文,模型请求里却没带上 |
| 模型有、存档没有 | 进程崩溃后恢复,模型突然"忘了"上一轮做过什么 |
| 压缩把历史改坏了 | 摘要覆盖了原文,界面上用户已经读过的内容凭空消失 |
(依据:Agent 库 · DeepSeek Harness · 第 2 章 · 唯一事实源:append-only 会话事件日志与 surface 投影 —— 朴素实现有内存 messages、UI 对话、磁盘存档三份状态靠同步维持一致,会出三类事故——界面有模型没有、模型有存档没有、压缩把历史改坏;dsh 的办法是取消同步,只留一份事实其余全是投影)
它的办法是取消同步这件事:只留一份事实,其余全部是它的投影。
一条可执行的硬规则
模型可见 ⟺ 已落账:任何能进入一次模型请求的东西,都必须能从会话日志重建;新增一种模型可见输入,就必须新增一种会话事件。
而且它在代码里有强制检查点,不是口号。 (依据:Agent 库 · DeepSeek Harness · 第 2 章 · 唯一事实源:append-only 会话事件日志与 surface 投影 —— 规则「model-visible ⟺ logged」——任何能进入模型请求的东西都必须能从会话日志重建,新增一种模型可见输入就必须新增一种会话事件;代码里有强制检查点)
三个承重词各有唯一含义,不互相借用:
| 词 | 指什么 | 能不能改 |
|---|---|---|
| 日志 | 一次会话发生过的全部事实,按序号连续编号 | 只能在尾部追加;已写入的事件深度冻结 |
| 可见面 | 日志里"会变成一条模型消息"的那些事件的有序编号列表 | 可以遮蔽某一段,但不动日志 |
| 投影 | 把可见面的每个节点算成一条消息的纯函数结果 | 缓存产物,随时可从日志重算 |
它的类比很好:日志是记账凭证(一张都不能撕),可见面是当期科目余额表(可以把一批旧凭证结转掉),投影是打印出来的报表。
"压缩不是删历史,是在可见面里遮蔽一段"——这是本课题"历史怎么压"这一支最干净的表述。 deepagents 的"只做投影"、nanobot 的"只修副本"、opencode 的"库里还在只是不发"都是同一族; 这一家把它上升成了数据模型,而不是一个技巧。