| 1 | # ADR 0060: Аккордный слой (FMS-style), S/T и overlay — расширение keyboard-first (ADR 0013) |
| 2 | |
| 3 | **Статус:** Accepted (частично: Intent Melody каталог + chord/palette v1; полный FMS T/S overlay — по ADR) |
| 4 | **Дата:** 2026-04-19 |
| 5 | ## Связанные ADR |
| 6 | |
| 7 | | ADR | Роль | |
| 8 | |-----|------| |
| 9 | | [0013](0013-command-surface-and-discoverability.md) | палитра, toolbar, discoverability — **этот ADR не заменяет** палитру | |
| 10 | | [0070](0070-command-palette-direct-overlay-surface.md) | палитра как overlay surface | |
| 11 | | [0008](0008-mcp-contracts-and-testable-infrastructure.md) | MCP и команды | |
| 12 | | [0030](0030-command-ids-hotkeys-and-ui-registry-layers.md) | `IdeCommands`, `hotkeys.toml`, реестр | |
| 13 | | [0017](0017-multi-window-workspace-and-agent-surfaces.md) | мультиоконность, фокус | |
| 14 | | [0021](0021-pfd-mfd-cockpit-attention-model.md) | PFD / MFD | |
| 15 | | [0032](0032-hud-banner-configuration-and-grammar.md) | HUD / подписи режима — опционально | |
| 16 | | [0055](0055-skia-instrument-composition-pipeline.md) | Skia — overlay | |
| 17 | | [0059](0059-roslyn-mcp-profiles-manager-tactical-strategic-efb.md) | тактика / EFB на MFD, Manager | |
| 18 | | [0072](0072-chat-topic-cards-intent-melody-keyboard-contract.md) | навигация по темам чата — **уточнение в chat-domain**, не замена этого ADR | |
| 19 | | [0081](0081-parametric-intent-melodies-editor-line-ranges.md) | параметрические melody `:start:end` для редактора; развивается поверх Command Melody из §11 | |
| 20 | |
| 21 | ### Вне ADR |
| 22 | |
| 23 | | Документ | Роль | |
| 24 | |----------|------| |
| 25 | | [north-star — keyboard-first](../design/north-star-cursor-mcp-cascade-workbench-v1.md) | north-star — keyboard-first | |
| 26 | | [chord-notation-cascadeide.md](../chord-notation-cascadeide.md) | chord notation cascadeide | |
| 27 | **Частичное уточнение (chat-domain):** навигация по **темам чата** (topic cards, drill-in/back, минимальный набор intent-команд и паритет палитра / Melody / Chords) зафиксирована в [0072](0072-chat-topic-cards-intent-melody-keyboard-contract.md). Этот ADR (**0060**) остаётся каноном для общей модели **Melody**, **CascadeChord** и **Command Melody (`c:`)**; **0072** **не** отменяет §1–§11 целиком и **не** переназначает S/T/M/E для кокпита вне chat-topic navigation. |
| 28 | |
| 29 | --- |
| 30 | ## Контекст |
| 31 | |
| 32 | [0013](0013-command-surface-and-discoverability.md) закрепляет **палитру команд** как опорную точку (поиск по строке, полный каталог) и **keyboard-first** как продуктовый ориентир. Для кокпита этого недостаточно: пилот в FMS сначала выбирает **раздел**, потом **параметр** — два осмысленных шага без набора текста. В CascadeIDE параллельно нужен **масштаб мышления** (тактика vs стратегия, см. [0059](0059-roslyn-mcp-profiles-manager-tactical-strategic-efb.md)), который **не сводится** к «открыть другое окно». |
| 33 | |
| 34 | Нужен **второй вход с клавиатуры**: **аккордный слой** (префикс → вторая клавиша), согласованный с `IdeCommands` ([0030](0030-command-ids-hotkeys-and-ui-registry-layers.md)) и не дублирующий палитру. |
| 35 | |
| 36 | ## Резюме |
| 37 | |
| 38 | - Аккордный слой (**Ctrl+K**), FMS-style тактика/стратегия, overlay поверх [0013](0013-command-surface-and-discoverability.md). |
| 39 | - Расширение discoverability без замены палитры и IdeCommands. |
| 40 | - Связь с intent melody и chat-domain ([0072](0072-chat-topic-cards-intent-melody-keyboard-contract.md)). |
| 41 | |
| 42 | --- |
| 43 | |
| 44 | ## Решение |
| 45 | |
| 46 | <a id="adr0060-p1"></a> |
| 47 | |
| 48 | ### 1. Палитра и аккорд — два физических входа (слэш — [§1a](#adr0060-p1a)) |
| 49 | |
| 50 | | Вход | Назначение | Ориентир в [0013](0013-command-surface-and-discoverability.md) | |
| 51 | |------|------------|------------------------------------------------------------------| |
| 52 | | **Палитра команд** (хоткей по умолчанию **Ctrl+Q** в шипнутом `hotkeys.toml`) | Полный каталог, поиск по имени, недавние | Решение §2 пункт 2 | |
| 53 | | **Корень аккорда** — рабочее имя **`CascadeChord`** (хоткей по умолчанию **Ctrl+K** в поставке; переопределение — пользовательский `hotkeys.toml`) | Короткий FMS-поток: префикс → вторая клавиша → исполнение **одной** команды из заранее ограниченного набора «кокпитных» действий | Расширение keyboard-first **без** отмены палитры | |
| 54 | | **Тот же `command_id` текстом в палитре** — префикс **`c:`** (**Command Melody**, [§11](#adr0060-p11)) | Компактный mnemonic (`c: gs`, …) без смены окна; fuzzy по title/id как прежде | Не третий «физический» вход: по-прежнему **Ctrl+Q**, расширенный строкой запроса | |
| 55 | |
| 56 | **Правило:** **Ctrl+K** не заменяет **Ctrl+Q**; пользователь выбирает «искать по имени», «идти по известной букве» аккорда или ввести **melody** после открытия палитры. Конфликт с хоткеями редактора/ОС — отлавливать при загрузке и отражать в UX (см. открытые вопросы). |
| 57 | |
| 58 | <a id="adr0060-p1a"></a> |
| 59 | |
| 60 | ### 1a. Третий вход: слэш в Intercom ([0119](0119-chat-slash-commands-intercom-surface.md)) |
| 61 | |
| 62 | **Статус:** Accepted · Implemented (не отменяет §1). |
| 63 | |
| 64 | | Вход | Назначение | |
| 65 | |------|------------| |
| 66 | | **Слэш в `ChatInput`** (`/` + autocomplete) | Unified command line в composer: Intercom-глаголы и IDE (`/build run`, `/topic …`, …); тот же `command_id`; discoverability **в канале сессии** без Ctrl+Q/Ctrl+K | |
| 67 | |
| 68 | Слэш **ортогонален** физическим хоткеям §1; сжатые мнемоники — в аккорде и Melody `c:`, не в коротких `/…` ([0119](0119-chat-slash-commands-intercom-surface.md)). Сводка для дизайна: [cascadeide-philosophy-v1 §7](../design/cascadeide-philosophy-v1.md), [handbook §2.6](../design/cide-design-handbook-v1.md). |
| 69 | |
| 70 | <a id="adr0060-p2"></a> |
| 71 | |
| 72 | ### 2. Первый уровень после `CascadeChord`: **S / T** (канон масштаба) |
| 73 | |
| 74 | **Канонический** первый выбор после префикса — **масштаб мышления** и глубина сопряжения с Roslyn MCP ([0059](0059-roslyn-mcp-profiles-manager-tactical-strategic-efb.md)), а не «какой монитор»: |
| 75 | |
| 76 | | Клавиша (после префикса) | Имя | Смысл | |
| 77 | |---------------------------|-----|--------| |
| 78 | | **T** | **Tactical** | Локальная семантика вокруг курсора; тактический контур PFD / Forward; узкий контракт | |
| 79 | | **S** | **Strategic** | Глобальный / слойный граф; контур **MFD / EFB**; профиль `Profile.GlobalMap` в смысле [0059](0059-roslyn-mcp-profiles-manager-tactical-strategic-efb.md) | |
| 80 | |
| 81 | **Плюс:** одна ось отражает суть CascadeIDE — **меняем глубину погружения**, а не только «вид». |
| 82 | |
| 83 | Исполнение конкретной команды (например `cascade.focus_tactical_map`, `cascade.focus_strategic_efb`) — через **`IdeCommands`** и MCP-паритет ([0008](0008-mcp-contracts-and-testable-infrastructure.md), [0002](0002-debug-human-agent-parity.md)). |
| 84 | |
| 85 | <a id="adr0060-p3"></a> |
| 86 | |
| 87 | ### 3. Альтернатива / второй уровень: **M / E** (дисплеи) |
| 88 | |
| 89 | Разделение **MFD** vs **EFB** ([0059](0059-roslyn-mcp-profiles-manager-tactical-strategic-efb.md): EFB = **MFD**, не PFD) может выноситься на **второй шаг** аккорда или **параллельный** набор букв, если продукту нужна явная привязка к **дисплею**: |
| 90 | |
| 91 | | Клавиша | Имя | Смысл (идея) | |
| 92 | |---------|-----|----------------| |
| 93 | | **M** | MFD-фокус | Инструменты, логи, терминал — «на земле» / диагностика | |
| 94 | | **E** | EFB / стратегия | Карта, архитектура на MFD | |
| 95 | |
| 96 | **Правило смешения:** не вводить **на одном уровне** одновременно S/T и M/E без документированной схемы (например: префикс → **S или T** → опционально второй аккорд **M или E** для уточнения поверхности). Минимальный v0 — **только S/T** после префикса. |
| 97 | |
| 98 | <a id="adr0060-p4"></a> |
| 99 | |
| 100 | ### 4. «Векторный» вариант (комбинированный) |
| 101 | |
| 102 | Опционально (отдельная итерация или пресет хоткеев): |
| 103 | |
| 104 | - **Цифры 1 / 2 / 3** после префикса — быстрый **фокус на монитор / TopLevel** ([0017](0017-multi-window-workspace-and-agent-surfaces.md)) в порядке конфигурации пользователя. |
| 105 | - **F** — переключение **Flight** / снятие «режима полёта» (связь с [0010](0010-ui-modes-toml-configuration.md) — не смешивать с S/T без явной подписи в UI). |
| 106 | |
| 107 | Это **не** обязательная часть v0; фиксируется, чтобы не плодить независимые корни аккордов без реестра. |
| 108 | |
| 109 | <a id="adr0060-p5"></a> |
| 110 | |
| 111 | ### 5. Машина состояния аккорда |
| 112 | |
| 113 | - После **CascadeChord** IDE переходит в состояние **«ожидаю вторую клавишу»** на короткий **таймаут** (дефолт и переопределение — опционально в `settings.toml`, см. §7). |
| 114 | - **Esc** — выход без действия; фокус возвращается по правилам [0013](0013-command-surface-and-discoverability.md) / [0017](0017-multi-window-workspace-and-agent-surfaces.md). |
| 115 | - **Редактор:** не перехватывать ввод текста, пока активен chord-wait, только если политика фокуса явно отдаёт события окну приложения (детали реализации — в коде; тесты на «не съесть букву в строке»). |
| 116 | |
| 117 | <a id="adr0060-p6"></a> |
| 118 | |
| 119 | ### 6. Overlay-подсказки (discoverability) |
| 120 | |
| 121 | После нажатия префикса на **короткое время** показывать **полупрозрачные подсказки** (буквы/подписи) над **зонами** или в **углу экрана** — чтобы не гадать «что дальше». Реализация: |
| 122 | |
| 123 | - предпочтительно **Skia**-оверлей поверх хоста ([0055](0055-skia-instrument-composition-pipeline.md): overlay не превращается в отдельный «инструмент» с дублированием pipeline); |
| 124 | - **Reduced motion** / отключение подсказок — флаг настройки; |
| 125 | - не загораживать критичные индикаторы PFD без политики плотности. |
| 126 | |
| 127 | <a id="adr0060-p7"></a> |
| 128 | |
| 129 | ### 7. Индикация режима на PFD (ситуационная осведомлённость) |
| 130 | |
| 131 | Малая строка вида **`MODE: TACTICAL`** / **`STRATEGIC`** / подрежимы **ECHELON** / **COMBAT** ([0059](0059-roslyn-mcp-profiles-manager-tactical-strategic-efb.md)) в углу PFD или в HUD-слое ([0032](0032-hud-banner-configuration-and-grammar.md)) — **рекомендуется**, чтобы визуально совпадать с тем, что делает Manager профилей. Источник истины — **один** (VM / CDS / сервис режима), не дублировать рассинхронно с аккордом. |
| 132 | |
| 133 | <a id="adr0060-p8"></a> |
| 134 | |
| 135 | ### 8. Конфигурация: где что живёт |
| 136 | |
| 137 | | Что | Где | |
| 138 | |-----|-----| |
| 139 | | Привязка **префикса** и аккордов к **`command_id`** | **`Hotkeys/hotkeys.toml`** (шип) + `%LocalAppData%\CascadeIDE\hotkeys.toml` ([0013](0013-command-surface-and-discoverability.md), [0030](0030-command-ids-hotkeys-and-ui-registry-layers.md)) | |
| 140 | | Реализация исполнения | **`IdeCommands`** + обработчик ввода (chord state machine) в C# | |
| 141 | | Опционально: `chord_timeout_ms`, `chord_overlay_enabled` | **`settings.toml`** или секция рядом с UI — **не** дублировать полную карту клавиш в `settings.toml` ([0013](0013-command-surface-and-discoverability.md) — отклонённый вариант хранить все хоткеи только в settings) | |
| 142 | |
| 143 | **Порядок работ (рекомендация):** сначала **идентификаторы команд и машина аккорда** в C#; затем строки в **`hotkeys.toml`**; затем overlay и MODE-строка. |
| 144 | |
| 145 | <a id="adr0060-p9"></a> |
| 146 | |
| 147 | ### 9. Логика миграции команд и эволюция шагов (реализация) |
| 148 | |
| 149 | **Что не переносим на аккорд без отдельного обсуждения** |
| 150 | |
| 151 | - **Стандарт редактора / ОС**, с которыми пользователи считают клавиатуру «как везде»: сохранение (**Ctrl+S**), отмена/повтор (**Ctrl+Z** / **Ctrl+Y**), вырезать/копировать/вставить, часто **Ctrl+W** / закрытие вкладки, **Ctrl+F** внутри редактора. Их оставляем на прямых жестах или настройке редактора; не загонять в **CascadeChord** только ради единообразия. |
| 152 | - **Уже закреплённые глобальные хоткеи IDE** из `hotkeys.toml` (**Ctrl+Q** палитра, **F5** отладка, …) не ломаем: аккорд — **второй** вход, не замена. |
| 153 | |
| 154 | **Целевая слоистая схема (после v0)** |
| 155 | |
| 156 | 1. **CascadeChord** (префикс, напр. **Ctrl+K**). |
| 157 | 2. **Первый буквенный шаг — масштаб S / T** (§2): тактика vs стратегия; привязка к профилю Roslyn MCP / контур внимания ([0059](0059-roslyn-mcp-profiles-manager-tactical-strategic-efb.md)). |
| 158 | 3. **Второй шаг — подсистема** (буквы-«страницы»): например **M** = карта намерений (**P** / **F** / **D**), **B** = build/тесты, **G** = Git и т.д. Так не смешиваем на одном уровне десяток несвязных букв и масштаб мышления. |
| 159 | |
| 160 | **Текущая многошаговая схема (код)** |
| 161 | |
| 162 | - **Префикс** → **M** → **M / P / F**: зоны кокпита — **MFD** (развернуть регион), **PFD** (развернуть регион), **Forward** (фокус в редактор). Метафора «настройки/фокус зоны» без второго корня **Ctrl+M**: вторая буква — **M** сразу после префикса (как FMS-страница), третья — выбор зоны. |
| 163 | - **Префикс** → **S** → **P / F / D**: карта намерений — вид / уровень / детализация (как в [0055](0055-skia-instrument-composition-pipeline.md)). |
| 164 | - Оверлей показывает допустимые клавиши **для текущего шага**; таймаут и **Esc** сбрасывают машину (§5). |
| 165 | |
| 166 | **Правило discoverability** |
| 167 | |
| 168 | - Любая команда, доступная только с аккорда, должна иметь **тот же `command_id`** в палитре и MCP ([0008](0008-mcp-contracts-and-testable-infrastructure.md)), чтобы «забыл букву» ≠ «потерял действие». |
| 169 | |
| 170 | <a id="adr0060-p10"></a> |
| 171 | |
| 172 | ### 10. Философия UX: невидимый инструмент, мышечная память, репетиция vs выступление |
| 173 | |
| 174 | > «Хороший актёр — это тот, которого нет. Потому что есть только его персонаж.» |
| 175 | |
| 176 | **IDE как невидимый актёр.** Продукт не должен «играть саму себя»: бесконечно выставлять напоказ инструменты, хоткеи, меню, панели, оверлеи. Задача интерфейса — **исчезнуть** там, где можно, и оставить в центре **код, задачу, мысль разработчика**. Кокпит CascadeIDE — метафора **невидимого актёра**: PFD, MFD, Forward, карта намерений — это не «лицо IDE ради IDE», а **инструменты пилота**, продолжение мышления. В работе пилот не формулирует «нажимаю кнопку на MFD» — он держит в голове **курс**, а руки находят жест. |
| 177 | |
| 178 | **Аккорды и мышечная память.** После достаточной практики пользователь перестаёт декламировать последовательность клавиш и оперирует **смысловыми слоями** (например Modification → Navigation → View → Strategic как мнемоника намерений, а не как список клавиш в абстракции). Пальцы закрепляют паттерн; сознание остаётся на задаче. Конкретная **грамматика шагов** (один корневой префикс vs дополнительные модификаторы, порядок букв, ось S/T vs intent-first семейства G/B/D/…) — предмет эволюции реестра и hotkeys; философский слой **не привязан** к одной таблице букв, но требует, чтобы любая версия грамматики оставалась **читаемой** и **обучаемой**. |
| 179 | |
| 180 | **Метафоры (одно направление — фон и исчезновение «лишнего»):** |
| 181 | |
| 182 | | Метафора | Применительно к CascadeIDE | |
| 183 | |----------|----------------------------| |
| 184 | | Тинтиннабули Пярта | Два голоса: контекстный фон (префиксы/слои ввода) + «мелодия» последующих букв — простая структура, строгая, медитативная | |
| 185 | | Мебельная музыка Сати | IDE как **фон**: не требует постоянного внимания, держит атмосферу работы | |
| 186 | | Хороший актёр | IDE **исчезает**; остаются код и задача | |
| 187 | |
| 188 | **Следствия для ADR и нотации** |
| 189 | |
| 190 | - **Нотация в документации** должна быть **прозрачной**: читатель не должен тратить умственную энергию на расшифровку. Запись вроде `<C-k> …` в [chord-notation-cascadeide.md](../chord-notation-cascadeide.md) дополняется **мнемонической расшифровкой** там, где это ускоряет понимание (что за намерение, а не только какие VK). |
| 191 | - **Overlay (§6)** — **суфлёр**, а не режиссёр: появляется, когда нужно подсказать следующий шаг, и **не загораживает сцену** (код, критичные индикаторы). См. политику плотности и Reduced motion в §6. |
| 192 | - **Три входа, одна модель `command_id`** — **репетиция** (палитра Ctrl+Q), **выступление** (аккорд Ctrl+K + Melody `c:`), **канал сессии** (слэш в Intercom, [0119](0119-chat-slash-commands-intercom-surface.md) §1a). Палитра — полный каталог; аккорд — мышечная память; слэш — discoverability в composer без смены фокуса ([0013](0013-command-surface-and-discoverability.md), §1–1a этого ADR). |
| 193 | |
| 194 | **Связь с intent-first и surface routing.** Идея «аккорд фиксирует **намерение** (Git, Build, Debug…), а **куда** вынести результат — решает маршрутизация поверхностей» — **согласуется** с этим разделом: кокпитные поверхности остаются контекстом показа, а не обязательным первым уровнем мысленной формулы для каждого жеста. Детализация грамматики v1 (семейства команд, оси S/T) — в отдельных итерациях ADR/реестра; цель §10 — зафиксировать **принципы UX**, а не конкретную таблицу букв. |
| 195 | |
| 196 | **См. также:** продуктовый нарратив «невидимый инструмент» vs класс риска облачного ассистента — [cascadeide-philosophy-v1.md](../design/cascadeide-philosophy-v1.md), [ADR 0071](0071-ai-assistance-sovereignty-locality-invisibility.md). |
| 197 | |
| 198 | <a id="adr0060-p11"></a> |
| 199 | |
| 200 | ### 11. Command Melody (`c:`) — палитра, mnemonic alias и мост к аккорду |
| 201 | |
| 202 | **Спецификация языка (лексика, EBNF, мотивация, открытые вопросы):** [intent-melody-language-v1.md](../intent-melody-language-v1.md) (**Intent-based Melody Language**, IML v1). |
| 203 | |
| 204 | **Происхождение:** спецификация melody (`c:`) сформулирована в **линии Comet** (внешний диалог); здесь — норматив продукта. Указатель в личном каноне KB (agent-notes) — `knowledge/personal/assistantLines/comet/comet-command-melody-cascade-palette-2026-04-19.md`. |
| 205 | |
| 206 | **Назначение.** Префикс **`c:`** вводит в **command palette** ([0013](0013-command-surface-and-discoverability.md), [0070](0070-command-palette-direct-overlay-surface.md)) специальный режим **melody**: короткие **mnemonic alias** в developer-first словаре. Пользователь может ввести компактную форму вроде `c: gs`, `c: br`, `c: da` и сразу получить нужную команду, не полагаясь только на fuzzy search по длинному заголовку. Эвристика **частота → длина** и отложенные варианты уточнения — [intent-melody-language-v1.md](../intent-melody-language-v1.md) §3.5. |
| 207 | |
| 208 | **Цель.** Режим нужен **не** для замены обычного поиска, а для **быстрого семантического входа**, общего для: |
| 209 | |
| 210 | - палитры (строка запроса); |
| 211 | - аккордного слоя (**CascadeChord**); |
| 212 | - канонического **`command_id`** в реестре ([0030](0030-command-ids-hotkeys-and-ui-registry-layers.md)); |
| 213 | - вызова через MCP / агента ([0008](0008-mcp-contracts-and-testable-infrastructure.md)) — тот же идентификатор. |
| 214 | |
| 215 | **Три представления одной команды** |
| 216 | |
| 217 | | Слой | Пример | |
| 218 | |------|--------| |
| 219 | | Human title | `Git: Status` | |
| 220 | | Melody alias | `c: gs` | |
| 221 | | Canonical id | `git.status` *(или эквивалент в `IdeCommands`; точная строка — реестр [0030](0030-command-ids-hotkeys-and-ui-registry-layers.md))* | |
| 222 | |
| 223 | Палитра **должна** находить и показывать команду по **любому** из этих представлений (title, alias, id). |
| 224 | |
| 225 | **Синтаксис** |
| 226 | |
| 227 | - Общий префикс namespace: **`c:`** — вход в melody. |
| 228 | - После `c:` допускается **один или несколько** mnemonic token; **базовая форма v1** — **двухбуквенная**: первая буква = **family**, вторая = **action**. |
| 229 | - Примеры (логические имена; фактический `command_id` — по реестру): |
| 230 | |
| 231 | | Ввод | Назначение (смысл) | |
| 232 | |------|---------------------| |
| 233 | | `c: gs` | Git → Status | |
| 234 | | `c: gc` | Git → Commit | |
| 235 | | `c: gp` | Git → Push | |
| 236 | | `c: gm` | Git → Merge | |
| 237 | | `c: gsu` | Git → Submodules | |
| 238 | | `c: br` | Build → Run / Rebuild (по принятой терминологии в реестре) | |
| 239 | | `c: bt` | Build → Test | |
| 240 | | `c: da` | Debug → Attach | |
| 241 | | `c: dc` | Debug → Continue | |
| 242 | | `c: dl` | Debug → Launch (`debug_launch`) | |
| 243 | | `c: cps` | Chat → **P**age → **S**how (`show_chat_page`; DOI) | |
| 244 | | `c: cs` | Chat → **S**end — отправить черновик поля ввода как user (`send_chat` без `message`) | |
| 245 | | `c: cex` | Chat → **ex**port (читаемый Markdown) | |
| 246 | | `c: ctf` | Chat → **T**hread → **F**ork (трёхбуквенное DOI: домен → объект → намерение; `fork_chat_thread`) | |
| 247 | | `c: ers` | Environment → **R**eadiness → **S**how (`show_environment_readiness_page`) | |
| 248 | | `c: ts` | **T**erminal → **S**how (`show_terminal_panel`) | |
| 249 | |
| 250 | Реестр мелодий в репозитории: **`IntentMelody/intent-melody-aliases.toml`** (см. [intent-melody-language-v1.md](../intent-melody-language-v1.md)). |
| 251 | |
| 252 | **Семейства v1 (узкий старт, узнаваемые домены)** |
| 253 | |
| 254 | | Буква | Family | |
| 255 | |-------|--------| |
| 256 | | **g** | Git | |
| 257 | | **b** | Build | |
| 258 | | **d** | Debug | |
| 259 | | **r** | Run | |
| 260 | | **e** | Editor | |
| 261 | | **m** | Map (карта намерений / навигация карты) | |
| 262 | | **c** | Chat | |
| 263 | | **t** | Terminal (панель / страница терминала во вторичном контуре) | |
| 264 | |
| 265 | Переходы «показать страницу» во вторичном контуре кодируются **доменом первым** (намерение): например Chat → Page → Show = `c: cps`, а не синтетический префикс **P** = Pages (**`pcs`**, **`pes`**, …), который ставит топологию IDE выше смысла команды. Для **готовности окружения** в DOI закрепляется цепочка вроде **Environment → Readiness → Show** (`ers` при появлении в реестре alias), а не «Pages → Environment». |
| 266 | |
| 267 | Это согласуется с **intent-first**: разработчик мыслит **доменом задачи**, а не топологией IDE ([§10](#adr0060-p10)). |
| 268 | |
| 269 | **Принципы выбора alias** |
| 270 | |
| 271 | 1. Alias **узнаваем** разработчиком без отдельного обучения. |
| 272 | 2. Alias **короче** human title, но не «шифр» уровня shell-golf. |
| 273 | 3. Alias **стабилен**, даже если формулировка в UI слегка меняется. |
| 274 | 4. Alias выражает **намерение**, а не **размещение на поверхности** (плохой базовый пример: привязка к «primary deck» вместо смысла команды). |
| 275 | 5. **Частота → длина (эвристика):** чем типичнее команда для рабочего дня, тем короче разумный alias в реестре (аналогия с префиксными кодами Хаффмана; [intent-melody-language-v1.md](../intent-melody-language-v1.md) §3.5). Сначала — **база** по консенсусу и ревью; **пересортировка по измеренной частоте** (в т.ч. телеметрия) — **отложена** до стабилизации реестра и палитры. |
| 276 | |
| 277 | **Разрешение конфликтов** |
| 278 | |
| 279 | 1. В пределах одного **workspace** один melody alias → ровно **один** canonical `command_id`. |
| 280 | 2. При конфликте: либо **фиксируется** одно отображение в реестре, остальные показываются как secondary matches; либо требуется **трёхбуквенная** форма; либо конфликтный alias помечается **invalid** до разруливания. |
| 281 | 3. **Human title** и **canonical id** остаются **всегда** валидными путями поиска, даже если alias неоднозначен. |
| 282 | |
| 283 | **Поведение палитры в melody mode** |
| 284 | |
| 285 | - При вводе `c:` палитра переключается в melody mode: при пустом хвосте после `c:` — **help** и **top families**; при `c: g` — доступные команды Git и хвосты; при `c: gs` — прямое совпадение (напр. Git: Status). |
| 286 | - В строке результата отображаются **human title**, **alias** и опционально **chord hint** (см. ниже). Пример строки: |
| 287 | `Git: Status — c: gs — git.status` |
| 288 | |
| 289 | **Связь с аккордным слоем (один семантический путь)** |
| 290 | |
| 291 | Melody **не живёт отдельно** от аккорда: тот же путь, что `c: gs` в палитре, в ментальной модели intent-first выражается аккордом **`Ctrl+K` → `G` → `S`** (буквы семейства и действия), а в реестре — тем же **`command_id`**. Палитра даёт **текстовую** компактную форму; аккорд — **клавиатурную**; MCP — **идентификатор**. |
| 292 | |
| 293 | **UX-ограничения** |
| 294 | |
| 295 | - `c:` — **ускоритель**, не единственный способ: команда обязана находиться и **обычным fuzzy** по human title. |
| 296 | - В UI **рядом с командой** показывать alias (и при необходимости подсказку аккорда), чтобы язык усваивался постепенно. |
| 297 | - Overlay / help может предлагать подсказку вида: «Try `c: gs` for Git Status» ([§6](#adr0060-p6)). |
| 298 | |
| 299 | **Минимальный словарь v1 (стартовый набор)** |
| 300 | |
| 301 | | Alias | Логический смысл (canonical id — уточнить в реестре) | |
| 302 | |-------|------------------------------------------------------| |
| 303 | | `c: gs` | git.status | |
| 304 | | `c: gc` | git.commit | |
| 305 | | `c: gp` | git.push | |
| 306 | | `c: gm` | git.merge | |
| 307 | | `c: gsu` | git.submodules | |
| 308 | | `c: bt` | build.test | |
| 309 | | `c: br` | build.run или build.rebuild | |
| 310 | | `c: da` | debug.attach | |
| 311 | | `c: dl` | `debug_launch` | |
| 312 | | `c: dc` | debug.continue | |
| 313 | | `c: ms` | map.semantic / show semantic map (по принятому именованию) | |
| 314 | |
| 315 | Расширение словаря — по мере появления команд в `IdeCommands`; дубликаты и конфликты — по правилам выше. |
| 316 | |
| 317 | --- |
| 318 | |
| 319 | ## Последствия |
| 320 | |
| 321 | - Появляется **второй UX-паттерн** рядом с палитрой; документация пользователя должна объяснять **Q vs K**. |
| 322 | - Реестр команд ([0030](0030-command-ids-hotkeys-and-ui-registry-layers.md)) получает слой **melody alias** и правила конфликтов; палитра ([0070](0070-command-palette-direct-overlay-surface.md)) — режим **`c:`** и отображение тройки title / alias / id. |
| 323 | - Тесты: сценарии таймаута, Esc, конфликт хоткеев, MCP `ide_execute_command` для тех же `command_id`. |
| 324 | - Зависимость от [0059](0059-roslyn-mcp-profiles-manager-tactical-strategic-efb.md): тактика/стратегия должны быть согласованы по смыслу с командами аккорда. |
| 325 | |
| 326 | --- |
| 327 | |
| 328 | ## Открытые вопросы |
| 329 | |
| 330 | - Зарезервирован ли **Ctrl+K** под редактор (Vim/Emacs-подобные плагины в будущем)? |
| 331 | - Одна глобальная машина аккорда на приложение или учёт **второго TopLevel** ([0017](0017-multi-window-workspace-and-agent-surfaces.md))? |
| 332 | - Локализация букв на overlay (EN-only в v0?). |
| 333 | - Как в одной машине состояний сочетаются **ось S/T** (§2) и **intent-first G/B/D/…** ([§11](#adr0060-p11)): два пресета аккорда, переключатель режима или последовательная миграция? |
| 334 | |
| 335 | --- |
| 336 | |
| 337 | ## Отклонённые на уровне ADR |
| 338 | |
| 339 | - **Заменить палитру на Ctrl+K** — отклонено: разные задачи (каталог vs короткий FMS-поток). |
| 340 | |