{"record":{"id":"c4a350161f95304d","repo":"JuliusBrussee/caveman","slug":"migrate-memories-db-w","errorCode":null,"errorMessage":"migrate memories db: %w","messagePattern":"migrate memories db: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"mem/store.go","lineNumber":127,"sourceCode":"\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)\n\t}\n\tif err := ccr.RetryOnBusy(func() error { return migrateMemorySchema(db) }); err != nil {\n\t\t_ = db.Close()\n\t\treturn nil, fmt.Errorf(\"migrate memories db: %w\", err)\n\t}\n\tstore, err := ccr.Open(ccrPath)\n\tif err != nil {\n\t\t_ = db.Close()\n\t\treturn nil, fmt.Errorf(\"open ccr: %w\", err)\n\t}\n\treturn &Store{db: db, eng: engine.New(store, nil), ccr: store}, nil\n}\n\n// Close releases the databases.\nfunc (s *Store) Close() error {\n\terr := s.db.Close()\n\tif cerr := s.ccr.Close(); cerr != nil && err == nil {\n\t\terr = cerr","sourceCodeStart":109,"sourceCodeEnd":145,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/27d5a3981a347890211bb1bf2439e5c821a63bc9/mem/store.go#L109-L145","documentation":"Error \"migrate memories db: %w\" thrown in JuliusBrussee/caveman.","triggerScenarios":"Thrown at mem/store.go:127 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Fix the memories database migration error 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-15T22:17:37.221Z"}