Skip to content

OpenClaw memory 在 session-start 触发重建索引时静默丢失会话数据

问题

openclaw memory search 返回为空,但 openclaw memory status 显示 sources: ["memory", "sessions"],系统报告一切正常。

实际上,历史会话 transcript 数据在重建索引过程中被静默丢弃,元数据却谎称已索引。这是一种"无声数据丢失"——系统报告成功,但检索时才发现数据不在。

根本原因shouldSyncSessions 函数存在逻辑顺序 bug。当 session-start 触发完整重建(needsFullReindex = true)时,该函数提前返回 false,导致所有会话 transcript 数据被跳过,但元数据仍标记为 sessions 已索引。

另一个关联问题:sessionsDirty 状态不会跨重启持久化。如果 gateway 重启后没有触发 needsFullReindexsessionsDirty 从 false 开始,shouldSyncSessions 直接返回 false,依然跳过所有 session 数据。

触发条件

  • Gateway 重启后模型配置变更(provider 切换、模型升级)
  • 每日自动 session 重置
  • 任何触发 warmSession → sync({ reason: "session-start" }) 的场景

解决方案

立即修复(强制完整索引)

bash
# 强制重建包含所有 session 数据的索引
openclaw memory sync --force

验证是否修复

bash
# 对比索引前后的 chunk 数量
openclaw memory status --deep

# 搜索已知存在的历史内容
openclaw memory search "你知道的一个特定词或句子"

注意:由于 .jsonl.reset.* 文件过滤 bug(见相关 issue),强制重建后仍可能遗漏归档的历史会话。这是两个独立 bug。

等待官方修复:官方需要将 needsFullReindex 检查移到 session-start 早返回判断之前,同时需要持久化 sessionsDirty 状态跨重启。

备份建议:在此 bug 修复前,定期用 openclaw backup create 导出完整状态存档。