<style> [data-reveal] { opacity: 1 !important; transform: none !important; } </style>

Aelyx

Инженерные знания о кодовой базе: контекст, привязанный к Git, долговременная память проекта и модель архитектуры, доступные AI-инструментам через MCP.

Принадлежность
Принадлежит лично мне. Ежедневно используется инженерной командой Red Sentra.
Доступность
Внутренний инженерный инструмент, а не общедоступный продукт. Исходный код приватный.
Стек
Rust / MCP / Git / Developer tooling
Публичная витрина (откроется в новой вкладке)

Обзор этой системы от Red Sentra (откроется в новой вкладке)

Снимок публичного сайта-витрины Aelyx.

Задача

AI-инструменты для кода забывают. Каждая сессия начинается с нуля, перечитывает те же файлы и заново строит приблизительную модель репозитория, который уже видела много раз. На большой кодовой базе это медленно, дорого и ненадёжно.

Система

Aelyx — это сервис на Rust, который хранит долговременную модель проекта, привязанную к Git: как он структурирован, как части зависят друг от друга и что изменилось с прошлого раза. Эти знания доступны AI-инструментам через MCP, поэтому ассистент спрашивает сам проект, а не догадывается по нескольким прочитанным файлам.

Моя роль

Он полностью мой: архитектура, реализация на Rust, интерфейс MCP и решения о том, что вообще стоит помнить.

Самое сложное

Держать модель корректной, пока репозиторий не стоит на месте. Код меняется постоянно, а устаревший ответ об архитектуре хуже отсутствия ответа: он уверенно неверен, и по нему начинают действовать.

Архитектурные решения

  1. Парсер фиксирует, что вызов происходит, но не фиксирует, куда он ведёт. Там, где синтаксис не может доказать цель, нет и поля для неё — ни target_symbol, ни resolved, ни callee_id. Необязательное поле для ответа, которого нет, — это приглашение: первый потребитель, которому нужен граф, заполнит его догадкой, и всё, что дальше за ним, прочитает это как факт. Цена вполне реальная: Aelyx не строит графа вызовов.
  2. В публичном API нет оценки уверенности, и тест падает, если она там появится. Я не смог обосновать ни одного дешёвого числа, которое честно подводило бы итог по данным, которые всегда неполны, а каждый дешёвый способ получить такое число просто его выдумывает. Потребители теряют на этом удобство сортировки по одной колонке.
  3. Перечень рабочих пространств и репозиториев на машине было бы легко открыть через MCP, и его сознательно нет. Перечислять чужие локальные проекты — значит раскрывать метаданные, потребность в которых ни один агент не доказал. Клиент приходит с конкретным путём и работает именно с ним, а не спрашивает, что ещё есть на машине.
  4. Правило, запрещающее зависимость, и правило, её требующее, проверяются по-разному. Одна найденная зависимость нарушает запрет окончательно, при любом покрытии. Доказать, что требование не выполнено, значит доказать отсутствие, а это верно лишь тогда, когда прочитано всё, что могло бы её содержать. Поэтому при частичном покрытии ответ звучит как «нарушений не найдено» — и это сознательно не то же самое, что «требование выполнено».

Текущее состояние

Используется внутри Red Sentra и постоянно развивается, но границы у него более узкие, чем можно подумать по этому использованию. Работает для одного оператора на одной машине, проверен на одном репозитории на Rust, а поведение на проектах с несколькими языками не испытано. Нет ни публичного сервера, ни релиза. Репозиторий остаётся приватным.