# AI Change Log Дата создания: 2026-04-18 ## Как пользоваться Этот файл - рабочий журнал изменений для Codex. Перед новыми правками нужно прочитать этот файл и учитывать: - что уже было изменено; - какие файлы трогались; - какие проверки запускались; - какие ограничения и договоренности есть по задаче. После каждой осмысленной правки нужно добавлять новую запись с: - кратким описанием изменения; - списком измененных файлов; - результатом проверок; - открытыми рисками или TODO, если они есть. ## Договоренности - Не менять контракты `POST /index`, `POST /sparse_embedding`, `POST /search`. - По текущей задаче фокус держать на `index`, если пользователь не просит иначе. - Не трогать `docker-compose.yml` и инфраструктуру без отдельной просьбы. - Не откатывать чужие или пользовательские изменения. ## Записи ### 2026-04-18 - разрешены конфликты с upstream/main Что сделано: - Объединены записи журнала из ветки PR и `upstream/main`. - В `search/main.py` сохранены расширенные retrieval/rerank доработки из обеих веток. - Убраны конфликтные маркеры после merge `upstream/main`. - Сохранены безопасные лимиты retrieval и защита от падения rerank. Измененные файлы: - `.ai_update/changes.md` - `search/main.py` Проверки: - `python3 -m py_compile index/main.py search/main.py` - Прямой smoke `build_chunks` на `data/Go Nova.json`: 15 чанков, покрыто 25 из 25 сообщений. - Pure smoke для `search/main.py` helper-функций через stub-модули. Открытые риски: - Полный интеграционный прогон с настоящими Qdrant/dense/rerank зависит от внешних сервисов. ### 2026-04-18 - index P1 and search retrieval/rerank Что сделано: - В `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-хвост. - Retrieval points дедуплицируются по Qdrant point id. - Финальные `message_ids` агрегируются по score, дедуплицируются и ограничиваются `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` Проверки: - Код не запускался, потому что создан только журнал.