Перейти к содержанию

ADR 0041: Protocol Buffers — рассмотрение для сообщений агента и IDE (точка входа)

Статус: Proposed (фиксация направления обсуждения и критериев; не решение о немедленной миграции с JSON)
Дата: 2026-04-13

Связанные ADR

ADR Роль
0008 контракты MCP и инфраструктура
0018 канон IdeCommands, ProtocolDocGen
0038 фасад агента, инструменты
0001 JSON как выбранное хранилище для отдельного домена — не смешивать с предметом этого ADR

Вне ADR

Документ Роль
MCP-PROTOCOL.md текущий wire-формат команд IDE для агента

Контекст

Долго обсуждалась возможность использовать Protocol Buffers (protobuf) вместо или рядом с JSON для обмена структурированными сообщениями между агентом, IDE и смежными процессами. Решение не было зафиксировано в репозитории; без ADR теряется точка входа для последующих обсуждений и оценки трудозатрат.

Этот ADR задаёт рамку: где protobuf уместен, где JSON остаётся разумным дефолтом, какие границы разделять и какие критерии использовать при принятии решения — без обязательства внедрения в конкретной версии продукта.


Проблема

  • JSON сегодня доминирует во внешних протоколах (MCP, многие LLM API), удобен для логов, отладки и ручной инспекции, не требует отдельного контура генерации схемы в простых сценариях.
  • Protobuf даёт компактное представление, быстрый parse/serialize в типичных реализациях, явную схему с эволюцией через номера полей и codegen в .NET — но добавляет пайплайн (.proto, сборка, дисциплина версий) и хуже читается человеком без инструментов.

Без зафиксированных границ команда рискует либо отклонить protobuf без формулировки критериев, либо смешать «внутренний бинарный контур» с «внешним JSON» без явной политики.


Решение (принципы)

1. Разделение по границам, а не «всё или ничего»

  • Внешняя / человеко-читаемая граница (спецификации вроде JSON-RPC MCP, публичные API, копипаст в чаты, быстрый grep по логам): JSON остаётся естественным кандидатом, пока спецификация или экосистема не требуют иного.
  • Внутренний высокочастотный или объёмный контур (IPC между процессами IDE, потоки событий, персистентные логи больших структур, несколько языков с общим контрактом): protobuf (или иной IDL + бинарный формат) — кандидат на оценку, если измеримая выгода перевешивает стоимость сопровождения.

Переход «везде protobuf вместо JSON» не является целью этого ADR.

2. Критерии, при которых имеет смысл углублять protobuf

Имеет смысл выделять время на прототип или RFC, если выполняется не одно из ниже, а устойчивое сочетание по метрикам:

  • Объём данных или частота сообщений создаёт заметную нагрузку на CPU/IO по сравнению с остальным пайплайном.
  • Нужна строгая совместимость версий схемы при параллельной эволюции клиентов (полевая модель protobuf).
  • Планируются несколько реализаций (например IDE + отдельные сервисы) и важен единый контракт без расхождения рукописных DTO.

Если ни один критерий не выполняется, JSON + дисциплина типов (и тесты контракта) могут оставаться достаточными.

3. Гибрид

Допустима и часто разумна схема: тот же логический контракт — разные кодеки на разных участках (например JSON на wire MCP и protobuf между внутренними компонентами), при явном mapping и тестах на границе. Это не обязанность дублировать каждое поле вручную навсегда — но точка конверсии должна быть осознанной и задокументированной.

4. Связь с текущим MCP и IdeCommands

Пока MCP-PROTOCOL.md и генерация исполнителей описывают JSON-аргументы команд, смена внешнего представления для агента — отдельное решение (спецификация MCP, совместимость с клиентами). Этот ADR не отменяет текущий канон; он задаёт рамку для будущих RFC по внутренним или опциональным контурам.


Не цели

  • Обязательная миграция всего обмена с агентами на protobuf в ближайшем релизе.
  • Отказ от JSON в логах и отладочных дампах без замены инструментами просмотра.
  • Привязка к конкретной библиотеке gRPC: protobuf может сочетаться с gRPC, но решение о транспорте — отдельно.

Открытые вопросы

  1. Какие конкретные потоки в Cascade IDE (имена подсистем) первыми кандидаты на замер «JSON vs protobuf» — отдельный чертёж или задача после появления профилирования.
  2. Нужен ли единый репозиторий .proto (monorepo + подмодули) или допустимы только внутренние контракты до стабилизации API.
  3. Как документировать границу для контрибьюторов: один абзац в architecture-policy.md vs ссылка только на этот ADR.

Последствия

  • Появляется стабильная ссылка для обсуждений и приоритизации: «см. 0041».
  • Реализация protobuf не следует автоматически из статуса Proposed; требуется отдельное решение с метриками или пилотом.