事件日志记得下每一次工具调用、每一条审批决定、每一个模型见过的输入——却没有一个组件从这份历史里学到任何东西。
这是 DSH 系列第四篇。第三篇结尾留了一个缺口:架构把路修到了门口,学习回路本身是空白。这一篇把空白填成一份可以开工的参考设计。先说清性质:这是设计提案,不是 dsh 现状。它可以在 dsh fork 上实现,也可以在任何采纳那套模式集合的平台上实现。文中所有 dsh 事实锚定开源仓库源码(基线 47f9438),设计部分是新增提案。
引子:七类消费者之后
先数一遍 DSH 事件日志的下游消费者。运行时六类:resume(会话恢复)、fork(分支出新会话)、transcript(对话转录)、遥测、标题生成、统计。测试期一类:快照回放,无 key 重放真实会话,对模型可见行为做断言。七类消费者,各取所需。
共同点只有一个:它们都在消费历史,没有人改变系统。resume 把系统放回原状,遥测把历史变成图表,快照回放把历史变成测试用例。没有任何一个组件从历史中提取经验、反哺运行时。
而底料是齐的。一切行为可重放:会话语义是日志的 fold,别无隐藏状态。一切决策可审计:审批有持久事件,谁在什么时候拒绝了什么,永久可查。一切模型可见输入可重建:模型见过什么,日志能一比一重放出来。这三句话合起来就是现成的经验采集格式,训练数据采集器的全部原料,存储成本也已经在付(zstd 全量落盘)。
缺的只是最后一个消费者:learner。
三个判断
为什么值得做这件事,三个判断叠着看。
范式判断:harness 的下一步分化在"会不会学习"。 执行层的可组合性之争已经有了答案形态,第三篇讲的就是。适应层,从自身运行历史改进自身,还是空位。有人会提 RL 直接优化 harness 决策的研究方向;不管训练路线成熟与否,那条路上的日志都是训练语料。换句话说,先有结构化的"观察、提案、效果"记录,才谈得上任何学习算法。日志侧的经验提取管道是前置工程,绕不开。
经济判断:边际成本很低。 会话日志已经在付存储成本,多一类消费者是纯增量收益。不动运行时热路径、不新增采集管道;新增持久化只有回路自身的提案事件,量级可忽略。工程上很少有成本这么低换新能力的买卖,这是罕见的一个。
风险判断:不受审的自我改进是权限提升通道。 这是最要紧的一条。一个能改 prompt、改 guard、加 skill 的组件,如果不走审批,就是系统里的超级用户。学习回路的价值恰恰在于先立安全约束、再开适应能力。顺序反了就是事故,而且是安全事故,不是功能事故。
两条路的分岔
DSH 里已经有一个"自我修改"的东西:tool-cordis。第二篇拆过它,cordis preset 让 agent 编辑自身运行时,执行模型写的 JavaScript。但它和学习回路是两条不同的路。
| tool-cordis(dsh 现状) | 学习回路(本设计) | |
|---|---|---|
| 触发 | 模型即兴决定 | 历史模式驱动(离线/回合制) |
| 载荷 | Cordis 插件代码 | 声明式制品(规则/markdown/diff) |
| 持久 | 进程内存,重启消失 | 事件日志加落层产物,永久可审计 |
| 定位 | 此刻能不能 | 长期该怎么变 |
一个类比:tool-cordis 是现场的即兴演奏,学习回路是事后整理的录音室专辑。前者探索可能性,后者沉淀可复用的经验。两者并存不冲突,但生产环境的自我改进必须是后者,即兴的东西不可审计。
第二篇留过一张进化能力表:人指挥改,已实现,cordis preset 就是;agent 自主改,部分实现(self-modification 包,能查能挂但无决策逻辑);系统从模式学习,空白。学习回路填的就是第三行。

回路设计
回路怎么转,一张图先立骨架:五个阶段串起六个事件,事件落在 learned/ 命名空间。

