Skip to content

fix(goal): explicit 模式下启动或恢复 Goal 后开放生命周期工具 (#464) - #491

Open
naivezip wants to merge 1 commit into
openpi-dev:mainfrom
naivezip:fix_goal_capability_loading
Open

fix(goal): explicit 模式下启动或恢复 Goal 后开放生命周期工具 (#464)#491
naivezip wants to merge 1 commit into
openpi-dev:mainfrom
naivezip:fix_goal_capability_loading

Conversation

@naivezip

@naivezip naivezip commented Sep 8, 2026

Copy link
Copy Markdown

问题

默认 explicit capability discovery 模式下,用户通过 /goal <objective> 创建 Goal、或恢复已有的 active Goal 后,Runtime 会启动续跑回合并提示模型在完成后调用 update_goal。然而,由于 goal 归属于 session 能力组,ownerIsVisible(state, "goal") 需要检查 state.loaded.has("session")。在 explicit 模式下初始 state.loaded 为空,导致模型实际接收到的可用工具中缺少 get_goalupdate_goal,执行状态与可用工具脱节。Fixes #464

价值

让用户明确启动或恢复的 Goal 能够正常查看进度、报告阻塞并顺利调用 update_goal 完成收尾闭环,避免工作完成后陷入死循环继续空耗 Token/回合;同时保留普通新 Session 零常驻 OpenPI 模型工具的不变式。

实现方案

  • extensions/goal/index.ts 中,修改 showLifecycleTools():在调用 patchOwnedTools(pi, "goal", { enable: ... }) 之前先调用 loadOpenPiCapabilities(pi, ["session"])
  • 保持能力的单调加载不变式(monotonic capability loading):session 能力组一旦加载即在当前 Session 内保持已加载,而 get_goal / update_goal 生命周期工具继续由 Goal controller 按状态动态启闭。
  • /goal resume 命令行以及 TUI 交互确认恢复路径中,在 controller.kickoff(ctx) 前显式调用 showLifecycleTools(),确保恢复的目标同样能够解除工具门禁。
  • 更新单元测试 tests/extensions/goal/index.test.ts 中的 extensionHarness,显式提供事件总线 events: { on, emit },避免测试落入“缺少 events 则假定全部可见”的 fallback 逻辑;验证新 Session 初始工具仅为 ["read", "third_party_tool"]
  • 新增真实 Pi 集成测试套件 tests/extensions/goal/goal-surface.integration.test.ts,使用真实 createAgentSession 覆盖:新会话 /goal <objective> 续跑与正常完成收尾、Session reload 恢复、Session fork 工具保留与延迟续跑、以及 update_goal 连续 3 回合 blocked 严格审计。

验证

  • node --test --experimental-strip-types tests/extensions/goal/goal-surface.integration.test.ts:4/4 测试通过(真实 Pi 会话端到端续跑、reload、fork 与 blocked 审计)。
  • node --test --experimental-strip-types tests/extensions/goal/index.test.ts:9/9 单元测试通过。
  • node --test --experimental-strip-types tests/extensions/shared/tool-surface.integration.test.ts:7/7 集成测试通过。
  • npx biome format tests/extensions/goal/ extensions/goal/:格式检查通过。
  • npx biome lint tests/extensions/goal/ extensions/goal/ --error-on-warnings:无 lint 告警或错误。
  • node scripts/check-config-contract.mjs:通过(15 个持久化字段契约检查)。
  • node scripts/check-discipline-ledger.mjs:通过(12 行 Discipline Ledger 检查)。

影响

  • 用户可见行为:在 explicit 模式下创建或恢复 Goal 后,模型能够正常识别目标工具并顺利达成收尾,无异常停滞;命令和 UI 状态保持不变。
  • 模型可见上下文/工具:当 Goal 处于 active 状态时,模型可调用 get_goalupdate_goal。未开启 Goal 的纯净会话依然保持零 OpenPI 常驻工具。
  • 运行时与生命周期:Goal 展示生命周期工具时单调加载 session 能力组;fork 继续遵守用户输入前延迟自动续跑的约定。
  • 持久化配置/数据:无变更。
  • 兼容性与风险:极低,变更严格限定在用户明确启动/恢复 Goal 时的工具投影链路内。

在 showLifecycleTools() 中单调加载 session 能力组,确保在 explicit 发现模式下创建或恢复 Goal 时,模型续跑能正常调用 get_goal 和 update_goal。

解决 openpi-dev#464
@naivezip
naivezip force-pushed the fix_goal_capability_loading branch from ab35f18 to 8bc79a0 Compare September 8, 2026 09:07
@naivezip naivezip changed the title fix(goal): expose lifecycle tools under explicit capability discovery (#464) fix(goal): explicit 模式下启动或恢复 Goal 后开放生命周期工具 (#464) Sep 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bug(goal): explicit 模式下启动或恢复 Goal 后未开放结束目标所需工具

1 participant