Быстрая итерация · API и документация могут меняться
Liri Liri Журнал разработки
На главную
RU
ЖУРНАЛ РАЗРАБОТКИ

Дорога, которая ещё не пройдена

От v0.1 до v0.5.22 — 156 дней, 116 релизов. Здесь не список функций, а наши ошибки, заработанные правила и пробелы, которые мы ещё не закрыли.

156 дней
с первого релиза
116
релизов
9
снимков архитектуры
20+
проверок архитектуры

Снимок данных 2026-11-01 · цифры собраны из основного репозитория Liri скриптами sync-facts и health:arch

Перейти к хронологии

Происхождение

25 мая 2026 года Liri вышел версией v0.1: 100 коммитов и терминальный ИИ-ассистент, который действительно работает.

Задача была конкретной — посадить модель в терминал, чтобы она читала файлы, выполняла команды и правила код, а не переписывалась в поле ввода на веб-странице. Локальные модели в приоритете, потому что личные файлы не должны уходить на чужой сервер; безопасность по умолчанию, потому что ассистент получает настоящую машину, а не только API.

За следующие три месяца возможности наращивались слой за слоем: инструменты, 27 каналов сообщений, десктопный клиент, голос, база знаний. К августу в репозитории было более 4000 файлов.

Именно тогда проблему впервые назвали вслух. Код-ревью 18 июня 2026 года: LocalHTTPService — 7200 строк, ChatManager — 3263 строки, 150 тестовых файлов против 3742 файлов исходного кода. Два месяца спустя первая оценка здоровья архитектуры: 10/40, класс D, 105 файлов сверх лимита — и все не зарегистрированы.

Урок: можно ли передать проект другому человеку, решают не количество функций, а правила, которые выросли после того, как проект упёрся в стену.

Пять поворотных точек

Порядок по причинно-следственной связи, а не по календарю — периоды частично перекрываются.

2026-05-25 → 2026-08

Сначала возможности, границы потом

Ситуация
В v0.1 было 100 коммитов: главное — чтобы работало; функции были важнее структуры.
Решение
Сначала заполнить возможности: инструменты, каналы, десктоп, голос, знания — одно за другим.
Цена
Первый аудит показал неприятные цифры: LocalHTTPService — 7200 строк, ChatManager — 3263, соотношение тестов к исходному коду около 4%, первая оценка здоровья архитектуры — 10/40 (D), 105 файлов сверх лимита без регистрации.
Результат
4000+ файлов, 69 инструментов, 27 каналов, 429 компонентов десктопа.

↳ Как войти — Хотите добавить возможность — создайте модуль в app/src, не заносите его в ядро.

2026-08-09 → 2026-09-30

Сначала научиться себя измерять

Ситуация
Проблему чувствовали все, но никто не мог сказать, насколько всё плохо.
Решение
Превратить качество архитектуры в повторяемую оценку с реестром и требовать регистрации каждого файла сверх лимита — отказавшись от допущения, что чистота держится на одной дисциплине.
Цена
Регистрация — не разделение: ChatManager вырос с 3263 до 7036 строк (сейчас он разделён до 2,570). Сама методика оценки продолжала меняться, поэтому это карта здоровья, а не KPI.
Результат
Девять снимков; незарегистрированных файлов сверх лимита стало 0 вместо 105 (позже — 2); список превратился в прослеживаемый реестр.

↳ Как войти — Возьмите один файл сверх лимита на разделение (см. «Как помочь» ниже).

2026-10-08 → 10-09

Одно неверное удаление дало нам процесс удаления

