JuliusBrussee/caveman · error
read forgotten memory: %w
Error message
read forgotten memory: %w
What it means
Inside the Forget transaction, reading the target memory's lineage pointers failed for a reason other than not-found. The wrapped error is the scan/query failure; the transaction rolls back.
Source
Thrown at mem/store.go:338
// Forget deletes a memory by id and atomically repairs neighboring lineage
// pointers. Expired predecessors stay expired: deleting a current version means
// forgetting that fact, never silently resurrecting an older one.
func (s *Store) Forget(id string) (bool, error) {
tx, err := s.db.Begin()
if err != nil {
return false, fmt.Errorf("forget begin: %w", err)
}
defer tx.Rollback()
var supersedes, supersededBy sql.NullString
if err := tx.QueryRow(
`SELECT supersedes, superseded_by FROM memories WHERE id = ?`, id,
).Scan(&supersedes, &supersededBy); err != nil {
if err == sql.ErrNoRows {
return false, nil
}
return false, fmt.Errorf("read forgotten memory: %w", err)
}
if supersedes.Valid {
if _, err := tx.Exec(
`UPDATE memories SET superseded_by = ? WHERE id = ?`,
nullableLineageID(supersededBy), supersedes.String,
); err != nil {
return false, fmt.Errorf("repair forgotten predecessor: %w", err)
}
}
if supersededBy.Valid {
if _, err := tx.Exec(
`UPDATE memories SET supersedes = ? WHERE id = ?`,
nullableLineageID(supersedes), supersededBy.String,
); err != nil {
return false, fmt.Errorf("repair forgotten successor: %w", err)
}
}
if _, err := tx.Exec(`DELETE FROM memories WHERE id = ?`, id); err != nil {View on GitHub (pinned to 766dce6b13)
Solutions
- Retry the forget after transient errors
- Check db integrity if persistent
- Inspect the wrapped scan error
Defensive patterns
Strategy: try-catch
When it happens
Trigger: Thrown at mem/store.go:338 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of JuliusBrussee/caveman@766dce6b13 (2026-08-18).
Data as JSON: /api/errors/308c506f3073a649.
Report an issue: GitHub.