Files
Mastermind/docs/architecture/system-patterns.md
T

86 lines
8.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Системные паттерны Mastermind
Этот документ описывает нормативные паттерны взаимодействия подсистем Mastermind.
## 1. Capability-Oriented Clean Architecture
**Problem**: Высокая связность между захватом, хранилищем и UI мешает тестированию и безопасности.
**Rule**: Каждая функциональная область (Capability) инкапсулирована в отдельный модуль с чёткими границами. Взаимодействие происходит через порты (протоколы).
**Apply when**: При добавлении новой крупной функциональности (например, новый вид захвата).
**Avoid**: Прямой импорт конкретных реализаций (Adapters) между модулями.
**Trade-offs**: Требует больше кода для инициализации (Dependency Injection).
**Verification**: Запрещены перекрёстные импорты в Swift модулях; Unit-тесты используют Mock-реализации портов.
## 2. Ports & Async Events
**Problem**: Глобальные шины событий (EventBus) делают зависимости неявными и затрудняют отладку.
**Rule**: Запросы и команды идут через явные порты (Application Ports). Факты о произошедшем передаются через типизированные асинхронные потоки событий (Typed Async Events). Глобальная шина запрещена.
**Apply when**: Для межмодульного взаимодействия.
**Avoid**: Использование `NotificationCenter` или глобальных `ObservableObject`.
**Trade-offs**: Требует явной оркестрации в Composition Root.
**Verification**: Каждый исходящий поток событий должен быть частью интерфейса порта модуля.
## 3. Observation Ledger
**Problem**: Прямая запись результатов захвата в граф знаний приводит к потере контекста и невозможности переобработки данных.
**Rule**: Collectors записывают только неизменяемые "свидетельства" (Observations) в лог (Ledger). Только Knowledge Pipeline читает этот лог.
**Apply when**: При обработке любого потока данных из источников (Sources).
**Avoid**: Прямое обновление Facts или Entities из Collectors.
**Trade-offs**: Увеличивает объём хранимых данных на диске до момента очистки (Retention).
**Verification**: База данных содержит таблицу `Observations` с Provenance.
## 4. Idempotent Projectors & Durable Checkpoints
**Problem**: Сбой во время обработки Observations может привести к дублированию или потере знаний в графе.
**Rule**: Проекторы (Projectors) читают лог Observations и обновляют граф, сохраняя контрольные точки (Checkpoints). Процесс должен быть идемпотентным.
**Apply when**: При преобразовании сырых данных в Assertions и Facts.
**Avoid**: Логика проекции, зависящая от текущего времени или внешнего состояния вне лога.
**Trade-offs**: Усложняет логику обновления графа.
**Verification**: Перезапуск проектора с одного и того же чекпоинта должен приводить к идентичному состоянию графа.
## 5. Capability-Specific Persistence Ports
**Problem**: Общие репозитории (Generic Repository<T>) скрывают специфичные требования к данным и производительности.
**Rule**: Каждый модуль определяет свои узкие порты для работы с данными (например, `AppendObservation`, `QueryContext`). Реализация за скрытым SQLite/SQLCipher адаптером.
**Avoid**: Использование общего DAO или прямого доступа к БД вне адаптера.
**Verification**: Интерфейсы портов содержат только те методы, которые реально нужны данному модулю.
## 6. Central Egress Gate & Privacy Envelopes
**Problem**: Риск случайной отправки конфиденциальных данных (PII) в облако.
**Rule**: Весь исходящий трафик к внешним провайдерам проходит через единый Egress Gate. Данные передаются в типизированных конвертах (Privacy Envelopes) с метаданными о классификации.
**Apply when**: Любая передача данных за пределы Mac (Cloud Providers).
**Avoid**: Прямые сетевые запросы из Assistant или других модулей.
**Trade-offs**: Единая точка отказа и бутылочное горлышко производительности.
**Verification**: Egress Gate блокирует любые данные без явного Provider Context Permission.
## 7. Work Scheduler & Budgets
**Problem**: Непрерывный захват и ML-обработка могут замедлять UI или разряжать батарею.
**Rule**: Центральный планировщик распределяет задачи по приоритетам и бюджетам ресурсов. Аудио и интерактив всегда выше фоновой индексации.
**Avoid**: Запуск `Task.detached` без указания приоритета и лимитов.
**Trade-offs**: Может увеличивать задержку (latency) для фоновых задач.
**Verification**: Приложение снижает активность в Low Power Mode.
## 8. Bounded Derived Caches
**Problem**: Кэширование может приводить к несогласованности данных и утечкам памяти.
**Rule**: Все кэши ограничены (bounded), принадлежат конкретным акторам (actor-owned) и могут быть полностью перестроены из Context Store.
**Apply when**: Для OCR, embeddings и UI элементов.
**Avoid**: Использование глобального `NSCache` без ограничений по времени и размеру.
**Verification**: Unit-тесты проверяют очистку кэша при достижении лимитов.
## 9. Structured Local Tracing
**Problem**: Текстовые логи бесполезны для отладки сложных распределённых процессов без передачи контента.
**Rule**: Использование структурированных спанов и событий с Correlation IDs (SourceID, ObservationID). Redacted metadata — только технические детали.
**Avoid**: Логирование распознанного текста или аудио-транскриптов.
**Verification**: Логи не содержат персональных данных пользователя, но позволяют проследить путь конкретной Observation.
## 10. Versioned Boundaries
**Problem**: Изменение формата данных (ASR, LLM, Export) ломает совместимость.
**Rule**: Все границы (Sidecars, Providers, Archives) используют типизированные DTO с версионированием и Contract Tests. Tolerant Reader обязателен.
**Avoid**: Сериализация внутренних доменных типов напрямую.
**Verification**: Наличие тестов на обратную совместимость схем.