Forge
markdowndeeb25a2
1# ADR 0056: Semantic Map adoption of Skia composition pipeline
2
3**Статус:** Accepted · Implemented
4**Дата:** 2026-04-17
5
6## Связанные ADR
7
8| ADR | Роль |
9|-----|------|
10| [0053](0053-semantic-map-control-flow-pfd.md) | controlFlow intent, раскладка |
11| [0055](0055-skia-instrument-composition-pipeline.md) | Общий Skia pipeline |
12| [0067](0067-graph-backed-surfaces-contract.md) | Контракт graph-backed surface |
13
14---
15## Контекст
16
17После внедрения `controlFlow` для Semantic Map выяснилось:
18
191. Layout и политика плотности были частично размазаны между VM/контролом/движком.
202. На компактном PFD viewport узлы слипались, чтение маршрута ухудшалось.
213. Поведение MCP без явных `line/column` требовало предсказуемого fallback к текущему курсору.
22
23---
24
25## Решение
26
27<a id="adr0056-p1"></a>
28### 1) Перевести Semantic Map на отдельный композитор инструмента
29
30Введён `CodeNavigationMapCompositor` как первый доменный адаптер общего подхода из ADR 0055:
31
32- выбор layout по `semantic_map.level`;
33- вычисление рекомендуемой высоты viewport для читаемости;
34- возврат scene + параметров отображения.
35
36<a id="adr0056-p2"></a>
37### 2) Явно разделить file/controlFlow композицию
38
39- `file` использует компактную схему (исторический star layout);
40- `controlFlow` использует вертикальный flight-plan layout с большим шагом между уровнями.
41
42<a id="adr0056-p3"></a>
43### 3) Сохранить семантику метода "под курсором"
44
45Для `controlFlow`:
46
47- без валидной позиции не делать fallback на "первый метод файла";
48- если `line/column` не переданы через MCP, подставлять текущую позицию каретки;
49- при отсутствии позиции и каретки возвращать пустой подграф, а не ложный контент.
50
51---
52
53## Последствия
54
55### Плюсы
56
57- Semantic Map стала первым валидированным потребителем общего pipeline.
58- Граница "instrument internals vs host surface" стала прозрачной в коде.
59- Улучшена читаемость controlFlow в узком viewport.
60
61### Минусы
62
63- Появился дополнительный слой композиции и новые тесты.
64- Declutter-policy пока минимальный и требует дальнейшей эволюции.
65
66---
67
68## Реализация (срез)
69
70- `Services/Navigation/CodeNavigationMapCompositor.cs`
71- `Services/Navigation/ICodeNavigationMapCompositor.cs`
72- `ViewModels/MainWindowViewModel.WorkspaceNavigationMap.cs`
73- `Views/WorkspaceNavigationMapView.axaml`
74- `Services/Navigation/CodeNavigationMapControlFlowGraphLayoutEngine.cs`
75- `Services/CodeNavigation/CodeNavigationControlFlowSubgraphBuilder.cs`
76
77---
78
79## Тесты
80
81- `CodeNavigationMapCompositorTests`
82- `CodeNavigationMapControlFlowGraphLayoutEngineTests`
83- `CodeNavigationControlFlowSubgraphBuilderTests`
84- `CodeNavigationControlFlowMcpCursorFallbackTests`
85
86
View only · write via MCP/CIDE