跳到主要内容
阅读约 4 分钟

沙箱与执行模型

一任务一沙箱的含义、控制面与沙箱的职责分界、状态权威归属,以及这个模型接受什么代价。

一任务一沙箱

每个任务对应一个沙箱。沙箱内只有一个监督器,作为依赖图状态与调度的权威,但允许并行运行多个独立的 Agent 会话。

沙箱内运行监督器与 Agent 运行时。每次执行尝试使用独立的工作树与独立的会话,不直接修改共享工作区。

职责分界

控制面负责:

  • 校验流程引用的技能、模型、扩展、编码驱动与基础资源是否存在;
  • 创建、观察和清理沙箱;
  • 代理 Web 控制台到沙箱内 Agent 的连接;
  • 持久化任务级生命周期与最终交付引用;
  • 判断沙箱已终止、丢失或超过失联宽限期后的任务失败;
  • 向交付节点提供受控的推送与变更请求工具。

监督器负责:依赖图、执行尝试、节点会话、产物引用与界面事件序号。

状态权威

这是理解整个模型的关键。

控制面只保存任务级状态:任务标识、任务级状态与租户创建人;仓库、基线提交、任务分支与冻结的流程版本;沙箱标识与关键时间点;最终产物归档、代码提交、远端分支与变更请求引用。

控制面不保存节点、执行尝试、返工、会话、消息或依赖图检查点。 这些全部由沙箱内的监督器用本地事务日志保存。

结果是:依赖图状态、会话、产物与代码工作树位于同一个故障域。模型简单,一致性容易保证。

接受的代价

这个设计有明确的代价,必须说清楚。

沙箱永久丢失会使整个任务失败。 无法从节点检查点恢复,也不在替代沙箱中恢复依赖图。Agent 短暂失联不会立即改变任务结果——控制面可以展示瞬时的不可达健康状态——但只有沙箱提供方确认实例丢失或超过宽限期后,任务才进入失败。

长任务会持续占用沙箱,等待用户输入时也不释放。

失败时如果沙箱同时消失,尚未归档的产物无法找回。

未来如要求跨沙箱恢复,需要新的架构决策,不能把本地事务日志直接提升成分布式状态机。

执行边界

沙箱提供方拥有运行环境的创建、观察、绑定与清理。默认提供方使用 Kubernetes Agent Sandbox;运行时类由部署策略冻结,本地环境省略运行时类,独立隔离验证才选择更强的执行边界。

任务冻结提供方标识、插件版本、模板引用、镜像摘要与能力摘要,运行中不热切换提供方。

所有生产提供方必须通过同一套契约测试:创建、观察、续期、终止、清理、幂等与失联语义。

凭据边界

控制面为任务创建最小化的私有密钥,承载该任务需要的成员模型密钥与受控连接器凭据。

凭据使用最小接收者注入:成员模型密钥只交给运行器与监督器,本地扩展的凭据只交给对应边车,远程扩展的凭据只交给代理边车。Agent 主进程不直接持有扩展凭据。

所有边车与运行时就绪后删除任务密钥。运行时配置以环境变量引用方式使用密钥,明文不写入配置文件、规格、事件或日志。

普通密钥轮换只影响新任务;紧急撤销通过终止受影响的沙箱生效。

网络与能力

任务运行环境允许主动出站以直连已冻结的模型与 Git 目标。细粒度出口策略与代理治理属于后续安全设计。

技能与扩展只能来自本地注册表。沙箱禁止在启动时通过包管理器从公网获取能力代码。技能由初始化容器从注册表下载、校验并解压到只读共享卷;本地扩展按镜像摘要预装配为边车。

任务只有在全部必需技能已物化、本地扩展边车就绪、远程扩展连接完整、运行时配置与节点配置校验成功且服务就绪后才进入运行状态。必需能力失败必须在沙箱创建前表现为能力缺口,运行期物化失败则以结构化失败结束。

生命周期与保留

镜像、Pod 计算规格与最长保留时间属于部署级运行策略,不属于工作范围、项目、仓库或个人设置。控制面保存单例运行策略配置,并在任务创建时代入当前修订。

每个任务冻结修订、运行器镜像、CPU 与内存的请求和上限,以及最长保留时间。同一任务的所有节点与重跑执行始终沿用该副本。设置更新只影响后续任务,不能原地漂移既有环境。

任务首次被观察为完成或失败时开始计算保留窗口。窗口内环境、服务、节点文件与 Agent 会话继续可读,失败节点仍可重跑。只有用户删除任务,或到期回收器确认生命周期截止时间已到,才可删除运行资源。控制面恢复、孤儿发现、手工回收与恢复失败都不是销毁原因。

回收后仍保留最终任务快照、节点结果、代码修订与变更请求元数据。