| 1 | # ADR 0058: Сопряжение агента и Roslyn MCP в `settings.toml` (лимиты, виды узлов, таймауты, пресеты) |
| 2 | |
| 3 | **Статус:** Proposed |
| 4 | **Дата:** 2026-04-18 |
| 5 | |
| 6 | ## Связанные ADR |
| 7 | |
| 8 | | ADR | Роль | |
| 9 | |-----|------| |
| 10 | | [0008](0008-mcp-contracts-and-testable-infrastructure.md) | контракты MCP | |
| 11 | | [0028](0028-user-settings-toml-localappdata-and-secrets.md) | `settings.toml` | |
| 12 | | [0039](0039-workspace-navigation-affordances.md) | навигация, пресеты MCP; карта намерений в UI | |
| 13 | | [0040](0040-lsp-launch-line-settings-toml-presets-and-environment.md) | паттерн TOML | |
| 14 | | [0053](0053-semantic-map-control-flow-pfd.md) | карта намерений на PFD | |
| 15 | | [0059](0059-roslyn-mcp-profiles-manager-tactical-strategic-efb.md) | профили, Manager, режимы Auto-Focus / Combat / Echelon, EFB на третьем мониторе — **отдельный ADR** | |
| 16 | |
| 17 | --- |
| 18 | ## Контекст |
| 19 | |
| 20 | Агентский слой и **Roslyn** связаны через **MCP-инструменты**. Без явных правил «сколько и чего отдавать» агент перегружает контекст или недополучает структуру. Менять это нужно **в конфиге** ([0028](0028-user-settings-toml-localappdata-and-secrets.md)), без обязательной правки C#. |
| 21 | |
| 22 | **Интуиция (не норма ADR):** агентский слой — контур запросов, Roslyn MCP — шлюз семантики; настройки ниже задают **объём, фильтр, тайминг**. |
| 23 | |
| 24 | **Уже есть (не отменяется):** |
| 25 | |
| 26 | - `[semantic_map]` — вид/глубина UI — [0039](0039-workspace-navigation-affordances.md), [0053](0053-semantic-map-control-flow-pfd.md). |
| 27 | - Пресеты **`get_code_navigation_context`** — [0039 § Agent/MCP](0039-workspace-navigation-affordances.md#adr0039-mcp-workspace-navigation). |
| 28 | |
| 29 | Этот ADR — **слой параметров сопряжения агент ↔ Roslyn MCP** в TOML. Поведение **профилей**, **Manager**, тактика/стратегия, третий монитор — **[0059](0059-roslyn-mcp-profiles-manager-tactical-strategic-efb.md)**. |
| 30 | |
| 31 | --- |
| 32 | |
| 33 | ## Решение (принципы) |
| 34 | |
| 35 | <a id="adr0058-p1"></a> |
| 36 | |
| 37 | ### 1. Одна декларативная схема — несколько потребителей |
| 38 | |
| 39 | | Категория | Пример смысла | Кто обязан учитывать | |
| 40 | |-----------|----------------|----------------------| |
| 41 | | Лимиты объёма ответа | `max_nodes_per_query`, лимиты глубины обхода | **Roslyn MCP** (или адаптер агрегации графа) | |
| 42 | | Фильтр видов узлов / символов | `included_kinds` / исключения | **Roslyn MCP** | |
| 43 | | Таймауты / «грязная» семантика | ожидание компиляции vs stale graph | **Roslyn MCP** ± **IDE** | |
| 44 | | Пресеты режимов запроса | условные `ExploreMode` / `RefactoringMode` | **Roslyn MCP**; агент может переопределить в вызове | |
| 45 | |
| 46 | **Правило приоритета:** аргумент вызова > секция TOML > дефолт сервера — зафиксировать в реализации и [MCP-PROTOCOL.md](../MCP-PROTOCOL.md) при появлении полей. |
| 47 | |
| 48 | <a id="adr0058-p2"></a> |
| 49 | |
| 50 | ### 2. Четыре группы параметров (контрактные оси) |
| 51 | |
| 52 | 1. **Throttling & scoping** — лимиты объёма и глубины за запрос (`max_nodes_per_query`, `max_recursion_depth` или эквиваленты в спецификации тула). |
| 53 | |
| 54 | 2. **Маппинг видимости (capabilities)** — какие классы узлов/символов в выдаче. |
| 55 | |
| 56 | 3. **Таймауты и согласованность** — ждать компиляцию; stale graph; лимиты времени на тяжёлые запросы. |
| 57 | |
| 58 | 4. **Инструментальные пресеты** — именованные наборы (controlFlow / architecture / обзор vs рефакторинг). Связь с [0039](0039-workspace-navigation-affordances.md): ссылка по имени или ортогональные пресеты — без неявного слияния. |
| 59 | |
| 60 | <a id="adr0058-p3"></a> |
| 61 | |
| 62 | ### 3. Размещение в TOML |
| 63 | |
| 64 | Целевая секция, например **`[agent.roslyn_mcp]`**, отдельно от `[semantic_map]` и от **`[[code_navigation.presets]]`** ([0039](0039-workspace-navigation-affordances.md)) без явного маппинга. Точные ключи — после прототипа; здесь зафиксированы **оси**. |
| 65 | |
| 66 | <a id="adr0058-p4"></a> |
| 67 | |
| 68 | ### 4. Версионирование |
| 69 | |
| 70 | Опциональные ключи и явные дефолты; смена обязательной формы — bump схемы ([0028](0028-user-settings-toml-localappdata-and-secrets.md)). |
| 71 | |
| 72 | <a id="adr0058-p5"></a> |
| 73 | |
| 74 | ### 5. Минимальный v0 vs отложенное |
| 75 | |
| 76 | **v0:** лимиты + один-два таймаута + один пресет «обзор vs глубже» без полного `included_kinds`. |
| 77 | |
| 78 | **Отложено:** исчерпывающий справочник kinds, сложная recursion, мегаконфиг; **автоматика профилей и режимов** — [0059](0059-roslyn-mcp-profiles-manager-tactical-strategic-efb.md). |
| 79 | |
| 80 | --- |
| 81 | |
| 82 | ## Последствия |
| 83 | |
| 84 | - Явный контракт PR: ключ относится к MCP-серверу или IDE. |
| 85 | - Тесты на дефолты и merge приоритетов. |
| 86 | |
| 87 | --- |
| 88 | |
| 89 | ## Отклонённые альтернативы |
| 90 | |
| 91 | - Только env — хуже воспроизводимости. |
| 92 | - Только системный промпт — нет детерминизма на уровне тула. |
| 93 | |
| 94 | --- |
| 95 | |
| 96 | ## Открытые вопросы |
| 97 | |
| 98 | - Синхронизация с конфигом **standalone** `roslyn-mcp` вне IDE — одна схема или две. |
| 99 | - Какие тулы в scope первой реализации (navigation / semantic map / оба). |
| 100 | |