JuliusBrussee/caveman · error

forget begin: %w

Error message

forget begin: %w

What it means

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.

Source

Thrown at mem/store.go:327

			return nil, fmt.Errorf("broken supersession history at %s: %w", cursor.ID, err)
		}
		if seen[next.ID] {
			return nil, fmt.Errorf("cyclic supersession history at %s", next.ID)
		}
		seen[next.ID] = true
		history = append(history, next)
		cursor = next
	}
	return history, nil
}

// 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)

View on GitHub (pinned to 766dce6b13)

Solutions

  1. Retry the forget
  2. Check mem.db is writable and not exclusively locked
Defensive patterns

Strategy: try-catch

When it happens

Trigger: Thrown at mem/store.go:327 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/1c1bf116447eab3e. Report an issue: GitHub.