{"record":{"id":"1c1bf116447eab3e","repo":"JuliusBrussee/caveman","slug":"forget-begin-w","errorCode":null,"errorMessage":"forget begin: %w","messagePattern":"forget begin: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"mem/store.go","lineNumber":327,"sourceCode":"\t\t\treturn nil, fmt.Errorf(\"broken supersession history at %s: %w\", cursor.ID, err)\n\t\t}\n\t\tif seen[next.ID] {\n\t\t\treturn nil, fmt.Errorf(\"cyclic supersession history at %s\", next.ID)\n\t\t}\n\t\tseen[next.ID] = true\n\t\thistory = append(history, next)\n\t\tcursor = next\n\t}\n\treturn history, nil\n}\n\n// Forget deletes a memory by id and atomically repairs neighboring lineage\n// pointers. Expired predecessors stay expired: deleting a current version means\n// forgetting that fact, never silently resurrecting an older one.\nfunc (s *Store) Forget(id string) (bool, error) {\n\ttx, err := s.db.Begin()\n\tif err != nil {\n\t\treturn false, fmt.Errorf(\"forget begin: %w\", err)\n\t}\n\tdefer tx.Rollback()\n\n\tvar supersedes, supersededBy sql.NullString\n\tif err := tx.QueryRow(\n\t\t`SELECT supersedes, superseded_by FROM memories WHERE id = ?`, id,\n\t).Scan(&supersedes, &supersededBy); err != nil {\n\t\tif err == sql.ErrNoRows {\n\t\t\treturn false, nil\n\t\t}\n\t\treturn false, fmt.Errorf(\"read forgotten memory: %w\", err)\n\t}\n\tif supersedes.Valid {\n\t\tif _, err := tx.Exec(\n\t\t\t`UPDATE memories SET superseded_by = ? WHERE id = ?`,\n\t\t\tnullableLineageID(supersededBy), supersedes.String,\n\t\t); err != nil {\n\t\t\treturn false, fmt.Errorf(\"repair forgotten predecessor: %w\", err)","sourceCodeStart":309,"sourceCodeEnd":345,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/766dce6b1394ebb56a3090748d5a0240a5aefb36/mem/store.go#L309-L345","documentation":"The SQLite transaction underpinning atomic Forget could not be started (db.Begin failed). The wrapped error is the underlying database failure; no lineage pointers were modified.","triggerScenarios":"Thrown at mem/store.go:327 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Retry the forget","Check mem.db is writable and not exclusively locked"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"766dce6b1394ebb56a3090748d5a0240a5aefb36","analyzedAt":"2026-08-18T03:14:35.516Z","contentChangedAt":"2026-08-18T03:14:35.516Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}