Ситуация
В коде накопился слой «мёртвых поверхностей», которые выглядели неиспользуемыми. Уборка в v0.4.69 приняла подсистему песочницы и изоляции за мёртвый код: затронуто 170 файлов, +9340 / −10174 строк.
Решение
На следующий день v0.4.71 полностью откатил изменения: восстановлены 24 файла (IsolationManager, EnhancedSandboxManager, PTYSandbox, SSHSandbox, docker/** и другие, плюс 5 наборов тестов) и возвращены сопутствующие правки в 21 живом файле.
Цена
Теперь удаление требует сначала написать доказательства — процесс медленнее, но дешевле отката.
Результат
v0.4.72 оформил удаление в процесс code-deletion.md (CD01–CD07): собрать доказательства, отсоединить точки входа, затем удалять. «Кажется, это никто не использует» перестало быть причиной.
Доказательства CHANGELOG v0.4.69 / v0.4.71 / v0.4.72

↳ Как войти — Проверьте одного «кандидата в мёртвый код» по CD01–CD07.

2026-10-10 → 10-22

Превратить правила в гейты

Ситуация
Правила жили в документах и держались на дисциплине; документы и код начали расходиться.
Решение
Каждое правило стало блокировкой CI, а не рекомендацией: пять гейтов плюс doc-gate и обязательная задача sandbox-negative; базовые ключи хардкода — 413; словарь состояний — 34 значения и 1795 пар в базе; отдельные гейты для поверхности запуска, критических модулей и поверхности ядра.
Цена
Несколько секунд на коммит, и при каждом изменении словаря базу нужно перегенерировать — смысл именно в том, что определения больше не могут расходиться незаметно.
Результат
Нарушений lint:arch — 0; тестов стало 7488 вместо 3029.

↳ Как войти — Перед отправкой прогоните локальные гейты (bun run ci) и исправьте всё, что покраснело.

2026-10-05 → 10-28

Сжатие ядра: с 5336 строк до отдельного пакета

Ситуация
core был одновременно реализацией точки входа и общим задним двором всех возможностей — добавлять мог кто угодно.
Решение
Три шага: сократить (CoreAPIImpl с 5336 до 2521 строки), выделить (@openliri/kernel как отдельный пакет; core с 146 до 113 файлов, гейты ядра K01–K08), затем вынести (37 модулей, не прошедших правило «нулевой I/O / нулевые зависимости вверх», опущены в app/src, обновлено более 470 импортов, перегенерированы пять семейств базовых значений).
Цена
Одна крупная миграция и полная перегенерация базовых значений; с 18.10 работа идёт пакетами, плотность коммитов намеренно снижена.
Результат
Ядро предоставляет наружу только тонкий интерфейс; у внешних вкладов впервые появилась граница.
Доказательства CHANGELOG v0.5.22

↳ Как войти — Новые возможности живут за границей ядра и начинаются в app/src.

Архитектура: слои как в операционной системе

Архитектура не изобреталась с нуля. Тонкое ядро, границы подсистем, одностороннее направление зависимостей, гейты и наблюдаемость пришли из десятилетий практики операционных систем; опубликованные за последние два года шаблоны проектирования и инженерные руководства для агентов сходятся к тем же вопросам — слои, границы, состояние, управление, оценка. Первым способом мы ограничиваем себя, вторым — проверяем.

Концепция ОС → где сейчас Liri

Концепция В Liri Статус
Ядро @openliri/kernel как отдельный пакет с тонким публичным интерфейсом, под охраной K01–K08 Реализовано
Подсистемы Инструменты / каналы / память / маршрутизация / песочница / задачи / голос / десктоп — у каждой свои точки входа и границы Сходится
Драйверы Адаптеры провайдеров, адаптеры каналов и 6 бэкендов песочницы (Landlock / Docker / SSH / PTY / macOS / Windows) Реализовано
Процессы и планирование Выполнение сеансов, PDCA, Swarm, Cron Реализовано
Модель прав Пять рубежей защиты и четыре этапа одобрения (requested → presented → decided → recorded) Ждёт аудита
Наблюдаемость и аудит Журнал событий, учёт затрат, реестр доказательств Реализовано
Сопровождающие (MAINTAINERS) Пока не создано: нет владельцев подсистем и пути передачи Пробел

С чем мы сверялись

Мы пункт за пунктом сопоставили себя с публичными шаблонами проектирования агентов и инженерными руководствами: все 21 шаблон имеют реальные реализации, но 3 из ключевых переключателей по умолчанию выключены — поэтому мы говорим только «реализовано», никогда «включено по умолчанию». Инженерный цикл проверяется по тем же пяти этапам: архитектура, сборка, работа, управление, оптимизация.

Три пробела

Институт сопровождающих подсистем

Без владельцев нет и пути передачи. Это самая «операционная» часть, и именно её нам не хватает.

Слой контрактов подсистем

Проект контрактов есть, но реализованы ли реестр и LoopProfile — не проверено; обещание стабильности интерфейсов пока не закреплено.

Гейт покрытия тестами

На момент проверки около 4%; в CI более 20 проверок архитектуры, но порога покрытия пока нет.

Честно: здоровье архитектуры по-прежнему D (10/40); из 142 файлов сверх лимита 141 всё ещё не зарегистрированы; крупнейший по-прежнему в модуле chat (ChatManager разделён с 7036 до 2,570 строк). Ядро есть, границы сходятся, института сопровождающих пока нет — вот что значит «ещё не пройдено».

Показать текущие 8 функциональных уровней

Архитектура в целом

8 функциональных уровней от точки входа до обратной связи; в инженерии их закрепляют 6 гейтов зависимостей (entry > ui > app > service > infra > core)

L1

Мультимодальный уровень входа

Терминал REPL
Терминальный интерфейс на React + Ink со встроенной системой Buddy
Десктопный клиент Tauri
429 TSX-компонентов на 32 страницах (Tauri 2.11 + React 19)
MCP / шлюз каналов
MCP Server и 27 каналов сообщений (WeChat, DingTalk, Feishu, Telegram и другие)
CLI / HTTP API
Три исполняемых файла — Liri / liri-memory / liri-ink — и HTTP API
L2

Первый уровень безопасности

Компиляционный анализ Rust AST
Слой FFI разбирает Bash AST и сверяет его с 37 правилами опасных команд
Семантический анализ TypeScript
Составные команды только для чтения разбираются посегментно, причина отказа поддаётся атрибуции
Движок правил Guardrail
14 шаблонов инъекций + 10 правил для Shell
Классификатор AutoMode
Автоматически оценивает риск задачи и выбирает: разрешить, спросить или отклонить
L3

Уровень интеллектуальной маршрутизации

Распознаётся 19 типов задач
код / текст / анализ / инструменты / перевод / поиск / идеи / светская беседа и другие
4 уровня tier
simple / medium / complex / reasoning
5-этапный конвейер решений
переключатель → быстрый путь → закрепление за сеансом → суждение LLM → выбор tier
FallbackChain
Последовательный откат при недоступности основного провайдера вместе с RetryPolicy
L4

Уровень инъекции второго мозга

База знаний
Markdown на диске и семантическая индексация; гибридный поиск по ключевым словам / векторам / RRF
Система памяти
Многоуровневая память с векторной таблицей SQLite и выборкой с весами по релевантности
События сеансов
events.jsonl только с добавлением — воспроизводимо и проверяемо
DreamEngine
Упорядочивает знания в простое: сбор → анализ → генерация → запись → индексация
L5

Цикл решений TAOR

Think
4 стратегий агента: общая / код / исследование / планирование
Act
69 встроенных инструментов, регистрируются динамически в зависимости от сборки
Observe
Оценка результата, уровневые окна контекста и автоматическое сжатие
Reason
Управление бюджетом токенов + возобновление с контрольных точек + предохранитель на раунд
L6

Уровень песочницы выполнения

Linux Landlock
Ограничение доступа к файловой системе на уровне ядра
macOS / Windows
Системные песочницы с Low IL / объектами Job как запасной вариант
Контейнер Docker
Полная изоляция контейнера с ограничениями ресурсов и сетевой политикой
SSH / PTY
Чистые удалённые среды выполнения и управляемые пути псевдотерминала
L7

Уровень длительных задач

Конвейер PDCA
Цикл Plan-Do-Check-Act, прогресс определяется наличием артефактов
Swarm с несколькими агентами
AgentSwarm с оркестрацией совета и динамическим обнаружением реестра
Планировщик Cron
Поддержка once / interval / выражений cron (с часовыми поясами)
Сохранение задач
Снимки сеансов, восстановление с точки останова и видимый обратный отсчёт во время ожидания
L8

Уровень обратной связи и эволюции

Обобщение сбоев
Шаблоны сбоев обобщаются и возвращаются в подсказки и навыки, замыкая цикл улучшений
Учёт затрат
Тарификация по таблице цен в базе с записью реального имени модели, которое вернул провайдер
Гейты оценки
Встроенные базовые наборы, метрика надёжности pass^k и парные измерения безопасности
Воспроизведение событий
Контекст каждого вызова модели можно восстановить постфактум

Философия архитектуры

🛡️
Безопасность по умолчанию
Безопасность — не плагин, а ДНК каждого уровня
🏠
Локально в первую очередь
Данные хранятся локально, работа офлайн, приватность защищена по умолчанию
🧠
Интеллектуальная маршрутизация
19 классов задач сопоставляются с подходящим уровнем модели
🧬
Второй мозг
База знаний, память и журнал событий — три уровня контекста с поиском
🔄
Проверяемый цикл
Выводы из сбоев возвращаются в систему, изменения блокируются гейтами
🔌
Единая мультимодальность
Терминал, десктоп, мессенджеры и API используют один движок

Хронология

Одна запись в месяц — только изменения архитектуры и управления, без обычных коммитов.

  1. 2026-05-25 v0.1: 100 коммитов, терминальный ассистент работает
  2. 2026-06-18 Первое код-ревью: монолит на 7200 строк, соотношение тестов к коду около 4%
  3. 2026-08-09 Первая оценка здоровья: 10/40 (D), 105 файлов сверх лимита не зарегистрированы
  4. 2026-10-09 Песочницу удалили при уборке → полный откат; на следующий день — процесс удаления CD01–CD07
  5. 2026-10-20 Гейт словаря состояний: 34 значения, 1795 пар в базе
  6. 2026-10-28 Вынос ядра завершён; видимых модели инструментов — 12 / 1397 токенов
  7. 2026-10-28 Двуязычный сайт документации и этот сайт запущены

Ежемесячные записи будут добавляться здесь.

Как помочь

Эта страница — не отчёт о завершении, а приглашение. Три задачи, и на все нужны руки.

Чек-лист аудита безопасности

  • Правила опасных команд: 37 правил — где они живут, как срабатывают; постройте один случай и проверьте, что сработало именно ожидаемое правило
  • Правила защиты от инъекций промптов: 14 правил — подайте вредоносный документ и посмотрите, будет ли он заблокирован
  • Правила Shell: 10 записей разрешений и запретов — попробуйте обходные пути (конвейеры, подоболочки, кодирование)
  • Логика деградации песочницы: при каких условиях деградирует каждый из 6 бэкендов и остаётся ли он fail-closed
  • Этапы одобрения: requested → presented → decided → recorded — нет ли пропущенных или переставленных этапов
  • Поверхность прав: может ли вызов инструмента обойти классификатор прав и напрямую записать на диск или выполниться

Точки входа: app/src/security, app/src/sandbox, app/src/permission.

Детали уязвимостей сообщайте приватно по SECURITY.md, не открывайте публичный issue; публичные issues — только о процессе аудита и его охвате.

Хотите поддержать деньгами? Смотрите страницу спонсорства