ADR 0036: Канал → CDS → композитор поверхности → поверхность (Agent-first отображение)¶
Статус: Accepted · Implemented
Дата: 2026-04-11
Связанные ADR¶
| ADR / документ | Роль |
|---|---|
| 0021 | Зоны внимания; CDS vs UiLayoutSnapshot |
| 0097 | CCU: DTO канала до CDS |
| 0017 | presentation, топология окон |
| 0008 | Контракты, тестируемые границы |
| 0035 | Веб-поверхность ≠ MCP |
| 0115 | Общий слой graph-backed в кабине |
| 0067 | Контракт измерений graph-backed |
cds-contract-v0.md |
Чертёж полей и DTO |
Снимок реализации¶
| Элемент | Значение |
|---|---|
| — | слои Cockpit/Cds, Cockpit/Channels, Cockpit/Composition, Cockpit/Surface |
| — | чертёж полей — cds-contract-v0.md §6–7, Features/README.md |
Резюме¶
- Цепочка: канал (смысл и payload) → CDS (куда данные имеют право попасть) → композитор (слот и разметка) → поверхность (Avalonia/Skia).
- Agent-first: целевые команды агента — на уровне CDS/композитора, не прямой доступ к произвольному
Control(исключения — явный strangler). UiLayoutSnapshotостаётся для дерева контролов и отладки; ортогонален CDS (0021).- Канал не импортирует
MainWindow.axaml; CDS не дублирует полное дерево UI. - Реализация:
Cockpit/Cds,Channels,Composition,Surface— см. cds-contract-v0.md.
Контекст¶
В авионике CDS (Cockpit Display System в смысле ARINC) — идея единого контура отображения: прикладные системы подают данные и команды, а композиция экрана (слои, приоритеты, допустимые регионы) — у согласованного рантайма. Cascade не копирует профиль 661 и не требует сертификации (0021 § ARINC 661); переносим принцип разделения: агент и каналы не должны напрямую «рисовать» произвольный UI, если цель — предсказуемая кабина и Agent-first дисциплина.
Уже зафиксировано: CDS в продукте — слой семантики кабины (какая топология, какие зоны/страницы активны), ортогонально дереву контролов (UiLayoutSnapshot) и тонкому чертежу полей в cds-contract-v0.md. Не хватает явной цепочки ответственности от потока данных до пикселей, чтобы новые фичи не пробивали дыру «сразу в Avalonia».
Решение¶
- Канал / поток — слой данных и смысла для конкретного инструмента внимания: здоровье workspace, EICAS, readiness, позже — иные каналы. Отвечает на вопросы: что показать, в каком приоритете, какой полезной нагрузкой (сегменты, сообщения, метрики). Не отвечает на вопрос «в какой пиксельной координате» и не привязан к конкретному
Controlв дереве.
- CDS (контракт кабины) — слой маршрутизации в модели внимания: куда данные канала имеют право попасть при текущем пресете и топологии. Агрегирует семантику: режим UI, эффективная строка
presentation, вид поверхности (AttentionLayoutSurfaceKind), видимость зон PFD/Forward/MFD, состояние окна-хоста Mfd, активная страница вторичного контура (SecondaryShellPage), и т.д. — в духе полейcds-contract-v0.md. Реализация в коде: снимок (напримерCockpitSurfaceState/CockpitSurfaceSnapshotBuilder), а не «один God-class» на весь UI.
- Композитор поверхности — слой связки слота канала с конкретным представлением внутри региона: полоса vs страница MFD, порядок сегментов, правила EICAS/HUD относительно канонов 0021. Отвечает на вопрос: как из допустимого места CDS и данных канала получить разметку для VM/представления (без дублирования полного текста канала в CDS — см. таблицу терминов в чертеже v0).
- Поверхность — конкретные контролы Avalonia (и привязки к
MainWindowViewModel), фокус, анимации. Avalonia намеренно узкая по смыслу: окно, ввод, хост для контролов; не первичный источник семантики зон кокпита (он в CDS / композиторе). Кастомная отрисовка (например Skia) допускается как реализация региона поверхности поверх этого хоста. MCP-инструменты вродеide_get_ui_layoutостаются на этом слое; целевые команды агента на изменение кабины формулируются на уровне CDS / композитора, а не прямого доступа к произвольному имени контрола — за исключением осознанных исключений (автоматизация, strangler), которые документируются отдельно.
- Инвариант: канал не импортирует знание о
MainWindow.axaml; CDS не дублирует полное дерево UI; композитор не подменяет политику зон из 0021. Нарушение — отдельное решение или временная мера с явной меткой. Уточнение: типы вCockpit/Channelsне зависят от конкретных VM фич (UiChromeViewModel, панели instrumentation и т.п.) — только от DTO, делегатов (Func<…>) и не-UI сервисов; подстановка живых источников — в корне композиции (напримерMainWindowViewModel). Это не запрещает VM знать каналы, CDS и видимость — это его роль.
Последствия¶
- Agent-first и расширения по MCP получают устойчивый язык: «куда в кабине» (CDS) отдельно от «что в полосе» (канал) и от «какой контрол» (поверхность).
- Тесты и снапшоты могут опираться на CDS-снимок без хрупкой привязки к дереву контролов для сценариев «внимание и раскладка».
- Реализация остаётся поэтапной: корневой VM по-прежнему связывает источники с каналом; этот ADR задаёт направление, к которому новые фичи стараются сходиться.
Не цели¶
- Полная реализация ARINC 661 или CDS как в сертифицированной авионике.
- Замена
UiLayoutSnapshotдля отладки и автоматизации дерева — слой ортогонален CDS (0021 §1.1).