{"record":{"id":"d5570c2d1bde0b9a","repo":"JuliusBrussee/caveman","slug":"secure-memories-db-w","errorCode":null,"errorMessage":"secure memories db: %w","messagePattern":"secure memories db: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"mem/store.go","lineNumber":109,"sourceCode":"}\n\n// Open opens (creating if needed) a cavemem store.\nfunc Open(opts Options) (*Store, error) {\n\tmemPath, ccrPath := \":memory:\", \":memory:\"\n\tif !opts.InMemory {\n\t\tdir := opts.Dir\n\t\tif dir == \"\" {\n\t\t\tdir = defaultDir()\n\t\t}\n\t\tif err := os.MkdirAll(dir, 0o700); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"create %s: %w\", dir, err)\n\t\t}\n\t\tmemPath = filepath.Join(dir, \"mem.db\")\n\t\tccrPath = filepath.Join(dir, \"ccr.db\")\n\t}\n\tcanonicalMemPath, err := ccr.PrepareSQLitePathCanonical(memPath)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"secure memories db: %w\", err)\n\t}\n\t// Same embedded-SQLite-behind-a-multi-process-CLI discipline as the recovery\n\t// store: a single writer connection plus busy_timeout(5000)+WAL. Several\n\t// cavemem processes (and the MCP server) share one mem.db, and the JS client\n\t// fires Promise.all(facts.map(remember)); without this, concurrent writes\n\t// returned SQLITE_BUSY and were silently dropped. See ccr.SQLiteDSN.\n\tdb, err := sql.Open(\"sqlite\", ccr.SQLiteDSN(canonicalMemPath))\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"open memories db: %w\", err)\n\t}\n\tdb.SetMaxOpenConns(1)\n\tdb.SetMaxIdleConns(1)\n\t// The cold-start migration is multi-statement DDL; under a fan-out of fresh\n\t// processes it can outlast a single busy_timeout, so retry it on SQLITE_BUSY\n\t// (runtime writes rely on busy_timeout alone). Both steps are idempotent.\n\tif err := ccr.RetryOnBusy(func() error { _, e := db.Exec(memSchema); return e }); err != nil {\n\t\t_ = db.Close()\n\t\treturn nil, fmt.Errorf(\"migrate memories db: %w\", err)","sourceCodeStart":91,"sourceCodeEnd":127,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/27d5a3981a347890211bb1bf2439e5c821a63bc9/mem/store.go#L91-L127","documentation":"Error \"secure memories db: %w\" thrown in JuliusBrussee/caveman.","triggerScenarios":"Thrown at mem/store.go:109 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Fix securing the memories database file and retry."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"27d5a3981a347890211bb1bf2439e5c821a63bc9","analyzedAt":"2026-08-15T09:26:11.751Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}