0.165.0

Added

  • Разделение памяти на episodic и semantic слои (ADR 2026-07-04, ). После v0.164.0 пользователь нажал «Новая тема» и попросил «Очисти все задачи» — агент вместо этого начал выполнять вчерашний план «перенос Gitea на PostgreSQL». Расследование выявило архитектурный дефект: topic_break обрезал только messages (episodic), но semantic-память (memory_facts, L0 abstracts, chunks) — не имела понятия «топик» и утекала в каждый следующий ход. Факт #1184 «Gitea мигрирована» (importance 0.9, category=solution) гарантированно попадал в top-3 L0-секцию системного промпта и галлюцинировал связь с любым запросом.

Пять изменений закрывают дефект:

  • #260 L0-context filter по category (internal/store/sqlite.go, postgres.go). ListL0Abstracts/ListL0FactIDs теперь фильтруют category IN ('user_fact','preference','general'). Episodic-категории (event/solution/decision/session_summary) исключены из always-on секции — остаются доступны только через RAG при cosine ≥ 0.45. Тесты: TestListL0Abstracts_ExcludesEpisodicCategories, TestListL0Abstracts_IncludesAllGlobalCategories, TestIsGlobalFactCategory.

  • #261 TopicBreak жёсткая очистка (internal/server/handler/chat.go, internal/store/sqlite.go, postgres.go, dual.go). Новый метод ArchiveTopicContext — атомарная транзакция:

  • UPDATE messages SET archived=1 WHERE created_at < before;

  • UPDATE memory_facts SET is_active=0 для эпизодических категорий с source_type=session;

  • DELETE FROM memory_chunks с source_type=session (колонки is_active в схеме нет; добавлять ради редкой операции нерентабельно — chunks индексные, пересоздаются);

  • синхронизация HNSW in-memory индекса через IndexFactDeactivate. Глобальные facts (user_fact/preference/general) остаются активными. TopicBreak handler логирует messages_archived/facts_deactivated/chunks_deactivated. Тесты: TestArchiveTopicContext_ArchivesEpisodicLayer, TestArchiveTopicContext_IdempotentSafe, TestArchiveTopicContext_NoLeakageInSearch.

  • #262 UI: обновлённый confirm dialog + tooltip (TopicBreakConfirmModal.svelte, ChatHeader.svelte). Modal теперь описывает реальное поведение: «сообщения архивируются, свежие эпизодические факты (события, решения, выполненные задачи) — деактивируются. Глобальные факты (профиль, предпочтения) сохраняются». Tooltip кнопки: «Очистить контекст текущего топика (сообщения и эпизодические факты)».

  • #263 REST PATCH category override (internal/server/handler/memory.go:UpdateFact). Теперь PATCH /api/v1/agents/{agentID}/facts/{factID} принимает category в теле. Admin может вручную перевести факт, ошибочно категоризованный консолидатором (например, #1184 «Gitea мигрирована» с solutiongeneral), чтобы он перестал деактивироваться при TopicBreak и остался в L0. Валидация: store.IsGlobalFactCategory + isValidEpisodicCategory. Тесты: TestUpdateFactCategory.

  • #264 Audit leakage (internal/store/sqlite.go, postgres.go). GetLatestSummary раньше намеренно возвращал archived summary (комментарий «артефакт компакции») — теперь фильтрует archived=0. После TopicBreak cached summary не утекает. Тесты: TestGetLatestSummary_ExcludesArchived, TestGetLatestSummary_AllArchived.

  • Константы GlobalFactCategories / EpisodicFactCategories / IsGlobalFactCategory в internal/store/store.go — единый источник правды для дискриминатора global vs episodic.

ADR

  • ADR 2026-07-04 «Разделение памяти на episodic и semantic слои» — формализация: episodic = контекст диалога + свежие events/decisions (гасятся при TopicBreak); semantic = стабильная идентичность + предпочтения (живут вечно, в L0 abstracts всегда). Категории как дискриминатор. Политика очистки: soft archive (archived=1 / is_active=0), без DELETE messages/facts.

Issues

  • #260 [P0] L0-context filter по category — fixed
  • #261 [P0] TopicBreak жёсткая очистка episodic слоя — fixed
  • #262 [P1] UI confirm dialog + tooltip — fixed
  • #263 [P1] REST PATCH /facts/{id}/category + admin override — fixed
  • #264 [P1] Audit: RAG / summary / KG исключают деактивированные — fixed

Ожидаемый эффект

  • После «Новой темы» агент начинает с чистого листа: «Очисти все задачи» → действительно очищает список задач, а не запускает вчерашний план.
  • Глобальные факты (Антон, Tailscale, prefs) — остаются, агент не теряет идентичность.
  • Admin UI (следующий релиз) — полный редактор фактов с dropdown category. Сейчас категорию можно менять через REST API напрямую.