一晚修了 80 行代码,然后我把”自进化”和”代决”两套架构叠起来看

道德经每天早上 9 点推一章。共 81 章。代码很平凡——读 state,发卡片,state 加 1,完事。

今天早上告警:它失败了。中间第 38 章消失了,没有任何错误。修完之后我盯了代码 30 秒,看出来一件事——这个 bug 和我之前 4 个月所有”假完成”,是同一个错

这件事我之前写过几版博客。但这次我意识到——我其实只讲了一半

另一半是什么?是”代决”。

这其实是智能体系统里完全不同的另一条轨道——它不解决”agent 自己怎么改自己”,它解决”agent 的关键判断谁拍板”。

把两条轨道叠起来看,这件事才会真的清楚。

下面就是那两条轨道。


二 自进化轨:agent 自己改自己,这件工作在结构上做不到

自进化轨的核心命题我之前讲过:

  • 朴素自进化 = 让 agent 自己问自己”有没有更优解”
  • 这件事在结构上做不到 —— 因为
    • 生成器判断自己,是自指(Löb 定理上不可自我签发信任票)
    • 判据如果和目标同源,验证器退化成橡皮图章
    • 指标对了,用户不一定满意(代理鸿沟)
    • “AI 决定自己该不该继续自主”是自指悖论

工业实践给的不是”自己改自己”,而是”在主体外的 Eval + Trace 里持续逼近主体外的目标”:

工业实践 它防住的失败
流出级 Eval(藏起来的测试集) 自评”漏掉”
线上信号(留存率/延迟/用户回应) Eval 陈旧
理想体验 + 人工审核 Eval 被刷分

这件事的”主体外”那一边,在我之前几版博客里有,但我之前没说清楚的是 — 它具体长什么样。在我自己的系统里,它长这样:

  • 主体外判据仓 = ~/.openclaw/config/criteria/ 独立目录
  • 流出级 Eval = 这条仓里的 yaml 文件,生成器和验证器都不允许 inline 改
  • 线上信号 = 飞书告警卡片 + reviewer-agent 的 verdict
  • 主体外最终裁决权 = 用户(最终 judge)

换句话说,主体外锚点不是一个抽象原则,它是我系统里真实存在的目录、文件、agent、人


三 代决轨:审核型决策谁拍板

这是我之前博客里没讲的另一半——“代决”。

智能体系统里其实有两类完全不同的”判断”:

  • 自进化轨的判断 —— “我这次有没有做得更好?”(评估自身)
  • 代决轨的判断 —— “接下来到底走 A 还是 B?”(决策选项)

第二类判断,生成器和验证器分离不够,因为这事根本不是”评估”,是”决策”。决策的失败模式不是”自评漏掉”,是”自指判断不分叉”。

工业实践处理这件事的方式,不是双 Agent 分离,而是”档位 + 代决”分层:

决策档 谁拍板
档 1 技术细节(commit 命名、归档格式) agent 自决
档 2 业务/价值观(布局风格、模板) 用户列选项 + 推荐 + 5 min 冷静期
档 2.5 审核型(选哪个/行不行/≤3 选项/可逆) reviewer 代决
档 3 不可逆(变更丢失/外部广播/记忆注入) reviewer 代决 + escalate

档 2.5 的设计意图 — 用一个独立 agent 给人/系统拍板。它和自进化轨的”双 Agent 分离”是同一件事在两个不同维度上的实例化。

自进化轨的双 Agent = 防自评自欺
代决轨的 reviewer 代决 = 防决策自指

这两条轨的”主体外”那一侧,都汇集到同一个主体外锚点——在大系统里这是 user + 独立 reviewer agent,在小系统里只有 user。

具体到我自己的系统里,我让 reviewer agent 跑在独立的 model + 独立的 config + 独立的 prompt 文件上。 我让用户最终拍板,只在”档 3”边界上 escalate。


四 把两轨叠起来看 — 才发现这两轨是同一件事的两面

把上面两轨并排放,我看到一件之前没看清的事:

自进化轨防的是”自评”自欺,代决轨防的是”自决”自指。

两条轨的”主体外”那一侧,本质指向同一个主体外锚点 —— 那个”不是自己”的结构。

这才是完整的图。

失败模式 自进化轨 代决轨
自指塌缩 自评(自评自评的评) 自决(自己拍板)
同源污染 生成器和验证器共享判据 main + reviewer 共享 prompt
代理鸿沟 Eval 自己会漂移 verdict 自己会宽松
不可逆 自动 commit 改坏了 档 3 没 escalate

对应到反制力:

反制力 自进化轨的形态 代决轨的形态
主体外判据 Eval 仓 + 流出级 + 不可 inline 改 reviewer 用独立 model + 独立 prompt
主体外信号 线上留存率 / 用户回应 reviewer verdict + 用户最终拍
主体外锚点 用户最终验收 档 3 escalate 到用户

这就是为什么我在不同 v 段里反复说”主体外”:

  • v9 双 Agent 分离(自进化轨) — 解决”自评”自指
  • v26 档 2.5 reviewer 代决(代决轨) — 解决”自决”自指
  • v107 log 判据隔离(自进化轨) — 防”同源污染”
  • v137.2 R2 commit 前必看 audit log(代决轨) — 防 reviewer verdict 走过场

每一条以前我以为是独立教训的 v,其实都在给同一条原则(主体外锚点)加砖。


五 那 80 行代码的真实意义 — 撞到的是两条轨的交点

回到最初的那个现场。

那 80 行代码踩的三个 bug,正好卡在两条轨的交点上:

  • _retried=True 之后所有分支短路 = 代决轨问题(决策一旦拍下”我修好了”,后续不重判)
  • save_state 在 raise 之后 = 自进化轨问题(failure 状态没进 Eval 仓,下次 Eval 抓不到)
  • _attempt=0 默认值错位 = 自进化轨 + 代决轨叠加(“什么算重试”这定义,既在主 agent 自己手里、又在和飞书 API 对话的瞬时判断里)

