{"record":{"id":"733115c3a34e3056","repo":"thedotmack/claude-mem","slug":"deep-probe-failed-at-list-stage","errorCode":null,"errorMessage":"Deep probe failed at list stage","messagePattern":"Deep probe failed at list stage","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/services/sync/ChromaMcpManager.ts","lineNumber":904,"sourceCode":"    stage: 'connect' | 'list' | 'query' | 'done';\n    error?: string;\n    collections?: number;\n    queryLatencyMs?: number;\n  }> {\n    let collections: number | undefined;\n\n    try {\n      const listResult: any = await this.callTool('chroma_list_collections', { limit: 100 });\n      if (Array.isArray(listResult)) {\n        collections = listResult.length;\n      } else if (listResult && Array.isArray(listResult.collections)) {\n        collections = listResult.collections.length;\n      } else if (listResult && typeof listResult === 'object' && 'length' in listResult) {\n        collections = (listResult as { length: number }).length;\n      }\n    } catch (error) {\n      const message = error instanceof Error ? error.message : String(error);\n      logger.warn('CHROMA_MCP', 'Deep probe failed at list stage', { error: message });\n      return { ok: false, stage: 'list', error: message };\n    }\n\n    const queryStartedAt = Date.now();\n    try {\n      await this.callTool('chroma_query_documents', {\n        collection_name: 'cm__claude-mem',\n        query_texts: ['ping'],\n        n_results: 1\n      });\n      const queryLatencyMs = Date.now() - queryStartedAt;\n      return { ok: true, stage: 'done', collections, queryLatencyMs };\n    } catch (error) {\n      const queryLatencyMs = Date.now() - queryStartedAt;\n      const rawMessage = error instanceof Error ? error.message : String(error);\n      const isMissingOrEmpty = /not exist|missing|empty|no such/i.test(rawMessage);\n      const errorMessage = isMissingOrEmpty\n        ? `collection cm__claude-mem missing or empty (${rawMessage})`","sourceCodeStart":886,"sourceCodeEnd":922,"githubUrl":"https://github.com/thedotmack/claude-mem/blob/8bc631a71a487424b866756e43a6efa4574cc66b/src/services/sync/ChromaMcpManager.ts#L886-L922","documentation":"First stage of probeSemanticSearch(): chroma_list_collections (limit 100) failed after a connection was established. Returns {ok:false, stage:'list', error}. Listing failing at this stage usually means the process is reachable but chroma itself errors — storage, permissions, or internal state — rather than missing data.","triggerScenarios":"callTool connects but chroma raises on list: corrupted local chroma storage under the chroma data dir, permission problems on that directory, disk-full, or two chroma instances contending for the same storage.","commonSituations":"Chroma data directory damaged after disk-full; concurrent instances locking storage; chroma-mcp version drift changing list semantics.","solutions":["Read the returned error string — it is chroma's own message","Check permissions and free space on the chroma data directory","Retry the probe after a clean restart","If persistent, back up and reset the chroma directory — it is rebuilt by sync"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"const probe = await chromaManager.probeSemanticSearch();\nif (!probe.ok && probe.stage === 'list') {\n  // chroma storage is the problem: check permissions/disk, run degraded\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep the chroma data directory on a healthy local disk with free space","Never let two instances share one chroma storage directory","Act on the returned error string — it is chroma's own diagnosis"],"tags":["chroma","probe","list-collections","diagnostics"],"backgroundTag":"health-check-failed","analyzedSha":"8bc631a71a487424b866756e43a6efa4574cc66b","analyzedAt":"2026-08-20T23:58:13.836Z","contentChangedAt":"2026-08-20T23:58:13.836Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}