feat: add market data architecture and complete migration through build 039

This commit is contained in:
2026-07-14 09:58:16 +03:00
parent 26deb861bc
commit a996f2f797
443 changed files with 80452 additions and 1335 deletions

View File

@@ -0,0 +1,157 @@
# Decision 006 — Immutable Engine Contract
## Статус
**Accepted**
---
# Дата принятия
Принято во время реализации **Build №006 — `common/models.py`**.
---
# Контекст
Во время проектирования единого контракта аналитических движков возник вопрос:
> **Могут ли модели результата изменяться после завершения расчёта?**
Рассматривались два варианта.
---
# Вариант 1
Изменяемые (`mutable`) модели.
После создания объекта любой компонент платформы может изменить его поля.
Например:
```python
result.score = ...
result.reason = ...
result.direction = ...
```
### Преимущества
- проще писать код;
- меньше ограничений.
### Недостатки
- невозможно гарантировать целостность результата;
- результат может измениться после публикации;
- журнал может содержать значения, отличающиеся от реально использованных;
- сложнее искать ошибки;
- возрастает риск скрытых побочных эффектов.
---
# Вариант 2
Неизменяемые (`immutable`) модели.
После создания объекта изменение его полей невозможно.
При необходимости формируется новый объект результата.
### Преимущества
- результат всегда остаётся неизменным;
- журнал отражает фактическое состояние расчёта;
- безопасная передача между компонентами;
- отсутствуют скрытые изменения;
- упрощается диагностика;
- упрощается тестирование;
- повышается предсказуемость поведения платформы.
### Недостатки
- при изменении необходимо создавать новый экземпляр объекта.
---
# Принятое решение
Для всех моделей, описывающих результат работы аналитических движков, используется **неизменяемый контракт**.
Все основные модели объявляются как:
```python
@dataclass(frozen=True, slots=True)
```
---
# Область применения
Правило распространяется на:
- `EngineResult`;
- `EngineContext`;
- `EngineMetric`;
- `EngineDiagnostics`;
- `EngineEvaluationMeta`;
- `EngineDependencyResult`;
а также на все будущие модели, описывающие результаты работы Engine.
---
# Исключения
Настоящее правило **не распространяется** на:
- Runtime State;
- AutoTrade State;
- Position State;
- Execution Runtime;
- внутренние рабочие объекты расчёта.
Эти объекты отражают изменяющееся состояние платформы и по своей природе являются изменяемыми.
---
# Причины принятия решения
Использование неизменяемых моделей обеспечивает:
- целостность результатов анализа;
- безопасную передачу данных между Engine;
- корректное журналирование;
- предсказуемость поведения системы;
- отсутствие скрытых побочных эффектов;
- упрощение сопровождения проекта в долгосрочной перспективе.
---
# Архитектурные последствия
После принятия настоящего решения:
- результаты Engine не изменяются после создания;
- каждый новый расчёт формирует новый объект результата;
- публикация событий всегда выполняется на основе завершённого результата;
- журнал содержит фактически опубликованные данные;
- Coordinator работает только с завершёнными результатами анализа.
---
# Связанные документы
- `runtime_contract.md`
- `architecture_principles.md`
- `development_process.md`
- `builds/build-006-common-models.md`
---
# История
| Версия | Изменение |
|---------|-----------|
| 1.0 | Первое принятие архитектурного решения. |