<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, а поведінка на проєктах із кількома мовами не випробувана. Немає ані публічного сервера, ані релізу. Репозиторій лишається приватним.