ADR 0060: Аккордный слой (FMS-style), S/T и overlay — расширение keyboard-first (ADR 0013)¶
Статус: Accepted (частично: Intent Melody каталог + chord/palette v1; полный FMS T/S overlay — по ADR)
Дата: 2026-04-19
Связанные ADR¶
| ADR | Роль |
|---|---|
| 0013 | палитра, toolbar, discoverability — этот ADR не заменяет палитру |
| 0070 | палитра как overlay surface |
| 0008 | MCP и команды |
| 0030 | IdeCommands, hotkeys.toml, реестр |
| 0017 | мультиоконность, фокус |
| 0021 | PFD / MFD |
| 0032 | HUD / подписи режима — опционально |
| 0055 | Skia — overlay |
| 0059 | тактика / EFB на MFD, Manager |
| 0072 | навигация по темам чата — уточнение в chat-domain, не замена этого ADR |
| 0081 | параметрические melody :start:end для редактора; развивается поверх Command Melody из §11 |
Вне ADR¶
| Документ | Роль |
|---|---|
| north-star — keyboard-first | north-star — keyboard-first |
| chord-notation-cascadeide.md | chord notation cascadeide |
Частичное уточнение (chat-domain): навигация по темам чата (topic cards, drill-in/back, минимальный набор intent-команд и паритет палитра / Melody / Chords) зафиксирована в 0072. Этот ADR (0060) остаётся каноном для общей модели Melody, CascadeChord и Command Melody (c:); 0072 не отменяет §1–§11 целиком и не переназначает S/T/M/E для кокпита вне chat-topic navigation. |
Контекст¶
0013 закрепляет палитру команд как опорную точку (поиск по строке, полный каталог) и keyboard-first как продуктовый ориентир. Для кокпита этого недостаточно: пилот в FMS сначала выбирает раздел, потом параметр — два осмысленных шага без набора текста. В CascadeIDE параллельно нужен масштаб мышления (тактика vs стратегия, см. 0059), который не сводится к «открыть другое окно».
Нужен второй вход с клавиатуры: аккордный слой (префикс → вторая клавиша), согласованный с IdeCommands (0030) и не дублирующий палитру.
Резюме¶
- Аккордный слой (Ctrl+K), FMS-style тактика/стратегия, overlay поверх 0013.
- Расширение discoverability без замены палитры и IdeCommands.
- Связь с intent melody и chat-domain (0072).
Решение¶
1. Палитра и аккорд — два физических входа (слэш — §1a)¶
| Вход | Назначение | Ориентир в 0013 |
|---|---|---|
Палитра команд (хоткей по умолчанию Ctrl+Q в шипнутом hotkeys.toml) |
Полный каталог, поиск по имени, недавние | Решение §2 пункт 2 |
Корень аккорда — рабочее имя CascadeChord (хоткей по умолчанию Ctrl+K в поставке; переопределение — пользовательский hotkeys.toml) |
Короткий FMS-поток: префикс → вторая клавиша → исполнение одной команды из заранее ограниченного набора «кокпитных» действий | Расширение keyboard-first без отмены палитры |
Тот же command_id текстом в палитре — префикс c: (Command Melody, §11) |
Компактный mnemonic (c: gs, …) без смены окна; fuzzy по title/id как прежде |
Не третий «физический» вход: по-прежнему Ctrl+Q, расширенный строкой запроса |
Правило: Ctrl+K не заменяет Ctrl+Q; пользователь выбирает «искать по имени», «идти по известной букве» аккорда или ввести melody после открытия палитры. Конфликт с хоткеями редактора/ОС — отлавливать при загрузке и отражать в UX (см. открытые вопросы).
1a. Третий вход: слэш в Intercom (0119)¶
Статус: Accepted · Implemented (не отменяет §1).
| Вход | Назначение |
|---|---|
Слэш в ChatInput (/ + autocomplete) |
Unified command line в composer: Intercom-глаголы и IDE (/build run, /topic …, …); тот же command_id; discoverability в канале сессии без Ctrl+Q/Ctrl+K |
Слэш ортогонален физическим хоткеям §1; сжатые мнемоники — в аккорде и Melody c:, не в коротких /… (0119). Сводка для дизайна: cascadeide-philosophy-v1 §7, handbook §2.6.
2. Первый уровень после CascadeChord: S / T (канон масштаба)¶
Канонический первый выбор после префикса — масштаб мышления и глубина сопряжения с Roslyn MCP (0059), а не «какой монитор»:
| Клавиша (после префикса) | Имя | Смысл |
|---|---|---|
| T | Tactical | Локальная семантика вокруг курсора; тактический контур PFD / Forward; узкий контракт |
| S | Strategic | Глобальный / слойный граф; контур MFD / EFB; профиль Profile.GlobalMap в смысле 0059 |
Плюс: одна ось отражает суть CascadeIDE — меняем глубину погружения, а не только «вид».
Исполнение конкретной команды (например cascade.focus_tactical_map, cascade.focus_strategic_efb) — через IdeCommands и MCP-паритет (0008, 0002).
3. Альтернатива / второй уровень: M / E (дисплеи)¶
Разделение MFD vs EFB (0059: EFB = MFD, не PFD) может выноситься на второй шаг аккорда или параллельный набор букв, если продукту нужна явная привязка к дисплею:
| Клавиша | Имя | Смысл (идея) |
|---|---|---|
| M | MFD-фокус | Инструменты, логи, терминал — «на земле» / диагностика |
| E | EFB / стратегия | Карта, архитектура на MFD |
Правило смешения: не вводить на одном уровне одновременно S/T и M/E без документированной схемы (например: префикс → S или T → опционально второй аккорд M или E для уточнения поверхности). Минимальный v0 — только S/T после префикса.
4. «Векторный» вариант (комбинированный)¶
Опционально (отдельная итерация или пресет хоткеев):
- Цифры 1 / 2 / 3 после префикса — быстрый фокус на монитор / TopLevel (0017) в порядке конфигурации пользователя.
- F — переключение Flight / снятие «режима полёта» (связь с 0010 — не смешивать с S/T без явной подписи в UI).
Это не обязательная часть v0; фиксируется, чтобы не плодить независимые корни аккордов без реестра.
5. Машина состояния аккорда¶
- После CascadeChord IDE переходит в состояние «ожидаю вторую клавишу» на короткий таймаут (дефолт и переопределение — опционально в
settings.toml, см. §7). - Esc — выход без действия; фокус возвращается по правилам 0013 / 0017.
- Редактор: не перехватывать ввод текста, пока активен chord-wait, только если политика фокуса явно отдаёт события окну приложения (детали реализации — в коде; тесты на «не съесть букву в строке»).
6. Overlay-подсказки (discoverability)¶
После нажатия префикса на короткое время показывать полупрозрачные подсказки (буквы/подписи) над зонами или в углу экрана — чтобы не гадать «что дальше». Реализация:
- предпочтительно Skia-оверлей поверх хоста (0055: overlay не превращается в отдельный «инструмент» с дублированием pipeline);
- Reduced motion / отключение подсказок — флаг настройки;
- не загораживать критичные индикаторы PFD без политики плотности.
7. Индикация режима на PFD (ситуационная осведомлённость)¶
Малая строка вида MODE: TACTICAL / STRATEGIC / подрежимы ECHELON / COMBAT (0059) в углу PFD или в HUD-слое (0032) — рекомендуется, чтобы визуально совпадать с тем, что делает Manager профилей. Источник истины — один (VM / CDS / сервис режима), не дублировать рассинхронно с аккордом.
8. Конфигурация: где что живёт¶
| Что | Где |
|---|---|
Привязка префикса и аккордов к command_id |
Hotkeys/hotkeys.toml (шип) + %LocalAppData%\CascadeIDE\hotkeys.toml (0013, 0030) |
| Реализация исполнения | IdeCommands + обработчик ввода (chord state machine) в C# |
Опционально: chord_timeout_ms, chord_overlay_enabled |
settings.toml или секция рядом с UI — не дублировать полную карту клавиш в settings.toml (0013 — отклонённый вариант хранить все хоткеи только в settings) |
Порядок работ (рекомендация): сначала идентификаторы команд и машина аккорда в C#; затем строки в hotkeys.toml; затем overlay и MODE-строка.
9. Логика миграции команд и эволюция шагов (реализация)¶
Что не переносим на аккорд без отдельного обсуждения
- Стандарт редактора / ОС, с которыми пользователи считают клавиатуру «как везде»: сохранение (Ctrl+S), отмена/повтор (Ctrl+Z / Ctrl+Y), вырезать/копировать/вставить, часто Ctrl+W / закрытие вкладки, Ctrl+F внутри редактора. Их оставляем на прямых жестах или настройке редактора; не загонять в CascadeChord только ради единообразия.
- Уже закреплённые глобальные хоткеи IDE из
hotkeys.toml(Ctrl+Q палитра, F5 отладка, …) не ломаем: аккорд — второй вход, не замена.
Целевая слоистая схема (после v0)
- CascadeChord (префикс, напр. Ctrl+K).
- Первый буквенный шаг — масштаб S / T (§2): тактика vs стратегия; привязка к профилю Roslyn MCP / контур внимания (0059).
- Второй шаг — подсистема (буквы-«страницы»): например M = карта намерений (P / F / D), B = build/тесты, G = Git и т.д. Так не смешиваем на одном уровне десяток несвязных букв и масштаб мышления.
Текущая многошаговая схема (код)
- Префикс → M → M / P / F: зоны кокпита — MFD (развернуть регион), PFD (развернуть регион), Forward (фокус в редактор). Метафора «настройки/фокус зоны» без второго корня Ctrl+M: вторая буква — M сразу после префикса (как FMS-страница), третья — выбор зоны.
- Префикс → S → P / F / D: карта намерений — вид / уровень / детализация (как в 0055).
- Оверлей показывает допустимые клавиши для текущего шага; таймаут и Esc сбрасывают машину (§5).
Правило discoverability
- Любая команда, доступная только с аккорда, должна иметь тот же
command_idв палитре и MCP (0008), чтобы «забыл букву» ≠ «потерял действие».
10. Философия UX: невидимый инструмент, мышечная память, репетиция vs выступление¶
«Хороший актёр — это тот, которого нет. Потому что есть только его персонаж.»
IDE как невидимый актёр. Продукт не должен «играть саму себя»: бесконечно выставлять напоказ инструменты, хоткеи, меню, панели, оверлеи. Задача интерфейса — исчезнуть там, где можно, и оставить в центре код, задачу, мысль разработчика. Кокпит CascadeIDE — метафора невидимого актёра: PFD, MFD, Forward, карта намерений — это не «лицо IDE ради IDE», а инструменты пилота, продолжение мышления. В работе пилот не формулирует «нажимаю кнопку на MFD» — он держит в голове курс, а руки находят жест.
Аккорды и мышечная память. После достаточной практики пользователь перестаёт декламировать последовательность клавиш и оперирует смысловыми слоями (например Modification → Navigation → View → Strategic как мнемоника намерений, а не как список клавиш в абстракции). Пальцы закрепляют паттерн; сознание остаётся на задаче. Конкретная грамматика шагов (один корневой префикс vs дополнительные модификаторы, порядок букв, ось S/T vs intent-first семейства G/B/D/…) — предмет эволюции реестра и hotkeys; философский слой не привязан к одной таблице букв, но требует, чтобы любая версия грамматики оставалась читаемой и обучаемой.
Метафоры (одно направление — фон и исчезновение «лишнего»):
| Метафора | Применительно к CascadeIDE |
|---|---|
| Тинтиннабули Пярта | Два голоса: контекстный фон (префиксы/слои ввода) + «мелодия» последующих букв — простая структура, строгая, медитативная |
| Мебельная музыка Сати | IDE как фон: не требует постоянного внимания, держит атмосферу работы |
| Хороший актёр | IDE исчезает; остаются код и задача |
Следствия для ADR и нотации
- Нотация в документации должна быть прозрачной: читатель не должен тратить умственную энергию на расшифровку. Запись вроде
<C-k> …в chord-notation-cascadeide.md дополняется мнемонической расшифровкой там, где это ускоряет понимание (что за намерение, а не только какие VK). - Overlay (§6) — суфлёр, а не режиссёр: появляется, когда нужно подсказать следующий шаг, и не загораживает сцену (код, критичные индикаторы). См. политику плотности и Reduced motion в §6.
- Три входа, одна модель
command_id— репетиция (палитра Ctrl+Q), выступление (аккорд Ctrl+K + Melodyc:), канал сессии (слэш в Intercom, 0119 §1a). Палитра — полный каталог; аккорд — мышечная память; слэш — discoverability в composer без смены фокуса (0013, §1–1a этого ADR).
Связь с intent-first и surface routing. Идея «аккорд фиксирует намерение (Git, Build, Debug…), а куда вынести результат — решает маршрутизация поверхностей» — согласуется с этим разделом: кокпитные поверхности остаются контекстом показа, а не обязательным первым уровнем мысленной формулы для каждого жеста. Детализация грамматики v1 (семейства команд, оси S/T) — в отдельных итерациях ADR/реестра; цель §10 — зафиксировать принципы UX, а не конкретную таблицу букв.
См. также: продуктовый нарратив «невидимый инструмент» vs класс риска облачного ассистента — cascadeide-philosophy-v1.md, ADR 0071.
11. Command Melody (c:) — палитра, mnemonic alias и мост к аккорду¶
Спецификация языка (лексика, EBNF, мотивация, открытые вопросы): intent-melody-language-v1.md (Intent-based Melody Language, IML v1).
Происхождение: спецификация melody (c:) сформулирована в линии Comet (внешний диалог); здесь — норматив продукта. Указатель в личном каноне KB (agent-notes) — knowledge/personal/assistantLines/comet/comet-command-melody-cascade-palette-2026-04-19.md.
Назначение. Префикс c: вводит в command palette (0013, 0070) специальный режим melody: короткие mnemonic alias в developer-first словаре. Пользователь может ввести компактную форму вроде c: gs, c: br, c: da и сразу получить нужную команду, не полагаясь только на fuzzy search по длинному заголовку. Эвристика частота → длина и отложенные варианты уточнения — intent-melody-language-v1.md §3.5.
Цель. Режим нужен не для замены обычного поиска, а для быстрого семантического входа, общего для:
- палитры (строка запроса);
- аккордного слоя (CascadeChord);
- канонического
command_idв реестре (0030); - вызова через MCP / агента (0008) — тот же идентификатор.
Три представления одной команды
| Слой | Пример |
|---|---|
| Human title | Git: Status |
| Melody alias | c: gs |
| Canonical id | git.status (или эквивалент в IdeCommands; точная строка — реестр 0030) |
Палитра должна находить и показывать команду по любому из этих представлений (title, alias, id).
Синтаксис
- Общий префикс namespace:
c:— вход в melody. - После
c:допускается один или несколько mnemonic token; базовая форма v1 — двухбуквенная: первая буква = family, вторая = action. - Примеры (логические имена; фактический
command_id— по реестру):
| Ввод | Назначение (смысл) |
|---|---|
c: gs |
Git → Status |
c: gc |
Git → Commit |
c: gp |
Git → Push |
c: gm |
Git → Merge |
c: gsu |
Git → Submodules |
c: br |
Build → Run / Rebuild (по принятой терминологии в реестре) |
c: bt |
Build → Test |
c: da |
Debug → Attach |
c: dc |
Debug → Continue |
c: dl |
Debug → Launch (debug_launch) |
c: cps |
Chat → Page → Show (show_chat_page; DOI) |
c: cs |
Chat → Send — отправить черновик поля ввода как user (send_chat без message) |
c: cex |
Chat → export (читаемый Markdown) |
c: ctf |
Chat → Thread → Fork (трёхбуквенное DOI: домен → объект → намерение; fork_chat_thread) |
c: ers |
Environment → Readiness → Show (show_environment_readiness_page) |
c: ts |
Terminal → Show (show_terminal_panel) |
Реестр мелодий в репозитории: IntentMelody/intent-melody-aliases.toml (см. intent-melody-language-v1.md).
Семейства v1 (узкий старт, узнаваемые домены)
| Буква | Family |
|---|---|
| g | Git |
| b | Build |
| d | Debug |
| r | Run |
| e | Editor |
| m | Map (карта намерений / навигация карты) |
| c | Chat |
| t | Terminal (панель / страница терминала во вторичном контуре) |
Переходы «показать страницу» во вторичном контуре кодируются доменом первым (намерение): например Chat → Page → Show = c: cps, а не синтетический префикс P = Pages (pcs, pes, …), который ставит топологию IDE выше смысла команды. Для готовности окружения в DOI закрепляется цепочка вроде Environment → Readiness → Show (ers при появлении в реестре alias), а не «Pages → Environment».
Это согласуется с intent-first: разработчик мыслит доменом задачи, а не топологией IDE (§10).
Принципы выбора alias
- Alias узнаваем разработчиком без отдельного обучения.
- Alias короче human title, но не «шифр» уровня shell-golf.
- Alias стабилен, даже если формулировка в UI слегка меняется.
- Alias выражает намерение, а не размещение на поверхности (плохой базовый пример: привязка к «primary deck» вместо смысла команды).
- Частота → длина (эвристика): чем типичнее команда для рабочего дня, тем короче разумный alias в реестре (аналогия с префиксными кодами Хаффмана; intent-melody-language-v1.md §3.5). Сначала — база по консенсусу и ревью; пересортировка по измеренной частоте (в т.ч. телеметрия) — отложена до стабилизации реестра и палитры.
Разрешение конфликтов
- В пределах одного workspace один melody alias → ровно один canonical
command_id. - При конфликте: либо фиксируется одно отображение в реестре, остальные показываются как secondary matches; либо требуется трёхбуквенная форма; либо конфликтный alias помечается invalid до разруливания.
- Human title и canonical id остаются всегда валидными путями поиска, даже если alias неоднозначен.
Поведение палитры в melody mode
- При вводе
c:палитра переключается в melody mode: при пустом хвосте послеc:— help и top families; приc: g— доступные команды Git и хвосты; приc: gs— прямое совпадение (напр. Git: Status). - В строке результата отображаются human title, alias и опционально chord hint (см. ниже). Пример строки:
Git: Status — c: gs — git.status
Связь с аккордным слоем (один семантический путь)
Melody не живёт отдельно от аккорда: тот же путь, что c: gs в палитре, в ментальной модели intent-first выражается аккордом Ctrl+K → G → S (буквы семейства и действия), а в реестре — тем же command_id. Палитра даёт текстовую компактную форму; аккорд — клавиатурную; MCP — идентификатор.
UX-ограничения
c:— ускоритель, не единственный способ: команда обязана находиться и обычным fuzzy по human title.- В UI рядом с командой показывать alias (и при необходимости подсказку аккорда), чтобы язык усваивался постепенно.
- Overlay / help может предлагать подсказку вида: «Try
c: gsfor Git Status» (§6).
Минимальный словарь v1 (стартовый набор)
| Alias | Логический смысл (canonical id — уточнить в реестре) |
|---|---|
c: gs |
git.status |
c: gc |
git.commit |
c: gp |
git.push |
c: gm |
git.merge |
c: gsu |
git.submodules |
c: bt |
build.test |
c: br |
build.run или build.rebuild |
c: da |
debug.attach |
c: dl |
debug_launch |
c: dc |
debug.continue |
c: ms |
map.semantic / show semantic map (по принятому именованию) |
Расширение словаря — по мере появления команд в IdeCommands; дубликаты и конфликты — по правилам выше.
Последствия¶
- Появляется второй UX-паттерн рядом с палитрой; документация пользователя должна объяснять Q vs K.
- Реестр команд (0030) получает слой melody alias и правила конфликтов; палитра (0070) — режим
c:и отображение тройки title / alias / id. - Тесты: сценарии таймаута, Esc, конфликт хоткеев, MCP
ide_execute_commandдля тех жеcommand_id. - Зависимость от 0059: тактика/стратегия должны быть согласованы по смыслу с командами аккорда.
Открытые вопросы¶
- Зарезервирован ли Ctrl+K под редактор (Vim/Emacs-подобные плагины в будущем)?
- Одна глобальная машина аккорда на приложение или учёт второго TopLevel (0017)?
- Локализация букв на overlay (EN-only в v0?).
- Как в одной машине состояний сочетаются ось S/T (§2) и intent-first G/B/D/… (§11): два пресета аккорда, переключатель режима или последовательная миграция?
Отклонённые на уровне ADR¶
- Заменить палитру на Ctrl+K — отклонено: разные задачи (каталог vs короткий FMS-поток).