OpenClaw ACP 完成通知缺失:Agent 不会主动汇报的 Bug

> 来源: https://x.com/xxx111god/status/2030850416133492818

> 作者: Jason Zuo (@xxx111god)

> 相关 Issue: https://github.com/openclaw/openclaw/issues/40272

> 影响版本: OpenClaw v2026.3.2+

> 互动: 25 回复 · 4 转帖 · 63 喜欢 · 84 书签 · 1.7 万查看

> 日期: 2026-03-09

📌 一句话总结

OpenClaw 的 ACP(Agent Communication Protocol)模式下,spawn 一个 coding agent(如 Codex/Claude Code)去执行任务后,任务完成时不会主动通知用户——用户必须手动去问"搞完没有?"。原因是代码里漏了一行 expectsCompletionMessage: true

🐛 Bug 描述

现象


用户: "帮我实现 feature X,写测试,push 到分支"
Agent: "好的,我来 spawn 一个 Codex 去干"
       → sessions_spawn(runtime="acp", task="...")
       
[10 分钟后]

Codex: ✅ 任务完成,代码已 push
       (但用户的 Discord/WhatsApp 频道里什么都没收到)

用户: "你好了没?"  ← 只能手动问
Agent: "哦,其实早就完成了"

正如作者吐槽的:"堂堂自主 AI agent,连自主汇报都没做到,有点搞笑"

根因分析

作者翻了源码,定位到 src/agents/tools/sessions-spawn-tool.ts


// runtime === 'acp' → 缺少 expectsCompletionMessage
const result = await spawnAcpDirect({ task, label, agentId, ... });
// ^^^^ 没传 expectsCompletionMessage: true

// runtime === 'subagent' → 有这个参数
const result = await spawnSubagentDirect({
  ...
  expectsCompletionMessage: true,  // ← subagent 有,ACP 没有
});

src/agents/acp-spawn.ts 中,只有 parentRelay?.notifyStarted(),没有对应的 notifyCompleted()

还有第二个问题

普通 subagent 的通知也不完全可靠:如果 channel(Discord/WhatsApp)临时断连超过 60 秒,通知直接永久丢失,连重试都没有。

📊 影响范围

场景是否受影响
`sessions_spawn(runtime="acp")`✅ 完全没通知
`sessions_spawn(runtime="subagent")`⚠️ 通知可能丢失(channel 断连时)
`/subagents spawn`❌ 不受影响(有完整的 announce pipeline)
`sessions_spawn(thread=true)`⚠️ 线程内可能也受影响

🔧 Issue 中提出的修复方案

方案 A:最小修复(推荐)

acp-spawn.ts 中补上 completion announce,参照 subagent-registry-runtime.tsrunSubagentAnnounceFlow

方案 B:显式 onComplete 参数

sessions_spawn 加一个 onComplete 参数:


sessions_spawn({
  task: "...",
  runtime: "acp",
  onComplete: {
    channel: "discord",
    target: "#general",
    message: "可选的自定义消息"
  }
})

方案 C:Agent 自己 workaround

用 cron job 轮询 ACP session 状态。很 fragile,不推荐。

💡 深度分析

这个 Bug 暴露了什么

1. ACP 是后来加的功能:从代码可以看出,subagent 路径是先实现的(有完整的通知机制),ACP 是后来接入的新 runtime,通知管线没有完全对齐。

2. 通知可靠性是系统性问题:即使 subagent 有 expectsCompletionMessage: true,channel 断连 60 秒就永久丢失通知,说明 announce pipeline 的重试/持久化机制不够健壮。

3. Agent UX 的核心问题:对于长时间运行的任务(代码生成、部署、测试),"完成通知"是最基本的用户体验需求。没有通知 = 用户不信任 Agent = 不敢委派长任务。

与我们的直接关系

我们就在用这个功能!

在我们的 OpenClaw 配置中:

这意味着:我们 spawn 的 Codex 任务完成后,用户也不会收到通知。 这解释了之前 TODO 里"Verify Codex actually works in the #codex channel"一直没确认——可能 Codex 早就跑完了,只是没通知。

社区反响

推文获得了 1.7 万次查看、63 喜欢、84 书签——说明这是一个广泛存在的痛点。很多 OpenClaw 用户都遇到了同样的问题。

临时 Workaround

在官方修复之前,可以:

1. 用 subagents list 手动检查状态

2. 在 Agent 的系统提示里加一条规则:"spawn ACP 任务后,每 N 分钟用 sessions_list 检查状态并汇报"

3. 用 cron job 监控(方案 C)

📊 评分

维度评分(/10)
问题发现质量9.5 — 定位到具体代码行,根因清晰
影响范围8.5 — 所有 ACP 用户都受影响
修复方案质量8.0 — 三个方案层次分明
与我们的相关性10 — 直接影响我们的 Codex 工作流
社区价值8.5 — 高互动,填补了文档空白
**综合****8.9**

报告由深度研究助手自动生成 | 2026-03-09

来源: https://x.com/xxx111god/status/2030850416133492818