Forge
markdowndeeb25a2
1# Миграция к архитектурной политике CascadeIDE
2
3**Связь:** [architecture-policy.md](architecture-policy.md).
4**Подход:** strangler — по фазам, без остановки разработки.
5
6## Стратегия: опора на целевой каркас (CDS · CCU · DAL · IDS)
7
8Геометрия **канал→композитор кабины (CDS)** ([ADR 0036](adr/0036-cds-channel-compositor-surface-pipeline.md)), **вычислительных блоков кабины (CCU)** ([ADR 0097](adr/0097-cockpit-compute-units-transport-to-channel-dto.md)), **DAL vs Application vs UI** ([ADR 0102](adr/0102-data-acquisition-layer-boundary-and-contract.md)) и **IDS** ([ADR 0079](adr/0079-ide-display-system-ids-overlay-pipeline.md)) уже **устоялась** как целевая линия: новые возможности смешиваем с нею, а не с параллельными локальными «мини-архитектурами» в главном окне.
9
10Иначе неизбежное **наполнение `MainWindowViewModel` новыми фичами** съест запас времени на приведение к этому каркасу. Поэтому:
11
121. **Держим активный упрощающий буфер** вокруг MW: последовательное сужение крупных partial-кластеров (MCP, `Presentation*` / `ShellState`, карта workspace и др.) через оркестраторы и политики в `Features/<домен>/` — см. ниже Wave 1 (MCP / UI clusters).
132. **Новая логика по умолчанию** живёт в `Features/` по слоям DAL → Application/CCU-потребители → биндинг на VM; главный VM — **тонкий композитор** там, где уместно уже зафиксировано таблицей «Целевая карта срезов» и [ADR 0006](adr/0006-presentation-layers-and-feature-slices.md).
143. **[ADR 0009](adr/0009-strangler-migration-and-exceptions.md)** остаётся в силе: полное стирание исторического монолита по дедлайну не обязательно — но без пункта 1 можно соблюдать strangler формально и при этом **не приблизиться к каркасу**, если главный узел только разрастается новыми фичами без выносов.
15
16## Текущее состояние
17
18<!-- AUTO:MAIN-WINDOW-SLICE:SUMMARY:BEGIN -->
19
20`MainWindowViewModel` — **композитор окна**: конструктор, подписки, мост `IIdeMcpActions` → `IdeMcpCommandExecutor`, оркестрация решения/сборки/LSP/MCP. Объём **~5.2k строк** суммарно по partial-классу `MainWindowViewModel*.cs` (**~5.2k**) плюс диспетчер `IdeMcpCommandExecutor*.cs` и `Generated/IdeMcpCommandExecutor.Generated.g.cs` (**~0k**); счётчики — ориентир по состоянию репозитория (авто: 2026-07). Чат, Git, терминал, сборка, инструментирование и т.д. — в **`Features/*`** как дочерние VM; цель дальше — **сужать** главный VM по мере доработок (вынос в сервисы, план B).
21
22<!-- AUTO:MAIN-WINDOW-SLICE:SUMMARY:END -->
23
24### Срез `MainWindowViewModel` (карта partial-файлов)
25
26Имена **по алфавиту** — для поиска; строки — `Measure-Object -Line` по `.cs` (пересчёт: `tools/Update-ArchitectureMigrationMainWindowSlice.ps1`).
27
28<!-- AUTO:MAIN-WINDOW-SLICE:MWVM-TABLE:BEGIN -->
29
30| Файл | Строк (≈) | Содержание |
31|------|------------|------------|
32| `MainWindowViewModel.AgentEnvironment.cs` | 121 | AEE: PFD Verify Epoch instrument, chat trace, epoch stale on write (ADR 0148 W3–W5). |
33| `MainWindowViewModel.AgentHarness.cs` | 39 | Agent harness: auto-verify coalescing after .cs writes (ADR 0166 interim). |
34| `MainWindowViewModel.AutonomousAgent.cs` | 113 | Автономный агент (Power). |
35| `MainWindowViewModel.Capabilities.cs` | 23 | Реестр capabilities. |
36| `MainWindowViewModel.CascadeChord.cs` | 107 | Аккордный слой ADR 0060: корень `cascade_chord` из hotkeys.toml (по умолчанию Ctrl+K), затем тот же хвост мелодии, что после `c:`. Однозначный обычный alias (например `so`) исполняется без Enter при отсутствии более длинного alias-префикса; параметрические (`wai:`, `els:`:…) — только по Enter или из палитры. При конфликте префиксов (`gs` vs `gsu`) — точный хвост или Enter. |
37| `MainWindowViewModel.CockpitCommandLine.cs` | 24 | Cockpit Command Line на Forward host: `primary=intercom` — Skia в ChatPanel; `primary=editor` — оверлей `CockpitCommandLineOverlayView` (ADR 0120). |
38| `MainWindowViewModel.CommandPalette.cs` | 166 | Палитра команд. |
39| `MainWindowViewModel.CompactIdeLayout.cs` | 85 | Compact tier IDE-scan presentation (ADR 0171 §2.3): Forward center, PFD/Intercom right or bottom, MFD bottom. |
40| `MainWindowViewModel.CorrespondenceShell.cs` | 24 | Страница Correspondence (CRS) в оболочке Mfd (ADR 0156). |
41| `MainWindowViewModel.cs` | 376 | Главный композитор окна (partial-класс, несколько `MainWindowViewModel*.cs`). Карта файлов и ответственности — `docs/architecture-migration.md`, раздел «Срез MainWindowViewModel». |
42| `MainWindowViewModel.CSharpLsp.cs` | 138 | Запуск/перезапуск C# LSP. |
43| `MainWindowViewModel.CursorAcp.cs` | 36 | Путь Cursor ACP и предпочитаемая модель. |
44| `MainWindowViewModel.DebugStackUi.cs` | 35 | Выбор кадра в панели «Стек» Mfd: подгрузка Locals для выбранного кадра (DAP). |
45| `MainWindowViewModel.DockInstrumentSlots.cs` | 34 | Какой инструмент показан в слотах PFD/MFD главного окна — по `InstrumentPlacementRuntime` и `DisplaySettings` (в т.ч. `[display.instrument_routing]` и merge `workspace.toml`). Логика — `MainWindowDockedGridInstrumentSlots`. |
46| `MainWindowViewModel.DocumentsDock.cs` | 29 | Документы / dock. |
47| `MainWindowViewModel.EditorNavigation.cs` | 9 | Monaco editor navigation service wiring for MainWindow. |
48| `MainWindowViewModel.EditorOllama.cs` | 30 | Состояние редактора, Markdown и выбора модели Ollama. |
49| `MainWindowViewModel.EditorSession.cs` | 129 | Wave 2: `EditorWorkspaceViewModel` + прокси на MWVM для существующих привязок и MCP. |
50| `MainWindowViewModel.Eicas.cs` | 17 | Канал EICAS / CAS — отдельно от полосы телеметрии контура работы (ADR 0021, вариант A). |
51| `MainWindowViewModel.EnvironmentReadiness.cs` | 48 | Снимок «готовность окружения» (ADR 0023), отдельно от Workspace Health. |
52| `MainWindowViewModel.FeatureCommandProxies.cs` | 66 | Wave 2: прокси RelayCommand на feature VMs (XAML, MCP, hotkeys без смены привязок). |
53| `MainWindowViewModel.FeatureSessions.cs` | 13 | Wave 2 этап 5: application shell, debug, build session VMs. |
54| `MainWindowViewModel.HybridIndex.cs` | 145 | Hybrid Codebase Index (HCI): status projection and UI commands for the HIS (MFD) page. |
55| `MainWindowViewModel.HybridIndexSettings.cs` | 18 | Привязки окна настроек к `HybridIndex` (ADR 0106). |
56| `MainWindowViewModel.IdeHealth.cs` | 95 | Связка с Workspace Health. |
57| `MainWindowViewModel.IdeMcpHostLifecycle.cs` | 20 | Жизненный цикл IDE MCP-хоста: `ide_ping`, перезапуск внешних MCP и stdio-сессии Cursor ACP. |
58| `MainWindowViewModel.IntercomAttachAffordances.cs` | 69 | Intercom attach affordances: selection hotkey, drag-to-composer (ADR 0128). |
59| `MainWindowViewModel.IntercomAttachmentReveal.cs` | 44 | Reveal вложения Intercom из чата: загрузка решения при необходимости, затем навигация в редактор (ADR 0128). |
60| `MainWindowViewModel.IntercomFeedMetrics.cs` | 26 | `[intercom] feed_metrics` — плотность Skia-ленты (comfortable / compact). |
61| `MainWindowViewModel.IntercomTransport.cs` | 34 | Координатор team transport Intercom: подключение SSE/HTTP ingest и делегирование в ChatPanel. |
62| `MainWindowViewModel.IntercomTransportSettings.cs` | 35 | Привязки `[intercom.transport]` и Connect/Disconnect (ADR 0144). |
63| `MainWindowViewModel.LaunchProfiles.cs` | 90 | Селектор launch profile, импорт `launchSettings.json` (ADR 0090). |
64| `MainWindowViewModel.LayoutNotifications.cs` | 17 | Инвалидация производных высот `MainGrid` без длинных цепочек `NotifyPropertyChangedFor` в ShellState. |
65| `MainWindowViewModel.MagicLink.cs` | 54 | Magic link: pipe-сервер single-instance и обработка URI. |
66| `MainWindowViewModel.MarkdownExport.cs` | 31 | Экспорт Markdown. |
67| `MainWindowViewModel.MarkdownLsp.cs` | 103 | Запуск/перезапуск Markdown LSP. |
68| `MainWindowViewModel.McpBreakpointReveal.cs` | 49 | MCP: постановка брейкпоинта с загрузкой решения и показом строки в редакторе. |
69| `MainWindowViewModel.McpHostBridge.cs` | 54 | Внутренний мост для `MainWindowIdeMcpHost` (Wave 2 Big Bang). |
70| `MainWindowViewModel.MfdShell.cs` | 62 | Оболочка Mfd: одна активная страница; навигация — команды и палитра. Якорь на экране задаётся presentation (зона Mfd в main и/или окно-хост). |
71| `MainWindowViewModel.PfdBackgroundStatus.cs` | 235 | Компактная полоса статуса над PFD/Forward: Verify Epoch (AEE W3) и solution warm-up (ADR 0141). |
72| `MainWindowViewModel.Presentation.cs` | 287 | Вычисляемые свойства разметки, Workspace Health и видимости панелей (режимы UI). |
73| `MainWindowViewModel.PresentationLayout.CockpitSurfaceSnapshot.cs` | 8 | Сборка `CockpitSurfaceState` главного окна (`Build`). |
74| `MainWindowViewModel.PresentationLayout.cs` | 113 | ADR 0017: строка `presentation` и второй `TopLevel` — `MfdHostWindow` с полным вторичным контуром (п. 8). |
75| `MainWindowViewModel.PresentationLayout.HostShell.cs` | 47 | События «окно-хост открыло полный контур» — скрытие колонок в main (`PresentationLayout`). |
76| `MainWindowViewModel.PresentationLayout.HostWindowBounds.cs` | 84 | Персистенция геометрии окон-хостов пресета `presentation` (ADR 0017). |
77| `MainWindowViewModel.PresentationLayoutAuthority.cs` | 14 | Запись intent видимости панелей (семантика «хочу»); фактическая поверхность — `MainWindowShellSurfaceCompositor`. |
78| `MainWindowViewModel.PresentationTier.cs` | 75 | Presentation tier compact vs cockpit (ADR 0171). |
79| `MainWindowViewModel.PrimaryWorkSurface.cs` | 77 | Переключатель лобового якоря Intercom / Editor (ADR 0120). |
80| `MainWindowViewModel.SettingsReactive.cs` | 228 | Реакции на изменение полей настроек и ключей API: диск, автономный агент, панели. |
81| `MainWindowViewModel.ShellConstruction.cs` | 272 | Конструктор и композиция shell: дочерние VM, шина, DAP/HCI, топология presentation (ADR 0017). |
82| `MainWindowViewModel.ShellSession.cs` | 192 | Wave 2 этап 3: `ShellChromeViewModel` + прокси на MWVM для привязок и presentation. |
83| `MainWindowViewModel.ShellState.AiProviders.cs` | 58 | Часть `ShellState`: режим ИИ и облачные ключи привязаны к нижнему приложению/чату. |
84| `MainWindowViewModel.ShellState.AutonomousAgentStripe.cs` | 64 | Часть `ShellState`: полоса/карточки автономной задачи агента, безопасности, LOC и сводки тестов для IDE Health. |
85| `MainWindowViewModel.ShellState.ChatAndSessionConfig.cs` | 34 | Часть `ShellState`: ввод чата и конфиг MCP/ACP для автономной сессии. |
86| `MainWindowViewModel.ShellState.cs` | 12 | Состояние раскладки главного окна: три зоны внимания в `MainGrid` (PFD · Forward · MFD), см. ADR 0021 и `docs/ui-ux/cascade-ide-ui-layout-v1.md`. Терминал, сборка, Git и пр. — во вторичном контуре колонки MFD (`MfdShellView` / `MfdShellPageStack`); отдельной строки «нижней панели» на всю ширину под сеткой нет. Режим ИИ и облачные ключи — `MainWindowViewModel.ShellState.AiProviders.cs`; чат и MCP/ACP — `MainWindowViewModel.ShellState.ChatAndSessionConfig.cs`; полоса агента / тесты для IDE Health — `MainWindowViewModel.ShellState.AutonomousAgentStripe.cs`; регион MFD/PFD и страницы контура — `ShellState.RegionAndContour.cs`; режим/UI-сессия и полосы — `ShellState.UiSessionChrome.cs`; модель/Kroki — `ShellState.ModelPullMarkdown.cs`. |
87| `MainWindowViewModel.ShellState.ModelPullMarkdown.cs` | 20 | Часть `MainWindowViewModel`: pull модели и превью Markdown / Kroki. |
88| `MainWindowViewModel.SolutionBuild.cs` | 125 | Загрузка решения, Ollama install; сборка — `MainWindowBuildSessionViewModel`. |
89| `MainWindowViewModel.SolutionExplorer.cs` | 112 | Solution Explorer: фильтр, compact, track active, индекс файлов (ADR 0167). |
90| `MainWindowViewModel.SolutionWarmup.cs` | 61 | Solution warm-up: оркестратор фаз загрузки решения, лампа статуса и подписка на DataBus (ADR 0141). |
91| `MainWindowViewModel.StartupProject.cs` | 140 | Стартовый проект. |
92| `MainWindowViewModel.UiGitWorkspace.cs` | 126 | Git + workspace UI. |
93| `MainWindowViewModel.ViewBridge.cs` | 68 | Колбэки и провайдеры, которые View подставляет в главный VM (диалоги, UI automation). |
94| `MainWindowViewModel.WebAiPortal.cs` | 29 | Страница MFD «веб-портал» (ADR 0108): URL, результат последнего вызова моста, `WebAiPortalCommandBridge`. |
95| `MainWindowViewModel.WorkspaceNavigationMap.Bridge.cs` | 50 | Мост к `WorkspaceNavigationMapViewModel` (ADR 0039): host + lifecycle, без прокси-привязок. |
96| `MainWindowViewModel.WorkspaceSplitters.cs` | 23 | Сплиттеры рабочей области (MainGrid, обозреватель решения, Git и т.д.): режим «взлёт» — блокировка перетаскивания. |
97
98<!-- AUTO:MAIN-WINDOW-SLICE:MWVM-TABLE:END -->
99
100### `IdeMcpCommandExecutor` (диспетчер MCP → `IIdeMcpActions`)
101
102<!-- AUTO:MAIN-WINDOW-SLICE:EXEC-TABLE:BEGIN -->
103
104| Файл | Строк (≈) | Содержание |
105|------|------------|------------|
106
107<!-- AUTO:MAIN-WINDOW-SLICE:EXEC-TABLE:END -->
108
109**Техдолг по главному VM (не блокирует развитие):** крупные куски MCP по-прежнему рядом с VM (`IdeMcpActions.*`); дальнейший вынос — по мере изменений. **Странглер-фасад и уведомления UI:** связка списка `HybridIndexDependentPresentationNames` и `[NotifyPropertyChangedFor]` у `_hybridIndexLast` закреплена тестом `HybridIndexPresentationNotificationsConsistencyTests`; пачечные вызовы `OnPropertyChanged` для Workspace Health IDE, док-инструментов в слотах и глифов брейкпоинтов сведены к статическим массивам имён и циклу в partial-файлах главного VM. **План B по примитивам MCP для текущего объёма закрыт:** координаты/пути редактора (`EditorTextCoordinateUtilities`), разбор JSON панели отладки (`McpDebugPayloadParsing`), чтение полей args MCP (`McpCommandJsonArgs` в `Services/`) — вне `ViewModels/`. **Готовность окружения ([ADR 0023](adr/0023-environment-readiness-glance.md)):** полный список строк — `EnvironmentReadinessSnapshotBuilder.BuildAllRowsAsync` в `Features/EnvironmentReadiness/Application/` (DAL/канал CCU, ADR 0102); обновление страницы — `EnvironmentReadinessRefreshOrchestrator` (канал → compositor на UI), главный VM вызывает только оркестратор. **Cursor ACP (ADR 0102):** разрешение пути к `cursor-agent`, stdio-процесс и fs в пределах workspace — `Features/CursorAcp/DataAcquisition/`; сессия ACP и `IAcpClient` — `Services/CursorAcp/CursorAcpChatConnection`. **Настройки (ADR 0102):** пути к `%LocalAppData%\CascadeIDE\`, hotkeys и чтение внешнего JSON MCP — `Features/Settings/DataAcquisition/` (`UserSettingsPaths`, `TextFileReadWrite`, `HotkeyTomlLoader`); сериализация и merge display — `Services/SettingsService`. **Workspace (ADR 0102):** загрузка .sln/.csproj, дерево проекта, поиск .sln у файла, папка-workspace, разрешение `workspace_path` для отладки — `Features/Workspace/DataAcquisition/`; обход `SolutionItem` для MCP/JSON — `Features/Workspace/Application/McpSolutionTree`.
110
111## Целевая карта срезов
112
113| Срез | Что сейчас (где живёт) | Целевое размещение | Примечание |
114|------|------------------------|-------------------|------------|
115| **Git** | Оркестрация и MCP на `MainWindowViewModel`; вкладка — `GitPanelViewModel` | `Features/Git/GitPanelViewModel` + `GitStatusRow` в `Models/` | `MainWindow` передаёт workspace, `LoadSolution`, MCP commit/push; телеметрия полосы частично в `UiGitWorkspace` / `ShellState` |
116| **Инфраструктура git** | `Process` + `git` внутри VM | `Services/IGitCommandRunner` / `GitCommandRunner` | Общий для панели, полосы телеметрии, MCP `GitCommit`/`GitStatus` |
117| **Сборка / вывод** | Текст вывода в `BuildOutputPanelViewModel`; оркестрация сборки в `MainWindowViewModel` | `Features/Build/BuildOutputPanelViewModel` | Вкладка Build output |
118| **Терминал** | `TerminalPanelViewModel` | `Features/Terminal/TerminalPanelViewModel` | Вкладка Terminal (телеметрия Power на той же вкладке — пока на главном VM) |
119| **Чат** | История, ввод, `SendChat`, стриминг в `ChatPanelViewModel` | `Features/Chat/ChatPanelViewModel` + `ChatMessageViewModel` | Правая колонка; провайдер/модель и контекст редактора — замыкания на `MainWindowViewModel` |
120| **Инструментирование** | События, таймлайн, агент, тесты, MCP-отладка | `Features/Instrumentation/InstrumentationPanelViewModel` | В разметке — `DataContext="{Binding InstrumentationPanel}"` + `x:DataType`; главный VM не дублирует поля |
121| **Решение и документы** | `SolutionRoots`, `OpenDocuments`, dock | **`SolutionWorkspaceViewModel`** + **`DocumentsWorkspaceViewModel`** (`Features/Workspace`, `Features/Documents`); MWVM — композитор и `SolutionLoadSessionApplyProjection.IHost` | Ядро сессии IDE |
122| **MCP-мост** | `IIdeMcpActions` на `MainWindowViewModel` | Остаётся на главном VM; делегирование в сервисы/дочерние VM | Контракт стабилен |
123
124## Фазы
125
126### Фаза 0 — инфраструктура (**сделано**)
127
128- **`IGitCommandRunner` + `GitCommandRunner`:** единая точка запуска `git` по рабочему каталогу. `MainWindowViewModel` использует runner для телеметрии и MCP (`RunGitCommandAsync`).
129
130### Фаза 1 — Git-панель (**сделано**)
131
132- Состояние и команды вкладки **Git** — в **`Features/Git/GitPanelViewModel`**. Зависимости: `IGitCommandRunner`, `GetWorkspacePath`, `IIdeMcpActions`, `LoadSolution`, `RefreshGitSummaryAsync`.
133- `MainWindowViewModel`: свойство **`GitPanel`**, видимость вкладки (`IsGitPanelVisible`) и настройки остаются на главном VM; при смене `SolutionPath` вызываются `GitPanel.RefreshRepositoryFlagAsync()` и при открытой вкладке — `RefreshGitPanelAsync()`.
134- **Страница Git в MFD** (`MfdShellPageStack`): контент страницы с `DataContext="{Binding GitPanel}"` (нет отдельного `BottomPanelView` во Flight).
135
136### Фаза 2 — Build output и Terminal (**сделано**)
137
138- **`Features/Build/BuildOutputPanelViewModel`** — текст вывода сборки и связанных операций (`BuildOutput`). Видимость вкладки и команды сборки остаются в `MainWindowViewModel`; он по-прежнему заполняет `BuildOutputPanel.BuildOutput` (как для Git — оркестрация снаружи).
139- **`Features/Terminal/TerminalPanelViewModel`** — `TerminalControlModel` (AvaloniaTerminal), `EnsureSessionStarted()`, `AppendOutput()` для ACP; ConPTY/redirected через `IntegratedTerminalSessionHost`.
140- **Страницы Terminal и Build output в колонке MFD** (`MfdShellPageStack`): `DataContext="{Binding TerminalPanel}"` и `DataContext="{Binding BuildOutputPanel}"`; телеметрия Power на странице Terminal остаётся на `MainWindowViewModel`. *(В старой топологии использовались привязки в `BottomPanelView`.)*
141
142### Фаза 3 — Chat (**сделано**)
143
144- **`Features/Chat/ChatPanelViewModel`** — `ChatMessages`, `ChatInput`, `IsChatLoading`, `SendChatCommand`, стриминг через `AiProviderManager`. В конструктор передаются замыкания: активный провайдер, модель Ollama, минимальный контекст, `CurrentFilePath`, `EditorText`.
145- **`MainWindowViewModel`:** свойство **`ChatPanel`**, `IsChatPanelExpanded`, выбор провайдера/модели и быстрые команды, подставляющие текст в `ChatPanel.ChatInput`.
146- **`ChatPanelView`:** блоки сообщений и ввода с `DataContext="{Binding ChatPanel}"` (свёртка панели и пр. — по-прежнему на главном VM).
147
148### Фаза 4 — Instrumentation (**сделано**)
149
150- **`Features/Instrumentation/InstrumentationPanelViewModel`** — `AgentToolCalls`, `AgentTraceSteps`, `EventTimeline`, `PowerTaskQueueItems`, `TestResultsOutput`, стек/переменные MCP-отладки; `AppendAgentTraceStep` (потокобезопасно).
151- **`ViewModels/`** — `DebugStackFrameViewModel`, `DebugVariableViewModel`, `AgentTraceStepViewModel` вынесены в отдельные файлы (типы для `x:DataType` без изменений).
152- **`MainWindowViewModel`:** свойство **`InstrumentationPanel`**, подписка на `IsDebugPanelVisible` для строк телеметрии полосы; `IIdeMcpActions.ShowDebugState` и `RunTests` пишут в `InstrumentationPanel`. Дочерние виды биндят блоки к `InstrumentationPanel`, без прокси на главном VM.
153
154### Фаза 5 — события, UI-поток, нагрузка (**основное сделано**)
155
156Цель и порядок шагов зафиксированы в ADR: [0004](adr/0004-ui-thread-marshaling.md) (маршалинг UI), [0007](adr/0007-signals-coupling-and-ui-backpressure.md) (сигналы, батчинг), [0005](adr/0005-defer-dynamic-plugins-mef.md) (отложенные идеи расширяемости). Краткий навигатор — [architecture-policy.md](architecture-policy.md). Кратко:
157
158<a id="arch-migration-phase5-p1"></a>
1591. Явные границы между источниками сигналов и подписчиками (без лишней связности между подсистемами).
160<a id="arch-migration-phase5-p2"></a>
1612. Единая политика маршалинга на UI-поток для обновлений после фона.
162<a id="arch-migration-phase5-p3"></a>
1633. Точечно — очереди/батчинг там, где поток данных давит на UI.
164
165**Сделано по [п. 2](#arch-migration-phase5-p2):** контракт **`IUiScheduler`**, реализация **`AvaloniaUiScheduler`** (единственное место с прямым `Dispatcher.UIThread`), доступ из кода через **`UiScheduler.Default`**. Вызовы переведены с размазанного `Dispatcher.UIThread` на `UiScheduler.Default`; для удобства — **`GlobalUsings.cs`** с `global using CascadeIDE.Services`.
166
167**Сделано по [п. 3](#arch-migration-phase5-p3) (диагностики):** **`WorkspaceDiagnosticsCoordinator`** — debounce для Roslyn без LSP; **`CSharpLspDiagnosticsHost`** — коалесcing **`DiagnosticsChanged`** (один `Post` на серию `textDocument/publishDiagnostics`, по тому же принципу, что **`BuildOutputPanelViewModel.Append`**).
168
169**Опционально позже по фазе 5:** при профилировании — ещё батчинг на стороне подписчиков Problems; шина событий / слабее связность ([п. 1](#arch-migration-phase5-p1)) — только если вырастет число кросс-подсистемных подписок.
170
171**Сделано по MCP и UI-потоку (дыра закрыта):** единый вход `IIdeMcpActions.ExecuteCommandAsync` в `MainWindowViewModel` маршалит выполнение на UI через `IUiScheduler.InvokeAsync(Func<Task<string>>)`; добавлен перегруз `InvokeAsync<T>(Func<Task<T>>)` в `IUiScheduler` / `AvaloniaUiScheduler`. Так MCP stdio и автономный агент не вызывают хендлеры `IdeMcpCommandExecutor` с фонового потока. Долгие операции по-прежнему не блокируют UI: внутри `IIdeMcpActions` используются `ConfigureAwait(false)`, `Task.Run`, `Post` на панели вывода и т.д.
172
173### План: связность `MainWindowViewModel` / MCP (не фаза 5, отдельная дорожка)
174
175| Шаг | Смысл |
176|-----|--------|
177| **A — сделано** | Один канал маршалинга MCP → UI (`ExecuteCommandAsync` + `InvokeAsync<Task<string>>`), документация на входе executor. |
178| **B — примитивы (текущий объём закрыт)** | Разбор аргументов JSON и вспомогательная логика без UI — в `Services/` (`EditorTextCoordinateUtilities`, `McpDebugPayloadParsing`, `McpCommandJsonArgs`); `IdeMcpCommandExecutor` остаётся диспетчером к `IIdeMcpActions`. |
179| **B — дальше по мере роста** | Новые фичи по возможности — в сервисы с узким интерфейсом; VM — оркестратор и `IIdeMcpActions`, без раздувания «командными» методами. |
180
181**Не блокирует продукт:** выделение **`SolutionWorkspaceViewModel`**, MEF/плагины, опциональный дополнительный батчинг Problems — см. политику и таблицу срезов выше.
182
183**Сделано:** коалесcing обновлений **`BuildOutput`** в **`BuildOutputPanelViewModel.Append`** (один `Post` на серию вызовов; `Set`/`Clear`/`FlushPending` инвалидируют отложенный flush); после **`BuildSolutionAsync`** вызывается **`FlushPending`**, чтобы текст и флаг сборки были согласованы до чтения MCP.
184
185**Не в этой фазе:** MEF и загрузка плагинов из каталога — зафиксировано как отложенная идея в политике.
186
187## Feature archetype v1 (DoD новой фичи)
188
189Чеклист «куда класть код» и шаблон каталогов — **[design/feature-archetype-v1.md](design/feature-archetype-v1.md)**. IDE chrome tokens — **[design/ide-chrome-tokens-v1.md](design/ide-chrome-tokens-v1.md)**. Цель: развитие в том же ритме, что CDS/CCU/DAL/IDS, без роста MWVM по умолчанию.
190
191## Правила на время миграции
192
1931. Новый код фич — **в срезе** `Features/<Имя>/`, не в конец `MainWindowViewModel`. См. [feature-archetype-v1.md](design/feature-archetype-v1.md). Панельный VM вешаем на UI через **`DataContext="{Binding ИмяПанели}"`** (и при compiled bindings — **`x:DataType`** на том же элементе), а не через десятки прокси-свойств на главном VM.
1942. Повторное использование **git** — только через `IGitCommandRunner` (или обёртки), не копировать `Process`.
1953. Изменения в `MainWindowViewModel` по старым фичам — по возможности сопровождать **микро-выносом** в сервис/панельный VM.
1964. Добыча внешних данных (fs/process/json/toml/wire) — в **Data Acquisition Layer** (`Features/<Feature>/DataAcquisition`), а не в `Cockpit/ComputingUnits/*` (см. ADR 0102).
1975. Крупную бизнес-логику в `MainWindowViewModel` не наращивать: сначала оркестратор/политика в `Features/<>` с узким контрактом; MV — только проверки контекста окна, вызов и обновление UI/шины (см. раздел «Стратегия: опора на целевой каркас» выше).
198
199## Wave 1: MCP thinning (практический срез)
200
201Цель волны: уменьшить плотность логики в `MainWindowViewModel.IdeMcpActions.*`, сохранив `MainWindowViewModel` как orchestration-слой.
202
203- Вынести из `IdeMcpActions.*` подготовку payload/парсинг/валидацию в feature-application сервисы с узкими интерфейсами.
204- Оставить в `MainWindowViewModel` только:
205 - проверку preconditions контекста окна;
206 - вызов соответствующего application-сервиса;
207 - публикацию DataBus/UI обновлений.
208- Порядок первой волны: `IdeMcpActions.Editor` -> `IdeMcpActions.Navigation` -> `IdeMcpActions.BuildTest`.
209- Первый срез выполнен: JSON для `get_open_document_text` (поиск вкладки по пути через `IdeMcpEditorOrchestrator.BuildGetOpenDocumentTextResponse`), якорь control-flow для `get_code_navigation_context` (`IdeMcpNavigationOrchestrator.ResolveControlFlowLineColumn`), payload `get_solution_files` (`IdeMcpBuildTestOrchestrator.BuildSolutionFilesJson`).
210- Второй срез: `HybridIndexScopeResolver` в `Features/HybridIndex/Application/` и `IdeMcpHybridIndexScope` для MCP `codebase_index_*` (`TryResolveForCodebaseIndexCommand` — без дубля логики в VM); MCP agent-notes через `IdeMcpAgentNotesOrchestrator`; `ResolveHybridIndexScope` в VM — делегирует ресолверу. Ошибки HCI и ping/rebuild хоста вынесены в оркестраторы (**v1.38**); дальнейший вынос build/test/UI — точечно при росте API.
211- Третий срез: `Services.IdeMcpSolutionPathAvailability.IsRunnableSolutionFile` для MCP build/test/code-cleanup (I/O вне статического оркестратора, CASCOPE031); мутации UI тестов — `IdeMcpBuildTestOrchestrator.IdeMcpTestRunInstrumentationMutation`.
212- Четвёртый срез: единый контур **`BuildStateChanged` → DataBus → `RebuildIdeHealth`** (ADR 0099): локальная сборка решения и MCP code cleanup не шлют «сырой» `_ideDataBus.Publish` без пересборки полосы; MCP-пути после `ConfigureAwait(false)` используют `PublishIdeBuildStateOnUiAsync`.
213- Пятый срез: MCP git целиком на **`IdeMcpGitWorkspaceSession`** (`Features/IdeMcp/Application/`), VM — только workspace + `RefreshGitSummaryAsync`; список команд preflight-fix — приватная константа в сессии (CASCOPE030: не статическое поле в оркестраторе).
214- Шестой срез: **`IdeMcpIdeStateUiCapture`** + `BuildIdeStatePayload(capture, diagnostics)`; `get_ide_state` — diagnostics вне UI, снимок UI одним `CaptureIdeMcpIdeStateUi` (включая CDS через `BuildCockpitSurfaceSnapshot`).
215- Седьмой срез: **`IdeMcpDapSnapshotUiPlan`** / `IdeMcpDebugOrchestrator.BuildDapSnapshotUiPlan` для `ApplyDapDebugSnapshotToUi` (без `File.Exists` в Application, CASCOPE031); **`get_debug_snapshot`** — сериализация без очереди на UI (`GetSnapshot` под lock).
216
217## Wave 1: UI clusters thinning
218
219Цель волны: сократить связность крупных partial-кластеров `MainWindowViewModel` без big-bang.
220
221- Кластер `Presentation*`:
222 - удерживать вычисления раскладки/видимости в compositor/policy-сервисах;
223 - на VM оставить свойства-проекции и orchestration вызовы.
224 - первый срез (**v1.40**): **`MainWindowPresentationSurfaceProjection`** (`Features/Shell/Application`) — заголовок окна, mount-style/топология, контур MFD, телеметрия-подписи, безопасность агента, mount-контекст IDE Health; плейсхолдеры риска/результата и дефолты в **ShellState.AutonomousAgentStripe** через константу проекции.
225 - второй срез (**v1.40b**): **`IdeHealthStripPresentationProjection`** — строки полосы IDE Health (build/tests/debug line + cockpit-short) из **`IdeHealthInputSnapshot?`**; геттеры **`MainWindowViewModel.Presentation`** только проксируют последний снимок.
226 - третий срез (**v1.40c**): кластер **`PresentationLayout`** разнесён на partial: топология/MainGrid (**`PresentationLayout.cs`**), **`PresentationLayout.HostShell`**, **`PresentationLayout.HostWindowBounds`**, **`PresentationLayout.CockpitSurfaceSnapshot`** (CDS-сборка без изменения логики).
227 - четвёртый срез (**v1.40d**): **`MainWindowPresentationCapabilitiesProjection`** — булевы цепочки и подписи из **`UiModeCapabilities`** (IDE Health strip / EICAS chrome / instrumentation / risk-result карточки / Skia overlay / safety ordinal / LOC-бейдж); тесты **`MainWindowPresentationCapabilitiesProjectionTests`**.
228- Кластер `ShellState`:
229 - состояния панелей и режимов — в отдельные state-модули по доменам, не в один monolith-файл.
230 - четвёртый срез: **`MainWindowViewModel.ShellState.AiProviders.cs`** — режим ИИ (`AiMode`, облачный провайдер, вычисляемые флаги выбора) и поля API-ключей; геометрия регионов и видимость страниц MFD после v1.39 — **`ShellState.RegionAndContour`**.
231 - пятый срез: **`MainWindowViewModel.ShellState.ChatAndSessionConfig.cs`** — клавиша отправки чата, thinking/минимальный контекст, JSON внешних MCP, `AcpAutoInjectIdeMcp`.
232 - шестой срез: **`MainWindowViewModel.ShellState.AutonomousAgentStripe.cs`** — активная задача агента, риск/результат/шаг, `SafetyLevel`, LOC-бейдж, сводка/бейдж тестов для полосы IDE Health.
233 - седьмой срез (**v1.39**): enum **`CascadeIDE.Models.Shell.CommandPaletteHost`** и partial **`ShellState.RegionAndContour`** / **`ShellState.UiSessionChrome`** / **`ShellState.ModelPullMarkdown`**; «базовый» **`ShellState.cs`** сведён к краткой сводке + привязкам текстов вторичных групп редакторов.
234- Кластер `WorkspaceNavigationMap`:
235 - graph/data трансформации — в сервисы/CCU;
236 - в VM оставить binding-state и команды поверхности.
237- Первый срез (карта PFD): **`CodeNavigationMapPresentationProjection`** + статические `CodeNavigationMapSettings.ViewWantsList` / `ViewWantsGraph`; биндинги list/graph/бейдж/has-related в `MainWindowViewModel.WorkspaceNavigationMap` делегируют в проекцию.
238- Второй срез: **`WorkspaceNavigationMapContextJsonBuilder`** (ветвление related / subgraph / control-flow JSON внутри фонового refresh) и **`CodeNavigationMapViewportPolicy`** (пороги ширины viewport мини-карты); тесты `WorkspaceNavigationMapContextAndViewportTests`.
239- Третий срез: **`WorkspaceNavigationMapRefreshComposer`** — разбор JSON refresh, композиция сцены + trace-flow, related-строки; **снимок CDS для control-flow** собирается на **UI-потоке** вместе с контекстом refresh и передаётся в композитор как `CockpitSurfaceState` (без чтения VM с пула); тесты `WorkspaceNavigationMapRefreshComposerTests`.
240- Четвёртый срез (**v1.40e**): partial **`MainWindowViewModel.WorkspaceNavigationMap.Refresh`** — debounce、`RunWorkspaceNavigationMapRefreshAsync` и viewport width; файл привязок/команд карты (**`WorkspaceNavigationMap.cs`**) укорочен до состояния и проекций.
241 - пятый срез (**v1.40f**): **`MainWindowPresentationSurfaceProjection`** — видимость сплита main grid (`IsMainGridSplitColumnVisible`), флаги Skia-mount IDE Health (колонка / окно-хост), **`ResolveInstrumentMountStyleForSlot`**; отдельно **`MainWindowPresentationDapProjection`** для паузы/«running» DAP; геттеры **`MainWindowViewModel.Presentation`** только делегируют; тесты **`MainWindowPresentationDapProjectionTests`** и доп. кейсы в **`MainWindowPresentationSurfaceProjectionTests`**.
242 - шестой срез (**v1.40g**): **`IMainWindowHostSurfaceInput`** (`Cockpit/Composition/HostSurface`) — **`MainWindowHostSurfaceProjection`** принимает контракт вместо ссылки на **`MainWindowViewModel`**; реализация на VM через partial; тест **`MainWindowHostSurfaceProjectionTests`**.
243- Кластер **Solution / Build / Startup / UiMode** (завершение Wave 1 UI, **v1.45–v1.48**):
244 - **`StartupProjectRefreshProjection`** — восстановление стартового `.csproj` после `LoadSolution`; **`MainWindowViewModel.StartupProject`** — делегирование.
245 - **`SolutionLoadUiApplyProjection`** — первая страница MFD после загрузки решения; **`MainWindowViewModel.SolutionBuild`** (`LoadSolutionAsync`).
246 - **`MainWindowBuildSolutionPrepProjection`** — `CanBuild` / prep заголовка и страницы Build; сборка по-прежнему через **`DotnetSolutionChunkedBuildOrchestrator`**.
247 - **`UiModeLayoutApplyProjection`** — план раскладки + persist workspace; **`ApplyUiModeLayout`** в **`UiGitWorkspace`**.
248
249### Wave 1 — статус (текущий объём **закрыт**)
250
251Фазы **0–5** и Wave 1 (**MCP thinning** + **UI clusters thinning** по плану v1.15–v1.48) считаются **выполненными** для зафиксированного scope strangler: главный VM остаётся композитором (подписки, дочерние VM, `IdeMcp` property), но крупные кластеры вынесены в `Features/*/Application` оркестраторами/проекциями.
252
253### Wave 2 — Big Bang MCP (v1.53, этап 1)
254
255**Цель:** убрать реализацию `IIdeMcpActions` с `MainWindowViewModel` — только композиция и `public IIdeMcpActions IdeMcp => _ideMcpHost`.
256
257**Сделано (этап 1):**
258
259- **`MainWindowIdeMcpHost`** (`Features/IdeMcp/Application/`, partial’ы бывших `MainWindowViewModel.IdeMcpActions.*`) — единственная реализация `IIdeMcpActions`.
260- **`MainWindowViewModel.McpHostBridge`** — internal-доступ к приватным полям/методам VM для host (git, editor providers, DataBus, breakpoints, debug stack).
261- **`IdeMcpCommandExecutor`** принимает `(MainWindowViewModel vm, IIdeMcpActions actions)`; generated/handlers вызывают `_actions`, не cast VM.
262- **`ProtocolDocGen`** генерирует `_actions` в pass-through хендлерах.
263- Call sites: `App.axaml.cs` (MCP stdio), `AgentContractHeadlessRuntime`, hotkeys, command palette, Intercom, Git panel (`IdeMcp`), DAP callback → `_ideMcpHost.ApplyDapDebugSnapshotToUi`.
264- RelayCommand превью Markdown остались на MWVM (`MainWindowViewModel.IdeMcpUiRelayCommands.cs`).
265
266**Этап 2 (v1.54):**
267
268- **`EditorWorkspaceViewModel`** (`Features/Editor/`) — `CurrentFilePath`, `EditorText`, selection, `IsLoadingCurrentFile`, markdown preview flags.
269- MWVM — прокси-свойства + ретрансляция `PropertyChanged` (Views/MCP без массовой правки).
270
271**Этап 3 (v1.55):**
272
273- **`ShellChromeViewModel`** (`Features/Shell/`) — регионы MainGrid, видимость MFD-страниц, `UiMode`, `EditorGroupCount`, `IsBuilding`, `CurrentMfdShellPage`, …
274- **`ShellChromePresentationNotifyMap`** — presentation-зависимости на MWVM (бывшие `NotifyPropertyChangedFor` на shell-полях).
275- MWVM — `Shell` + прокси + `OnShellChromePropertyChanged`; reactive side-effects (настройки, MFD-навигация, bloom UI mode) в `MainWindowViewModel.ShellSession`.
276- Удалены `MainWindowViewModel.ShellState.RegionAndContour` / `UiSessionChrome` (поля перенесены).
277
278**Этап 4 (v1.56):**
279
280- **Shell:** layout/MFD/UI mode RelayCommand → `ShellChromeViewModel.Commands.*`; MWVM — `MainWindowViewModel.FeatureCommandProxies` (палитра, MCP, hotkeys без смены имён команд).
281- **Documents:** вкладки/группы → `DocumentsWorkspaceViewModel.Commands`; `CloseDocument` API → `CloseDocumentByPath`.
282- **Safety L1–L3** — пока на MWVM (`RelayCommands.UiMode`).
283- Удалены `RelayCommands.Layout` / `RelayCommands.Documents`; `ToggleMfdRegionExpanded` убран из `SolutionBuild`.
284
285**Этап 5 (v1.57):**
286
287- **Application shell:** `MainWindowApplicationShellViewModel` — меню (открыть решение/папку/файл), темы, язык UI, окна-хосты; прокси команд на MWVM.
288- **Debug:** `MainWindowDebugSessionViewModel` — F5/attach/step/stop; `DebugLaunchInteractiveAsync` → `Debug.*`; `StateChanged` → `Debug.NotifyRelayCommandsChanged()`.
289- **Build:** `MainWindowBuildSessionViewModel` — `BuildSolutionAsync`, `HideBuildOutput`; bridge `HostDotnetRunner`.
290- **Editor slice:** `EditorWorkspaceViewModel.DebugGlyphs` (брейкпоинты, `DebugPosition*`), `EditorWorkspaceViewModel.Hud` (баннер диагностик/вхождений); прокси на MWVM.
291- Удалены `RelayCommands.Shell`, `RelayCommands.Debug`; build-команды убраны из `SolutionBuild`; удалены `Breakpoints.cs`, `EditorHud.cs` на MWVM.
292- `ShowDebugInfoAsync`, `GetWorkspacePath` — internal на host; тесты MCP → `vm.IdeMcp`.
293
294**Этап 6 (v1.58):**
295
296- **Shell:** `ShellChromeViewModel.Commands.Safety` (L1–L3), `Commands.MarkdownPreview` (MFD preview / отдельное окно).
297- **Editor:** `EditorWorkspaceViewModel.DebugHints`, `InlineHints`, `StabilizedInput`; прокси на MWVM.
298- Удалены `RelayCommands.UiMode`, `IdeMcpUiRelayCommands`, `EditorDebugHints` / `EditorInlineHints` / `EditorStabilizedInput` на MWVM.
299- Bridge: `HostUpdateCodeNavigationMapCaretOffset`.
300
301**Дальше:** метрики LOC в таблице partial MWVM; крупные кластеры (navigation map, HCI) — Plan B по мере фич.
302
303**Backlog MWVM (закрыт, v1.49–v1.52):**
304
305- **v1.49** — **`SolutionWorkspaceViewModel`** в `Features/Workspace/`; **`SolutionLoadSessionApplyProjection`** — применение загрузки решения (дерево + сброс редактора + MFD); тесты **`SolutionLoadSessionApplyProjectionTests`**.
306- **v1.50** — **`IdeMcpCommandExecutor`** перенесён в **`Features/IdeMcp/Execution/`** (диспетчер вне `ViewModels/`; генератор **`ProtocolDocGen`** и **`CascadeIDE.csproj`** синхронизированы). MWVM по-прежнему владеет экземпляром и маршалит UI.
307- **v1.51** — Точечный вынос MCP/UI при росте API — **правило на поддержку** ([feature-archetype-v1.md](design/feature-archetype-v1.md)); не big-bang.
308- **v1.52** — MEF/плагины и опциональный дополнительный батчинг Problems — **вне scope** (политика ADR 0009 / фаза 5 «основное сделано»); коалесcing BuildOutput и Diagnostics уже в продукте.
309
310Новые фичи — по **feature-archetype**; MWVM не раздуваем без выноса.
311
312## Версионирование
313
314- **v1** — карта срезов и фазы 0–4.
315- **v1.1** — фаза 1 (Git-панель) отмечена как выполненная.
316- **v1.2** — фаза 2 (Build output / Terminal как отдельные VM + привязки во Flight — страницы `MfdShellPageStack`; исторически упоминался `BottomPanelView`).
317- **v1.3** — фаза 3 (`ChatPanelViewModel`, привязки в `ChatPanelView` + `MainWindow.axaml.cs`).
318- **v1.4** — фаза 4 (`InstrumentationPanelViewModel`, модели трассы/отладки в отдельных файлах, прокси на главном VM).
319- **v1.5** — инструментирование без прокси: разметка с `DataContext` на `InstrumentationPanel`, правила миграции уточнены.
320- **v1.6** — фаза 5 (события, UI-поток, батчинг); MEF/плагины вынесены в отложенные идеи политики.
321- **v1.7** — фаза 5: введены `IUiScheduler` / `UiScheduler.Default`, маршалинг UI сосредоточен в `AvaloniaUiScheduler`.
322- **v1.8** — фаза 5: `BuildOutputPanelViewModel.Append` коалесит обновления привязки; `FlushPending` после сборки решения.
323- **v1.9** — фаза 5: `IUiScheduler.InvokeAsync<T>(Func<Task<T>>)`; MCP `ExecuteCommandAsync` всегда на UI; план шага B по выносу логики из VM.
324- **v1.10** — фаза 5: коалесcing `DiagnosticsChanged` в `CSharpLspDiagnosticsHost`; фаза 5 отмечена как «основное сделано», опциональные пункты вынесены отдельно.
325- **v1.11** — раздел «Срез MainWindowViewModel»: карта partial-файлов и уточнение текущего состояния (не один `.cs` на ~3k строк).
326- **v1.12** — обозреватель решения: вложенность файлов как в VS — `<DependentUpon>` из `.csproj` + эвристика для SDK-glob (`Stem.*.cs` → родитель `Stem.cs` в той же папке). Формат `.sln` вложенность не задаёт.
327- **v1.13** — рефакторинг: дерево файлов проекта вынесено в `Services/ProjectFileTreeBuilder.cs`, `SolutionParser` — только загрузка решения и сортировка узлов.
328- **v1.14** — план B (примитивы MCP): `McpCommandJsonArgs` в `Services/` вместо вложенного класса в `IdeMcpCommandExecutor`; генератор `ProtocolDocGen` и `IdeMcpCommandExecutor.Generated.g.cs` синхронизированы; тесты на контракт чтения args.
329- **v1.15** — зафиксирован слой **Data Acquisition Layer** (fs/process/parse outside CCU), добавлены wave-планы `MCP thinning` и `UI clusters thinning` для следующей итерации strangler.
330- **v1.16** — готовность окружения: `EnvironmentReadinessSnapshotBuilder` и `EnvironmentReadinessRefreshOrchestrator` в `Features/EnvironmentReadiness/Application/`; сценарий refresh вынесен из `MainWindowViewModel`; **CASCOPE020** / **CASCOPE021** (граница CCU) — severity **Error** при чистом baseline.
331- **v1.17** — DAL-завершение среза Environment Readiness (ADR 0102): `EnvironmentReadinessExecutablePathProbe`, `EnvironmentReadinessEnvSnapshot` / `WellKnownEnv`, `EnvironmentReadinessPathAcquisition`, `EnvironmentReadinessFileFacts` в `Features/EnvironmentReadiness/DataAcquisition/`; I/O и классификация путей вне `Application/`.
332- **v1.18** — Cursor ACP DAL: `CursorAcpAgentPath`, `CursorAcpWorkspaceFileAccess` в `Features/CursorAcp/DataAcquisition/`; `global using` для этого пространства имён; `CursorAcpChatConnection` без прямого I/O путей агента и workspace-файлов в обработчиках ACP.
333- **v1.19** — Settings DAL: `UserSettingsPaths`, `TextFileReadWrite`, `HotkeyTomlLoader` в `Features/Settings/DataAcquisition/`; `McpExternalServersJsonResolver` читает файл через DAL. Workspace: `SolutionParser`, `ProjectFileTreeBuilder`, `SolutionFileLocator`, `FolderWorkspaceTreeBuilder`, `DebugWorkspacePath` — `Features/Workspace/DataAcquisition/`; `McpSolutionTree` — `Features/Workspace/Application/`; `global using` для Settings и Workspace; `SolutionFileLocator` не зависит от `EditorTextCoordinateUtilities` (локальное сравнение путей).
334- **v1.20** — Wave MCP thinning (первый срез): оркестраторы `IdeMcpEditorOrchestrator` / `IdeMcpNavigationOrchestrator` / `IdeMcpBuildTestOrchestrator` + тесты `IdeMcpOrchestratorThinningTests`.
335- **v1.21** — MCP thinning второй заход: `HybridIndexScopeResolver`, `IdeMcpHybridIndexScope`, `IdeMcpAgentNotesOrchestrator`; тесты `HybridIndexScopeAndIdeMcpScopeTests`.
336- **v1.22** — `IdeMcpSolutionPathAvailability`, `IdeMcpTestRunInstrumentationMutation`; тесты `IdeMcpSolutionPathAvailabilityTests`.
337- **v1.23** — `PublishIdeBuildStateOnUiAsync`; MCP `RunCodeCleanupAsync` обрамлён `BuildStateChanged`; `BuildSolutionAsync` — `PublishToIdeDataBusAndRebuild` вместо «тихой» публикации в шину.
338- **v1.24** — `IdeMcpGitWorkspaceSession` (+ тесты `IdeMcpGitWorkspaceSessionTests`); `MainWindowViewModel.IdeMcpActions.Git` — делегирование в сессию.
339- **v1.25** — `IdeMcpIdeStateUiCapture`; `IdeMcpWorkspaceOrchestrator.BuildIdeStatePayload` по снимку; тест в `IdeMcpOrchestratorThinningTests`.
340- **v1.26** — DAP UI-план + MCP `GetDebugSnapshotAsync` без `UiScheduler.InvokeAsync`.
341- **v1.27** — Wave UI clusters: `CodeNavigationMapPresentationProjection`, `CodeNavigationMapSettings.ViewWants*`; тесты `CodeNavigationMapPresentationProjectionTests`.
342- **v1.28** — Wave UI clusters: `WorkspaceNavigationMapContextJsonBuilder`, `CodeNavigationMapViewportPolicy`; тесты `WorkspaceNavigationMapContextAndViewportTests`.
343- **v1.29** — Явная **стратегия целевого каркаса** (CDS / CCU / DAL / IDS), приоритет упрощающего буфера вокруг `MainWindowViewModel` и правило 5 раздела «Правила на время миграции» — чтобы strangler совпадал с реальным приближением к устоявшейся линии слоёв, а не откладывался потоком фич.
344- **v1.30** — Wave UI clusters: `WorkspaceNavigationMapRefreshComposer` (пост-JSON конвейер карты PFD); тесты `WorkspaceNavigationMapRefreshComposerTests`.
345- **v1.31** — Тот же срез: **CDS-снимок для trace-flow** на карте захватывается на UI до фонового парсинга/компоновки, контракт `Compose(.., CockpitSurfaceState?)` без `Func` с пула.
346- **v1.32** — Wave UI clusters: вынесен partial **`MainWindowViewModel.ShellState.AiProviders`** (режим ИИ и облачные ключи) из `ShellState.cs`.
347- **v1.33** — Wave UI clusters: **`MainWindowViewModel.ShellState.ChatAndSessionConfig`** (чат + MCP/ACP конфиг автономной сессии).
348- **v1.34** — Wave UI clusters: **`MainWindowViewModel.ShellState.AutonomousAgentStripe`** (полоса автономного агента + тесты/LOC для IDE Health).
349- **v1.35** — Терминология раскладки: **три зоны** (PFD · Forward · MFD); терминал/сборка/Git — **вторичный контур колонки MFD**, не отдельная «нижняя панель». Уточнены xmldoc `ShellState` и флаги страниц MFD.
350- **v1.36** — Переименование: `IsBottomPanelVisible` → **`IsMfdContourContentVisible`** (флаги контента стека вторичного контура MFD).
351- **v1.37** — Разметка и снимки: `Border#BottomPanelShell` → **`MfdContourStackHost`** (`MfdShellView.axaml`); ключ **`layout_regions`** в MCP/DeepSnapshot обновлён; доки без отсылки к вымышленной «нижней панели» главного окна во Flight.
352- **v1.38** — Wave MCP thinning (завершение волны в текущем объёме): **`IdeMcpBuildTestOrchestrator`** — поверхность панели при missing solution / ошибке сборки; **`IdeMcpHostOrchestrator`** — JSON `ping`/рестарт MCP; **`IdeMcpHybridCodebaseIndexOrchestrator`** — литералы ошибок и `SerializeReindexFailed`; дедуп **`PublishIdeMcpTestRunMutation`** в `IdeMcpActions.BuildTest`.
353- **v1.39** — Wave UI clusters: доменное разнесение **`MainWindowViewModel.ShellState`**: регион/контур MFD (**`ShellState.RegionAndContour.cs`**), режим UI и сборка (**`UiSessionChrome.cs`**), Kroki/modelfetch (**`ModelPullMarkdown.cs`**); enum палитры в **`Models/Shell/CommandPaletteHost.cs`** (хост-окна + тесты пользуются из `CascadeIDE.Models.Shell`).
354- **v1.40** — Wave UI clusters, кластер **Presentation**: статическая проекция **`MainWindowPresentationSurfaceProjection`** для вычисляемых свойств **`MainWindowViewModel.Presentation`**, тесты **`MainWindowPresentationSurfaceProjectionTests`**.
355- **v1.40b** — тот же кластер: **`IdeHealthStripPresentationProjection`** + тесты **`IdeHealthStripPresentationProjectionTests`**; VM не дублирует разбор вложенного снимка в шести геттерах.
356- **v1.40c** — **`MainWindowViewModel.PresentationLayout`**: несколько **`PresentationLayout.*`** partial-файлов (топология, host-shell инвалидация, сохранённые bounds окон-хостов, CDS snapshot).
357- **v1.40d** — **`MainWindowPresentationCapabilitiesProjection`** + тесты; геттеры **`Presentation`** делегируют цепочки capabilities/Skia/safety/LOC.
358- **v1.40e** — **`MainWindowViewModel.WorkspaceNavigationMap.Refresh`**: поток обновления карты отделён от partial с привязками PFD.
359- **v1.40f** — расширение **`MainWindowPresentationSurfaceProjection`** (split/Mount-style/IDE Health mount) + **`MainWindowPresentationDapProjection`**; VM без локальных помощников резолва mount-style.
360- **v1.40g** — **`IMainWindowHostSurfaceInput`** + проекция host surface без типа VM; связность Cockpit → ViewModels ослаблена на границе shell/host кадра.
361- **v1.40h** — MCP **`BuildAsync`** / **`RunCodeCleanupAsync`**: общий каркас **`WithIdeMcpPublishedBuildStateAsync`** (пара **`BuildStateChanged`** на шину IDE Health, ADR 0099) вместо дублирующего try/finally в **`MainWindowViewModel.IdeMcpActions.BuildTest`**.
362- **v1.40i** — MCP UI automation: **`IdeMcpUiAutomationOrchestrator`** — **`TryGetRemoveBreakpointNormalizedPath`**, **`ShouldSkipToggleBreakpointInEditor`**, **`InvokeStringResultOnUiAsync`**, **`EditChatAssistantMessageOnUiAsync`**; **`MainWindowViewModel.IdeMcpActions.UiAutomation`** короче.
363- **v1.40j** — палитра команд: типы строки списка **`IdeCommandPaletteRowKind`** / **`IdeCommandPaletteRowViewModel`** вынесены в **`ViewModels/IdeCommandPaletteRowViewModel.cs`**; **`MainWindowViewModel.CommandPalette.cs`** остаётся логикой фильтрации и исполнения.
364- **v1.40k** — Launch / MCP: **`DebugLaunchByProfileMcpOrchestrator`** (`Features/Launch/Application`) — сценарий **`debug_launch`** по `target_path` или профилю без длинного тела в **`MainWindowViewModel.StartupProject`**; HCI: **`HybridIndexHisPresentationProjection.LampItem`** + тесты, **`MainWindowViewModel.HybridIndex`** — однострочный геттер.
365- **v1.40l** — Workspace: **`SolutionLoadCrashLog`** (`Features/Workspace/Application`) — запись **`LoadSolution`** crash в **`.cascade-ide/crash-log.txt`** вне **`MainWindowViewModel.SolutionBuild`**; штамп UTC через **`InvariantCulture`**.
366- **v1.41a** — Launch / F5: **`DebugLaunchForF5Orchestrator`** (`Features/Launch/Application`) — pre-resolve + MSBuild для F5 вне **`MainWindowViewModel.StartupProject`**; **`LaunchProjectPathResolver.NormalizeExistingProjectFileFullPath`** (DAL) — проверка существования стартового `.csproj` без `File.Exists` в Application-оркестраторе (CASCOPE031).
367- **v1.41b** — Палитра команд: **`IdeCommandPaletteFilterOrchestrator`** / **`IdeCommandPaletteExecutionOrchestrator`** + **`CommandPaletteGoToAsyncHandle`** (`Features/Search/Application`) — фильтрация (каталог / melody / go-to + ripgrep) и исполнение выбора вне **`MainWindowViewModel.CommandPalette`**.
368- **v1.41c** — CascadeChord (ADR 0060): **`CascadeChordIntentSession`** (`Features/Shell/Application`) — фаза, хвост, таймер и разбор клавиш; **`MainWindowViewModel.CascadeChord`** — привязки и туннель к сессии.
369- **v1.41d** — Presentation: **`MainWindowPresentationSurfaceProjection.ComposeHostSurfaceFrame`** — сборка **`MainWindowHostSurfaceFrame`** по **`IMainWindowHostSurfaceInput`** и нормализованному UI-режиму вне **`MainWindowViewModel.Presentation`**.
370- **v1.41e** — Настройки: **`ShellSettingsReactiveSideEffects`** (`Features/Settings/Application`) — длинные цепочки **внешний MCP / autonomous**, **AI mode / cloud provider**, **HCI index dir + scope** вместо тел в **`MainWindowViewModel.SettingsReactive`**.
371- **v1.41f** — Relay-команды: нарезка **`MainWindowViewModel.RelayCommands`** на **`RelayCommands.Shell`** / **`Layout`** / **`Documents`** / **`UiMode`** (+ **`RelayCommands.Debug`** без изменений логики); **`ApplyMfdRegionExpanded`** / **`ApplyPfdRegionExpanded`** вместо прямых присваиваний (CASCOPE003).
372- **v1.41g** — MCP executor: **`IdeMcpCommandExecutor.Handlers.Chrome`** разнесён на **`Chrome.OutputFocus`** / **`Chrome.UiVisibility`** / **`Chrome.MenuToolbar`** (регистрация хендлеров без изменения поведения).
373- **v1.41h** — Главное окно: тело конструктора вынесено в **`MainWindowViewModel.ShellConstruction`**; **CASCOPE003** — в белом списке **`ShellConstruction`** (наряду с `MainWindowViewModel.cs`).
374- **v1.41i** — MCP executor: **`IdeMcpCommandExecutor.Handlers.PowerDocuments`** разнесён на **`PowerDocuments.FocusPowerAgent`** (фокус, автономность, чат, Ollama) и **`PowerDocuments.Documents`** (вкладки документов).
375- **v1.41j** — MCP **`IIdeMcpActions`**: **`IdeMcpActions.BuildTest`** разнесён на **`BuildTest.Build`** (диагностики, дерево решения, сборка, structured, code cleanup) и **`BuildTest.Tests`** (тесты и **`PublishIdeMcpTestRunMutation`**).
376- **v1.41k** — MCP UI automation: **`IdeMcpActions.UiAutomation`** разнесён на **`UiAutomation.EditorPreview`** (редактор, брейкпоинты, превью) и **`UiAutomation.Providers`** (подтверждения, тема, провайдеры контролов и чата).
377- **v1.41l** — MCP executor: **`Handlers.DapDebug`** → **`DapDebug.LaunchAttach`** / **`DapDebug.Stepping`**; **`Handlers.Editor`** → **`Editor.ToolCatalog`** (статический **`RegisterCore`**), **`FilesAndChat`**, **`StateContent`**, **`EditNavigation`**; **`Chrome.MenuToolbar`** → **`MenuToolbar.DialogsApp`**, **`ThemeLanguage`**, **`PanelsLayout`**; **`CascadeIDE.csproj`** — **`DependentUpon`** для вложенных partial.
378- **v1.41m** — Workspace: **`BlankSolutionCreator`** (`Features/Workspace/Application`) — новое пустое **`.sln`** через **`dotnet new sln`**; меню **Файл → Создать новое решение…**, MCP **`create_new_solution_dialog`**, тесты **`BlankSolutionCreatorTests`**; **`MainWindowViewModel.TryCreateBlankSolutionAtPathAsync`**.
379- **v1.41n** — Роли слоёв: атрибут **`[PresentationProjection]`** (`CascadeIDE.Contracts`), анализатор **`LayerRoleConsistencyAnalyzer`** (**CASCOPE032–042**); проекции в `Features/*/Application` переведены с `[ComputingUnit]` на `[PresentationProjection]`; оркестраторы палитры/F5/debug — `[ApplicationOrchestrator]`; I/O-исключения (`ExpandedMarkdownFileExportProjection`, `StartupProjectDebugInferenceProjection`) остаются на `[ComputingUnit]`.
380- **v1.41o** — **`ShellSettingsPresentationProjection`** (был `ShellSettingsOrchestrator`); **CASCOPE039** не предупреждает MCP/application-фасады с `[ApplicationOrchestrator]` и делегированием в `*Service` (и разбором `JsonElement`/`GraphDocument`).
381- **v1.42** — [design/feature-archetype-v1.md](design/feature-archetype-v1.md) + [design/ide-chrome-tokens-v1.md](design/ide-chrome-tokens-v1.md); глобальные стили `cascadeSection` / UiKit **`CascadeSection`**, **`CascadeStatusChip`**; ADR **0076**, **0121** → Accepted.
382- **v1.43** — ADR **0120** (primary work surface Intercom/Editor) → Accepted · Implemented; IOP manifest синхронизирован.
383- **v1.44** — ADR **0119** (chat slash commands) → Accepted · Implemented (фазы A, A′, B); **0121** таблица зрелости обновлена.
384- **v1.45** — Strangler UI: **`StartupProjectRefreshProjection`**; MWVM **`StartupProject`** укорочен.
385- **v1.46** — **`SolutionLoadUiApplyProjection`** + **`MainWindowBuildSolutionPrepProjection`**; MWVM **`SolutionBuild`** без прямого `File.Exists` для CanBuild.
386- **v1.47** — **`UiModeLayoutApplyProjection`**; **`ApplyUiModeLayout`** в **`UiGitWorkspace`**.
387- **v1.48** — Wave 1 strangler MWVM (текущий объём) отмечен **закрытым**; backlog зафиксирован в разделе «Wave 1 — статус».
388- **v1.49** — **`SolutionWorkspaceViewModel`** + **`SolutionLoadSessionApplyProjection`** (см. backlog MWVM).
389- **v1.50** — **`IdeMcpCommandExecutor`** → **`Features/IdeMcp/Execution/`**.
390
View only · write via MCP/CIDE