0.99.0

Added

  • Поля evidence и subject для фактов памяти (миграция 056): теперь каждый факт хранит дословную цитату-источник (≤120 символов) и scope user|agent|world. MemoryFact.Evidence, MemoryFact.Subject доступны через store API и видны в JSON-ответах GET /api/v1/agents/:id/memory/facts.
  • FTS-prefilter в дедупликации: перед vector-проверкой делается FTS-поиск с OR-склейкой значимых терминов нового факта; если у кандидата ≥3 общих значащих слова — он сразу идёт в LLM-merge. Помогает ловить пары, где cosine-эмбеддинг расходится из-за рефразы.
  • Настройки дедупликации (через settings): dedup_cosine_threshold (default 0.88), dedup_llm_check_threshold (default 0.80), dedup_fts_overlap_min (default 3).
  • Новые тесты в internal/memory/iter18_test.go: Extract_RequiresEvidence, Extract_RequiresSubject, Extract_RejectsCategoryGeneral, Extract_RejectsUserSubjectInAnonymousScope, Dedup_NearDuplicates_Below095_AskMerge, Dedup_FTSOverlap_AskMerge, SignificantTerms, TrimEvidence, BlacklistsSessionConfig_PromptContainsRules, ConflictResolutionPrompt_HasEvidenceFields.

Changed

  • Промпт извлечения фактов (extractFactsPrompt) переписан:
  • Обязательное поле evidence (дословная цитата из диалога).
  • Запрещена категория general — если ничего не подходит, факт пропускается.
  • Чёткий black-list инфраструктуры сессии (модель LLM, число tools, max_iterations, sandbox, autonomy_level, версия агента, hostname, workspace path).
  • Few-shot пример с контекстом обстоятельств (host + path).
  • Few-shot пример с отказом для самоутверждений ассистента (без подтверждения от user).
  • Конкретное правило «гипотеза агента → не извлекается».
  • Промпт conflictResolutionPrompt теперь принимает evidence обоих фактов и обязывает сохранять обстоятельства (host, path, IDs) из обоих при UPDATE/MERGE.
  • Порог дедупликации понижен с 0.95 до 0.88 (dedup_cosine_threshold); диапазон [0.80, 0.88) дополнительно отдаётся в askMerge. Это ловит ранее пропускаемые семантические дубли (например, 24 факта про username agaltsovav с разными рефразами).
  • Валидация фактов в persistFacts: новый validateFact отбрасывает факты без evidence, без валидного subject (user|agent|world), c категорией вне белого списка, и subject=user в анонимном scope.

Fixed

  • Subject теперь сохраняется в БД. Поле Subject в ExtractedFact объявлено давно и требовалось промптом, но не передавалось в store.MemoryFact — терялось.
  • Удалён мёртвый дублированный switch в Consolidator.resolveConflict (бывшие строки 269-333). Поведение объединено в один блок без потери семантики.

Docs

  • ADR docs/adr/2026-05-22-fact-evidence-subject.md — решения и альтернативы.
  • Аудит docs/audit/memory-facts-2026-05-22.md — диагностика на агенте Yashka.