| 1 | # ADR 0003: Отдельный UI-режим Debug (не кокпит Power) |
| 2 | |
| 3 | **Статус:** Accepted (продуктовое направление); **реализация** — по плану релизов |
| 4 | **Дата:** 2026-04-02 |
| 5 | ## Связанные ADR |
| 6 | |
| 7 | | ADR | Роль | |
| 8 | |-----|------| |
| 9 | | [0001](0001-debug-hypotheses-json-storage.md) | Хранение гипотез отладки в одном JSON-файле | |
| 10 | |
| 11 | ### Вне ADR |
| 12 | |
| 13 | | Документ | Роль | |
| 14 | |----------|------| |
| 15 | | [ux/cascade-ide-ui-layout-v1.md](../ui-ux/cascade-ide-ui-layout-v1.md) | текущие Focus / Balanced / Power | |
| 16 | |
| 17 | --- |
| 18 | ## Контекст |
| 19 | |
| 20 | Режим **Power** перегружен телеметрией, trace агента, очередью задач и кокпитом автономного сценария. Сценарий «**в основном отладка**» (брейкпоинты, стек, переменные, гипотезы, воспроизведение бага) не должен требовать включения всего этого слоя. IDE в таком сценарии — **наблюдатель и исполнитель MCP** (состояние отладки, команды, UI под агента), а **диалог с агентом и автономные сценарии** остаются в **Cursor**; встроенный чат IDE не дублирует роль основного чата. |
| 21 | |
| 22 | ## Решение |
| 23 | |
| 24 | Ввести отдельный **UI-режим Debug** (имя в меню/реестре режимов уточняется при реализации): |
| 25 | |
| 26 | - Сфокусированная раскладка под отладку и связанные панели (в т.ч. гипотезы — [ADR 0001](0001-debug-hypotheses-json-storage.md)). |
| 27 | - **Минимальный хром:** без Quick Actions, без нижней панели «терминал / сборка / git / …» по умолчанию; сборка и консоль по сценарию — в **Cursor** или по явному включению в «Вид», не как постоянная оболочка режима. |
| 28 | - Скрытие или сильное сокращение Power-специфики (очередь задач кокпита, лишняя телеметрия агента там, где не нужна задаче отладки). |
| 29 | - Сохранение общего принципа [0002-debug-human-agent-parity.md](0002-debug-human-agent-parity.md): состояние отладки одно для человека и MCP. |
| 30 | |
| 31 | ### Карта видимости панелей (целевое состояние) |
| 32 | |
| 33 | Ориентир по зонам главного окна — [ux/cascade-ide-ui-layout-v1.md](../ui-ux/cascade-ide-ui-layout-v1.md). Таблица ниже — не «комментарии», а **два ответа на строку**: что режим Debug **оставляет на экране** и что в этом режиме **не показываем** (относительно Power и частично Balanced). Детали хоткеев и биндингов — в спецификации UI при появлении режима в коде. |
| 34 | |
| 35 | | Зона | Показываем в Debug | Не показываем в Debug | |
| 36 | | --- | --- | --- | |
| 37 | | **Task cockpit** (строка под тулбаром) | Минимум: то, что нужно для **запуска под отладчиком** и навигации по задаче (без дублирования полноценной «рабочей» полосы) | **Quick Actions** (Balanced / capability `quick_actions`); блок **Autonomous** и остальная разметка кокпита при семье **Power** (`UiModeFamily.Power`) | |
| 38 | | **Solution Explorer** | Дерево решения, навигация по файлам | Очередь **PowerTaskQueueItems** под деревом (в Power — да, в Debug — нет) | |
| 39 | | **Колонка редактора** | 1–2 группы редакторов; панель **стек/переменные** при активной DAP-сессии | Третья группа по умолчанию (как в Power); **встроенный вывод сборки** под редактором — по умолчанию **не показываем** (сборка вне фокуса режима); Power-хром доков, если только для Power | |
| 40 | | **Правая колонка (чат)** | По умолчанию **не занимаем место под чат**: `ChatPanelExpanded: false` в спеке режима, ширина колонки **0 px** (без узкой полоски), сплиттер перед чатом скрыт; площадь отдаём редактору и отладочным панелям. Вернуть чат — «Вид → Чат», кнопка **Show chat** на тулбаре или MCP | Развёрнутый встроенный чат как в Balanced/Power; **Agent Trace**; **Agent Operations**; Power-разметка чата. Смысл: основной чат — в **Cursor**, автономность в IDE **отложена**, дублировать ленту диалога в окне отладки не нужно | |
| 41 | | **Полоса телеметрии** | Минимум информации; **статус отладки** уместен, остальное (сборка/тесты/git) — по желанию или скрыто, чтобы не дублировать сценарий «всё в Cursor» | Расширенный Power-cockpit и дубли, которые есть только в Power | |
| 42 | | **Нижняя панель** | По умолчанию **свёрнута** или только смысловые для отладки: вкладка **«Отладка»** (стек/переменные в доке), рядом — вкладка **«Гипотезы»** (список из [0001](0001-debug-hypotheses-json-storage.md)); см. ниже | **Терминал**, **Build output**, **Git**, **События**, **Тесты** — **не разворачиваем** по умолчанию; доступ через «Вид», если без них никак (воспроизведение, ручной git и т.д.) | |
| 43 | |
| 44 | ### Гипотезы: зона UI (решено) |
| 45 | |
| 46 | - **Правая колонка чата** — не используем для списка гипотез (чат в Cursor; колонка в Debug по умолчанию свёрнута). |
| 47 | - **Целевой вариант:** отдельная вкладка **«Гипотезы»** в **нижней панели**, на одной полосе с **«Отладка»** — общий отладочный контекст; разворот нижней панели — через «Вид», когда нужен список или стек в доке. |
| 48 | - **Запасной вариант** (только если при реализации окажется тесно): часть списка или дубль — в колонке редактора рядом со стек/переменными; приоритет всё равно у вкладки в нижней панели. |
| 49 | |
| 50 | ### Брейкпоинты: зона UI, модель данных, агент |
| 51 | |
| 52 | - **Зона окна:** отдельная колонка под «список брейкпоинтов» не требуется. Сейчас точки задаются **в gutter** колонки редактора; если позже появится список с действиями — логично разместить его в **отладочной** зоне (нижняя панель / рядом с панелью стек/переменные), а не как четвёртая колонка главного окна. |
| 53 | - **Модель:** одна запись в хранилище (`.dotnet-debug-mcp-breakpoints.json` / `BreakpointEntry`) — **активная** точка; переключение в UI снимает запись или добавляет её, **без** состояния «выключено, но строка на месте» как в Visual Studio. |
| 54 | - **Граница продукта:** режим **enabled/disabled** без удаления из JSON **сознательно не в scope**, пока нет явного запроса и отдельного решения по схеме и DAP. Если понадобится — отдельный ADR или дополнение к хранилищу брейкпоинтов. |
| 55 | - **Агент (Cursor / MCP):** источник правды для списка — **файл на диске** и инструменты вроде `debug_list_breakpoints`; push в чат нет. После правок человеком в IDE агент увидит актуальное состояние при **следующем** чтении файла или вызове инструмента, не мгновенно. |
| 56 | |
| 57 | ### Начальная раскладка (реестр режимов) |
| 58 | |
| 59 | При добавлении в `UiModeLayoutRegistry` (или аналога) режим Debug задаётся отдельной `UiModeLayoutSpec`: **дерево включено**, **`TerminalVisible: false`**, **`BuildOutputVisible: false`**, **`ChatPanelExpanded: false`**, **число групп редактора** — 1–2; нижняя панель и встроенный вывод сборки под редактором — по умолчанию выключены в спеке или свёрнуты. Точные значения фиксируются в коммите, который вводит режим. |
| 60 | |
| 61 | Точная карта контролов и хоткеи — в обновлении `cascade-ide-ui-layout-v1` (или преемника) после появления режима в коде. |
| 62 | |
| 63 | ## Последствия |
| 64 | |
| 65 | - Потребуется расширение `UiModeLayoutRegistry` / аналога и условной видимости, а не только новая вкладка внутри Power. |
| 66 | - Документация режимов обновляется, когда режим появится в коде. |
| 67 | |
| 68 | ## Отклонённые альтернативы |
| 69 | |
| 70 | - **Только Power + новая вкладка** без отдельного режима — отклонено как не дающее нужной изоляции сценария «только отладка». |
| 71 | - **Полное дублирование окна** — не требуется; достаточно режима в том же главном окне. |
| 72 | |