{"record":{"id":"58df724fc8806869","repo":"ruvnet/ruflo","slug":"graph-backend-message","errorCode":null,"errorMessage":"[graph-backend] ${message}","messagePattern":"\\[graph-backend\\] (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"v3/@claude-flow/cli/src/ruvector/graph-backend.ts","lineNumber":62,"sourceCode":"        return mod;\n      } catch {\n        graphBackendAvailable = false;\n        return null;\n      }\n    })();\n  }\n  return graphNodeModulePromise;\n}\n\n/**\n * Report a graph-backend problem.\n *\n * No \"already warned\" flag: the open runs once per process because\n * `getGraphDb` memoizes the promise, and a second flag would only hide it if\n * that ever stopped being true.\n */\nfunction warnGraphInit(message: string): void {\n  console.warn(`[graph-backend] ${message}`);\n}\n\n/**\n * Whether this handle is actually backed by the file we asked for.\n *\n * `@ruvector/graph-node` 2.1.0 accepts a bare path STRING without throwing\n * and hands back a volatile in-memory instance -- `isPersistent() === false`,\n * `getStoragePath() === null`. Nothing downstream notices: writes succeed,\n * reads succeed, and the graph is gone at exit. Passing the options object\n * fixes that, and this check is what makes the fix self-reporting instead of\n * something a future signature change can quietly undo.\n *\n * A build that exposes neither accessor cannot be interrogated, so it is\n * accepted rather than refused -- this guards against a silent downgrade, not\n * against an unfamiliar version.\n */\nfunction isPersistentAt(db: any, storagePath: string): boolean {\n  const canReport =","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/ruvnet/ruflo/blob/9c61c86f06b439af2a95085ae9bb0ca839662e41/v3/@claude-flow/cli/src/ruvector/graph-backend.ts#L44-L80","documentation":"warnGraphInit is a generic reporting helper, not a thrower: it emits a console warning prefixed `[graph-backend]` for any problem detected while opening the RuVector graph database. Callers (openGraphDb, getGraphDb) pass messages for conditions such as: the `@ruvector/graph-node` native module failed to require (graphBackendAvailable is memoized false and getGraphDb returns null), or the opened handle is not actually persistent at the requested storage path (isPersistentAt false — the silent in-memory downgrade where @ruvector/graph-node 2.1.0 accepts a bare path string, reports isPersistent()===false and getStoragePath()===null, and loses all data at exit). There is no dedup flag because the open runs once per process via the memoized promise.","triggerScenarios":"Thrown at v3/@claude-flow/cli/src/ruvector/graph-backend.ts:62 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["If the message reports the module failed to load, install or rebuild @ruvector/graph-node (native/NAPI) for the current platform and Node version.","If it reports a non-persistent handle, confirm the open call passes the options object (not a bare path string) so the 2.1.0 in-memory trap is avoided.","Check disk writability and permissions for the requested storage path.","Treat the warning as degraded-mode signal: the CLI continues without the graph backend; fix before relying on graph persistence across restarts."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"9c61c86f06b439af2a95085ae9bb0ca839662e41","analyzedAt":"2026-09-22T05:44:27.648Z","contentChangedAt":"2026-09-22T05:44:27.648Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}