| 1 | # ADR 0120: Primary work surface — Intercom или Editor (аналог Agent / Editor) |
| 2 | |
| 3 | **Статус:** Accepted · Implemented |
| 4 | **Дата:** 2026-05-17 |
| 5 | |
| 6 | ## Связанные ADR |
| 7 | |
| 8 | | ADR | Роль | |
| 9 | |-----|------| |
| 10 | | [0017](0017-multi-window-workspace-and-agent-surfaces.md) | Топология PFD / Forward / MFD, `presentation`, мультиоконность | |
| 11 | | [0021](0021-pfd-mfd-cockpit-attention-model.md) | Якоря внимания; Forward = лобовое поле зрения | |
| 12 | | [0010](0010-ui-modes-toml-configuration.md) | Режимы UI в TOML; место для пресета «agent-central» | |
| 13 | | [0028](0028-user-settings-toml-localappdata-and-secrets.md) | `%LocalAppData%\CascadeIDE\settings.toml` | |
| 14 | | [0080](0080-intercom-naming-and-multi-party-channel-model.md) | Intercom — канал сессии, не «чат-виджет» | |
| 15 | | [0098](0098-semantic-first-document-as-projection.md) | Редактор — мощный канал, не абсолют всей правды | |
| 16 | | [0044](0044-avalonia-host-skia-agent-chat-surface.md) | Skia host для agent chat surface | |
| 17 | | [0072](0072-chat-topic-cards-intent-melody-keyboard-contract.md) | Topic cards в overview/detail | |
| 18 | | [0119](0119-chat-slash-commands-intercom-surface.md) | Слэш-команды в `ChatInput` — усиливаются при Intercom в центре | |
| 19 | | [0121](0121-intent-oriented-programming-paradigm.md) | IOP: дисциплина коммуникации; Intercom как центр вокруг цели; честные границы потока | |
| 20 | | [0074](0074-settings-ui-mfd-compact-layout-overflow.md) | Плотность MFD при узкой колонке | |
| 21 | |
| 22 | ### Вне ADR |
| 23 | |
| 24 | | Документ | Роль | |
| 25 | |----------|------| |
| 26 | | [ux/README.md](../ui-ux/README.md) | Актуальная линия Flight; legacy Focus/Balanced/Power — архив | |
| 27 | | [iop-manifest-v1.md](../iop-manifest-v1.md) | IOP: Intercom — центр коммуникации; не обещать «переварить любой поток» | |
| 28 | |
| 29 | ## Резюме |
| 30 | |
| 31 | - Вводится настройка **`primary_work_surface`**: **`intercom`** | **`editor`** (аналог **Agent / Editor** в Cursor). |
| 32 | - Определяет, **что занимает якорь Forward** (лобовое поле): полноэкранный **Intercom** (чат + картотека + spine) или **редактор кода**. |
| 33 | - Вторичный контур (MFD) показывает **другую** поверхность (редактор или страницы shell), без потери функций. |
| 34 | - **Не** путать с primary-монитором ОС ([0017 § primary vs Forward](0017-multi-window-workspace-and-agent-surfaces.md#adr0017-p5-primary-vs-forward)). |
| 35 | - Дефолт продукта: **`editor`**; пресет «как Cursor» — **`intercom`**. Связь с [0119](0119-chat-slash-commands-intercom-surface.md). |
| 36 | - При **`intercom`** лобовой якорь — не «лента сообщений», а **центр коммуникации вокруг цели** (люди + агенты → намерение → реализация), см. [0121](0121-intent-oriented-programming-paradigm.md), [iop-manifest-v1.md](../iop-manifest-v1.md). |
| 37 | |
| 38 | --- |
| 39 | |
| 40 | ## Контекст |
| 41 | |
| 42 | Часть пользователей (в т.ч. при работе **в Cursor** с чатом на **главном экране**) проводит в диалоге с агентом **большую часть сессии**. Для них кокпитная метафора «Forward = редактор, чат на MFD» **инвертирована** относительно реального внимания: центр — **мысль и переписка**, код — **по запросу**. |
| 43 | |
| 44 | **Design thesis (ось, не только layout):** классические IDE оптимизируют **авторинг**; сопутствующая информация вокруг кода читается плохо. В agentic-цикле **писать в основном агент**, человеку — **восприятие и управление сессией**; ручное редактирование вторично (verify, surgical fix). `primary_work_surface = intercom` — продуктовое выражение этой оси; habitat и session graph — [0172](0172-conversation-first-habitat.md). |
| 45 | |
| 46 | В CIDE уже есть: |
| 47 | |
| 48 | - **три якоря** PFD / Forward / MFD ([0021](0021-pfd-mfd-cockpit-attention-model.md)); |
| 49 | - **Intercom** как продуктовая модель ([0080](0080-intercom-naming-and-multi-party-channel-model.md), [0072](0072-chat-topic-cards-intent-melody-keyboard-contract.md), [0096](0096-intercom-topic-card-summary-and-product-spine.md)); |
| 50 | - **настраиваемая топология** экранов через `presentation` ([0017](0017-multi-window-workspace-and-agent-surfaces.md)); |
| 51 | - **режимы UI** в TOML ([0010](0010-ui-modes-toml-configuration.md)). |
| 52 | |
| 53 | Не хватает **явного переключателя «что в центре»** без ручной перекомпоновки мониторов и без смены всей строки `presentation`. |
| 54 | |
| 55 | --- |
| 56 | |
| 57 | ## Проблема |
| 58 | |
| 59 | 1. **Forward зашит как редактор** в ментальной модели и типовой раскладке — agent-central пользователь **периферийно** воспринимает чат. |
| 60 | 2. **Путаница с монитором:** «центральный экран» ≠ **primary display** ОС — см. [0017](0017-multi-window-workspace-and-agent-surfaces.md); нужна отдельная ось **primary_work_surface**. |
| 61 | 3. **0119 (слэши)** и **topic cards** выигрывают, когда Intercom уже в лобовом якоре; без 0120 архитектура остаётся «чат сбоку». |
| 62 | 4. **Риск «убрать редактор»:** продуктовая цель — **сменить default фокус**, не отказ от кода ([0098](0098-semantic-first-document-as-projection.md)). |
| 63 | |
| 64 | --- |
| 65 | |
| 66 | ## Решение |
| 67 | |
| 68 | <a id="adr0120-p1"></a> |
| 69 | |
| 70 | ### 1. Ось `primary_work_surface` |
| 71 | |
| 72 | Допустимые значения: |
| 73 | |
| 74 | | Значение | Лобовой якорь **Forward** | Типичное размещение редактора | |
| 75 | |----------|---------------------------|-------------------------------| |
| 76 | | **`editor`** *(дефолт CIDE)* | Редактор кода (AvaloniaEdit) | MFD: страница **Intercom** / чат в shell | |
| 77 | | **`intercom`** | **Intercom** (полный `ChatPanel` + Skia surface: overview, spine, detail) | MFD: **Editor** как страница или докируемая панель; PFD без изменений по смыслу | |
| 78 | |
| 79 | **Инвариант:** обе поверхности **остаются доступны**; меняется **якорь внимания по умолчанию**, как переключение Agent / Editor в Cursor. |
| 80 | |
| 81 | <a id="adr0120-p2"></a> |
| 82 | |
| 83 | ### 2. Ортогональность другим осям |
| 84 | |
| 85 | | Ось | Вопрос | Связь с `primary_work_surface` | |
| 86 | |-----|--------|--------------------------------| |
| 87 | | **`presentation`** ([0017](0017-multi-window-workspace-and-agent-surfaces.md)) | Сколько окон и долей P/F/M | Независима: можно `(P+F+M)` на одном дисплее **и** `intercom` в Forward | |
| 88 | | **Primary monitor ОС** | Куда Windows ставит taskbar | **Не** задаёт Forward; см. [0017 §5](0017-multi-window-workspace-and-agent-surfaces.md#adr0017-p5-primary-vs-forward) | |
| 89 | | **UiMode / Flight** ([0010](0010-ui-modes-toml-configuration.md)) | Видимость панелей, capabilities | Может **сужать** хром (Dark Cockpit); не подменяет якорь | |
| 90 | | **Melody / Chords** ([0060](0060-keyboard-chord-stack-fms-tactical-strategic.md)) | Фокус зоны M/P/F | Сохраняются; `focus_forward` фокусирует **лобовой якорь** (чат или редактор) | |
| 91 | |
| 92 | <a id="adr0120-p3"></a> |
| 93 | |
| 94 | ### 3. UX-контракт переключения |
| 95 | |
| 96 | - **Явный переключатель** в UI (toggle, пункт меню, опционально хоткей) — подписи **`Intercom`** / **`Editor`** или **`Agent`** / **`Editor`** (копирайт уточнить в UX; канон данных — `intercom` | `editor`). |
| 97 | - Переключение **не сбрасывает** сессию чата и **не закрывает** открытые файлы; меняется только **хост в Forward** и **страница по умолчанию** на MFD. |
| 98 | - Состояние **персистится** в `settings.toml` ([0028](0028-user-settings-toml-localappdata-and-secrets.md)). |
| 99 | |
| 100 | <a id="adr0120-p4"></a> |
| 101 | |
| 102 | ### 4. Конфигурация (целевая схема) |
| 103 | |
| 104 | ```toml |
| 105 | # settings.toml (фрагмент) |
| 106 | [workspace] |
| 107 | primary_work_surface = "intercom" # "editor" | "intercom" |
| 108 | ``` |
| 109 | |
| 110 | Опционально в **`UiModes/Flight.toml`** (или отдельный пресет `AgentCentral.toml`): |
| 111 | |
| 112 | ```toml |
| 113 | primary_work_surface = "intercom" |
| 114 | # capabilities: шире чат, уже полоса IDE Health, … |
| 115 | ``` |
| 116 | |
| 117 | **Дефолт при отсутствии ключа:** `editor` (совместимость с текущим CIDE). |
| 118 | |
| 119 | <a id="adr0120-p5"></a> |
| 120 | |
| 121 | ### 5. Связь с Intercom и [0119](0119-chat-slash-commands-intercom-surface.md) |
| 122 | |
| 123 | При **`primary_work_surface = intercom`**: |
| 124 | |
| 125 | - Forward показывает **картотеку тем**, spine, detail — [0072](0072-chat-topic-cards-intent-melody-keyboard-contract.md), [0096](0096-intercom-topic-card-summary-and-product-spine.md). |
| 126 | - **`ChatInput`** — естественная **command line** сессии; слэш-команды ([0119](0119-chat-slash-commands-intercom-surface.md)) становятся **основным** путём к `build` / `test` / `card`, а не периферийным. |
| 127 | |
| 128 | При **`editor`** — поведение как сейчас; 0119 остаётся полезным, но чат не обязан быть в центре внимания. |
| 129 | |
| 130 | <a id="adr0120-p5b"></a> |
| 131 | |
| 132 | #### 5.1. Intercom в центре ≠ бесконечный поток |
| 133 | |
| 134 | `primary_work_surface = intercom` **не** означает «всё входящее в одну ленту» и **не** обещает, что продукт или агенты **вывезут любой объём** переписки от людей — без структуры его не вывозят и сами люди ([0121](0121-intent-oriented-programming-paradigm.md) § «Риски и границы», [iop-manifest-v1.md](../iop-manifest-v1.md) § «Честно о потоке»). |
| 135 | |
| 136 | Смысл центрального Intercom: |
| 137 | |
| 138 | - **линии работы** (topic cards, spine) вместо хаотичного чата; |
| 139 | - **батчи уточнений** и треды ([0031](0031-agent-chat-clarification-batches-and-threading.md)); |
| 140 | - **intent-first** и слэши/MCP как один контракт ([0119](0119-chat-slash-commands-intercom-surface.md)); |
| 141 | - человек в Forward — **арбитр намерения и дельты**, а не диспетчер каждого сообщения. |
| 142 | |
| 143 | 0120 меняет **якорь внимания**; IOP и картотека тем — **как** этот якорь не превращается в шум. |
| 144 | |
| 145 | <a id="adr0120-p6"></a> |
| 146 | |
| 147 | ### 6. Редактор при Intercom-central |
| 148 | |
| 149 | - Редактор **не удаляется**: перенос на MFD-страницу «Code» / док / split — деталь вёрстки в реализации. |
| 150 | - **Go to definition**, открытие файла из чата, якоря [0080](0080-intercom-naming-and-multi-party-channel-model.md) — по-прежнему переводят фокус на **редактор** (временно или с переключением surface), без отмены deep link. |
| 151 | - Semantic map / PFD **не обязаны** переезжать в Forward. |
| 152 | |
| 153 | --- |
| 154 | |
| 155 | ## Non-goals |
| 156 | |
| 157 | - Замена трёхзонной модели PFD / Forward / MFD на «только чат». |
| 158 | - Тождество `primary_work_surface` и **primary monitor** ОС. |
| 159 | - Обязательная смена строки `presentation` при каждом переключении Agent/Editor. |
| 160 | - Удаление режима **Editor** или отказ от AvaloniaEdit во Forward **навсегда**. |
| 161 | - **Бесконечная лента** как целевой UX Intercom-central — против [0080](0080-intercom-naming-and-multi-party-channel-model.md), [0072](0072-chat-topic-cards-intent-melody-keyboard-contract.md), [0121](0121-intent-oriented-programming-paradigm.md). |
| 162 | |
| 163 | --- |
| 164 | |
| 165 | ## Якоря реализации (план) |
| 166 | |
| 167 | | Компонент | Роль | |
| 168 | |-----------|------| |
| 169 | | `settings.toml` | `workspace.primary_work_surface` | |
| 170 | | `MainWindow` / `MainGrid` | условный host в колонке Forward | |
| 171 | | `MfdShellView` / secondary pages | вторая поверхность при `intercom` | |
| 172 | | `MainWindowViewModel` | свойство + команда переключения; сохранение в settings | |
| 173 | | `IdeCommands` *(опционально)* | `set_primary_work_surface`, `toggle_primary_work_surface` для MCP | |
| 174 | | [0119](0119-chat-slash-commands-intercom-surface.md) | реализация слэшей — после или параллельно с host-swap | |
| 175 | |
| 176 | **Порядок:** |
| 177 | |
| 178 | 1. Настройка + переключатель + swap hosts в `MainWindow` (без смены `presentation`). |
| 179 | 2. MFD-страница редактора при `intercom`. |
| 180 | 3. Пресет TOML «agent-central» + документация UX. |
| 181 | 4. MCP / хоткей по необходимости. |
| 182 | |
| 183 | --- |
| 184 | |
| 185 | ## Открытые решения (до Accepted) |
| 186 | |
| 187 | | # | Вопрос | Направление | |
| 188 | |---|--------|-------------| |
| 189 | | 1 | Подписи UI: **Intercom** vs **Agent** | Продукт: Intercom ([0080](0080-intercom-naming-and-multi-party-channel-model.md)); для пользователей Cursor — alias «Agent» в toggle | |
| 190 | | 2 | Редактор на MFD: отдельная **страница** vs **док** | Страница v1 (проще паритет с текущим shell) | |
| 191 | | 3 | Авто-переключение на Editor при go-to-definition | Опционально v2; v1 — явный переход | |
| 192 | |
| 193 | --- |
| 194 | |
| 195 | ## Диаграмма |
| 196 | |
| 197 | ```mermaid |
| 198 | flowchart LR |
| 199 | subgraph editor_mode [primary_work_surface = editor] |
| 200 | F1[Forward: Editor] |
| 201 | M1[MFD: Intercom page] |
| 202 | end |
| 203 | subgraph intercom_mode [primary_work_surface = intercom] |
| 204 | F2[Forward: Intercom] |
| 205 | M2[MFD: Editor page] |
| 206 | end |
| 207 | toggle[User toggle / settings.toml] |
| 208 | toggle --> editor_mode |
| 209 | toggle --> intercom_mode |
| 210 | ``` |
| 211 | |
| 212 | --- |
| 213 | |
| 214 | ## Отклонённые альтернативы |
| 215 | |
| 216 | 1. **Только смена `presentation`** без отдельного ключа — недостаточно для одного монитора и для быстрого Agent/Editor toggle. |
| 217 | 2. **Чат всегда в Forward, редактор только во всплывающем окне** — ломает паритет MCP/отладки и привычный MFD shell. |
| 218 | 3. **Новый четвёртый якорь «Intercom»** вместо swap Forward — раздувает [0021](0021-pfd-mfd-cockpit-attention-model.md) без необходимости. |
| 219 | |
| 220 | --- |
| 221 | |
| 222 | ## История изменений |
| 223 | |
| 224 | <a id="adr0120-history"></a> |
| 225 | |
| 226 | | Дата | Изменение | |
| 227 | |------|-----------| |
| 228 | | 2026-05-17 | Proposed: `primary_work_surface` (intercom \| editor), swap Forward/MFD, связь с 0119. | |
| 229 | | 2026-05-17 | §5.1: Intercom-central = центр коммуникации вокруг цели; границы потока (0121, IOP manifest). | |
| 230 | |