# AI Change Log Дата создания: 2026-04-18 ## Как пользоваться Этот файл - рабочий журнал изменений для Codex. Перед новыми правками нужно прочитать этот файл и учитывать: - что уже было изменено; - какие файлы трогались; - какие проверки запускались; - какие ограничения и договоренности есть по задаче. После каждой осмысленной правки нужно добавлять новую запись с: - кратким описанием изменения; - списком измененных файлов; - результатом проверок; - открытыми рисками или TODO, если они есть. ## Договоренности - Не менять контракты `POST /index`, `POST /sparse_embedding`, `POST /search`. - По текущей задаче фокус держать на `index`. - Не трогать `search`, `docker-compose.yml` и инфраструктуру без отдельной просьбы. - Не откатывать чужие или пользовательские изменения. ## Записи ### 2026-04-18 - индексный P1 и безопасный P0 search Что сделано: - В `index/main.py` заменен символьный chunking на сборку чанков окнами сообщений. - Добавлен учет временного разрыва между сообщениями через `INDEX_TIME_GAP_SECONDS`. - Overlap теперь работает по границам сообщений через `INDEX_CHUNK_OVERLAP_MESSAGES`, а не по хвосту строки. - Сообщения рендерятся структурно: `author`, `time`, `thread`, `mentions`, флаги, `quote`, `forward`, `file`, `system_event`. - `file_snippets` парсятся как JSON; в индекс попадают имя файла, mime, url, владелец и дата создания. - `member_event` превращается в индексируемый системный текст. - `page_content`, `dense_content`, `sparse_content` разведены. - В `index/Dockerfile` старый `CHUNK_SIZE=10` заменен на реальные `INDEX_*` настройки chunking. - В `search/main.py` исправлен runtime-баг с неинициализированным `must_conditions`. - Основной query в search теперь берется из `question.search_text` с fallback на `question.text`. - `question.variants`, `question.hyde`, `question.keywords` и entities используются как дополнительные dense/sparse запросы. - Retrieval делает несколько prefetch-запросов и fusion через Qdrant. - Rerank больше не выбрасывает retrieval-хвост. - Финальные `message_ids` агрегируются, дедуплицируются и ограничиваются `top-50`. Измененные файлы: - `index/main.py` - `index/Dockerfile` - `search/main.py` - `.ai_update/changes.md` Проверки: - `python3 -m py_compile index/main.py search/main.py` - Прямой smoke `build_chunks` на `data/Go Nova.json`. - Прямой smoke endpoint-функции `index(...)` на `data/Go Nova.json`. - Pure smoke для `search` helper-функций через stub-модули, потому в host env нет `qdrant_client` и `httpx`. Результаты проверки индекса: - Было 29 чанков, стало 15. - Покрытие сообщений на `data/Go Nova.json`: 25 из 25. - Системное сообщение с `member_event` больше не выпадает. - `file_snippets` с `IMG_8471.webp` попадает в `sparse_content`. - Quote и forward маркеры попадают в `dense_content`. - `page_content`, `dense_content`, `sparse_content` больше не одинаковые. Открытые риски: - Полный интеграционный прогон `search` с настоящими Qdrant/dense/rerank локально не выполнялся. - `date_range` фильтр включается только если установленный `qdrant_client` поддерживает `models.DatetimeRange`. - Полный docker build локально не запускался. ### 2026-04-18 - создан журнал изменений Что сделано: - Создан файл `.ai_update/changes.md`. - Зафиксировано, что до этого код не менялся, была только разведка репозитория и ТЗ. Контекст по текущему состоянию: - `index/main.py` сейчас использует символьный chunking. - `render_message` берет только `message.text` и `parts[*].text`. - `page_content`, `dense_content`, `sparse_content` сейчас одинаковые. - В примере `data/Go Nova.json` текущий `build_chunks` покрывает 24 из 25 сообщений; системное сообщение с `member_event` выпадает из индекса. Измененные файлы: - `.ai_update/changes.md` Проверки: - Код не запускался, потому что создан только журнал. Следующий ожидаемый фокус: - Перестроить индексный renderer и chunking в `index/main.py`, если пользователь попросит перейти к реализации.