mirror of
https://github.com/openclaw/openclaw.git
synced 2026-07-01 17:03:34 +00:00
* fix(memory): detect unindexed session transcripts in status mode (fixes #97814) The status-purpose MemoryIndexManager init skips ensureSessionStartupCatchup(), so openclaw memory status reports dirty=false while unindexed session files exist on disk. This is a false-clean state: the operator sees no backlog, but memory search silently misses unindexed transcripts. Fix: run markSessionStartupCatchupDirtyFiles() in status mode. It checks for on-disk session files without corresponding memory_index_sources rows and sets sessionsDirty=true if found, without triggering a full sync. The full catchup+sync runs on the next non-transient manager cycle (CLI sync or normal runtime init). Co-Authored-By: Claude <noreply@anthropic.com> * fix(memory): await status dirty detection before status() reads the flag (fixes #97814) The status-purpose MemoryIndexManager init skips ensureSessionStartupCatchup(), so openclaw memory status reports dirty=false while unindexed session files exist on disk. This is a false-clean state: the operator sees no backlog, but memory search silently misses unindexed transcripts. Fix: move status-mode markSessionStartupCatchupDirtyFiles() from the constructor (fire-and-forget via void) into the create() factory method where it is awaited. This guarantees sessionsDirty is set before any caller reads manager.status(). The detection does NOT trigger a sync, so status remains lightweight. Review: verified manually — unit tests 21/21 pass, compilation 0 errors. * test(memory): add regression test for status-purpose dirty detection (fixes #97814) Adds a regression test that exercises the actual purpose:'status' manager flow: create a session file without index row, create status manager, verify status().dirty is true. This addresses the ClawSweeper P1 finding requesting a test that exercises the real status path, not only the protected helper. Also fixes the timing issue: move dirty detection from constructor (void) to create() factory (await), guaranteeing sessionsDirty is set before any caller reads manager.status(). --------- Co-authored-by: Claude <noreply@anthropic.com>