ADR 0047: Инструмент кабины (Instrument) — дескриптор композиции слота, не Control¶
Статус: Accepted · Implemented
Дата: 2026-04-15
Связанные ADR¶
| ADR / документ | Роль |
|---|---|
| 0036 | Канал → CDS → композитор → поверхность |
| 0021 | Зоны внимания |
| 0039 | Semantic Map, навигация |
| 0046 | Инварианты presentation |
cds-contract-v0.md |
Чертёж дескрипторов и слотов |
Имя файла (история): ранее черновик назывался *widget*; канонический термин продукта — Instrument (см. п.1).
Снимок реализации¶
| Элемент | Значение |
|---|---|
| — | термин Instrument, CockpitInstrumentDescriptor, MainWindowHostSurfaceFrame, MainWindowInstrumentMountRegistry |
| — | см. cds-contract-v0.md |
| — | расширение списка инструментов — по дорожной карте |
Контекст¶
В разговоре о Solution Explorer и Semantic Map всплыла путаница уровней: «данные», «представление данных», «поверхность Avalonia» и «слот внимания» смешивались. Нужен устойчивый термин для единицы, которую композитор выбирает для слота и которую поверхность монтирует — без подмены смысла «любым Control». Слово instrument в английском многозначно (авиа-прибор, измерительный прибор, музыкальный инструмент и т.д.); в этом ADR оно закреплено в значении кабинного инструмента: логическая единица индикации/представления в зоне внимания, в духе метафоры PFD/MFD, не обязательно «стрелка на приборной доске».
Решение¶
Instrument(кабинный) — это именованный выбор представления в слоте внимания, результат работы композитора. Это не синоним Avalonia-Controlи не сырой канал данных (Build log, граф навигации и т.д. остаются в каналах / проекциях).
CockpitInstrumentDescriptor(код) — минимальный контрактный дескриптор: стабильныйinstrument_id, идентификатор слота (slot_id, напримерpfd/mfd/forward),schema_versionстроки дескриптора. Расширение полей (параметры инструмента, ссылки на данные) — по мере появления второго и третьего инструмента в одном слоте.
- CDS по-прежнему отвечает на «куда имеет право попасть инструмент» при текущем
presentationи топологии; композитор — на «какойinstrument_idв какомslot_id»; поверхность — на «какойControl/View реализует этот дескриптор».
- Примеры слотов PFD:
solution_explorer_treeиworkspace_navigation_map(Semantic Map) — два разных инструмента одного класса слота «представление workspace», взаимоисключаемо или с явным split — решает композитор + capabilities, не произвольный код View.
Последствия¶
- Появляется язык для MCP/агента: «смонтировать инструмент X в слот Y» без привязки к имени контрола в дереве.
- Регрессии «сломали не данные, а представление» локализуются в композиторе и реестре инструментов.
Не цели (v1)¶
- Полный реестр инструментов и hot-swap всех панелей — отдельными итерациями после стабилизации дескриптора.
- Замена
UiLayoutSnapshotдля автоматизации дерева UI.
Отклонённые альтернативы¶
Widget— перегружен (веб, Flutter, «виджеты ОС»); заменён на Instrument для ясной связи с кабинной метафорой и меньшей коллизией с UI-фреймворками.- Называть любой
UserControl«инструментом» без дескриптора — отклонено: размывает границу композитор/поверхность. - Вешать выбор SE vs Semantic Map только на TOML без слоя композитора — отклонено: не масштабируется на MCP и тесты.