0.134.25

Fixed (MEDIUM-аудит: 6 находок группы 4.5 Store, см. docs/audit/backend-2026-06.md §4.5)

  • M-ST-1 store.SQLiteStore.RemoveFactIDFromKGSourceIDs — вся операция (SELECT + UPDATE/DELETE) обёрнута в BeginTx/Commit. Ранее ошибки UPDATE/DELETE глотались, оставляя БД в рассогласованном состоянии при частичном отказе. Также rows.Scan теперь логирует ошибку через slog.Warn вместо молчаливого continue.
  • M-ST-2 store.scanRowWarn — новый helper для rows.Scan с slog.Warn при ошибке. Применён к scanEntities (самой критичной функции — KG-сущности). Остальные ~45 мест в sqlite.go/postgres.go остаются с if err := rows.Scan(...); err != nil { continue } — это by design (resilience: corrupt row не должна ломать весь запрос, контракт задокументирован в комментарии функции).
  • M-ST-3 store.ApplyTimeDecay — добавлена поддержка нескольких форматов timestamp (RFC3339Nano, RFC3339, SQLite 2006-01-02 15:04:05, и вариации с микросекундами). Раньше парсил только SQLite-формат — на PG-данных всегда возвращал исходные score (continue при parse fail).
  • M-ST-4 store.DualStore — параметр sessionID переименован в agentID в 6 функциях (GetMessages, GetRecentMessages, GetLatestSummary, DeleteSummaryBefore, DeleteMessagesBefore, DeleteMessagesBetween). Реально это всегда был agentID (подтверждено сигнатурами SQLiteStore/PostgresStore), старое имя сбивало с толку.
  • M-ST-5 store.SQLiteStore.AddFactSources — вместо N отдельных INSERT OR IGNORE в цикле теперь один batch-INSERT с placeholder’ами. Для батчей >5000 записей — chunking (3 чанка по 5000 для 12k записей). Существенный прирост на больших messageIDs.
  • M-ST-6 store.SQLiteStore.EnqueueKGFact — добавлен doc-комментарий о требовании SQLite >= 3.24 для ON CONFLICT ... DO UPDATE SET ... WHERE ... (выпущен июнь 2018, поддерживается всеми актуальными macOS/Linux/Windows). Fallback не предусмотрен — на целевых платформах версия всегда >= 3.24.

Tests

  • Новые: internal/store/remove_factid_test.go::TestSQLite_RemoveFactIDFromKGSourceIDs_Transaction (M-ST-1), internal/store/time_decay_test.go::TestApplyTimeDecay_PostgresFormats (M-ST-3, проверяет SQLite+RFC3339 форматы), internal/store/add_fact_sources_test.go::TestSQLite_AddFactSources_BatchInsert + TestSQLite_AddFactSources_EmptyAndLarge (M-ST-5, проверяет батч + chunking 12k записей).

Build / Tests

  • go test ./internal/... — все тесты проходят (store, memory, agent, server/handler и т.д.).
  • go build — OK.