覆盖语义要能穿过序列化
Agent 的状态更新不能只看“写进去了没有”,还要看写进去之后,覆盖、合并、追加这些语义有没有在 checkpoint 和 replay 之后保持不变。
LangGraph 1.2.7 里两个很小但很典型的修复值得注意:一个是 DeltaChannel overwrite supersteps 的 snapshot 处理,另一个是让 Overwrite 能穿过 JSON roundtrip。它们指向同一个问题:运行时里很多状态不是普通值,而是带更新语义的值。序列化如果只保留数据形状、不保留更新意图,恢复后系统看似正常,实际已经把“覆盖”误解成“合并”或“追加”。
这在 Agent 平台里尤其危险。消息投影、工具结果、审批状态、memory delta、UI patch、子任务进度都可能依赖 overwrite 语义。一次恢复后如果把旧的 pending approval、过期 tool result 或被覆盖的状态又合并回来,模型可能基于幽灵状态继续行动。
工程上应该把状态操作也纳入 schema:哪些字段是 append-only,哪些字段 last-write-wins,哪些字段必须带 revision,哪些字段只能由特定 actor 覆盖。checkpoint 不是简单 dump object,而是在保存一段可重放的状态协议。
当我们设计 OPC 的任务状态和 Agent memory 时,有没有哪些字段现在看起来只是 JSON,但其实已经需要明确“覆盖/合并/追加”的协议语义?