{"record":{"id":"74d3a882244eb342","repo":"JuliusBrussee/caveman","slug":"cannot-remember-empty-text","errorCode":null,"errorMessage":"cannot remember empty text","messagePattern":"cannot remember empty text","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"mem/store.go","lineNumber":168,"sourceCode":"// Memory is one stored memory.\ntype Memory struct {\n\tID           string  `json:\"id\"`\n\tText         string  `json:\"text\"`\n\tCreatedAt    string  `json:\"created_at\"`\n\tValidFrom    string  `json:\"valid_from\"`\n\tValidUntil   *string `json:\"valid_until,omitempty\"`\n\tSupersedes   string  `json:\"supersedes,omitempty\"`\n\tSupersededBy string  `json:\"superseded_by,omitempty\"`\n}\n\n// Remember stores text durably and returns it with a content-addressed id.\n// Remembering identical current text twice is idempotent (same id, stored once).\n// Text that exists only as an expired historical version is rejected: returning\n// that row as success would claim it was remembered while Recall still hides it.\n// The raw text is written before any other work, so a memory is never lost.\nfunc (s *Store) Remember(text string) (Memory, error) {\n\tif strings.TrimSpace(text) == \"\" {\n\t\treturn Memory{}, fmt.Errorf(\"cannot remember empty text\")\n\t}\n\tif err := validateMemorySize(text); err != nil {\n\t\treturn Memory{}, err\n\t}\n\tid := memID(text)\n\tcreated := time.Now().UTC().Format(time.RFC3339Nano)\n\t// INSERT OR IGNORE keeps the original created_at on a repeat remember.\n\t// RetryOnBusy: under a fan-out of cavemem processes, a queued writer can\n\t// outlast a single busy_timeout (Windows file locking is the slowest case).\n\tif err := ccr.RetryOnBusy(func() error {\n\t\t_, e := s.db.Exec(\n\t\t\t`INSERT OR IGNORE INTO memories (id, text, created_at, valid_from) VALUES (?, ?, ?, ?)`,\n\t\t\tid, text, created, created,\n\t\t)\n\t\treturn e\n\t}); err != nil {\n\t\treturn Memory{}, fmt.Errorf(\"store memory: %w\", err)\n\t}","sourceCodeStart":150,"sourceCodeEnd":186,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/27d5a3981a347890211bb1bf2439e5c821a63bc9/mem/store.go#L150-L186","documentation":"Error \"cannot remember empty text\" thrown in JuliusBrussee/caveman.","triggerScenarios":"Thrown at mem/store.go:168 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Provide non-empty text to remember."],"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"}