# Build 015.2 — Runtime Protocol

**Engineering Build Document**

---

# Контроль документа

| Свойство | Значение |
|----------|-----------|
| Build | 015.2 |
| Название | Runtime Protocol |
| Статус | **Accepted** |
| Подсистема | Market Intelligence |
| Layer | Runtime |
| Тип | Architecture + Implementation |
| Версия | 1.0 |
| Язык | Русский |

---

# Причина появления Build

После появления `RuntimeResult` стало возможно определить официальный контракт Runtime Layer.

Runtime должен взаимодействовать с аналитическими Engine через единый стабильный интерфейс и не зависеть от конкретных реализаций Engine.

---

# Цель Build

Создать файл:

```text
app/src/trading/market_intelligence/runtime/protocol.py
```

и определить в нём официальный контракт Runtime Layer.

---

# Architecture

`RuntimeProtocol` описывает только внешний интерфейс Runtime.

Runtime отвечает за:

- регистрацию Engine;
- удаление Engine;
- получение зарегистрированного Engine;
- выполнение анализа;
- возврат агрегированного `RuntimeResult`.

Runtime не отвечает за:

- аналитику;
- торговые решения;
- порядок стратегий;
- пользовательский интерфейс;
- работу с биржей;
- работу с БД;
- журналирование.

---

# Architecture Review

Проверка подтвердила:

- Runtime работает через `EngineProtocol`;
- Runtime регистрирует классы Engine, а не экземпляры;
- Runtime возвращает `RuntimeResult`;
- Runtime не знает конкретных Engine;
- Runtime не содержит аналитики;
- Runtime не содержит Coordinator-логики;
- AutoTrade не изменяется.

Архитектура Build признана корректной.

---

# Architecture Decision (ADR)

## Решение

Runtime Layer регистрирует классы Engine, а не экземпляры Engine.

Официальный контракт:

```python
register_engine(
    engine_type: type[EngineProtocol],
) -> None
```

## Статус

**Accepted**

## Обоснование

`EngineMetadata` доступна без создания экземпляра Engine через `get_metadata()`.

Поэтому Runtime не обязан создавать объект Engine на этапе регистрации.

Регистрация класса позволяет Runtime самостоятельно управлять жизненным циклом экземпляров Engine.

## Обязательное правило

Все Engine обязаны иметь конструктор без пользовательских параметров.

Всё изменяемое состояние и конфигурация анализа передаются через:

```text
EngineContext
```

## Запрещено

```python
register_engine(engine: EngineProtocol)
```

Регистрация экземпляров Engine запрещена.

## Последствия

После принятия решения:

- Runtime контролирует жизненный цикл Engine;
- Engine не сохраняют состояние между запусками;
- Runtime готов к параллельному выполнению;
- Registry сможет хранить типы Engine;
- добавление новых Engine не требует изменения Runtime.

---

# Build Design

Реализуется контракт:

```text
RuntimeProtocol
├── register_engine(engine_type)
├── unregister_engine(engine_name)
├── get_engine(engine_name)
└── analyze(context)
```

Файл не содержит реализации Runtime.

---

# Implementation

Реализован файл:

```text
app/src/trading/market_intelligence/runtime/protocol.py
```

Содержимое контракта:

```python
class RuntimeProtocol(Protocol):
    def register_engine(
        self,
        engine_type: type[EngineProtocol],
    ) -> None:
        ...

    def unregister_engine(
        self,
        engine_name: EngineName,
    ) -> None:
        ...

    def get_engine(
        self,
        engine_name: EngineName,
    ) -> type[EngineProtocol] | None:
        ...

    async def analyze(
        self,
        context: EngineContext,
    ) -> RuntimeResult:
        ...
```

---

# Compile Check

Проверка выполнена командой:

```bash
python -m compileall src/trading/market_intelligence
```

Результат:

- успешно скомпилирован `runtime/protocol.py`;
- синтаксические ошибки отсутствуют;
- циклические зависимости отсутствуют.

**Статус:** ✅ Passed

---

# Domain Review

Проверено соответствие предметной области.

`RuntimeProtocol`:

- работает через `EngineProtocol`;
- регистрирует классы Engine;
- возвращает `RuntimeResult`;
- не знает конкретных Engine;
- не содержит аналитики;
- не содержит Coordinator-логики;
- не зависит от AutoTrade;
- не обращается к бирже, БД, Telegram или EventBus;
- получает изменяемые данные анализа только через `EngineContext`.

**Статус:** ✅ Passed

---

# Documentation

В рамках Build должны быть обновлены:

- Build History;
- Runtime Contract;
- Engine Layer Architecture;
- Runtime Architecture.

---

# Acceptance

Build считается завершённым.

Выполнены:

- ✅ Architecture
- ✅ Architecture Review
- ✅ Architecture Decision (ADR)
- ✅ Build Design
- ✅ Implementation
- ✅ Compile Check
- ✅ Domain Review
- ✅ Documentation
- ✅ Acceptance

Статус Build:

**Accepted**

---

# Итоги Build

В результате Build 015.2:

- создан официальный контракт Runtime Layer;
- Runtime получил стабильную зависимость от `EngineProtocol`;
- закреплена регистрация классов Engine вместо экземпляров;
- Runtime возвращает агрегированный `RuntimeResult`;
- подготовлена основа для реализации Runtime Registry.

---

# Следующий Build

```text
Build 015.3

Runtime Registry

runtime/registry.py
```