| 1 | # ADR 0044: Разделение ролей — Avalonia как хост («фюзеляж»), кастомная отрисовка для чата агента (Skia как гипотеза) |
| 2 | |
| 3 | **Статус:** Accepted · Implemented |
| 4 | **Дата:** 2026-04-13 |
| 5 | **Обновлено:** 2026-04-13 — порядок итераций: **модель первична**, UI и спайк отрисовки следом. Подробности — [§ История](#adr0044-history). |
| 6 | ## Связанные ADR |
| 7 | |
| 8 | | ADR | Роль | |
| 9 | |-----|------| |
| 10 | | [0031](0031-agent-chat-clarification-batches-and-threading.md) | пакеты уточнений, выход за линейную ленту | |
| 11 | | [0039](0039-workspace-navigation-affordances.md) | Semantic Map; `ILayoutEngine`, Skia в перспективе | |
| 12 | | [0017](0017-multi-window-workspace-and-agent-surfaces.md) | зона MFD, `MfdShellView` | |
| 13 | | [0038](0038-agent-facade-ai-provider-and-tool-orchestration.md) | фасад агента | |
| 14 | | [0043](0043-mcp-transport-recovery-human-agent-parity.md) | транспорт MCP | |
| 15 | |
| 16 | ### Вне ADR |
| 17 | |
| 18 | | Документ | Роль | |
| 19 | |----------|------| |
| 20 | | [north-star — переход из Cursor](../design/north-star-cursor-mcp-cascade-workbench-v1.md) | снять трение | |
| 21 | |
| 22 | --- |
| 23 | ## Контекст |
| 24 | |
| 25 | Продуктовая цель **уйти от привычки держать Cursor ради чата** требует, чтобы разговор с агентом **внутри CascadeIDE** был **удобным и обозримым** — иначе трение миграции остаётся высоким независимо от силы редактора и MCP. |
| 26 | |
| 27 | Параллельно обсуждается архитектурная рамка: **Avalonia** как надёжный **хост** (окно, DPI, ввод, мониторы, жизненный цикл `TopLevel`, общий каркас кокпита), а не как единственный носитель **всей** сложной визуализации навсегда. Для поверхностей вроде **нестрочного** чата (ветки, обзор пакета уточнений, плотная структура вместо одной ленты — см. [0031](0031-agent-chat-clarification-batches-and-threading.md)) и родственных «карт» контекста разумно рассмотреть **отдельный слой отрисовки**; **Skia** — проверяемый кандидат (в т.ч. стык с [Semantic Map / укладкой](0039-workspace-navigation-affordances.md)). |
| 28 | |
| 29 | <a id="adr0044-p1"></a> |
| 30 | |
| 31 | ## Решение (направление, без фиксации сроков) |
| 32 | |
| 33 | 1. **Явно разделить роли:** слой **Avalonia** — фюзеляж: размещение зон, стандартные контролы там, где достаточно, интеграция с остальной кабиной. Слой **кастомной отрисовки** (целевой кандидат — **Skia**) — «приборы» в зоне чата/агента и согласованных поверхностях, **без** обещания переписать весь IDE на Skia. |
| 34 | |
| 35 | 2. **Модель первична, UI не обязателен для старта:** в первую очередь — **каноническая модель** потока диалога и сессии (события, сущности, пакеты уточнений, стабильные идентификаторы, привязки к артефактам — направление [0031](0031-agent-chat-clarification-batches-and-threading.md)). Её можно проектировать и проверять **без** нового UI (тесты, сериализация, сценарии). При удачном разделении слоёв **набросать представление поверх** — проще, чем выводить структуру из нарисованного интерфейса. |
| 36 | |
| 37 | 3. **Спайк отрисовки** (в т.ч. Skia) — **после** или **параллельно** черновику модели, на **синтетических** данных или на модели, когда контуры ясны; цель — риски хоста/отрисовки, а не угадывание доменной формы по пикселям. |
| 38 | |
| 39 | 4. **Модель и пиксели ортогональны:** будь то Skia или Avalonia-контролы в зоне чата, это **не** отменяет требований к модели; этот ADR фиксирует **разделение ответственности хост/отрисовка**, а не единственную библиотеку. |
| 40 | |
| 41 | <a id="adr0044-p2"></a> |
| 42 | |
| 43 | ## Последствия |
| 44 | |
| 45 | - Возможное сосуществование **двух стилей** UI (Avalonia и Skia-остров) — нужны **границы**, общие токены цвета/типографики и дисциплина, чтобы не разъехались стиль и баги. |
| 46 | - Масштабирование сценария чата **после** выводов спайка, не до. |
| 47 | - Ранние **автотесты на модели** (без UI) снижают стоимость смены представления. |
| 48 | |
| 49 | ## Отклонённые альтернативы (на данном этапе) |
| 50 | |
| 51 | - **Считать качество чата второстепенным** по сравнению с редактором — отклонено для цели «жить в CIDE без Cursor ради разговора». |
| 52 | - **Переписать весь чат на Skia одним махом** — отклонено без измеримого спайка и модели данных. |
| 53 | - **Начинать со слоя отрисовки без канона модели** — отклонено: риск зацементировать неверную структуру в графике. |
| 54 | |
| 55 | --- |
| 56 | |
| 57 | ## История изменений |
| 58 | |
| 59 | <a id="adr0044-history"></a> |
| 60 | |
| 61 | | Дата | Изменение | |
| 62 | |------|-----------| |
| 63 | | 2026-04-13 | порядок итераций: **модель первична**, UI и спайк отрисовки следом. | |
| 64 | |