Перейти к содержанию

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)

  1. CascadeChord (префикс, напр. Ctrl+K).
  2. Первый буквенный шаг — масштаб S / T (§2): тактика vs стратегия; привязка к профилю Roslyn MCP / контур внимания (0059).
  3. Второй шаг — подсистема (буквы-«страницы»): например M = карта намерений (P / F / D), B = build/тесты, G = Git и т.д. Так не смешиваем на одном уровне десяток несвязных букв и масштаб мышления.

Текущая многошаговая схема (код)

  • ПрефиксMM / P / F: зоны кокпита — MFD (развернуть регион), PFD (развернуть регион), Forward (фокус в редактор). Метафора «настройки/фокус зоны» без второго корня Ctrl+M: вторая буква — M сразу после префикса (как FMS-страница), третья — выбор зоны.
  • ПрефиксSP / 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 + Melody c:), канал сессии (слэш в 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

  1. Alias узнаваем разработчиком без отдельного обучения.
  2. Alias короче human title, но не «шифр» уровня shell-golf.
  3. Alias стабилен, даже если формулировка в UI слегка меняется.
  4. Alias выражает намерение, а не размещение на поверхности (плохой базовый пример: привязка к «primary deck» вместо смысла команды).
  5. Частота → длина (эвристика): чем типичнее команда для рабочего дня, тем короче разумный alias в реестре (аналогия с префиксными кодами Хаффмана; intent-melody-language-v1.md §3.5). Сначала — база по консенсусу и ревью; пересортировка по измеренной частоте (в т.ч. телеметрия) — отложена до стабилизации реестра и палитры.

Разрешение конфликтов

  1. В пределах одного workspace один melody alias → ровно один canonical command_id.
  2. При конфликте: либо фиксируется одно отображение в реестре, остальные показываются как secondary matches; либо требуется трёхбуквенная форма; либо конфликтный alias помечается invalid до разруливания.
  3. 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+KGS (буквы семейства и действия), а в реестре — тем же command_id. Палитра даёт текстовую компактную форму; аккорд — клавиатурную; MCP — идентификатор.

UX-ограничения

  • c:ускоритель, не единственный способ: команда обязана находиться и обычным fuzzy по human title.
  • В UI рядом с командой показывать alias (и при необходимости подсказку аккорда), чтобы язык усваивался постепенно.
  • Overlay / help может предлагать подсказку вида: «Try c: gs for 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-поток).