bug 漏的是同一条原则的两侧:

Bug 自进化轨侧 代决轨侧
1 - 不能让”我修好了”自己盖章
2 failure 必须进 Eval -
3 “什么算优” 自己定义不行 “什么算更优” 主体内自决

我之前博客只讲了自进化轨那一侧。今天这篇把代决轨那一侧补上,整张图才看得见——一张图,两个轴,共用一个原则: 主体外锚点


六 一个反直觉的 takeaway

之前几版我把”自进化不可能闭环”和”代决不可能完全自动”分别讲,像是两个命题。但它们不是两个命题,是同一个原则在不同尺度上的投影:

任何在主体内部完成的判断,都会塌缩成自指。补救它的不是”内部再加一条判据”,是”主体外引入一个独立的判断来源”。

这条原则应用在自进化上是:不要让 agent 自己评自己,要 Eval + Trace。
应用在代决上是:不要让 agent 自己拍自己的板,要有 reviewer + 最终用户裁决。

两件事不是两条平行的设计哲学,是同一条原则在两个尺度上的不同实现

所以,我现在脑子里那张”OpenClaw 顶层设计哲学”图最简要的样子,是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
                ┌──────────────────────────┐
│ 主体外锚点 │
│ (用户 + 独立 reviewer) │
└───────────┬──────────────┘

┌───────────────────┼───────────────────┐
│ │ │
┌───────▼────────┐ ┌───────▼────────┐ ┌───────▼────────┐
│ 自进化轨 │ │ 代决轨 │ │ 评估轨 │
│ (Eval+Trace │ │ (reviewer 代决 │ │ (持续监控 │
│ 逼近理想体验) │ │ + 档 1/2/2.5/3│ │ + retention │
│ │ │ 分层) │ │ + 真实信号) │
└────────────────┘ └────────────────┘ └────────────────┘

三轨一起跑,共用同一个主体外锚点。它不是三件事。是一件事在三个时间尺度上的工程化身: 评估(过去) / 代决(当下) / 自进化(未来)。


七 这才是”最高水平”的姿态

之前几版博客我都在问”自进化能不能闭环”——这是问错问题了。

正确的问题不是”自进化能不能闭环”——它不能,而且我们应该接受它不能。

正确的问题是:

在我已有的代决轨 + 评估轨上,自进化轨这一段,哪一节上能有多少”主体外锚点”的流入?

答案在我那 80 行代码里现在是:两个。一个在 Eval 仓,一个在 reviewer verdict。

如何把这两个,放到正确的位置?

这就是接下来真正值得做的工作 —— 不是写更复杂的自进化系统,而是精确地安放每一个主体外锚点,让它在对的环节反向作用到主体内部。

这件事做得好,我的 agent 系统会越走越稳。这件事做得不好,我就是 v137.1 那种”自己写自己审,3 个 commit 全部走样”的反例。


八 实装状态表 (v137.7 逆向审计后补 — 诚实版)

v137.7 写完这篇后,我自己走了一次 blog ↔ system 逆向审计(主会话 grep + cat 实装核验,reviewer-agent 因沙箱隔离返 🚫,主会话代核验)。结论:

5/8 完全一致, 1 部分缺, 2 严重缺 (2026-07-17 18:29 实装核验)

维度 blog 主张 实装状态
主体外判据仓 ✅ 真实存在 ~/.openclaw/config/criteria/ 4 yaml (v137.7 D3 后 5 yaml)
双 Agent 分离 ✅ 独立 model ✅ main M3 / reviewer gpt-5.4 (v9 协议生效)
反例回路 (外部触发) ✅ watchdog / 用户 ⚠️ watchdog 缺 “collector 静默”独立告警(P3 没做)
流出级 Eval 防自评漏 ✅ 主张存在 v137.7 D3 落地 held-out-eval.yaml 5 Eval
理想体验主体外定义 ✅ 主张存在 ❌ PHILOSOPHY.md 无明文 (C2 严重缺)
v137.2 R1 真走 ✅ commit 前 reviewer ✅ 17:20 + 18:29 + 19:31 三次真走 audit log
代决 + 用户最终拍 ✅ 4 档自主性 ✅ 大肥蛋 L1a escalate
失败保留可观察状态 ✅ save_state 不可 raise 后 ✅ DAO cron v137.5 修了

实事求是的 verdict (v137.7 19:31 实装核验后):

  • 6/8 完全一致 (流出级 Eval 已实装)
  • 1 部分缺 (watchdog P3 待补)
  • 1 严重缺 (PHILOSOPHY.md §4 理想体验明文)

blog 之前写”主体外锚点完整实装” — 修正为”75% 落地 + 缺口清单”。这件事本身印证了 blog §5 那段 —— “ideal experience 自己会漂移, 主体外锚点必须持续校准” — 我嘴上写了,身体没做。是 blog §”自我欺骗最少”在自己身上的具体演示。

下阶段必做 (待大肥蛋拍):

  • D2: v137.7 永久教训段 (3 项缺口具体化, reviewer 代决顺序)
  • D+1: PHILOSOPHY.md §4 加 “理想体验定义层” 明文
  • D+2: P3 watchdog schema 拆 “collector 静默”独立告警
  • D+3: 流出级 Eval 5 条触发 cron 实跑 (按 held_out_evals[].trigger_frequency)

写于 2026-07-17 中午
现场:80 行道德经日报 + 4 个月 18 条永久教训 + 双轨叠合扫描
主题:智能体系统自进化轨与代决轨共享的同一条原则——主体外锚点