Forge
markdowndeeb25a2
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
381. **Intent**: построение модели текущего состояния диалога (треды, pending confirmations, активные ветви).
392. **Declutter**: приоритизация сообщений/подтверждений и компрессия шумовых элементов.
403. **Layout**: раскладка узлов разговора и карточек подтверждений.
414. **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
53Avalonia остаётся 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
951. Ввести каркас `ChatSurfaceCompositor` и stage-контракты (`Intent/Declutter/Layout`) в стиле 0055.
962. Поднять intent-слой: `ThreadNode` / `MessageNode` / `ConfirmationNode` / `DecisionEdge` поверх канонической истории диалога.
973. Подключить `ClarificationBatch` / `ClarificationResponse` к реальному chat flow и MCP entrypoints, без строкового схлопывания как единственной правды.
984. Добавить snapshot/contract-тесты композиции и threading/clarification сценариев.
99
View only · write via MCP/CIDE