OpenClaw QQ /临时列表 异常复盘:12条限制、重复回复与不回复问题

OpenClaw QQ /临时列表 异常复盘(仅显示12条 / 重复回复 / 偶发不回复)

一、问题现象

在群 883766069 里,出现了三个关联症状:

  1. /临时列表 只显示 12 条,实际历史会话明显更多。
  2. 同一条 /临时列表 命令,机器人会重复发 2~3 次。
  3. 某些时段“发了命令但完全不回”。

二、关键排查结论

1) 数据未丢失

检查 ~/.openclaw/workspace/qq-temp-sessions.json

  • history["default:group:883766069"] 实际是 33 条。
  • 说明“只显示12条”不是数据丢失,而是读取/运行态问题。

2) “不回复”有明确根因:网关进程曾被 SIGTERM 停掉

日志中有多次:

  • signal SIGTERM received
  • 随后 Gateway unreachable (ECONNREFUSED)

该状态下端口 18789 无监听,QQ命令自然无法被处理,所以会出现“发了不回”。

3) 重复回复曾真实存在

通过 OneBot 历史可复现看到:

  • 同一时间戳出现 3 条相同的 /临时列表 回复。
  • 说明当时不是用户端视觉问题,而是服务端确实执行了重复发送。

三、修复与加固

修复点 A:/临时列表 改为优先从磁盘状态回填

~/.openclaw/extensions/qq/src/channel.ts 中新增:

  • reloadTempSessionStateFromDisk()
  • /临时列表 分支先执行磁盘回填,再渲染输出。

目的:避免进程内旧缓存导致“列表显示落后于真实状态”。

修复点 B:保持无上限展示

/临时列表 渲染逻辑保持全量输出,不再限制 12 条。

修复点 C:网关改为 LaunchAgent 常驻

执行:

  • openclaw gateway install
  • openclaw gateway start

结果:

  • Gateway service 进入 loaded · running
  • 避免前台调试会话退出时把网关连带停掉。

四、验证结果

当前健康状态:

  • Gateway: reachable
  • Gateway service: loaded · running
  • QQ: 已连接 OneBot 并登录
  • 端口:18789 监听正常,21736 -> 3001 长连已建立
  • 日志可见:[QQ] /临时列表 thread=default:group:883766069 slots=33

说明当前 /临时列表 读到的是 33 条,会话数据完整。

五、经验与后续建议

  1. 区分“数据层”和“运行层”问题:先查 JSON 状态文件,再查网关在线状态。
  2. 优先用常驻服务模式:避免手工前台启动被终端生命周期影响。
  3. 保留关键诊断日志
    • /临时列表mem/disk 对比日志非常有用。
    • 若再次出现重复回复,可继续根据同一命令时间戳比对 OneBot 历史。

如果后续还出现“重复回复”,下一步建议在命令入口再加一层 (group_id,user_id,raw_message,time_bucket) 的短 TTL 保护,并输出 drop 日志,便于一次性确认是上游重复投递还是本地重复消费。