六个事件,一个生命周期
学习回路自己的历史也走事件日志,六类持久事件:
learned/pattern-observed 模式发现:什么模式、命中哪些会话位置、统计强度
learned/proposal-created 提案:改什么、证据链(引用源事件序号)、置信度
learned/proposal-decided 裁决:批准/拒绝/搁置,谁裁的(人/自动策略)
learned/proposal-applied 落层:进了哪层、定位在哪、产生了什么版本
learned/proposal-rolled-back 回滚:为什么、回退到哪个版本
learned/effect-observed 效果观测:窗口、基线、差值、置信度、附注
一个生命周期闭环:模式被发现,变成提案,被裁决,被落层或回滚,效果被观测。两个细节值得停一下。其一,提案载荷分三类,prompt 修订、skill 草稿、guard 收紧,这是"改什么"的分类,不要和六事件混淆,六事件是流程,三类是内容。其二,效果观测事件成为下一轮模式发现的输入:一个持续无正效果的制品,会触发"建议复审"模式。回路自己会发现自己学错了。
五个阶段
事件是记录,阶段是流程。extract、propose、gate、apply、audit。
extract 阶段离线 fold 会话日志,找重复模式。P0 范围三类:反复失败的工具调用序列(同一个工具连续失败 N 次的形态)、审批反复(同一操作被拒后原样重试)、用户纠正语(用户对同类输出的连续修正)。实现为纯函数投影,冷启动免费,重放即重建,与 dsh 会话恢复同构。
propose 阶段把候选模式变成带证据链的提案事件。证据不是模型的一句"我觉得",是源事件序号列表,每条可点开、可重放。
gate 阶段是安全核心,三道工序依次过。自动校验,载荷合法性、证据完整性。单调性校验,guard 类提案与现有策略集做半格 join,join 结果存在放松方向就直接拒绝。人工审批,呈现提案全文、证据、影响范围,人来定。
apply 阶段的关键词是零新旁路。prompt 修订走既有的 system-prompt section 机制,order 落在独立号段,不挤占工具指南区;skill 走 skills 缝;guard 规则走 patch 配置层。不新开任何变更通道,学习产物与人工配置走同一条路、受同一套律约束。
audit 阶段由独立的 Auditor 做效果观测。注意独立性怎么钉死的:Auditor 是 harness 内置投影,不可由 learner 缝的 provider 注册,不是靠"我们不复用上下文"的口头承诺。metric 词表固定,失败率、重试率、审批率,新增 metric 走 harness 变更而非学习层。观测窗口按事件时间戳推进,会话崩溃不重置,冷恢复后补跑未闭合的窗口。
一轮真实的样子
拿设计文档里的完整走查过一遍,比抽象描述清楚。
用户敲 /learn-review。Extractor fold 日志,三条 pattern-observed 落进日志:一个失败序列模式、一个审批反模式、一个纠正语模式。Proposer 从中生成两条提案:一条 guard 收紧(把某个反复失败的操作参数直接禁掉),一条 prompt 修订(给某类任务加一条注意事项)。
Gate 第一道,证据重放,两条都过。第二道,单调校验,guard 提案 join 无放松方向,过;prompt 不适用单调校验,过。第三道,人工审批(approval waterfall)。guard 提案走人工,有人看了证据链,批准,decided 事件落日志,patch 层追加一行 learned- 前缀的规则,applied 事件落日志,Auditor 挂起 24 小时观测窗。prompt 提案被搁置(defer),TTL 72 小时,到期无人答复,自动转 rejected。fail-closed,搁置不是默许,到期不批就是拒绝。
24 小时后窗口闭合。effect-observed 落日志:该操作失败率 delta 负 41%,样本量 17,置信度 0.6,附注写明"单会话"。这条事件进入下一轮 extract 的输入。
回滚的机械性
学习会出错,回滚必须便宜。答案是 patch 层的位置和前缀纪律:学习层在层序中位于 home 之上、overlay 之下,会话经验的语义强度介于个人全局配置与本次启动的显式覆盖之间。所有学习产物带 learned- 前缀,回滚等于 disable 该行,或者把整个学习层剥掉,再加一条 rolled-back 事件。append,不删历史。
操作集是封闭的:禁 ReplaceRow 非 learned 行,学习层永远改不了人工配置;learned 行自身的修订强制重过单调校验,且校验基线包含被替换的旧版本,你不能用一个新提案悄悄缩小自己上一版的拒绝域。patch 代数没有"反向操作"动词,回滚语义落在既有动词上,因此机械、可审计、无特例。
回合制,不是常驻进程
回路不是后台守护。一次命令驱动一轮 extract 和 propose,gate、apply、audit 按提案粒度异步推进。任何阶段崩溃,状态由事件重放恢复:已 applied 未观测的提案,Auditor 重新挂窗;defer 中的提案,TTL 按事件时间戳续算。不存在只活在内存里的回路状态,这条性质直接继承自事件溯源底座,一分钱额外成本没花。
安全模型
三条铁律管住回路,一个方向永远封死:

