时空可组合性 ④:系统边界、安全、相关工作与自演化 Agent(中文译文)
译文系列(4/4):① 问题、预备知识与上下文范式 · ② 动态组合演算 · ③ Cordis 实现与 Koishi · ④ 系统边界、相关工作与结论
本篇集中说明理论不覆盖什么、工程上还欠什么,以及它为什么把自演化 Agent Harness 视为下一块验证场。
6. 讨论
6.1 系统边界
inverse 能恢复到哪里,由系统边界决定。系统能独占修改并恢复的位置属于 Γ 内部;否则操作对 Γ 等同于恒等映射,无法由演算撤回。coeffect 可把外部位置“具体化”为受控接口,让所有访问经过能产生 inverse 的操作,从而移动边界。
一次外部操作通常分两段:获取资源会在内部留下记录,如 open/close、malloc/free、fork/kill,可逆;向文件、网络或第三方系统发出数据则越过边界,不可凭本地 inverse 收回。要处理 emission,只能延迟输出直到状态确定提交,或执行应用定义的补偿,如删除已创建文件、退款。补偿仍能 LIFO 组合,但必须在更粗的业务等价关系下重新证明交换性,不能直接继承本演算结论。
6.2 服务多路复用
多个 provider 可以采用独占 binding,也可以通过稳定的 broker 间接提供服务。broker 吸收后端 provider 的变化,consumer 依赖不变,因此适合:
- 按轮询、最小负载或延迟权重做负载均衡;
- 先加入新 provider、渐进迁流、排空旧请求再卸载的滚动更新;
- 把其他进程包装成远端 provider,经 RPC 保持接口透明。
跨进程接口必须是异步契约,因为网络延迟和中途失败不可能被同步本地调用可靠隐藏。
6.3 访问控制与沙箱
依赖声明加 Proxy 检查构成 capability 风格的访问控制:inject 是权限申请,context 是权限中介;编排者可在加载前审查完整需求。intercept 还能携带路径、只读/读写等细粒度策略,在不改 provider/consumer 代码、不触发依赖重载的情况下动态收紧权限。
但这不是恶意代码沙箱。能直接接触宿主运行时的组件可以绕过语言层对象,因此不可信代码仍需软件故障隔离、独立 runtime、进程或容器。桥接层在宿主侧表现为普通 fiber,再由 capability/intercept 缩减其权限。
6.4 语言独立性
时间可组合性的最低要求是 closure,以及可动态引入和回收模块的机制:托管运行时可操作模块 registry,原生系统可用 dlopen/dlclose,WebAssembly 则由 embedder 管理实例。空间可组合性要求可声明、注入并动态中介依赖;类型层可借助 typeclass、trait 或 TypeScript module augmentation,运行时可借助 Proxy、Python descriptor 或反射,宏/注解则能同时生成类型声明和访问器。
6.5 相互依赖与组件粒度
依赖环不会像线程死锁那样随调度偶发,而会让环中组件确定地永远 Inactive,因此可在加载时诊断。多数“双向依赖”可拆成两个稳定 core 与若干单向 integration 组件。例如 server 与 access control 不必互相依赖,可拆为 server-core、access-control-core、request-mediation 与 policy-management。
代价是最坏情况下 integration 数随交互对数二次增长。包级 bundling、按约定自动 wiring 和脚手架生成可以降低认知成本,却不牺牲无环模型的保证。
6.6 依赖类型与版本
仅凭 key 名连接独立构建的组件,会出现接口漂移与 key 碰撞。三条路线各有取舍:
- key 加包命名空间可消除碰撞,但把模型绑定到包 registry;
- peer dependency 可在安装期检查版本,Cordis 当前采用此法,但依赖语义化版本纪律,也难以同进程并存多版本;
- 结构兼容性让 provider 的实际接口覆盖 consumer 需求,最通用,却难以跨语言表达行为契约,带有界量化时甚至不可判定。
怎样统一这三者,同时保持动态组合保证,仍是开放问题。
6.7 与语言和操作系统协同设计
专门语言可让 context 重新隐式化,却保留“不同组件拥有不同 context”的语义,避免普通变量误传导致 effect 越界或 coeffect 逃逸;编译器还可把 iterator inverse 编成单个状态机,把依赖规格纳入类型系统,在编译期发现环与结构不兼容。
协同设计的操作系统则可让组件除了声明的 coeffect 外无物可达,把文件、网络、进程等 OS 资源本身作为 capability 注入,像 WebAssembly import 那样构造最小权限环境。内核若原生记录资源获取与 inverse,还能把今天位于语言库中的恢复边界下沉到更可靠的系统层。
7. 相关工作
7.1 effect 与 coeffect 系统
代数 effect、handler、free monad、箭头等传统工作主要把 effect 作为静态程序结构进行组合与解释;contextual/graded type 系统则在编译期同时描述“计算会做什么”和“计算需要什么”。可逆计算与 dagger/inverse arrow 要求计算整体具备双边逆,Cordis 的要求更弱也更运行时化:只有每个原子 effect 提供单边 inverse,组合 inverse 由 LIFO 自动推导。
coeffect 研究以隐式参数、资源需求、数据流等为对象,通常在词法固定作用域内静态判定。本文的贡献与之正交:把 effects/coeffects 提升为随组件拓扑变化而重新解析的运行时机制。
7.2 编程范式
上下文导向编程(COP)的 context 是位置、用户、模式等环境,激活 layer 会改变动态作用域内的方法分派;它不追踪 layer 的副作用,也不按依赖满足关系控制生命周期。AOP 通过 pointcut 对任意 join point 编织 advice,强调被织入代码“不知情”;Cordis 的横切面只到达组件明确声明的 coeffect,覆盖范围更窄,却可审查、可追踪,并随组件卸载自动恢复和传播。
7.3 时间可组合性
动态软件更新、Erlang/OTP 和常见 HMR 把旧状态迁移到新版本,擅长保留堆对象和连接,但通常依赖手写迁移函数,且不处理组件永久移除。OSGi/IDE 插件、Command、Saga、finalizer、event sourcing 与 React useEffect 依赖开发者写 cleanup 或补偿;React 把 effect/cleanup 结构化配对,但 hook 受顶层调用、同步回调等限制,不能把任意异步嵌套 effect 自动组合成 inverse。
STM、可逆语言、可逆进程演算、线性类型、RAII 与 Rust ownership 在预先固定的事务、语义或词法范围内自动恢复。Nooks、shadow driver、Akeso 则在内核/扩展边界截获资源获取并记录回收信息,最接近运行时 effect tracking,但平台必须预先认识所有可回收资源。Cordis 允许组件定义新原子 effect 及 inverse,范围覆盖整个动态生命周期。
7.4 空间可组合性
Spring/Guice/Angular 等 DI 与 React/Vue context 通常在初始化时绑定,provider 运行时替换后不会自动重启既有 consumer。OSGi Declarative Services 与 iPOJO 能随服务出现/消失激活组件,是 reactive coeffect 最接近的前身,但 teardown 仍靠手写同步回调。FRP/signals 在单值层传播并追求 glitch freedom;Cordis 在组件层提供异步生命周期,只保证一次 transition 不跨两套解析。二者互补:coeffect 本身完全可以承载 signal,实现组件级和数值级两层响应。
8. 结论
本文把经典 effects 与 coeffects 变成运行时机制,为动态组合建立形式基础。可逆 effects 解决局部时间可组合性:每个 context 变换携带 inverse,追踪与恢复均保持组合,因此组件移除后 context 得到恢复。响应式 coeffects 解决局部空间可组合性:context 变化会重新判定需求,隔离改变 key 解析到什么,拦截改变 binding 如何被使用。
二者统一为单一 context 后,coeffect 上的观测等价为 effect 独立性提供基础;组件演算再把单组件性质提升到交错运行的整个系统。Cordis 核心库、声明式加载器、配置协调与 HMR 给出了实现,Koishi 超过 4,000 个社区插件的生态则提供了生产采用证据。
论文最后提出一个尤其值得关注的验证方向:自演化 Agent Harness。AI Agent 会持续生成、替换自己的运行时组件,人工监督很少,恰好同时压测“频繁替换后能否完整恢复”和“拓扑持续变化时能否协调依赖”。这也是 Cordis 从插件元框架走向自主系统基础设施的关键试验场。
译注与原始资料
本文按原论文第 1—8 章完整翻译其论证结构、定义、定理、算法语义、讨论、相关工作与结论;公式沿用原记号,证明中重复的逐规则推导合并为等价中文说明。参考文献题名属于正式书目信息,保留英文不另译,完整 124 项可在原 PDF 的 References 中查阅。
原文:Yifan Shi, Wei Zhang, Tianyi Cui, A Programming Paradigm for Spatiotemporal Composability, 2026 年 8 月 13 日预印本。本文为中文译文,术语首次出现时保留英文,便于与形式定义和源码互相核对。