| 1 | # ADR 0043: Паритет восстановления MCP-транспорта (человек ↔ агент) и границы хоста |
| 2 | |
| 3 | **Статус:** Proposed |
| 4 | **Дата:** 2026-04-13 |
| 5 | ## Связанные ADR |
| 6 | |
| 7 | | ADR | Роль | |
| 8 | |-----|------| |
| 9 | | [0008](0008-mcp-contracts-and-testable-infrastructure.md) | контракты MCP | |
| 10 | | [0016](0016-agent-client-protocol-external-agent.md) | ACP ортогонально MCP | |
| 11 | | [0002](0002-debug-human-agent-parity.md) | Единый слой состояния отладки для человека и агента | |
| 12 | |
| 13 | ### Вне ADR |
| 14 | |
| 15 | | Документ | Роль | |
| 16 | |----------|------| |
| 17 | | [north-star-cursor-mcp-cascade-workbench-v1.md](../design/north-star-cursor-mcp-cascade-workbench-v1.md) | Cursor + MCP + Cascade | |
| 18 | | [MCP-PROTOCOL.md](../MCP-PROTOCOL.md) | транспорт stdio, видимость MCP | |
| 19 | |
| 20 | --- |
| 21 | ## Контекст |
| 22 | |
| 23 | Северная звезда продукта предполагает рабочий контур **Cursor (или аналог) + MCP + CascadeIDE**: агент вызывает инструменты IDE и видит согласованное состояние с человеком ([north-star § критерии](../design/north-star-cursor-mcp-cascade-workbench-v1.md#критерии-мы-в-зоне-цели-проверяемые)). |
| 24 | |
| 25 | <a id="adr0043-motivation"></a> |
| 26 | |
| 27 | ### Продуктовая логика: MCP как «способ быть в мире» |
| 28 | |
| 29 | Для агента **MCP — не фоновая деталь, а интерфейс к действию**: без живого канала к тулам он не «просто без удобства», а **ограничен в том же роде, что человек без руки** — только у человека обычно есть **обходы**: другой инструмент, перезапуск, настройки, «протез» (замена пути к цели). В экосистеме хоста часть серверов может быть **встроенной**, большинство — **внешние процессы**; человек-оператор при сбое может **починить любое упавшее звено** в своей цепочке. |
| 30 | |
| 31 | **Агент в типичном чате не выбирает хост и не может перезапустить себе инструмент:** он шлёт вызовы в **тот же** транспорт. Если MCP мёртв или завис, агент **не имеет** того класса самопомощи, который у человека считается нормой. Это не педантичная жалоба на UX — **структурная асимметрия операторности**: человек может восстановить или обойти цепочку, агент — часто нет, хотя от него ждут того же рода результатов. Такая ситуация **противоречит интуиции паритета** «мы в одной работе» и заслуживает явного признания в дизайне продукта и хоста, а не сведения к «ну перезапусти MCP руками». |
| 32 | |
| 33 | ### Технически: где проходит граница |
| 34 | |
| 35 | MCP-серверы у хоста — это **процессы**: обмен по stdio с дочерним процессом CascadeIDE с `--mcp-stdio`, плюс **другие настроенные у хоста MCP-процессы** (например отдельный сервер с тулами Roslyn для C#, сервер отладки .NET). Это **не** встроенный Roslyn/DAP внутри окна CascadeIDE — у каждого такого процесса свой транспорт и жизненный цикл, которым управляет **хост**, а не IDE. Ограничение агента следует из **роли ProcessHost**, не из «не захотели сделать» в одном репозитории. |
| 36 | |
| 37 | **Связь с [0002](0002-debug-human-agent-parity.md):** там — паритет **состояния отладки** в IDE; здесь — другая ось: **доступность канала MCP** и восстановление после сбоя. |
| 38 | |
| 39 | ## Решение (направление, без обязательства сроков) |
| 40 | |
| 41 | <a id="adr0043-p1"></a> |
| 42 | |
| 43 | 1. **Явно разделить уровни:** |
| 44 | - **Уровень A — хост (Cursor и аналоги):** запуск, остановка, перезапуск **любого** MCP-сервера, который хост держит в своей конфигурации. CascadeIDE **не подменяет** хост и не обещает произвольный рестарт соседних серверов из процесса IDE. |
| 45 | - **Уровень B — процесс CascadeIDE:** в перспективе — **контролируемое** восстановление **собственной** роли MCP-сервера (например повторная инициализация stdio-сессии **внутри** поддерживаемой модели), только если это безопасно для UI и не ломает контракт [0008](0008-mcp-contracts-and-testable-infrastructure.md). Отдельные итерации дизайна и реализации. |
| 46 | - **Уровень C — наблюдаемость:** расширять диагностику «транспорт жив / команда не дошла / IDE не в режиме MCP» так, чтобы **агент и человек** опирались на **одни и те же** сигналы (снимок состояния, явные ошибки в ответах тулами), в духе уже описанного в [MCP-PROTOCOL.md § «Видимость MCP»](../MCP-PROTOCOL.md#видимость-mcp-для-агента-на-будущее-свои-mcp-в-ide). |
| 47 | |
| 48 | <a id="adr0043-p2"></a> |
| 49 | |
| 50 | 2. **Зафиксировать цель паритета:** где технически возможно, **восстановление или явная деградация** канала должно быть доступно **и** через действия человека в хосте, **и** через **поддерживаемый** контракт (тулы IDE, команды хоста, или документированный сценарий), а не только «напиши пользователю перезапусти MCP». |
| 51 | |
| 52 | <a id="adr0043-p3"></a> |
| 53 | |
| 54 | 3. **ACP:** внешний агент по [0016](0016-agent-client-protocol-external-agent.md) остаётся **ортогонален** этому ADR; восстановление MCP-транспорта к IDE не смешивается с транспортом ACP, кроме общего требования **ясных ошибок** и наблюдаемости. |
| 55 | |
| 56 | ## Последствия |
| 57 | |
| 58 | - Появление **осмысленных** задач в бэклоге: health MCP в снимках IDE, при необходимости узкие команды «переподнять свой серверный режим», согласование с хостом — отдельно. |
| 59 | - Зависимость от **roadmap Cursor** (или другого клиента) для полного паритета «агент перезапускает любой MCP» — честно отражать в документации и north-star, без обещания «всё в одном репо IDE». |
| 60 | |
| 61 | ## Отклонённые альтернативы |
| 62 | |
| 63 | - **Произвольный рестарт чужих MCP-процессов из CascadeIDE** без участия хоста — отклонено: нарушает границу ProcessHost, небезопасно и непереносимо. |
| 64 | - **Молчать о разрыве** и считать это только проблемой пользователя — отклонено как противоречащее north-star про «снять трение» перехода из Cursor. |
| 65 | |