Skip to content

control: 研究 Pi-native 的全局安全暂停,让所有 Agent 在下一执行边界停住 #161

Description

@tt-a1i

一句话结论

OMP 的 /pause 不是 cancel-all:它允许已开始的 provider stream / tool call 正常完成,然后在下一次 model call 或 tool call 前停住主 Agent、in-process subagent 和 advisor;resume 后原队列继续。

这是很有价值的 operator control primitive。OpenPI 可以研究对应能力,但正确位置应优先是 Pi agent loop seam;不能靠各 extension 分别打一个 pause flag 来伪装原子全局暂停。

固定证据

对比固定在:

  • OpenPI main@2a69d3f32994da4123f1312b7fa84ef3d6119be1
  • OMP main@151dc754e8cd9314721aa6c78a168a205a4b0e4c

OMP 当前:

  • /pause 只在 interactive TUI 可用,process-global gate 覆盖 main、in-process subagents、advisor;in-flight work 不 abort,新工作不开始:command contract
  • agent loop 在每次 provider turn 前检查 gate:model boundary
  • 每个 tool call 真正开始前再次检查 gate;已经执行的 tool 不受影响:tool boundary
  • 单个 run 的 AbortSignal 可让它从 pause wait 中退出,但不会释放全局 gate:pause gate semantics, wait behavior

OpenPI 当前:

  • control surface 分散为 subagent_cancelworkflow_stopbg_kill,分别属于不同 owner:owned control tools
  • 这些是终止单个/一组 owner work 的命令,不是“让 Pi main + 所有 child 在安全边界暂时静止”。
  • OpenPI extension 无法仅凭自身证明在 Pi provider/tool dispatch 前建立全局 gate。

为什么值得讨论

暂停与取消解决不同问题:

  • 用户发现环境、凭证、branch 或需求需要先确认,但不想杀掉长时间调查;
  • 多个 child 正在运行,需要先阻止它们继续发起新模型/工具动作,再逐个检查;
  • provider 429、成本异常或外部系统故障时,希望立即阻止新的请求,同时让已开始的写操作完整结算;
  • operator 想获得一个稳定观察窗口,而不是和持续变化的 dashboard 竞速。

这属于 operator authority 和 runtime lifecycle,不是模型判断。

OpenPI 应保留的优势

  • Pi 是所有 in-process Session 的 owner;暂停原语应位于 Pi loop,而不是 OpenPI 第二控制面;
  • pause 不改变 Task/Goal/Workflow canonical status;
  • 不把 pause 当 success、cancel 或 quiesced receipt;
  • 不自动恢复;恢复必须来自明确 operator action 或调用方协议;
  • Background Terminal 是外部 process,是否继续运行必须单独定义,不能假装 Pi Agent gate 已暂停它。

需要先设计的边界

  • scope:当前 Session tree、当前 Pi process,还是所有 OpenPI-owned external process?
  • safe boundary:provider request 前、tool execute 前、child spawn admission 前、completion-triggered wake 前;
  • 已开始的 mutating tool、Workflow sandbox、Background Terminal 是否完成、冻结或只禁止后续步骤;
  • paused 时新 user input 是排队、允许 control command,还是隐式 resume?
  • cancel/interrupt while paused 如何只终止目标,不释放其他 Agent;
  • RPC/ACP/print 模式如何表示 paused,不制造永远 busy 的客户端状态;
  • shutdown 时是否自动释放 waiters,且不能因此启动新工作;
  • operator 如何看到“已请求 pause”与“所有 scope 已实际 parked”的区别。

非目标

  • 不用 pause 代替 cancel/kill;
  • 不暂停 OS 进程或线程;
  • 不在任意 tool 中间强行冻结;
  • 不由模型自动触发;
  • 不让 extension monkey-patch Pi internals;
  • 不声称按下 pause 时所有 Agent 已瞬间静止。

完成条件

  • 先确认或提出最小 Pi agent-loop pause seam
  • 定义 requested / partially parked / fully parked / resuming / running 状态和收据
  • main、Direct Subagent、Workflow child、completion-triggered turn 在下一安全边界一致停住
  • in-flight provider/tool 不被截断,cancel signal 仍可独立退出
  • 新 spawn/admission 与新的 provider request 在 paused 时不能穿透
  • Background Terminal 的独立语义明确且 UI 不误报
  • session switch、shutdown、RPC/ACP disconnect 的恢复/清理有测试
  • 没有 Pi seam 时记录 upstream requirement,不在 OpenPI 旁路实现假全局 gate

与现有 Issue 的关系

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions