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.ts 的 runSubagentAnnounceFlow。
方案 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 配置中:
codex-agent就是通过 ACP 运行的#codex频道绑定了codex-agent- 我们之前配置 ACP 的
approve-all模式就是为了让 Codex 能顺畅执行
这意味着:我们 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