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

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».

Решение

  1. Канал / поток — слой данных и смысла для конкретного инструмента внимания: здоровье workspace, EICAS, readiness, позже — иные каналы. Отвечает на вопросы: что показать, в каком приоритете, какой полезной нагрузкой (сегменты, сообщения, метрики). Не отвечает на вопрос «в какой пиксельной координате» и не привязан к конкретному Control в дереве.

  1. CDS (контракт кабины) — слой маршрутизации в модели внимания: куда данные канала имеют право попасть при текущем пресете и топологии. Агрегирует семантику: режим UI, эффективная строка presentation, вид поверхности (AttentionLayoutSurfaceKind), видимость зон PFD/Forward/MFD, состояние окна-хоста Mfd, активная страница вторичного контура (SecondaryShellPage), и т.д. — в духе полей cds-contract-v0.md. Реализация в коде: снимок (например CockpitSurfaceState / CockpitSurfaceSnapshotBuilder), а не «один God-class» на весь UI.

  1. Композитор поверхности — слой связки слота канала с конкретным представлением внутри региона: полоса vs страница MFD, порядок сегментов, правила EICAS/HUD относительно канонов 0021. Отвечает на вопрос: как из допустимого места CDS и данных канала получить разметку для VM/представления (без дублирования полного текста канала в CDS — см. таблицу терминов в чертеже v0).

  1. Поверхность — конкретные контролы Avalonia (и привязки к MainWindowViewModel), фокус, анимации. Avalonia намеренно узкая по смыслу: окно, ввод, хост для контролов; не первичный источник семантики зон кокпита (он в CDS / композиторе). Кастомная отрисовка (например Skia) допускается как реализация региона поверхности поверх этого хоста. MCP-инструменты вроде ide_get_ui_layout остаются на этом слое; целевые команды агента на изменение кабины формулируются на уровне CDS / композитора, а не прямого доступа к произвольному имени контрола — за исключением осознанных исключений (автоматизация, strangler), которые документируются отдельно.

  1. Инвариант: канал не импортирует знание о 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).