Appearance
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 重启后没有触发 needsFullReindex,sessionsDirty 从 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 导出完整状态存档。