门户首页
插件化 Agent 架构系列 · 2 / 4 · 时间维度

Temporal Composability:组件可进可出(Revertible Effects)

时间维度 = 组件卸载时能否完全撤销它的所有副作用。论文核心机制:Revertible Effects—— 每个 effect 配对一个显式 inverse,runtime 自动按 LIFO 顺序撤销。本页讲清这个机制、3 个关键属性,以及 怎么应用到 agent 工具的生命周期管理。

生成时间:2026-09-02 19:52 · 生成 Agent:MiniMax Code (LLM: MiniMax-M3) · 载体:agentsoft-research-platform teaching-web-platform

概览

3
关键属性
1
核心机制
1
时序图
1
公式
本系列 4 页进度
#页状态
1overview✅ 已完成(回顾)
2temporal👉 本页
3spatial下一篇
4unified末篇

第一篇 · Temporal Composability 是什么

Part 1 · 2 卡:定义 + 机制
先把"时间维度"钉死——它问的不是"组件能不能被卸",而是"卸载时世界能不能回到加载前"。
第 2 讲 · 1 定义 + 3 属性

什么是 Temporal Composability(论文 §1.1)

论文定义:temporal composability 是"upon removal of a component, the modifications the component made to the shared environment must be completely and safely reversed"。换句话说——

组件卸载后,世界状态 必须等于 组件加载前的世界状态。中间的所有副作用、注册的事件、打开的文件句柄、分配的缓存——全部回滚。
3 个关键属性
  • 完全撤销(complete reversal):不是"部分撤销"或"尽力撤销"——必须 = idΓ,所有 effect 全部 revert
  • LIFO 顺序:后装的先卸(stack 语义),因为后装的可能依赖先装的资源;乱序会导致 resource 已经卸了但有人还在用
  • 自动组合(composition-preserving):单个 effect 撤销 + 另一个 effect 撤销 = 复合 effect 撤销(数学上的 monoid homomorphism)
为什么是"lifetime-level" 而不是"scope-level":传统 RAII / bracket pattern 处理的是词法作用域(lexical scope)的资源——进 `{}` 就装,出 `{}` 就卸。Plugin-based agent 要处理的是组件生命周期(lifetime)——装可能在任意时刻,卸也可能在任意时刻,不在词法边界上。这就是为什么需要把 effect 从静态分析(type system)提升到 runtime mechanism。
← 返回入口 下一卡:机制 回 §1.1 基础:Shi et al. 2026 §1.1, §3.1
第 2 讲 · 1 公式 + 1 时序图 + 1 伪代码

机制:Revertible Effects(论文 §3.1)

核心思想:每个 effect 配对一个 inverse,runtime 自动累积、按 LIFO 撤销。作者用一个代数结构承载这个语义。

形式化骨架(论文 Definition 1-3)
// 1) 改造前的 impure 函数
f_impure : X → Y

// 2) 改造成"接受 context、返回 (新 context, inverse)"
f : Γ × X → Γ × Y

// 3) effect 上下文:当前 state + inverse 累积器
∂Γ := Γ × (Γ → Γ)
       //  ↑       ↑
       // state   累积器:到目前为止所有 inverse 的复合

// 4) 跟踪 effect 的核心函数
track( f, g ) : ∂Γ → ∂Γ
track( f, g )(γ, φ) = ( f(γ), φ ∘ g )
                     // ↑      ↑
                     // 应用 f  把 inverse g 复合到累积器

// 5) 卸载时跑累积器
dispose() : ∂Γ → ∂Γ
dispose(γ, φ) = ( φ(γ), id )  // 把世界状态用累积器回滚
3 个调用累积成 1 个 inverse(截图:LIFO 撤销过程)
sequenceDiagram autonumber participant U as 组件 participant C as Runtime Context participant T as Accumulator (φ) Note over U,C: 组件加载,按 LIFO 累积 inverse U->>C: ctx.effect(f1, g1) C->>T: φ ← g1 U->>C: ctx.effect(f2, g2) C->>T: φ ← g2 ∘ g1 U->>C: ctx.effect(f3, g3) C->>T: φ ← g3 ∘ g2 ∘ g1 Note over U,C: 组件卸载(一次性跑累积器) U->>C: dispose() C->>T: 读 φ = g3 ∘ g2 ∘ g1 C->>C: 先撤销 g3(f3 的效果) C->>C: 再撤销 g2(f2 的效果) C->>C: 最后撤销 g1(f1 的效果) C-->>U: 卸载完毕,state 回到加载前
图 1 · 3 个 effect 的累积与撤销:累积时 prepend(g_new ∘ φ_old),撤销时按累积顺序(最右先跑)
论文反复强调:inverse 是程序员显式提供的(§5.1.1 原文:"an obligation on the component author rather than a property the runtime verifies")——runtime 只负责自动组合和自动撤销,不负责替你写出 inverse。所以"原子级"的语义仍然要手写,但"系统级"的正确性由 runtime 保证。
← 返回入口 下一篇:空间维度 跳到 §3 落地 基础:Shi et al. 2026 §3.1, §5.1.1

第二篇 · 落地:agent 工具的生命周期

Part 2 · 1 卡:把机制套到 agent 工具管理
理论看着对,套到 agent 工具上到底管什么用?这张卡给出 3 个具体场景 + 跟本仓的连接。
第 2 讲 · 3 场景 + 1 连接

应用到 agent 工具管理:3 个场景

工具(tool)是 agent 最常见的"组件"。传统实现里,工具加载 / 卸载的副作用管理是程序员记性——用 Cordis 视角看,每个 tool 的 lifecycle 都应该走 ctx.effect。

场景 1 · 工具注册副作用(论文 §1.2.1 痛点)
传统实现Cordis 化后
加载时 registry.register(tool);卸载时靠开发者记 registry.unregister(tool) ctx.effect(() => registry.register(tool))——unregister 自动生成
忘写 unregister → 工具残留、内存泄漏、后续 reload 时报"already registered" 不可能忘——runtime 强制追踪,不写 inverse 会报"missed effect"
场景 2 · 工具运行时资源(文件句柄、连接、子进程)
  • 传统:工具打开 file handle / 建立 DB connection / 启动子进程,开发者记 dispose
  • Cordis 化:ctx.effect(() => { fd = open(path); return () => close(fd) })——accumulator 收集 close callback
  • agent 价值:长跑 agent 中途换 tool(比如从 file_reader 换成 s3_reader)时,fd 自动关、新 fd 自动开,state 干净
场景 3 · tool 的参数 cache / 派生 state
  • 问题:tool 加载时建了 derived state(比如 embedding 缓存、connection pool),卸载时这些 state 必须清掉否则泄漏
  • 传统:开发者手动跟踪,debug 噩梦
  • Cordis 化:每个 derived state 用 ctx.effect 分配 → inverse 自动记录 → 卸载时自动回收
跟本仓 experiment_modules/solving/adapters/ 的连接:本仓 4 个 brand adapter(kimi / qwen / mimo / opencode)+ ollama runner,每个都该被当作 component,每个 tool 的注册/资源/state 都该走 ctx.effect。当前实现(参考 REPORT-ollama-tool-call-substitute-20260902.md)有些 hand-rolled 清理逻辑,Cordis 化后能结构性消除。
← 返回入口 下一篇:空间维度 末篇:Context 范式 应用:Shi et al. 2026 §6.3 (capability-based access control)