这是整个设计的智识核心,也是为什么说可组合性优先的架构恰好是自我改进系统的安全底座。
铁律一:学习只能收紧,不能放松。 guard 类提案与现有策略集做半格 join,join 结果若存在放松方向,把既有拒绝域缩小,直接拒绝。这是 guard 吸收律在时间维上的推广:空间上,存在 deny 即 deny;时间上,存在放松即拒绝。学坏了的回路顶多把自己学得更严,学不会给自己开门。
铁律二:guard 与 skill 类提案必须人工审批。 自动批准策略只允许作用于 prompt 类提案。理由朴素:prompt 改坏了影响输出质量,guard 改坏了影响安全边界,skill 引入了新代码。三类风险等级不同,审批等级就该不同。
铁律三:效果观测是数据,不是结论。 Auditor 产出 delta 和置信度,附注写明窗口和样本量,不做因果断言。单会话样本撑不起因果结论,小样本显式降权,样本不足就老实说不足。诚实胜过完整,这条论题在学习回路里又一次兑现。
设计验收时给自己上了对抗测试,七条攻击路径逐一构造:注入恶意 skill、放松性提案、伪造证据链、提案洪泛、自我评分美化、绕过审批直接 apply、自动策略越权扩围。要求全部被对应防线拦截,且断言报错信息正确。比如自动策略越权这条,测试用例必须包含"guard 类提案按 kind 被拒"的断言,不是靠 prompt 约束,是靠类型判别。
三个代表性威胁对三个不变量:提案洪泛耗尽审批带宽,用 gate 配额执法,turn 窗口加会话双上限;借学习提权,靠铁律一加铁律二封死;效果不可证,靠铁律三的观测纪律兜住。
还有一条总纲:回路自身也是事件日志。每一轮学了什么、批了什么、效果如何,全部可审计,包括审计者自己。自我改进系统最怕的是改进过程成为黑箱,这里没有黑箱。
路线图
P0,一到两周,只读起步。 /learn-review 斜杠命令,无模型回合,纯函数 extractor 找三类模式,只读呈现,不落任何 learned 事件。风险为零,价值立得:先看模式发现的质量,再决定要不要往下走。验收标准也现成:构造含已知模式的测试会话,fixture 集五十例以上,三类模式精确率与召回率各不低于 90%。
P1,约一季,受审落层。 六事件加 gate 三工序全量上,prompt 和 skill 两条 apply 路径先通,guard 路径随后。全部不变量有运行时断言,审计回放完整,重放适应史与管理面板零差异。
P2,跨会话聚合,诚实标注为开放问题。 模式库存哪、谁审、如何防跨租户泄漏,每一个都够一个独立设计文档。方向上有真杠杆,跨会话的模式库才能撑起统计意义上可信的效果归因,单会话样本永远撑不起。但把它画进 P2 是"有待设计",不是"已经想清楚"。同类的还有振荡约束:收紧、效果差、回滚、再提议的循环,目前只有配额兜底,倾向是同 payload 哈希在 K turn 内禁复提的冷却期,未定。
尾声
这份设计没有预言谁会做、什么时候做成。它预言的是一件事:把事件溯源、单调策略、受审变更这三样东西放在一起,学习回路就不是天马行空,是水到渠成的下一步。底座早就在了,等的就是第一个动手的消费者。
上一篇文章说 DSH 会执行、不会学习。严格讲,这个判断的有效期可能只剩几个月。不是 DSH 会追上来,而是第一个把第八类消费者做对的团队,会重新定义 agent harness 的分界线。到那时回头看,"会执行不会学习"会是这个阶段最好的一句墓志铭。
声明: 本文基于 DeepSeek Harness 开源仓库(github.com/deepseek-ai/deepseek-harness,v0.1.0-rc.5,分析基线 commit 47f9438)源码事实与《学习回路设计 v1.2》参考设计(Judy 二审 8.5/10)撰写;dsh 事实部分锚定源码,设计部分为提案性质,非 dsh 现状。系列前三篇见本站。不构成投资建议。数据截至 2026 年 8 月 17 日。
