Forge
markdowndeeb25a2
1# ADR 0139: Hot-reload типографики `[fonts]` — только режим Ground
2
3**Статус:** Proposed · **Ground-only** (обсуждение до реализации)
4**Дата:** 2026-05-21
5
6## Связанные ADR
7
8| ADR | Роль |
9|-----|------|
10| [0028](0028-user-settings-toml-localappdata-and-secrets.md) | `%LocalAppData%\CascadeIDE\settings.toml` |
11| [0123](0123-intercom-full-skia-surface-evolution.md) | Skia Intercom + MFD typography |
12| [0127](0127-intercom-spine-and-topic-tabs-chrome-navigation.md) | Chrome navigation — не смешивать с reload settings |
13| [0010](0010-ui-modes-toml-configuration.md) | UiModes / слои продукта |
14
15## Резюме
16
17- **Сделать:** при сохранении `settings.toml` (или явном «Применить») перечитывать `[fonts.intercom]` / `[fonts.editor]` и проталкивать в VM → Skia (`IntercomPanelFontsChanged`) + Avalonia MFD (`ChatPanelTypographyApplier`), с инвалидацией `IntercomFontDefaults`.
18- **Не делать в Take Off:** фоновый watcher файла, debounce, частичный merge без перезапуска IDE, hot-reload всего `CascadeIdeSettings`, hot-reload `display.screens` / topology.
19- **Почему Ground:** смена pt/family без перезапуска — **настройка и калибровка** (как темы/UiModes на земле), а не полётный контур, где гонки reload vs layout/presentation недопустимы.
20
21## Контекст
22
23После embedded `Settings/defaults-settings.toml` ([0028](0028-user-settings-toml-localappdata-and-secrets.md)) типографика стабильна при старте, но правка `%LocalAppData%\CascadeIDE\settings.toml` требует **полного перезапуска IDE**. Оператору неудобно подбирать `prose_pt`, `panel_*`, editor `size_pt`.
24
25## Решение (направление)
26
271. **Триггер:** `SettingsService.Save` успешно записал файл **и** секция `[fonts]` изменилась (или первый load после edit в UI настроек, если появится).
282. **Путь данных:** `SettingsDefaultsLoader.DeserializeEffective(diskToml)` → сравнить `Fonts` → если diff → event `FontsSettingsChanged`.
293. **Подписчики:** `MainWindowViewModel` / `ChatPanelViewModel.SetIntercomFontsSettings`, `IntercomFontDefaults.Reset()`, `InvalidateVisual` на `IntercomSkiaSurface`.
304. **Редактор:** `DockDocumentView.ApplyEditorFontFromSettings` для открытых документов (опционально v1 — только активный editor).
315. **Не в scope v1:** FileSystemWatcher; reload при внешнем редактировании toml в Notepad.
32
33## Отклонено (Take Off)
34
35| Идея | Почему |
36|------|--------|
37| Watcher на `settings.toml` | Непредсказуемый reload mid-flight, конфликт с Save merge presentation |
38| Hot-reload всего settings | Слишком широко; display/ai требуют отдельных ADR |
39| Reload без invalidation кэша | Риск stale `IntercomFontDefaults` |
40
41## Критерий готовности (когда Accepted)
42
431. Изменить `prose_pt` в user `settings.toml`, нажать Save (или переключить фокус с сохранением) — **без перезапуска** обновляются Skia-лента и MFD Chat.
442. Forward `prose_pt_forward` и MFD `prose_pt` расходятся корректно после reload.
453. Регрессия: embedded defaults при отсутствии user-файла не ломаются.
46
47## История
48
49| Дата | Изменение |
50|------|-----------|
51| 2026-05-21 | Proposed: Ground-only; отложено до завершения 0127 A/B. |
52
View only · write via MCP/CIDE