Forge
markdowndeeb25a2
1# ADR 0102: Data Acquisition Layer — граница внешних интерфейсов и адаптеров
2
3**Статус:** Accepted
4**Дата:** 2026-04-26
5
6## Связанные ADR
7
8| ADR | Роль |
9|-----|------|
10| [0006](0006-presentation-layers-and-feature-slices.md) | связанный ADR |
11| [0008](0008-mcp-contracts-and-testable-infrastructure.md) | связанный ADR |
12| [0009](0009-strangler-migration-and-exceptions.md) | связанный ADR |
13| [0094](0094-ingestion-bus-afdx-analogy-and-threading-channels.md) | связанный ADR |
14| [0095](0095-workspace-solution-ide-health-stratification.md) | связанный ADR |
15| [0097](0097-cockpit-compute-units-transport-to-channel-dto.md) | связанный ADR |
16| [0099](0099-ide-databus-typed-events-and-projections.md) | связанный ADR |
17
18
19## Резюме
20
21- **DAL** — явная граница добычи внешних данных.
22- Контракт DAL ↔ CCU ↔ UI; сырой I/O не в VM.
23
24
25---
26
27<a id="adr0102-context"></a>
28
29## 1. Контекст
30
31В кодовой базе есть вычислительные юниты (CCU), orchestration в `MainWindowViewModel` и набор сервисов/адаптеров, которые читают внешние источники (файлы, процессы, конфиги, wire payload).
32Без отдельного каноничного термина и границы этот внешний слой «расползается» по `Services`, `ViewModels`, а иногда попадает в `ComputingUnits`.
33
34Это создаёт дрейф:
35
36- CCU начинают смешиваться с IO;
37- сложно автоматически проверять границы анализаторами;
38- растёт связность и стоимость рефакторинга.
39
40---
41
42<a id="adr0102-decision"></a>
43
44## 2. Решение
45
46Ввести и закрепить единый термин: **Data Acquisition Layer (DAL)**.
47
48`DAL` — слой внешних интерфейсов для вычислительного контура: входящий сбор/чтение и исходящая передача данных наружу.
49
50<a id="adr0102-dal-in-scope"></a>
51
52### В DAL входит
53
54- `fs` операции (`File`, `Directory`, проверка существования, пути);
55- запуск внешних процессов и сбор их вывода;
56- parse/serialize внешних форматов (`json`, `toml`, wire payload);
57- интеграционные резолверы и адаптеры источников.
58- исходящая передача наружу (запись, отправка, внешние вызовы), где это требуется фичей.
59
60<a id="adr0102-dal-out-of-scope"></a>
61
62### В DAL не входит
63
64- вычисление смысловых snapshot/DTO канала;
65- UI-рендер и UI-композиция;
66- маршрутизация слотов/поверхностей.
67
68---
69
70<a id="adr0102-ccu-ui-boundary"></a>
71
72## 3. Граница с CCU и UI
73
74- **DAL**: добывает и нормализует внешние данные.
75- **CCU** (`Cockpit/ComputingUnits/*`): считает смысловые snapshot/DTO из уже подготовленного входа.
76- **CDS/UI**: отображают готовые снимки.
77
78Инвариант:
79
801. CCU не выполняет прямых внешних вызовов (ни inbound, ни outbound).
812. DAL не подменяет собой CCU-композицию канала.
823. `MainWindowViewModel` не становится местом массовой добычи данных из внешнего мира.
83
84---
85
86<a id="adr0102-code-layout"></a>
87
88## 4. Размещение кода (strangler)
89
90Базовое размещение DAL:
91
92- `Features/<Feature>/DataAcquisition/*`
93
94Соседний слой для orchestration/use-case логики:
95
96- `Features/<Feature>/Application/*`
97
98Разделение ответственности:
99
100- `DataAcquisition` — адаптеры внешнего мира (I/O, process, wire, API).
101- `Application` — подготовка use-case payload/правил сценария без прямых внешних вызовов.
102 Для классов оркестрации рекомендуется явный нейминг `*Orchestrator`.
103- `CCU` — вычисление смысловых snapshot/DTO канала.
104
105На переходном этапе допустимы узкие адаптеры в `Services/*`, если:
106
107- есть явный интерфейс;
108- слой не тянет UI;
109- есть план переноса в feature-инфраструктуру.
110
111---
112
113<a id="adr0102-first-slice-example"></a>
114
115## 5. Пример первого среза
116
117Launch-контур:
118
119- `LaunchProfilesStore` и `LaunchSettingsJsonImport` относятся к DAL;
120- `LaunchReadinessUnit`, `LaunchPreResolvePipelineUnit`, `LaunchProfileProjectResolveUnit` остаются в CCU;
121- `MainWindowViewModel` выполняет orchestration.
122
123---
124
125<a id="adr0102-guardrails"></a>
126
127## 6. Проверка границ
128
129Для DAL/CCU вводятся архитектурные guardrails (CASCOPE*):
130
131- запрет IO/process/wire parse в `Cockpit/ComputingUnits/*`;
132- запрет зависимостей CCU на `ViewModels/Views/Ui*`;
133- поэтапный rollout: warning -> baseline cleanup -> error.
134
135---
136
137<a id="adr0102-consequences"></a>
138
139## 7. Последствия
140
141- Граница «добыча данных vs вычисление смысла» становится явной.
142- Рефакторинг `Services` в feature-срезы становится детерминированным.
143- Анализаторы получают однозначную цель для правил.
144
145---
146
147<a id="adr0102-non-goals"></a>
148
149## 8. Не цели
150
151- Big-bang перенос всех `Services/*` в один коммит.
152- Принудительный rename всех существующих namespace за один этап.
153- Изменение контракта DataBus этим ADR.
154
View only · write via MCP/CIDE