| 1 | # ADR 0057: Chat surface adoption of Skia composition pipeline |
| 2 | |
| 3 | **Статус:** Accepted · Implemented |
| 4 | **Дата:** 2026-04-17 |
| 5 | |
| 6 | ## Связанные ADR |
| 7 | |
| 8 | | ADR | Роль | |
| 9 | |-----|------| |
| 10 | | [0031](0031-agent-chat-clarification-batches-and-threading.md) | пакеты уточнений, threading | |
| 11 | | [0044](0044-avalonia-host-skia-agent-chat-surface.md) | ранняя гипотеза host/render split | |
| 12 | | [0055](0055-skia-instrument-composition-pipeline.md) | общий pipeline | |
| 13 | | [0056](0056-semantic-map-pipeline-adoption.md) | первый внедрённый consumer | |
| 14 | | [0072](0072-chat-topic-cards-intent-melody-keyboard-contract.md) | overview/detail layout и keyboard-first intent для тем поверх pipeline | |
| 15 | |
| 16 | --- |
| 17 | ## Контекст |
| 18 | |
| 19 | После внедрения pipeline в Semantic Map ([0056](0056-semantic-map-pipeline-adoption.md)) следующий запланированный consumer — chat surface: |
| 20 | |
| 21 | - треды, |
| 22 | - подтверждения (confirmations), |
| 23 | - приоритизация и declutter в режиме высокой плотности событий. |
| 24 | |
| 25 | Чат в `MfdShellView` остаётся продуктовой MFD-поверхностью, но канонический surface теперь строится вокруг Skia pipeline snapshot, а не вокруг Avalonia list/tree. |
| 26 | Новый слой Skia нужен не для "замены ради замены", а для сценариев, где линейная лента не даёт достаточной ситуационной читаемости и не показывает ширину ветвления. |
| 27 | |
| 28 | --- |
| 29 | |
| 30 | ## Решение |
| 31 | |
| 32 | <a id="adr0057-p1"></a> |
| 33 | |
| 34 | ### 1) Принять chat surface как следующий pipeline-consumer |
| 35 | |
| 36 | Чат переводится на тот же composition-подход из [0055](0055-skia-instrument-composition-pipeline.md): |
| 37 | |
| 38 | 1. **Intent**: построение модели текущего состояния диалога (треды, pending confirmations, активные ветви). |
| 39 | 2. **Declutter**: приоритизация сообщений/подтверждений и компрессия шумовых элементов. |
| 40 | 3. **Layout**: раскладка узлов разговора и карточек подтверждений. |
| 41 | 4. **Render**: Skia-отрисовка сцены. |
| 42 | |
| 43 | <a id="adr0057-p2"></a> |
| 44 | |
| 45 | ### 2) Зафиксировать single product path через Skia surface |
| 46 | |
| 47 | После появления snapshot-композитора: |
| 48 | |
| 49 | - `ChatPanelView` остаётся host-контейнером и формой ввода, но не альтернативной лентой; |
| 50 | - продуктовый рендер чата идёт через единый Skia surface; |
| 51 | - legacy Avalonia list-path не считается обязательным fallback. |
| 52 | |
| 53 | Avalonia остаётся shell/host-слоем, а не параллельной продуктовой реализацией chat scene. |
| 54 | |
| 55 | <a id="adr0057-p3"></a> |
| 56 | |
| 57 | ### 3) Выделить чатовые intent-единицы как first-class |
| 58 | |
| 59 | Минимальный набор доменных сущностей для v1: |
| 60 | |
| 61 | - `ThreadNode`, |
| 62 | - `MessageNode`, |
| 63 | - `ConfirmationNode`, |
| 64 | - `DecisionEdge` (`ask`, `confirm`, `resolve`, `supersede`). |
| 65 | |
| 66 | Слой layout не должен вычислять эти сущности из UI-дерева; он получает их из Intent-stage. |
| 67 | |
| 68 | --- |
| 69 | |
| 70 | ## Последствия |
| 71 | |
| 72 | ### Плюсы |
| 73 | |
| 74 | - Чат становится консистентным с общей моделью Skia-инструментов (0055). |
| 75 | - Треды/подтверждения получают явно управляемую композицию, а не "плоскую ленту с костылями". |
| 76 | - Reuse pipeline-практик, уже проверенных на Semantic Map. |
| 77 | |
| 78 | ### Минусы |
| 79 | |
| 80 | - Увеличивается сложность chat-подсистемы. |
| 81 | - Требуется держать строгие snapshot/contract tests, потому что surface больше не дублируется вторым UI-путём. |
| 82 | |
| 83 | --- |
| 84 | |
| 85 | ## Не-цели |
| 86 | |
| 87 | - Не возвращать параллельный Avalonia list-path как "страховочный" baseline без новой ADR. |
| 88 | - Не фиксировать здесь итоговый visual language (цвета, типографика, анимации) — это отдельные UX-итерации. |
| 89 | - Не менять MCP-контракты чата в этой ADR без отдельной контрактной фиксации. |
| 90 | |
| 91 | --- |
| 92 | |
| 93 | ## План внедрения (минимум) |
| 94 | |
| 95 | 1. Ввести каркас `ChatSurfaceCompositor` и stage-контракты (`Intent/Declutter/Layout`) в стиле 0055. |
| 96 | 2. Поднять intent-слой: `ThreadNode` / `MessageNode` / `ConfirmationNode` / `DecisionEdge` поверх канонической истории диалога. |
| 97 | 3. Подключить `ClarificationBatch` / `ClarificationResponse` к реальному chat flow и MCP entrypoints, без строкового схлопывания как единственной правды. |
| 98 | 4. Добавить snapshot/contract-тесты композиции и threading/clarification сценариев. |
| 99 | |