From caf18c9acbb8ca23e0b08477ac3e1a66ba82fd8e Mon Sep 17 00:00:00 2001 From: Mathias Bergqvist Date: Fri, 17 Apr 2026 20:23:03 +0200 Subject: [PATCH] fix(ingestion): consistent error handling in search walk Both walk-level errors and ReadFile failures now use best-effort semantics (warn via slog, continue) instead of mixed abort/silent-skip. filepath.Rel error is now propagated from the callback instead of discarded. Co-Authored-By: Claude Sonnet 4.6 --- ingestion/internal/search/search.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/ingestion/internal/search/search.go b/ingestion/internal/search/search.go index 764a323..5cace27 100644 --- a/ingestion/internal/search/search.go +++ b/ingestion/internal/search/search.go @@ -3,6 +3,8 @@ package search import ( "bufio" + "fmt" + "log/slog" "os" "path/filepath" "sort" @@ -32,13 +34,18 @@ func Query(brainDir, query string, limit int) ([]Result, error) { var results []Result err := filepath.WalkDir(filepath.Join(brainDir, "wiki"), func(path string, d os.DirEntry, err error) error { - if err != nil || d.IsDir() || !strings.HasSuffix(path, ".md") { - return err + if err != nil { + slog.Warn("search: skipping path", "path", path, "err", err) + return nil + } + if d.IsDir() || !strings.HasSuffix(path, ".md") { + return nil } content, err := os.ReadFile(path) if err != nil { - return nil // skip unreadable files + slog.Warn("search: skipping unreadable file", "path", path, "err", err) + return nil } lower := strings.ToLower(string(content)) @@ -50,7 +57,10 @@ func Query(brainDir, query string, limit int) ([]Result, error) { return nil } - rel, _ := filepath.Rel(brainDir, path) + rel, err := filepath.Rel(brainDir, path) + if err != nil { + return fmt.Errorf("rel path: %w", err) + } rel = filepath.ToSlash(rel) results = append(results, Result{